From 2d5ae585582db84d0eae90786349291a84fc56e7 Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Mon, 3 Nov 2025 15:12:36 -0700 Subject: [PATCH 1/2] Generated website --- CNAME | 1 + compiler-docs/.lock | 0 compiler-docs/crates.js | 2 + compiler-docs/fe/all.html | 1 + compiler-docs/fe/fn.main.html | 1 + compiler-docs/fe/index.html | 1 + compiler-docs/fe/sidebar-items.js | 1 + compiler-docs/fe/struct.FelangCli.html | 109 + .../constant.DEFAULT_OUTPUT_DIR_NAME.html | 1 + compiler-docs/fe/task/build/enum.Emit.html | 117 + compiler-docs/fe/task/build/fn.build.html | 1 + .../fe/task/build/fn.build_ingot.html | 1 + .../fe/task/build/fn.build_single_file.html | 1 + .../fe/task/build/fn.ioerr_to_string.html | 1 + compiler-docs/fe/task/build/fn.mir_dump.html | 1 + .../build/fn.verify_nonexistent_or_empty.html | 1 + .../task/build/fn.write_compiled_module.html | 7 + .../fe/task/build/fn.write_output.html | 1 + compiler-docs/fe/task/build/index.html | 1 + compiler-docs/fe/task/build/sidebar-items.js | 1 + .../fe/task/build/struct.BuildArgs.html | 106 + compiler-docs/fe/task/check/fn.check.html | 1 + .../fe/task/check/fn.check_ingot.html | 1 + .../fe/task/check/fn.check_single_file.html | 1 + compiler-docs/fe/task/check/index.html | 1 + compiler-docs/fe/task/check/sidebar-items.js | 1 + .../fe/task/check/struct.CheckArgs.html | 101 + compiler-docs/fe/task/enum.Commands.html | 103 + compiler-docs/fe/task/index.html | 1 + .../task/new/constant.SRC_TEMPLATE_DIR.html | 1 + .../fe/task/new/fn.create_new_project.html | 1 + .../fe/task/new/fn.create_project.html | 1 + compiler-docs/fe/task/new/index.html | 1 + compiler-docs/fe/task/new/sidebar-items.js | 1 + .../fe/task/new/struct.NewProjectArgs.html | 101 + compiler-docs/fe/task/sidebar-items.js | 1 + compiler-docs/fe_abi/all.html | 1 + compiler-docs/fe_abi/contract/index.html | 1 + .../fe_abi/contract/sidebar-items.js | 1 + .../fe_abi/contract/struct.AbiContract.html | 20 + compiler-docs/fe_abi/event/index.html | 1 + compiler-docs/fe_abi/event/sidebar-items.js | 1 + .../fe_abi/event/struct.AbiEvent.html | 26 + .../fe_abi/event/struct.AbiEventField.html | 25 + .../event/struct.AbiEventSignature.html | 11 + .../fe_abi/function/enum.AbiFunctionType.html | 27 + .../fe_abi/function/enum.CtxParam.html | 15 + .../fe_abi/function/enum.SelfParam.html | 15 + .../fe_abi/function/enum.StateMutability.html | 27 + compiler-docs/fe_abi/function/index.html | 1 + .../fe_abi/function/sidebar-items.js | 1 + .../fe_abi/function/struct.AbiFunction.html | 27 + .../function/struct.AbiFunctionSelector.html | 12 + compiler-docs/fe_abi/index.html | 1 + compiler-docs/fe_abi/sidebar-items.js | 1 + compiler-docs/fe_abi/types/enum.AbiType.html | 34 + compiler-docs/fe_abi/types/index.html | 1 + compiler-docs/fe_abi/types/sidebar-items.js | 1 + .../fe_abi/types/struct.AbiTupleField.html | 24 + compiler-docs/fe_analyzer/all.html | 1 + .../builtins/enum.ContractTypeMethod.html | 25 + .../builtins/enum.GlobalFunction.html | 33 + .../fe_analyzer/builtins/enum.Intrinsic.html | 109 + .../builtins/enum.ValueMethod.html | 25 + compiler-docs/fe_analyzer/builtins/index.html | 1 + .../fe_analyzer/builtins/sidebar-items.js | 1 + .../builtins/struct.GlobalFunctionIter.html | 221 + .../builtins/struct.IntrinsicIter.html | 221 + .../constant.EMITTABLE_TRAIT_NAME.html | 1 + .../constants/constant.EMIT_FN_NAME.html | 1 + .../constants/constant.INDEXED.html | 1 + .../constant.MAX_INDEXED_EVENT_FIELDS.html | 1 + .../fe_analyzer/constants/index.html | 1 + .../fe_analyzer/constants/sidebar-items.js | 1 + .../context/enum.AdjustmentKind.html | 26 + .../fe_analyzer/context/enum.CallType.html | 53 + .../fe_analyzer/context/enum.Constant.html | 34 + .../fe_analyzer/context/enum.NamedThing.html | 41 + compiler-docs/fe_analyzer/context/index.html | 1 + .../fe_analyzer/context/sidebar-items.js | 1 + .../context/struct.Adjustment.html | 23 + .../fe_analyzer/context/struct.Analysis.html | 29 + .../context/struct.DiagnosticVoucher.html | 23 + .../context/struct.ExpressionAttributes.html | 33 + .../context/struct.FunctionBody.html | 26 + .../fe_analyzer/context/struct.Label.html | 34 + .../context/struct.TempContext.html | 63 + .../context/trait.AnalyzerContext.html | 178 + compiler-docs/fe_analyzer/db/index.html | 1 + compiler-docs/fe_analyzer/db/sidebar-items.js | 1 + .../fe_analyzer/db/struct.AllImplsQuery.html | 46 + .../db/struct.AnalyzerDbGroupStorage__.html | 113 + .../db/struct.AnalyzerDbStorage.html | 12 + .../db/struct.ContractAllFieldsQuery.html | 46 + .../db/struct.ContractAllFunctionsQuery.html | 46 + .../db/struct.ContractCallFunctionQuery.html | 46 + .../struct.ContractDependencyGraphQuery.html | 46 + .../db/struct.ContractFieldMapQuery.html | 46 + .../db/struct.ContractFieldTypeQuery.html | 46 + .../db/struct.ContractFunctionMapQuery.html | 46 + .../db/struct.ContractInitFunctionQuery.html | 46 + ...struct.ContractPublicFunctionMapQuery.html | 46 + ...t.ContractRuntimeDependencyGraphQuery.html | 46 + .../db/struct.EnumAllFunctionsQuery.html | 46 + .../db/struct.EnumAllVariantsQuery.html | 46 + .../db/struct.EnumDependencyGraphQuery.html | 46 + .../db/struct.EnumFunctionMapQuery.html | 46 + .../db/struct.EnumVariantKindQuery.html | 46 + .../db/struct.EnumVariantMapQuery.html | 46 + .../db/struct.FunctionBodyQuery.html | 46 + .../struct.FunctionDependencyGraphQuery.html | 46 + .../db/struct.FunctionSignatureQuery.html | 46 + .../db/struct.FunctionSigsQuery.html | 46 + .../db/struct.ImplAllFunctionsQuery.html | 46 + .../fe_analyzer/db/struct.ImplForQuery.html | 46 + .../db/struct.ImplFunctionMapQuery.html | 46 + .../db/struct.IngotExternalIngotsQuery.html | 39 + .../db/struct.IngotFilesQuery.html | 39 + .../db/struct.IngotModulesQuery.html | 46 + .../db/struct.IngotRootModuleQuery.html | 46 + .../db/struct.InternAttributeLookupQuery.html | 39 + .../db/struct.InternAttributeQuery.html | 39 + ...struct.InternContractFieldLookupQuery.html | 39 + .../db/struct.InternContractFieldQuery.html | 39 + .../db/struct.InternContractLookupQuery.html | 39 + .../db/struct.InternContractQuery.html | 39 + .../db/struct.InternEnumLookupQuery.html | 39 + .../db/struct.InternEnumQuery.html | 39 + .../struct.InternEnumVariantLookupQuery.html | 39 + .../db/struct.InternEnumVariantQuery.html | 39 + .../db/struct.InternFunctionLookupQuery.html | 39 + .../db/struct.InternFunctionQuery.html | 39 + .../struct.InternFunctionSigLookupQuery.html | 39 + .../db/struct.InternFunctionSigQuery.html | 39 + .../db/struct.InternImplLookupQuery.html | 39 + .../db/struct.InternImplQuery.html | 39 + .../db/struct.InternIngotLookupQuery.html | 39 + .../db/struct.InternIngotQuery.html | 39 + .../struct.InternModuleConstLookupQuery.html | 39 + .../db/struct.InternModuleConstQuery.html | 39 + .../db/struct.InternModuleLookupQuery.html | 39 + .../db/struct.InternModuleQuery.html | 39 + .../struct.InternStructFieldLookupQuery.html | 39 + .../db/struct.InternStructFieldQuery.html | 39 + .../db/struct.InternStructLookupQuery.html | 39 + .../db/struct.InternStructQuery.html | 39 + .../db/struct.InternTraitLookupQuery.html | 39 + .../db/struct.InternTraitQuery.html | 39 + .../db/struct.InternTypeAliasLookupQuery.html | 39 + .../db/struct.InternTypeAliasQuery.html | 39 + .../db/struct.InternTypeLookupQuery.html | 39 + .../db/struct.InternTypeQuery.html | 39 + .../db/struct.ModuleAllImplsQuery.html | 46 + .../db/struct.ModuleAllItemsQuery.html | 46 + .../db/struct.ModuleConstantTypeQuery.html | 46 + .../db/struct.ModuleConstantValueQuery.html | 46 + .../db/struct.ModuleConstantsQuery.html | 46 + .../db/struct.ModuleContractsQuery.html | 46 + .../db/struct.ModuleFilePathQuery.html | 46 + .../db/struct.ModuleImplMapQuery.html | 46 + .../db/struct.ModuleIsIncompleteQuery.html | 46 + .../db/struct.ModuleItemMapQuery.html | 46 + .../db/struct.ModuleParentModuleQuery.html | 46 + .../db/struct.ModuleParseQuery.html | 46 + .../db/struct.ModuleStructsQuery.html | 46 + .../db/struct.ModuleSubmodulesQuery.html | 46 + .../db/struct.ModuleTestsQuery.html | 46 + .../db/struct.ModuleUsedItemMapQuery.html | 46 + .../fe_analyzer/db/struct.RootIngotQuery.html | 39 + .../db/struct.StructAllFieldsQuery.html | 46 + .../db/struct.StructAllFunctionsQuery.html | 46 + .../db/struct.StructDependencyGraphQuery.html | 46 + .../db/struct.StructFieldMapQuery.html | 46 + .../db/struct.StructFieldTypeQuery.html | 46 + .../db/struct.StructFunctionMapQuery.html | 46 + .../fe_analyzer/db/struct.TestDb.html | 123 + .../db/struct.TraitAllFunctionsQuery.html | 46 + .../db/struct.TraitFunctionMapQuery.html | 46 + .../db/struct.TraitIsImplementedForQuery.html | 46 + .../db/struct.TypeAliasTypeQuery.html | 46 + .../fe_analyzer/db/trait.AnalyzerDb.html | 318 + compiler-docs/fe_analyzer/display/index.html | 1 + .../fe_analyzer/display/sidebar-items.js | 1 + .../display/struct.DisplayableWrapper.html | 14 + .../display/trait.DisplayWithDb.html | 5 + .../display/trait.Displayable.html | 10 + .../errors/enum.BinaryOperationError.html | 25 + .../errors/enum.IndexingError.html | 22 + .../errors/enum.TypeCoercionError.html | 26 + .../errors/fn.duplicate_name_error.html | 6 + .../fe_analyzer/errors/fn.error.html | 5 + .../fe_analyzer/errors/fn.fancy_error.html | 5 + .../errors/fn.name_conflict_error.html | 7 + .../errors/fn.not_yet_implemented.html | 1 + .../errors/fn.self_contract_type_error.html | 1 + .../fe_analyzer/errors/fn.to_mem_error.html | 1 + .../fe_analyzer/errors/fn.type_error.html | 6 + compiler-docs/fe_analyzer/errors/index.html | 7 + .../fe_analyzer/errors/sidebar-items.js | 1 + .../errors/struct.AlreadyDefined.html | 12 + .../errors/struct.ConstEvalError.html | 33 + .../fe_analyzer/errors/struct.FatalError.html | 16 + .../errors/struct.IncompleteItem.html | 15 + .../fe_analyzer/errors/struct.TypeError.html | 36 + .../fe_analyzer/fn.analyze_ingot.html | 4 + .../fe_analyzer/fn.analyze_module.html | 4 + compiler-docs/fe_analyzer/index.html | 6 + .../fe_analyzer/namespace/index.html | 1 + .../namespace/items/enum.DepLocality.html | 26 + .../namespace/items/enum.EnumVariantKind.html | 29 + .../namespace/items/enum.IngotMode.html | 29 + .../namespace/items/enum.Item.html | 57 + .../namespace/items/enum.ModuleSource.html | 27 + .../namespace/items/enum.TypeDef.html | 41 + .../namespace/items/fn.builtin_items.html | 1 + .../items/fn.walk_local_dependencies.html | 2 + .../fe_analyzer/namespace/items/index.html | 6 + .../namespace/items/sidebar-items.js | 1 + .../namespace/items/struct.Attribute.html | 25 + .../namespace/items/struct.AttributeId.html | 31 + .../namespace/items/struct.Contract.html | 26 + .../namespace/items/struct.ContractField.html | 25 + .../items/struct.ContractFieldId.html | 35 + .../namespace/items/struct.ContractId.html | 61 + .../items/struct.DepGraphWrapper.html | 20 + .../namespace/items/struct.Enum.html | 25 + .../namespace/items/struct.EnumId.html | 41 + .../namespace/items/struct.EnumVariant.html | 26 + .../namespace/items/struct.EnumVariantId.html | 35 + .../namespace/items/struct.Function.html | 30 + .../namespace/items/struct.FunctionId.html | 35 + .../namespace/items/struct.FunctionSig.html | 26 + .../namespace/items/struct.FunctionSigId.html | 40 + .../namespace/items/struct.Impl.html | 27 + .../namespace/items/struct.ImplId.html | 46 + .../namespace/items/struct.Ingot.html | 29 + .../namespace/items/struct.IngotId.html | 53 + .../namespace/items/struct.Module.html | 26 + .../items/struct.ModuleConstant.html | 25 + .../items/struct.ModuleConstantId.html | 38 + .../namespace/items/struct.ModuleId.html | 96 + .../namespace/items/struct.Struct.html | 25 + .../namespace/items/struct.StructField.html | 25 + .../namespace/items/struct.StructFieldId.html | 35 + .../namespace/items/struct.StructId.html | 41 + .../namespace/items/struct.Trait.html | 25 + .../namespace/items/struct.TraitId.html | 38 + .../namespace/items/struct.TypeAlias.html | 25 + .../namespace/items/struct.TypeAliasId.html | 35 + .../namespace/items/trait.DiagnosticSink.html | 7 + .../namespace/items/type.DepGraph.html | 1 + .../namespace/scopes/enum.BlockScopeType.html | 27 + .../namespace/scopes/fn.check_visibility.html | 7 + .../fe_analyzer/namespace/scopes/index.html | 2 + .../namespace/scopes/sidebar-items.js | 1 + .../namespace/scopes/struct.BlockScope.html | 70 + .../scopes/struct.FunctionScope.html | 66 + .../namespace/scopes/struct.ItemScope.html | 65 + .../fe_analyzer/namespace/sidebar-items.js | 1 + .../namespace/types/constant.U256.html | 1 + .../namespace/types/enum.Base.html | 37 + .../namespace/types/enum.GenericArg.html | 25 + .../types/enum.GenericParamKind.html | 26 + .../namespace/types/enum.GenericType.html | 35 + .../namespace/types/enum.Integer.html | 52 + .../namespace/types/enum.TraitOrType.html | 25 + .../namespace/types/enum.Type.html | 48 + .../namespace/types/fn.address_max.html | 1 + .../namespace/types/fn.i256_max.html | 1 + .../namespace/types/fn.i256_min.html | 1 + .../namespace/types/fn.u256_max.html | 1 + .../namespace/types/fn.u256_min.html | 1 + .../fe_analyzer/namespace/types/index.html | 1 + .../namespace/types/sidebar-items.js | 1 + .../namespace/types/struct.Array.html | 25 + .../namespace/types/struct.CtxDecl.html | 25 + .../namespace/types/struct.FeString.html | 34 + .../namespace/types/struct.FunctionParam.html | 30 + .../types/struct.FunctionSignature.html | 31 + .../namespace/types/struct.Generic.html | 34 + .../namespace/types/struct.GenericParam.html | 14 + .../types/struct.GenericTypeIter.html | 221 + .../namespace/types/struct.IntegerIter.html | 221 + .../namespace/types/struct.Map.html | 25 + .../namespace/types/struct.SelfDecl.html | 25 + .../namespace/types/struct.Tuple.html | 24 + .../namespace/types/struct.TypeId.html | 71 + .../namespace/types/trait.SafeNames.html | 6 + .../namespace/types/trait.TypeDowncast.html | 8 + .../enum.ConstructorKind.html | 27 + .../enum.LiteralConstructor.html | 24 + .../enum.SimplifiedPatternKind.html | 30 + .../fe_analyzer/pattern_analysis/index.html | 5 + .../pattern_analysis/sidebar-items.js | 1 + .../struct.PatternMatrix.html | 27 + .../struct.PatternRowVec.html | 26 + .../pattern_analysis/struct.SigmaSet.html | 23 + .../struct.SimplifiedPattern.html | 27 + compiler-docs/fe_analyzer/sidebar-items.js | 1 + .../enum.ConstructorKind.html | 11 + .../enum.LiteralConstructor.html | 11 + .../enum.SimplifiedPatternKind.html | 11 + .../traversal/pattern_analysis/index.html | 11 + .../struct.PatternMatrix.html | 11 + .../struct.PatternRowVec.html | 11 + .../pattern_analysis/struct.SigmaSet.html | 11 + .../struct.SimplifiedPattern.html | 11 + compiler-docs/fe_codegen/all.html | 1 + compiler-docs/fe_codegen/db/index.html | 1 + compiler-docs/fe_codegen/db/sidebar-items.js | 1 + .../db/struct.CodegenAbiContractQuery.html | 46 + .../db/struct.CodegenAbiEventQuery.html | 46 + ...enAbiFunctionArgumentMaximumSizeQuery.html | 46 + .../db/struct.CodegenAbiFunctionQuery.html | 46 + ...egenAbiFunctionReturnMaximumSizeQuery.html | 46 + .../struct.CodegenAbiModuleEventsQuery.html | 46 + ...struct.CodegenAbiTypeMaximumSizeQuery.html | 46 + ...struct.CodegenAbiTypeMinimumSizeQuery.html | 46 + .../db/struct.CodegenAbiTypeQuery.html | 46 + ....CodegenConstantStringSymbolNameQuery.html | 46 + ...odegenContractDeployerSymbolNameQuery.html | 46 + ...struct.CodegenContractSymbolNameQuery.html | 46 + .../db/struct.CodegenDbGroupStorage__.html | 42 + .../db/struct.CodegenDbStorage.html | 12 + ...struct.CodegenFunctionSymbolNameQuery.html | 46 + .../db/struct.CodegenLegalizedBodyQuery.html | 46 + ...struct.CodegenLegalizedSignatureQuery.html | 46 + .../db/struct.CodegenLegalizedTypeQuery.html | 46 + compiler-docs/fe_codegen/db/struct.Db.html | 135 + .../fe_codegen/db/trait.CodegenDb.html | 37 + compiler-docs/fe_codegen/index.html | 1 + compiler-docs/fe_codegen/sidebar-items.js | 1 + compiler-docs/fe_codegen/yul/index.html | 1 + .../fe_codegen/yul/isel/context/index.html | 1 + .../yul/isel/context/sidebar-items.js | 1 + .../yul/isel/context/struct.Context.html | 14 + .../yul/isel/contract/fn.lower_contract.html | 11 + .../fn.lower_contract_deployable.html | 11 + .../yul/isel/fn.lower_contract.html | 1 + .../isel/fn.lower_contract_deployable.html | 4 + .../yul/isel/fn.lower_function.html | 5 + .../fe_codegen/yul/isel/fn.lower_test.html | 1 + .../yul/isel/function/fn.lower_function.html | 11 + compiler-docs/fe_codegen/yul/isel/index.html | 1 + .../fe_codegen/yul/isel/sidebar-items.js | 1 + .../yul/isel/test/fn.lower_test.html | 11 + .../legalize/body/fn.legalize_func_body.html | 11 + .../yul/legalize/fn.legalize_func_body.html | 1 + .../legalize/fn.legalize_func_signature.html | 1 + .../fe_codegen/yul/legalize/index.html | 1 + .../fe_codegen/yul/legalize/sidebar-items.js | 1 + .../signature/fn.legalize_func_signature.html | 11 + .../yul/runtime/enum.AbiSrcLocation.html | 16 + .../fe_codegen/yul/runtime/index.html | 1 + .../fe_codegen/yul/runtime/sidebar-items.js | 1 + .../struct.DefaultRuntimeProvider.html | 144 + .../yul/runtime/trait.RuntimeProvider.html | 296 + compiler-docs/fe_codegen/yul/sidebar-items.js | 1 + compiler-docs/fe_common/all.html | 1 + compiler-docs/fe_common/db/index.html | 1 + compiler-docs/fe_common/db/sidebar-items.js | 1 + .../fe_common/db/struct.FileContentQuery.html | 39 + .../db/struct.FileLineStartsQuery.html | 46 + .../fe_common/db/struct.FileNameQuery.html | 46 + .../db/struct.InternFileLookupQuery.html | 39 + .../fe_common/db/struct.InternFileQuery.html | 39 + .../db/struct.SourceDbGroupStorage__.html | 31 + .../fe_common/db/struct.SourceDbStorage.html | 12 + compiler-docs/fe_common/db/struct.TestDb.html | 32 + .../fe_common/db/trait.SourceDb.html | 33 + compiler-docs/fe_common/db/trait.Upcast.html | 4 + .../fe_common/db/trait.UpcastMut.html | 4 + .../diagnostics/cs/enum.LabelStyle.html | 28 + .../diagnostics/cs/enum.Severity.html | 46 + .../fe_common/diagnostics/cs/index.html | 3 + .../fe_common/diagnostics/cs/sidebar-items.js | 1 + .../diagnostics/cs/struct.Diagnostic.html | 59 + .../diagnostics/cs/struct.Label.html | 52 + .../diagnostics/enum.LabelStyle.html | 25 + .../fe_common/diagnostics/enum.Severity.html | 46 + .../diagnostics/fn.diagnostics_string.html | 5 + .../diagnostics/fn.print_diagnostics.html | 2 + .../fe_common/diagnostics/index.html | 1 + .../fe_common/diagnostics/sidebar-items.js | 1 + .../diagnostics/struct.Diagnostic.html | 27 + .../fe_common/diagnostics/struct.Label.html | 31 + .../fe_common/files/enum.FileKind.html | 27 + .../fe_common/files/enum.Utf8Component.html | 79 + .../fe_common/files/fn.common_prefix.html | 3 + compiler-docs/fe_common/files/index.html | 2 + .../fe_common/files/sidebar-items.js | 1 + .../fe_common/files/struct.File.html | 30 + .../fe_common/files/struct.SourceFileId.html | 33 + .../fe_common/files/struct.Utf8Path.html | 667 + .../fe_common/files/struct.Utf8PathBuf.html | 768 ++ compiler-docs/fe_common/index.html | 2 + .../macro.assert_snapshot_wasm!.html | 11 + .../fe_common/macro.assert_snapshot_wasm.html | 3 + .../fe_common/macro.assert_strings_eq!.html | 11 + .../fe_common/macro.assert_strings_eq.html | 7 + .../fe_common/macro.impl_intern_key!.html | 11 + .../fe_common/macro.impl_intern_key.html | 3 + .../fe_common/numeric/enum.Radix.html | 27 + .../fe_common/numeric/fn.to_hex_str.html | 1 + compiler-docs/fe_common/numeric/index.html | 1 + .../fe_common/numeric/sidebar-items.js | 1 + .../fe_common/numeric/struct.Literal.html | 16 + .../panic/fn.install_panic_hook.html | 1 + compiler-docs/fe_common/panic/index.html | 1 + .../fe_common/panic/sidebar-items.js | 1 + compiler-docs/fe_common/sidebar-items.js | 1 + compiler-docs/fe_common/span/struct.Span.html | 11 + .../fe_common/span/trait.Spanned.html | 11 + compiler-docs/fe_common/struct.Span.html | 37 + compiler-docs/fe_common/trait.Spanned.html | 4 + .../fe_common/utils/dirs/fn.get_fe_deps.html | 1 + .../fe_common/utils/dirs/fn.get_fe_home.html | 1 + compiler-docs/fe_common/utils/dirs/index.html | 1 + .../fe_common/utils/dirs/sidebar-items.js | 1 + .../utils/files/enum.DependencyKind.html | 16 + .../utils/files/enum.FileLoader.html | 14 + .../utils/files/enum.ProjectMode.html | 23 + .../utils/files/fn.get_project_root.html | 2 + .../fe_common/utils/files/index.html | 1 + .../fe_common/utils/files/sidebar-items.js | 1 + .../utils/files/struct.BuildFiles.html | 19 + .../utils/files/struct.Dependency.html | 18 + .../utils/files/struct.GitDependency.html | 16 + .../utils/files/struct.LocalDependency.html | 16 + .../utils/files/struct.ProjectFiles.html | 17 + .../utils/files/trait.DependencyResolver.html | 10 + .../utils/git/fn.fetch_and_checkout.html | 7 + compiler-docs/fe_common/utils/git/index.html | 2 + .../fe_common/utils/git/sidebar-items.js | 1 + .../humanize/fn.pluralize_conditionally.html | 4 + .../fe_common/utils/humanize/index.html | 1 + .../fe_common/utils/humanize/sidebar-items.js | 1 + .../utils/humanize/trait.Pluralizable.html | 6 + compiler-docs/fe_common/utils/index.html | 1 + .../fe_common/utils/keccak/fn.full.html | 2 + .../utils/keccak/fn.full_as_bytes.html | 2 + .../fe_common/utils/keccak/fn.partial.html | 2 + .../utils/keccak/fn.partial_right_padded.html | 3 + .../fe_common/utils/keccak/index.html | 2 + .../fe_common/utils/keccak/sidebar-items.js | 1 + .../utils/ron/fn.to_ron_string_pretty.html | 4 + compiler-docs/fe_common/utils/ron/index.html | 2 + .../fe_common/utils/ron/sidebar-items.js | 1 + .../fe_common/utils/ron/struct.Diff.html | 13 + .../fe_common/utils/sidebar-items.js | 1 + compiler-docs/fe_compiler_test_utils/all.html | 1 + .../constant.DEFAULT_CALLER.html | 1 + .../fe_compiler_test_utils/fn.address.html | 1 + .../fn.address_array_token.html | 1 + .../fn.address_token.html | 1 + .../fe_compiler_test_utils/fn.bool_token.html | 1 + .../fn.bytes_token.html | 1 + .../fn.encode_error_reason.html | 1 + .../fn.encode_revert.html | 1 + .../fn.encoded_div_or_mod_by_zero.html | 1 + .../fn.encoded_invalid_abi_data.html | 1 + .../fn.encoded_over_or_underflow.html | 1 + .../fn.encoded_panic_assert.html | 1 + .../fn.encoded_panic_out_of_bounds.html | 1 + .../fn.get_2s_complement_for_negative.html | 3 + .../fn.int_array_token.html | 1 + .../fe_compiler_test_utils/fn.int_token.html | 1 + .../fn.load_contract.html | 5 + .../fn.string_token.html | 1 + .../fn.to_2s_complement.html | 1 + .../fn.tuple_token.html | 1 + .../fn.uint_array_token.html | 1 + .../fe_compiler_test_utils/fn.uint_token.html | 1 + .../fn.uint_token_from_dec_str.html | 1 + .../fn.validate_return.html | 4 + .../fn.validate_revert.html | 4 + .../fn.with_executor.html | 1 + .../fn.with_executor_backend.html | 4 + .../fe_compiler_test_utils/index.html | 2 + .../macro.assert_harness_gas_report!.html | 11 + .../macro.assert_harness_gas_report.html | 4 + .../fe_compiler_test_utils/sidebar-items.js | 1 + .../struct.ContractHarness.html | 143 + .../struct.ExecutionOutput.html | 95 + .../struct.GasRecord.html | 94 + .../struct.GasReporter.html | 97 + .../struct.NumericAbiTokenBounds.html | 97 + .../struct.Runtime.html | 95 + .../struct.SolidityCompileError.html | 92 + .../trait.ToBeBytes.html | 4 + .../fe_compiler_test_utils/type.Backend.html | 1 + .../fe_compiler_test_utils/type.Executor.html | 1 + .../type.StackState.html | 1 + compiler-docs/fe_compiler_tests/all.html | 1 + compiler-docs/fe_compiler_tests/index.html | 1 + .../fe_compiler_tests/sidebar-items.js | 1 + .../fe_compiler_tests_legacy/all.html | 1 + .../fe_compiler_tests_legacy/index.html | 1 + .../fe_compiler_tests_legacy/sidebar-items.js | 1 + compiler-docs/fe_driver/all.html | 1 + compiler-docs/fe_driver/fn.check_ingot.html | 1 + .../fe_driver/fn.check_single_file.html | 1 + compiler-docs/fe_driver/fn.compile_ingot.html | 10 + .../fe_driver/fn.compile_single_file.html | 8 + .../fe_driver/fn.dump_mir_single_file.html | 6 + compiler-docs/fe_driver/index.html | 1 + compiler-docs/fe_driver/sidebar-items.js | 1 + .../fe_driver/struct.CompileError.html | 91 + .../fe_driver/struct.CompiledContract.html | 96 + .../fe_driver/struct.CompiledModule.html | 96 + compiler-docs/fe_driver/struct.Db.html | 210 + compiler-docs/fe_driver/trait.CodegenDb.html | 37 + compiler-docs/fe_library/all.html | 1 + compiler-docs/fe_library/constant.STD.html | 1 + .../fe_library/fn.static_dir_files.html | 3 + .../fe_library/fn.std_src_files.html | 1 + compiler-docs/fe_library/index.html | 1 + compiler-docs/fe_library/sidebar-items.js | 1 + compiler-docs/fe_mir/all.html | 1 + compiler-docs/fe_mir/analysis/cfg/index.html | 1 + .../fe_mir/analysis/cfg/sidebar-items.js | 1 + .../analysis/cfg/struct.CfgPostOrder.html | 209 + .../analysis/cfg/struct.ControlFlowGraph.html | 20 + .../fe_mir/analysis/domtree/index.html | 4 + .../fe_mir/analysis/domtree/sidebar-items.js | 1 + .../fe_mir/analysis/domtree/struct.DFSet.html | 17 + .../analysis/domtree/struct.DomTree.html | 25 + compiler-docs/fe_mir/analysis/index.html | 1 + .../fe_mir/analysis/loop_tree/index.html | 1 + .../analysis/loop_tree/sidebar-items.js | 1 + .../struct.BlocksInLoopPostOrder.html | 209 + .../analysis/loop_tree/struct.Loop.html | 27 + .../analysis/loop_tree/struct.LoopTree.html | 27 + .../analysis/loop_tree/type.LoopId.html | 1 + .../analysis/post_domtree/enum.PostIDom.html | 24 + .../fe_mir/analysis/post_domtree/index.html | 2 + .../analysis/post_domtree/sidebar-items.js | 1 + .../post_domtree/struct.PostDomTree.html | 12 + .../fe_mir/analysis/sidebar-items.js | 1 + compiler-docs/fe_mir/db/index.html | 1 + compiler-docs/fe_mir/db/sidebar-items.js | 1 + .../fe_mir/db/struct.MirDbGroupStorage__.html | 42 + .../fe_mir/db/struct.MirDbStorage.html | 12 + .../db/struct.MirInternConstLookupQuery.html | 39 + .../fe_mir/db/struct.MirInternConstQuery.html | 39 + .../struct.MirInternFunctionLookupQuery.html | 39 + .../db/struct.MirInternFunctionQuery.html | 39 + .../db/struct.MirInternTypeLookupQuery.html | 39 + .../fe_mir/db/struct.MirInternTypeQuery.html | 39 + ...uct.MirLowerContractAllFunctionsQuery.html | 46 + .../struct.MirLowerEnumAllFunctionsQuery.html | 46 + ...truct.MirLowerModuleAllFunctionsQuery.html | 46 + ...truct.MirLowerStructAllFunctionsQuery.html | 46 + .../db/struct.MirLoweredConstantQuery.html | 46 + .../db/struct.MirLoweredFuncBodyQuery.html | 46 + .../struct.MirLoweredFuncSignatureQuery.html | 46 + ...oweredMonomorphizedFuncSignatureQuery.html | 46 + ...PseudoMonomorphizedFuncSignatureQuery.html | 46 + .../fe_mir/db/struct.MirLoweredTypeQuery.html | 46 + compiler-docs/fe_mir/db/struct.NewDb.html | 134 + compiler-docs/fe_mir/db/trait.MirDb.html | 54 + .../fe_mir/graphviz/fn.write_mir_graphs.html | 6 + compiler-docs/fe_mir/graphviz/index.html | 1 + .../fe_mir/graphviz/sidebar-items.js | 1 + compiler-docs/fe_mir/index.html | 1 + .../fe_mir/ir/basic_block/index.html | 1 + .../fe_mir/ir/basic_block/sidebar-items.js | 1 + .../ir/basic_block/struct.BasicBlock.html | 22 + .../ir/basic_block/type.BasicBlockId.html | 1 + .../fe_mir/ir/body_builder/index.html | 1 + .../fe_mir/ir/body_builder/sidebar-items.js | 1 + .../ir/body_builder/struct.BodyBuilder.html | 104 + .../ir/body_cursor/enum.CursorLocation.html | 26 + .../fe_mir/ir/body_cursor/index.html | 3 + .../fe_mir/ir/body_cursor/sidebar-items.js | 1 + .../ir/body_cursor/struct.BodyCursor.html | 35 + compiler-docs/fe_mir/ir/body_order/index.html | 1 + .../fe_mir/ir/body_order/sidebar-items.js | 1 + .../ir/body_order/struct.BodyOrder.html | 132 + .../ir/constant/enum.ConstantValue.html | 26 + compiler-docs/fe_mir/ir/constant/index.html | 1 + .../fe_mir/ir/constant/sidebar-items.js | 1 + .../fe_mir/ir/constant/struct.Constant.html | 33 + .../fe_mir/ir/constant/struct.ConstantId.html | 23 + .../fe_mir/ir/function/enum.Linkage.html | 31 + compiler-docs/fe_mir/ir/function/index.html | 3 + .../fe_mir/ir/function/sidebar-items.js | 1 + .../ir/function/struct.BodyDataStore.html | 29 + .../ir/function/struct.FunctionBody.html | 28 + .../fe_mir/ir/function/struct.FunctionId.html | 33 + .../ir/function/struct.FunctionParam.html | 26 + .../ir/function/struct.FunctionSignature.html | 30 + compiler-docs/fe_mir/ir/index.html | 3 + compiler-docs/fe_mir/ir/inst/enum.BinOp.html | 43 + .../fe_mir/ir/inst/enum.BranchInfo.html | 16 + .../fe_mir/ir/inst/enum.CallType.html | 26 + .../fe_mir/ir/inst/enum.CastKind.html | 27 + .../fe_mir/ir/inst/enum.InstKind.html | 121 + .../fe_mir/ir/inst/enum.IterBase.html | 231 + .../fe_mir/ir/inst/enum.IterMutBase.html | 217 + compiler-docs/fe_mir/ir/inst/enum.UnOp.html | 30 + .../fe_mir/ir/inst/enum.YulIntrinsicOp.html | 100 + compiler-docs/fe_mir/ir/inst/index.html | 1 + compiler-docs/fe_mir/ir/inst/sidebar-items.js | 1 + compiler-docs/fe_mir/ir/inst/struct.Inst.html | 29 + .../fe_mir/ir/inst/struct.SwitchTable.html | 22 + .../fe_mir/ir/inst/type.BlockIter.html | 6 + compiler-docs/fe_mir/ir/inst/type.InstId.html | 6 + .../fe_mir/ir/inst/type.ValueIter.html | 6 + .../fe_mir/ir/inst/type.ValueIterMut.html | 6 + compiler-docs/fe_mir/ir/sidebar-items.js | 1 + .../fe_mir/ir/struct.SourceInfo.html | 27 + .../fe_mir/ir/types/enum.TypeKind.html | 47 + compiler-docs/fe_mir/ir/types/index.html | 1 + .../fe_mir/ir/types/sidebar-items.js | 1 + .../fe_mir/ir/types/struct.ArrayDef.html | 26 + .../fe_mir/ir/types/struct.EnumDef.html | 28 + .../fe_mir/ir/types/struct.EnumVariant.html | 27 + .../fe_mir/ir/types/struct.EventDef.html | 28 + .../fe_mir/ir/types/struct.MapDef.html | 26 + .../fe_mir/ir/types/struct.StructDef.html | 28 + .../fe_mir/ir/types/struct.TupleDef.html | 25 + .../fe_mir/ir/types/struct.Type.html | 25 + .../fe_mir/ir/types/struct.TypeId.html | 40 + .../fe_mir/ir/value/enum.AssignableValue.html | 37 + compiler-docs/fe_mir/ir/value/enum.Value.html | 44 + compiler-docs/fe_mir/ir/value/index.html | 1 + .../fe_mir/ir/value/sidebar-items.js | 1 + .../fe_mir/ir/value/struct.Local.html | 31 + .../fe_mir/ir/value/type.ValueId.html | 6 + compiler-docs/fe_mir/pretty_print/index.html | 1 + .../fe_mir/pretty_print/sidebar-items.js | 1 + .../pretty_print/trait.PrettyPrint.html | 22 + compiler-docs/fe_mir/sidebar-items.js | 1 + compiler-docs/fe_parser/all.html | 1 + .../fe_parser/ast/enum.BinOperator.html | 38 + .../fe_parser/ast/enum.BoolOperator.html | 29 + .../fe_parser/ast/enum.CompOperator.html | 33 + .../fe_parser/ast/enum.ContractStmt.html | 28 + compiler-docs/fe_parser/ast/enum.Expr.html | 80 + .../fe_parser/ast/enum.FuncStmt.html | 81 + .../fe_parser/ast/enum.FunctionArg.html | 36 + .../fe_parser/ast/enum.GenericArg.html | 30 + .../fe_parser/ast/enum.GenericParameter.html | 32 + .../fe_parser/ast/enum.LiteralPattern.html | 28 + .../fe_parser/ast/enum.ModuleStmt.html | 39 + compiler-docs/fe_parser/ast/enum.Pattern.html | 48 + .../fe_parser/ast/enum.TypeDesc.html | 40 + .../fe_parser/ast/enum.UnaryOperator.html | 30 + compiler-docs/fe_parser/ast/enum.UseTree.html | 38 + .../fe_parser/ast/enum.VarDeclTarget.html | 29 + .../fe_parser/ast/enum.VariantKind.html | 39 + compiler-docs/fe_parser/ast/index.html | 1 + compiler-docs/fe_parser/ast/sidebar-items.js | 1 + .../fe_parser/ast/struct.CallArg.html | 29 + .../fe_parser/ast/struct.ConstantDecl.html | 31 + .../fe_parser/ast/struct.Contract.html | 31 + compiler-docs/fe_parser/ast/struct.Enum.html | 31 + compiler-docs/fe_parser/ast/struct.Field.html | 34 + .../fe_parser/ast/struct.Function.html | 29 + .../ast/struct.FunctionSignature.html | 32 + compiler-docs/fe_parser/ast/struct.Impl.html | 30 + .../fe_parser/ast/struct.MatchArm.html | 29 + .../fe_parser/ast/struct.Module.html | 28 + compiler-docs/fe_parser/ast/struct.Path.html | 28 + .../fe_parser/ast/struct.Pragma.html | 28 + .../fe_parser/ast/struct.SmolStr.html | 1368 ++ .../fe_parser/ast/struct.Struct.html | 31 + compiler-docs/fe_parser/ast/struct.Trait.html | 30 + .../fe_parser/ast/struct.TypeAlias.html | 30 + compiler-docs/fe_parser/ast/struct.Use.html | 28 + .../fe_parser/ast/struct.Variant.html | 30 + compiler-docs/fe_parser/fn.parse_file.html | 11 + .../contracts/fn.parse_contract_def.html | 7 + .../fe_parser/grammar/contracts/index.html | 1 + .../grammar/contracts/sidebar-items.js | 1 + .../expressions/fn.parse_call_args.html | 4 + .../grammar/expressions/fn.parse_expr.html | 2 + .../fn.parse_expr_with_min_bp.html | 6 + .../fe_parser/grammar/expressions/index.html | 2 + .../grammar/expressions/sidebar-items.js | 1 + .../functions/fn.parse_assert_stmt.html | 4 + .../grammar/functions/fn.parse_fn_def.html | 6 + .../grammar/functions/fn.parse_fn_sig.html | 7 + .../grammar/functions/fn.parse_for_stmt.html | 4 + .../functions/fn.parse_generic_param.html | 5 + .../functions/fn.parse_generic_params.html | 5 + .../grammar/functions/fn.parse_if_stmt.html | 4 + .../functions/fn.parse_match_arms.html | 3 + .../functions/fn.parse_match_stmt.html | 4 + .../grammar/functions/fn.parse_pattern.html | 1 + .../functions/fn.parse_return_stmt.html | 4 + .../functions/fn.parse_revert_stmt.html | 4 + .../functions/fn.parse_single_word_stmt.html | 6 + .../grammar/functions/fn.parse_stmt.html | 2 + .../functions/fn.parse_unsafe_block.html | 4 + .../functions/fn.parse_while_stmt.html | 4 + .../fe_parser/grammar/functions/index.html | 6 + .../grammar/functions/sidebar-items.js | 1 + compiler-docs/fe_parser/grammar/index.html | 1 + .../grammar/module/fn.parse_constant.html | 7 + .../grammar/module/fn.parse_module.html | 2 + .../grammar/module/fn.parse_module_stmt.html | 2 + .../grammar/module/fn.parse_pragma.html | 2 + .../grammar/module/fn.parse_use.html | 4 + .../grammar/module/fn.parse_use_tree.html | 2 + .../fe_parser/grammar/module/index.html | 1 + .../fe_parser/grammar/module/sidebar-items.js | 1 + .../fe_parser/grammar/sidebar-items.js | 1 + .../grammar/types/fn.parse_enum_def.html | 7 + .../grammar/types/fn.parse_field.html | 8 + .../grammar/types/fn.parse_generic_args.html | 7 + .../grammar/types/fn.parse_impl_def.html | 4 + .../grammar/types/fn.parse_opt_qualifier.html | 2 + .../grammar/types/fn.parse_path_tail.html | 5 + .../grammar/types/fn.parse_struct_def.html | 7 + .../grammar/types/fn.parse_trait_def.html | 7 + .../grammar/types/fn.parse_type_alias.html | 7 + .../grammar/types/fn.parse_type_desc.html | 2 + .../grammar/types/fn.parse_variant.html | 4 + .../fe_parser/grammar/types/index.html | 3 + .../fe_parser/grammar/types/sidebar-items.js | 1 + compiler-docs/fe_parser/index.html | 3 + .../fe_parser/lexer/enum.TokenKind.html | 121 + compiler-docs/fe_parser/lexer/index.html | 1 + .../fe_parser/lexer/sidebar-items.js | 1 + .../fe_parser/lexer/struct.Lexer.html | 195 + .../fe_parser/lexer/struct.Token.html | 24 + .../fe_parser/lexer/token/enum.TokenKind.html | 11 + .../fe_parser/lexer/token/struct.Token.html | 11 + compiler-docs/fe_parser/node/index.html | 1 + compiler-docs/fe_parser/node/sidebar-items.js | 1 + compiler-docs/fe_parser/node/struct.Node.html | 38 + .../fe_parser/node/struct.NodeId.html | 30 + compiler-docs/fe_parser/node/struct.Span.html | 43 + .../fe_parser/node/trait.Spanned.html | 4 + .../fe_parser/parser/struct.Label.html | 11 + .../fe_parser/parser/struct.ParseFailed.html | 11 + .../fe_parser/parser/struct.Parser.html | 11 + .../fe_parser/parser/type.ParseResult.html | 11 + compiler-docs/fe_parser/sidebar-items.js | 1 + compiler-docs/fe_parser/struct.Label.html | 34 + .../fe_parser/struct.ParseFailed.html | 23 + compiler-docs/fe_parser/struct.Parser.html | 81 + compiler-docs/fe_parser/type.ParseResult.html | 6 + compiler-docs/fe_test_files/all.html | 1 + compiler-docs/fe_test_files/fn.fixture.html | 1 + .../fe_test_files/fn.fixture_bytes.html | 1 + .../fe_test_files/fn.fixture_dir.html | 1 + .../fe_test_files/fn.fixture_dir_files.html | 2 + .../fn.new_fixture_dir_files.html | 2 + compiler-docs/fe_test_files/index.html | 1 + compiler-docs/fe_test_files/sidebar-items.js | 1 + compiler-docs/fe_test_runner/all.html | 1 + compiler-docs/fe_test_runner/fn.execute.html | 6 + compiler-docs/fe_test_runner/index.html | 1 + compiler-docs/fe_test_runner/sidebar-items.js | 1 + .../fe_test_runner/struct.TestSink.html | 92 + compiler-docs/fe_yulc/all.html | 1 + compiler-docs/fe_yulc/fn.compile.html | 6 + .../fe_yulc/fn.compile_single_contract.html | 7 + compiler-docs/fe_yulc/index.html | 1 + compiler-docs/fe_yulc/sidebar-items.js | 1 + .../fe_yulc/struct.ContractBytecode.html | 14 + compiler-docs/fe_yulc/struct.YulcError.html | 11 + compiler-docs/help.html | 1 + compiler-docs/search-index.js | 4 + compiler-docs/search.desc/fe/fe-desc-0-.js | 1 + .../search.desc/fe_abi/fe_abi-desc-0-.js | 1 + .../fe_analyzer/fe_analyzer-desc-0-.js | 1 + .../fe_codegen/fe_codegen-desc-0-.js | 1 + .../fe_common/fe_common-desc-0-.js | 1 + .../fe_compiler_test_utils-desc-0-.js | 1 + .../fe_compiler_tests-desc-0-.js | 1 + .../fe_compiler_tests_legacy-desc-0-.js | 1 + .../fe_driver/fe_driver-desc-0-.js | 1 + .../fe_library/fe_library-desc-0-.js | 1 + .../search.desc/fe_mir/fe_mir-desc-0-.js | 1 + .../fe_parser/fe_parser-desc-0-.js | 1 + .../fe_test_files/fe_test_files-desc-0-.js | 1 + .../fe_test_runner/fe_test_runner-desc-0-.js | 1 + .../search.desc/fe_yulc/fe_yulc-desc-0-.js | 1 + compiler-docs/settings.html | 1 + compiler-docs/src-files.js | 2 + compiler-docs/src/fe/main.rs.html | 38 + compiler-docs/src/fe/task/build.rs.html | 278 + compiler-docs/src/fe/task/check.rs.html | 59 + compiler-docs/src/fe/task/mod.rs.html | 26 + compiler-docs/src/fe/task/new.rs.html | 49 + compiler-docs/src/fe_abi/contract.rs.html | 33 + compiler-docs/src/fe_abi/event.rs.html | 148 + compiler-docs/src/fe_abi/function.rs.html | 307 + compiler-docs/src/fe_abi/lib.rs.html | 4 + compiler-docs/src/fe_abi/types.rs.html | 374 + .../src/fe_analyzer/builtins.rs.html | 154 + .../src/fe_analyzer/constants.rs.html | 4 + compiler-docs/src/fe_analyzer/context.rs.html | 595 + compiler-docs/src/fe_analyzer/db.rs.html | 238 + .../src/fe_analyzer/db/queries.rs.html | 9 + .../fe_analyzer/db/queries/contracts.rs.html | 403 + .../src/fe_analyzer/db/queries/enums.rs.html | 241 + .../fe_analyzer/db/queries/functions.rs.html | 501 + .../src/fe_analyzer/db/queries/impls.rs.html | 54 + .../src/fe_analyzer/db/queries/ingots.rs.html | 83 + .../src/fe_analyzer/db/queries/module.rs.html | 762 ++ .../fe_analyzer/db/queries/structs.rs.html | 279 + .../src/fe_analyzer/db/queries/traits.rs.html | 62 + .../src/fe_analyzer/db/queries/types.rs.html | 73 + compiler-docs/src/fe_analyzer/display.rs.html | 41 + compiler-docs/src/fe_analyzer/errors.rs.html | 297 + compiler-docs/src/fe_analyzer/lib.rs.html | 42 + .../src/fe_analyzer/namespace/items.rs.html | 2167 ++++ .../src/fe_analyzer/namespace/mod.rs.html | 3 + .../src/fe_analyzer/namespace/scopes.rs.html | 700 + .../src/fe_analyzer/namespace/types.rs.html | 854 ++ .../src/fe_analyzer/operations.rs.html | 179 + .../fe_analyzer/traversal/assignments.rs.html | 143 + .../fe_analyzer/traversal/borrowck.rs.html | 110 + .../fe_analyzer/traversal/call_args.rs.html | 228 + .../fe_analyzer/traversal/const_expr.rs.html | 370 + .../traversal/declarations.rs.html | 174 + .../fe_analyzer/traversal/expressions.rs.html | 2214 ++++ .../fe_analyzer/traversal/functions.rs.html | 753 ++ .../traversal/matching_anomaly.rs.html | 101 + .../src/fe_analyzer/traversal/mod.rs.html | 14 + .../traversal/pattern_analysis.rs.html | 753 ++ .../src/fe_analyzer/traversal/pragma.rs.html | 31 + .../src/fe_analyzer/traversal/types.rs.html | 654 + .../src/fe_analyzer/traversal/utils.rs.html | 61 + compiler-docs/src/fe_codegen/db.rs.html | 100 + .../src/fe_codegen/db/queries.rs.html | 5 + .../src/fe_codegen/db/queries/abi.rs.html | 279 + .../fe_codegen/db/queries/constant.rs.html | 12 + .../fe_codegen/db/queries/contract.rs.html | 20 + .../fe_codegen/db/queries/function.rs.html | 76 + .../src/fe_codegen/db/queries/types.rs.html | 102 + compiler-docs/src/fe_codegen/lib.rs.html | 2 + .../src/fe_codegen/yul/isel/context.rs.html | 81 + .../src/fe_codegen/yul/isel/contract.rs.html | 289 + .../src/fe_codegen/yul/isel/function.rs.html | 978 ++ .../fe_codegen/yul/isel/inst_order.rs.html | 1368 ++ .../src/fe_codegen/yul/isel/mod.rs.html | 9 + .../src/fe_codegen/yul/isel/test.rs.html | 70 + .../src/fe_codegen/yul/legalize/body.rs.html | 219 + .../yul/legalize/critical_edge.rs.html | 121 + .../src/fe_codegen/yul/legalize/mod.rs.html | 6 + .../fe_codegen/yul/legalize/signature.rs.html | 27 + compiler-docs/src/fe_codegen/yul/mod.rs.html | 26 + .../src/fe_codegen/yul/runtime/abi.rs.html | 950 ++ .../fe_codegen/yul/runtime/contract.rs.html | 127 + .../src/fe_codegen/yul/runtime/data.rs.html | 461 + .../src/fe_codegen/yul/runtime/emit.rs.html | 74 + .../src/fe_codegen/yul/runtime/mod.rs.html | 828 ++ .../src/fe_codegen/yul/runtime/revert.rs.html | 90 + .../fe_codegen/yul/runtime/safe_math.rs.html | 628 + .../src/fe_codegen/yul/slot_size.rs.html | 16 + compiler-docs/src/fe_common/db.rs.html | 49 + .../src/fe_common/diagnostics.rs.html | 145 + compiler-docs/src/fe_common/files.rs.html | 132 + compiler-docs/src/fe_common/lib.rs.html | 26 + compiler-docs/src/fe_common/numeric.rs.html | 98 + compiler-docs/src/fe_common/panic.rs.html | 24 + compiler-docs/src/fe_common/span.rs.html | 153 + .../src/fe_common/utils/dirs.rs.html | 26 + .../src/fe_common/utils/files.rs.html | 416 + compiler-docs/src/fe_common/utils/git.rs.html | 68 + .../src/fe_common/utils/humanize.rs.html | 44 + .../src/fe_common/utils/keccak.rs.html | 36 + compiler-docs/src/fe_common/utils/mod.rs.html | 6 + compiler-docs/src/fe_common/utils/ron.rs.html | 92 + .../src/fe_compiler_test_utils/lib.rs.html | 901 ++ .../src/fe_compiler_tests/lib.rs.html | 68 + .../src/fe_compiler_tests_legacy/lib.rs.html | 18 + compiler-docs/src/fe_driver/lib.rs.html | 359 + compiler-docs/src/fe_library/lib.rs.html | 27 + compiler-docs/src/fe_mir/analysis/cfg.rs.html | 164 + .../src/fe_mir/analysis/domtree.rs.html | 343 + .../src/fe_mir/analysis/loop_tree.rs.html | 347 + compiler-docs/src/fe_mir/analysis/mod.rs.html | 9 + .../src/fe_mir/analysis/post_domtree.rs.html | 284 + compiler-docs/src/fe_mir/db.rs.html | 104 + compiler-docs/src/fe_mir/db/queries.rs.html | 7 + .../src/fe_mir/db/queries/constant.rs.html | 43 + .../src/fe_mir/db/queries/contract.rs.html | 17 + .../src/fe_mir/db/queries/enums.rs.html | 17 + .../src/fe_mir/db/queries/function.rs.html | 130 + .../src/fe_mir/db/queries/module.rs.html | 35 + .../src/fe_mir/db/queries/structs.rs.html | 17 + .../src/fe_mir/db/queries/types.rs.html | 657 + .../src/fe_mir/graphviz/block.rs.html | 62 + .../src/fe_mir/graphviz/function.rs.html | 78 + compiler-docs/src/fe_mir/graphviz/mod.rs.html | 22 + .../src/fe_mir/graphviz/module.rs.html | 158 + .../src/fe_mir/ir/basic_block.rs.html | 6 + .../src/fe_mir/ir/body_builder.rs.html | 381 + .../src/fe_mir/ir/body_cursor.rs.html | 231 + .../src/fe_mir/ir/body_order.rs.html | 473 + compiler-docs/src/fe_mir/ir/constant.rs.html | 47 + compiler-docs/src/fe_mir/ir/function.rs.html | 275 + compiler-docs/src/fe_mir/ir/inst.rs.html | 764 ++ compiler-docs/src/fe_mir/ir/mod.rs.html | 49 + compiler-docs/src/fe_mir/ir/types.rs.html | 120 + compiler-docs/src/fe_mir/ir/value.rs.html | 142 + compiler-docs/src/fe_mir/lib.rs.html | 7 + .../src/fe_mir/lower/function.rs.html | 1367 ++ compiler-docs/src/fe_mir/lower/mod.rs.html | 4 + .../lower/pattern_match/decision_tree.rs.html | 576 + .../fe_mir/lower/pattern_match/mod.rs.html | 326 + .../lower/pattern_match/tree_vis.rs.html | 150 + compiler-docs/src/fe_mir/lower/types.rs.html | 194 + .../src/fe_mir/pretty_print/inst.rs.html | 206 + .../src/fe_mir/pretty_print/mod.rs.html | 22 + .../src/fe_mir/pretty_print/types.rs.html | 19 + .../src/fe_mir/pretty_print/value.rs.html | 81 + compiler-docs/src/fe_parser/ast.rs.html | 1421 +++ compiler-docs/src/fe_parser/grammar.rs.html | 5 + .../src/fe_parser/grammar/contracts.rs.html | 91 + .../src/fe_parser/grammar/expressions.rs.html | 677 + .../src/fe_parser/grammar/functions.rs.html | 914 ++ .../src/fe_parser/grammar/module.rs.html | 281 + .../src/fe_parser/grammar/types.rs.html | 680 + compiler-docs/src/fe_parser/lexer.rs.html | 102 + .../src/fe_parser/lexer/token.rs.html | 316 + compiler-docs/src/fe_parser/lib.rs.html | 30 + compiler-docs/src/fe_parser/node.rs.html | 66 + compiler-docs/src/fe_parser/parser.rs.html | 429 + compiler-docs/src/fe_test_files/lib.rs.html | 44 + compiler-docs/src/fe_test_runner/lib.rs.html | 191 + compiler-docs/src/fe_yulc/lib.rs.html | 96 + .../static.files/COPYRIGHT-7fb11f4e.txt | 71 + .../FiraMono-Medium-86f75c8c.woff2 | Bin 0 -> 64572 bytes .../FiraMono-Regular-87c26294.woff2 | Bin 0 -> 64868 bytes .../FiraSans-Italic-81dc35de.woff2 | Bin 0 -> 136300 bytes .../FiraSans-LICENSE-05ab6dbd.txt | 98 + .../FiraSans-Medium-e1aa3f0a.woff2 | Bin 0 -> 132780 bytes .../FiraSans-MediumItalic-ccf7e434.woff2 | Bin 0 -> 140588 bytes .../FiraSans-Regular-0fe48ade.woff2 | Bin 0 -> 129188 bytes .../static.files/LICENSE-APACHE-a60eea81.txt | 201 + .../static.files/LICENSE-MIT-23f18e03.txt | 23 + .../NanumBarunGothic-13b3dcba.ttf.woff2 | Bin 0 -> 399468 bytes .../NanumBarunGothic-LICENSE-a37d393b.txt | 103 + .../SourceCodePro-It-fc8b9304.ttf.woff2 | Bin 0 -> 44896 bytes .../SourceCodePro-LICENSE-67f54ca7.txt | 97 + .../SourceCodePro-Regular-8badfe75.ttf.woff2 | Bin 0 -> 52228 bytes .../SourceCodePro-Semibold-aa29a496.ttf.woff2 | Bin 0 -> 52348 bytes .../SourceSerif4-Bold-6d4fd4c0.ttf.woff2 | Bin 0 -> 81540 bytes .../SourceSerif4-It-ca3b17ed.ttf.woff2 | Bin 0 -> 59716 bytes .../SourceSerif4-LICENSE-a2cfd9d5.md | 98 + .../SourceSerif4-Regular-6b053e98.ttf.woff2 | Bin 0 -> 76260 bytes .../SourceSerif4-Semibold-457a13ac.ttf.woff2 | Bin 0 -> 80732 bytes .../static.files/favicon-044be391.svg | 24 + .../static.files/favicon-32x32-6580c154.png | Bin 0 -> 1125 bytes compiler-docs/static.files/main-eebb9057.js | 11 + .../static.files/normalize-9960930a.css | 2 + .../static.files/noscript-32bb7600.css | 1 + .../static.files/rust-logo-9a9549ea.svg | 61 + .../static.files/rustdoc-aa0817cf.css | 59 + .../static.files/scrape-examples-5e967b76.js | 1 + compiler-docs/static.files/search-fa3e91e5.js | 6 + .../static.files/settings-5514c975.js | 17 + .../static.files/src-script-813739b1.js | 1 + .../static.files/storage-68b7e25d.js | 25 + .../trait.impl/clap/derive/trait.Args.js | 9 + .../clap/derive/trait.CommandFactory.js | 9 + .../clap/derive/trait.FromArgMatches.js | 9 + .../trait.impl/clap/derive/trait.Parser.js | 9 + .../clap/derive/trait.Subcommand.js | 9 + .../trait.impl/clap/derive/trait.ValueEnum.js | 9 + .../trait.impl/core/clone/trait.Clone.js | 9 + compiler-docs/trait.impl/core/cmp/trait.Eq.js | 9 + .../trait.impl/core/cmp/trait.Ord.js | 9 + .../trait.impl/core/cmp/trait.PartialEq.js | 9 + .../trait.impl/core/cmp/trait.PartialOrd.js | 9 + .../trait.impl/core/convert/trait.AsRef.js | 9 + .../trait.impl/core/convert/trait.From.js | 9 + .../trait.impl/core/convert/trait.TryFrom.js | 9 + .../trait.impl/core/default/trait.Default.js | 9 + .../trait.impl/core/error/trait.Error.js | 9 + .../trait.impl/core/fmt/trait.Debug.js | 9 + .../trait.impl/core/fmt/trait.Display.js | 9 + .../trait.impl/core/hash/trait.Hash.js | 9 + .../iter/traits/collect/trait.IntoIterator.js | 9 + .../double_ended/trait.DoubleEndedIterator.js | 9 + .../exact_size/trait.ExactSizeIterator.js | 9 + .../iter/traits/iterator/trait.Iterator.js | 9 + .../trait.impl/core/marker/trait.Copy.js | 9 + .../trait.impl/core/marker/trait.Freeze.js | 9 + .../trait.impl/core/marker/trait.Send.js | 9 + .../core/marker/trait.StructuralPartialEq.js | 9 + .../trait.impl/core/marker/trait.Sync.js | 9 + .../trait.impl/core/marker/trait.Unpin.js | 9 + .../core/marker/trait.UnsafeUnpin.js | 9 + .../trait.impl/core/ops/arith/trait.Add.js | 9 + .../core/ops/arith/trait.AddAssign.js | 9 + .../panic/unwind_safe/trait.RefUnwindSafe.js | 9 + .../panic/unwind_safe/trait.UnwindSafe.js | 9 + .../core/str/traits/trait.FromStr.js | 9 + .../context/trait.AnalyzerContext.js | 9 + .../fe_analyzer/db/trait.AnalyzerDb.js | 9 + .../display/trait.DisplayWithDb.js | 9 + .../fe_analyzer/display/trait.Displayable.js | 9 + .../namespace/items/trait.DiagnosticSink.js | 9 + .../namespace/types/trait.TypeDowncast.js | 9 + .../fe_codegen/db/trait.CodegenDb.js | 9 + .../yul/runtime/trait.RuntimeProvider.js | 9 + .../trait.impl/fe_common/db/trait.SourceDb.js | 9 + .../trait.impl/fe_common/db/trait.Upcast.js | 9 + .../fe_common/db/trait.UpcastMut.js | 9 + .../fe_common/span/trait.Spanned.js | 9 + .../utils/files/trait.DependencyResolver.js | 9 + .../utils/humanize/trait.Pluralizable.js | 9 + .../fe_compiler_test_utils/trait.ToBeBytes.js | 9 + .../trait.impl/fe_mir/db/trait.MirDb.js | 9 + .../fe_mir/pretty_print/trait.PrettyPrint.js | 9 + compiler-docs/trait.impl/logos/trait.Logos.js | 9 + .../salsa/interned/trait.InternKey.js | 9 + .../salsa/plumbing/trait.DatabaseOps.js | 9 + .../plumbing/trait.DatabaseStorageTypes.js | 9 + .../salsa/plumbing/trait.HasQueryGroup.js | 9 + .../salsa/plumbing/trait.QueryFunction.js | 9 + .../salsa/plumbing/trait.QueryGroup.js | 9 + .../trait.impl/salsa/trait.Database.js | 9 + compiler-docs/trait.impl/salsa/trait.Query.js | 9 + .../trait.impl/salsa/trait.QueryDb.js | 9 + .../trait.impl/serde/de/trait.Deserialize.js | 9 + .../trait.impl/serde/ser/trait.Serialize.js | 9 + .../strum/trait.IntoEnumIterator.js | 9 + .../type.impl/core/result/enum.Result.js | 9 + .../backend/memory/struct.MemoryBackend.js | 9 + .../stack/executor/struct.StackExecutor.js | 9 + .../stack/memory/struct.MemoryStackState.js | 9 + .../type.impl/fe_mir/ir/inst/enum.IterBase.js | 9 + .../fe_mir/ir/inst/enum.IterMutBase.js | 9 + compiler-docs/type.impl/id_arena/struct.Id.js | 9 + .../petgraph/graphmap/type.DiGraphMap.js | 9 + devconnect.html | 204 + devconnect_ist.png | Bin 0 -> 479888 bytes docs/404.html | 218 + docs/FontAwesome/css/font-awesome.css | 4 + docs/FontAwesome/fonts/FontAwesome.ttf | Bin 0 -> 165548 bytes .../FontAwesome/fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../FontAwesome/fonts/fontawesome-webfont.svg | 2671 ++++ .../FontAwesome/fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes docs/ayu-highlight.css | 78 + docs/book.js | 697 + docs/clipboard.min.js | 7 + docs/code_of_conduct.html | 317 + docs/contributing.html | 266 + docs/css/chrome.css | 587 + docs/css/general.css | 234 + docs/css/print.css | 50 + docs/css/variables.css | 277 + docs/development/build.html | 249 + docs/development/index.html | 233 + docs/development/release.html | 255 + docs/elasticlunr.min.js | 10 + docs/favicon.png | Bin 0 -> 5679 bytes docs/favicon.svg | 22 + docs/fonts/OPEN-SANS-LICENSE.txt | 202 + docs/fonts/SOURCE-CODE-PRO-LICENSE.txt | 93 + docs/fonts/fonts.css | 100 + .../open-sans-v17-all-charsets-300.woff2 | Bin 0 -> 44352 bytes ...open-sans-v17-all-charsets-300italic.woff2 | Bin 0 -> 40656 bytes .../open-sans-v17-all-charsets-600.woff2 | Bin 0 -> 44936 bytes ...open-sans-v17-all-charsets-600italic.woff2 | Bin 0 -> 42120 bytes .../open-sans-v17-all-charsets-700.woff2 | Bin 0 -> 44988 bytes ...open-sans-v17-all-charsets-700italic.woff2 | Bin 0 -> 40800 bytes .../open-sans-v17-all-charsets-800.woff2 | Bin 0 -> 44536 bytes ...open-sans-v17-all-charsets-800italic.woff2 | Bin 0 -> 40812 bytes .../open-sans-v17-all-charsets-italic.woff2 | Bin 0 -> 41076 bytes .../open-sans-v17-all-charsets-regular.woff2 | Bin 0 -> 43236 bytes ...source-code-pro-v11-all-charsets-500.woff2 | Bin 0 -> 59140 bytes docs/highlight.css | 82 + docs/highlight.js | 6 + docs/images/fe.png | Bin 0 -> 86850 bytes docs/index.html | 259 + docs/mark.min.js | 7 + docs/print.html | 6021 +++++++++ docs/quickstart/deploy_contract.html | 359 + docs/quickstart/first_contract.html | 338 + docs/quickstart/index.html | 243 + docs/release_notes.html | 2870 +++++ docs/searcher.js | 483 + docs/searchindex.js | 1 + docs/searchindex.json | 1 + docs/spec/comments.html | 233 + docs/spec/data_layout/index.html | 238 + docs/spec/data_layout/memory/index.html | 233 + .../memory/sequence_types_in_memory.html | 237 + docs/spec/data_layout/stack.html | 241 + .../constant_size_values_in_storage.html | 238 + docs/spec/data_layout/storage/index.html | 229 + .../data_layout/storage/maps_in_storage.html | 239 + .../data_layout/storage/to_mem_function.html | 232 + .../expressions/arithmetic_operators.html | 274 + docs/spec/expressions/attribute.html | 258 + docs/spec/expressions/boolean_operators.html | 238 + docs/spec/expressions/call.html | 254 + .../expressions/comparison_operators.html | 255 + docs/spec/expressions/index.html | 243 + docs/spec/expressions/indexing.html | 254 + docs/spec/expressions/list.html | 258 + docs/spec/expressions/literal.html | 241 + docs/spec/expressions/name.html | 242 + docs/spec/expressions/path.html | 242 + docs/spec/expressions/struct.html | 229 + docs/spec/expressions/tuple.html | 262 + docs/spec/expressions/unary_operators.html | 243 + docs/spec/index.html | 325 + docs/spec/items/contracts.html | 302 + docs/spec/items/enums.html | 282 + docs/spec/items/functions/context.html | 318 + docs/spec/items/functions/index.html | 350 + docs/spec/items/functions/self.html | 260 + docs/spec/items/index.html | 235 + docs/spec/items/structs.html | 257 + docs/spec/items/traits.html | 264 + docs/spec/items/type_aliases.html | 239 + docs/spec/items/visibility_and_privacy.html | 265 + docs/spec/lexical_structure/identifiers.html | 247 + docs/spec/lexical_structure/index.html | 233 + docs/spec/lexical_structure/keywords.html | 295 + docs/spec/lexical_structure/tokens.html | 327 + docs/spec/notation.html | 246 + docs/spec/statements/assert.html | 254 + docs/spec/statements/assign.html | 253 + docs/spec/statements/augassign.html | 262 + docs/spec/statements/break.html | 277 + docs/spec/statements/const.html | 244 + docs/spec/statements/continue.html | 278 + docs/spec/statements/for.html | 249 + docs/spec/statements/if.html | 250 + docs/spec/statements/index.html | 244 + docs/spec/statements/let.html | 252 + docs/spec/statements/match.html | 277 + docs/spec/statements/pragma.html | 240 + docs/spec/statements/return.html | 262 + docs/spec/statements/revert.html | 267 + docs/spec/statements/while.html | 248 + docs/spec/type_system/index.html | 228 + docs/spec/type_system/types/address.html | 240 + docs/spec/type_system/types/array.html | 249 + docs/spec/type_system/types/boolean.html | 232 + docs/spec/type_system/types/contract.html | 248 + docs/spec/type_system/types/enum.html | 229 + docs/spec/type_system/types/function.html | 229 + docs/spec/type_system/types/index.html | 269 + docs/spec/type_system/types/map.html | 259 + docs/spec/type_system/types/numeric.html | 247 + docs/spec/type_system/types/string.html | 240 + docs/spec/type_system/types/struct.html | 254 + docs/spec/type_system/types/tuple.html | 260 + docs/spec/type_system/types/unit.html | 229 + docs/std/index.html | 232 + docs/std/precompiles.html | 465 + docs/theme/custom-highlight.js | 87 + docs/theme/reference.css | 64 + docs/tomorrow-night.css | 102 + .../example_contracts/auction_contract.html | 324 + docs/user-guide/example_contracts/index.html | 231 + docs/user-guide/external_links.html | 289 + docs/user-guide/index.html | 236 + docs/user-guide/installation.html | 295 + docs/user-guide/projects.html | 287 + docs/user-guide/tutorials/auction.html | 454 + docs/user-guide/tutorials/index.html | 234 + fe-logo-small.svg | 10562 ++++++++++++++++ fe-logo.svg | 10479 +++++++++++++++ index.html | 351 + privacy-policy.docx | Bin 0 -> 32292 bytes 1172 files changed, 120843 insertions(+) create mode 100644 CNAME create mode 100644 compiler-docs/.lock create mode 100644 compiler-docs/crates.js create mode 100644 compiler-docs/fe/all.html create mode 100644 compiler-docs/fe/fn.main.html create mode 100644 compiler-docs/fe/index.html create mode 100644 compiler-docs/fe/sidebar-items.js create mode 100644 compiler-docs/fe/struct.FelangCli.html create mode 100644 compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html create mode 100644 compiler-docs/fe/task/build/enum.Emit.html create mode 100644 compiler-docs/fe/task/build/fn.build.html create mode 100644 compiler-docs/fe/task/build/fn.build_ingot.html create mode 100644 compiler-docs/fe/task/build/fn.build_single_file.html create mode 100644 compiler-docs/fe/task/build/fn.ioerr_to_string.html create mode 100644 compiler-docs/fe/task/build/fn.mir_dump.html create mode 100644 compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html create mode 100644 compiler-docs/fe/task/build/fn.write_compiled_module.html create mode 100644 compiler-docs/fe/task/build/fn.write_output.html create mode 100644 compiler-docs/fe/task/build/index.html create mode 100644 compiler-docs/fe/task/build/sidebar-items.js create mode 100644 compiler-docs/fe/task/build/struct.BuildArgs.html create mode 100644 compiler-docs/fe/task/check/fn.check.html create mode 100644 compiler-docs/fe/task/check/fn.check_ingot.html create mode 100644 compiler-docs/fe/task/check/fn.check_single_file.html create mode 100644 compiler-docs/fe/task/check/index.html create mode 100644 compiler-docs/fe/task/check/sidebar-items.js create mode 100644 compiler-docs/fe/task/check/struct.CheckArgs.html create mode 100644 compiler-docs/fe/task/enum.Commands.html create mode 100644 compiler-docs/fe/task/index.html create mode 100644 compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html create mode 100644 compiler-docs/fe/task/new/fn.create_new_project.html create mode 100644 compiler-docs/fe/task/new/fn.create_project.html create mode 100644 compiler-docs/fe/task/new/index.html create mode 100644 compiler-docs/fe/task/new/sidebar-items.js create mode 100644 compiler-docs/fe/task/new/struct.NewProjectArgs.html create mode 100644 compiler-docs/fe/task/sidebar-items.js create mode 100644 compiler-docs/fe_abi/all.html create mode 100644 compiler-docs/fe_abi/contract/index.html create mode 100644 compiler-docs/fe_abi/contract/sidebar-items.js create mode 100644 compiler-docs/fe_abi/contract/struct.AbiContract.html create mode 100644 compiler-docs/fe_abi/event/index.html create mode 100644 compiler-docs/fe_abi/event/sidebar-items.js create mode 100644 compiler-docs/fe_abi/event/struct.AbiEvent.html create mode 100644 compiler-docs/fe_abi/event/struct.AbiEventField.html create mode 100644 compiler-docs/fe_abi/event/struct.AbiEventSignature.html create mode 100644 compiler-docs/fe_abi/function/enum.AbiFunctionType.html create mode 100644 compiler-docs/fe_abi/function/enum.CtxParam.html create mode 100644 compiler-docs/fe_abi/function/enum.SelfParam.html create mode 100644 compiler-docs/fe_abi/function/enum.StateMutability.html create mode 100644 compiler-docs/fe_abi/function/index.html create mode 100644 compiler-docs/fe_abi/function/sidebar-items.js create mode 100644 compiler-docs/fe_abi/function/struct.AbiFunction.html create mode 100644 compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html create mode 100644 compiler-docs/fe_abi/index.html create mode 100644 compiler-docs/fe_abi/sidebar-items.js create mode 100644 compiler-docs/fe_abi/types/enum.AbiType.html create mode 100644 compiler-docs/fe_abi/types/index.html create mode 100644 compiler-docs/fe_abi/types/sidebar-items.js create mode 100644 compiler-docs/fe_abi/types/struct.AbiTupleField.html create mode 100644 compiler-docs/fe_analyzer/all.html create mode 100644 compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html create mode 100644 compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html create mode 100644 compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html create mode 100644 compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html create mode 100644 compiler-docs/fe_analyzer/builtins/index.html create mode 100644 compiler-docs/fe_analyzer/builtins/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html create mode 100644 compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html create mode 100644 compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html create mode 100644 compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html create mode 100644 compiler-docs/fe_analyzer/constants/constant.INDEXED.html create mode 100644 compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html create mode 100644 compiler-docs/fe_analyzer/constants/index.html create mode 100644 compiler-docs/fe_analyzer/constants/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html create mode 100644 compiler-docs/fe_analyzer/context/enum.CallType.html create mode 100644 compiler-docs/fe_analyzer/context/enum.Constant.html create mode 100644 compiler-docs/fe_analyzer/context/enum.NamedThing.html create mode 100644 compiler-docs/fe_analyzer/context/index.html create mode 100644 compiler-docs/fe_analyzer/context/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/context/struct.Adjustment.html create mode 100644 compiler-docs/fe_analyzer/context/struct.Analysis.html create mode 100644 compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html create mode 100644 compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html create mode 100644 compiler-docs/fe_analyzer/context/struct.FunctionBody.html create mode 100644 compiler-docs/fe_analyzer/context/struct.Label.html create mode 100644 compiler-docs/fe_analyzer/context/struct.TempContext.html create mode 100644 compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html create mode 100644 compiler-docs/fe_analyzer/db/index.html create mode 100644 compiler-docs/fe_analyzer/db/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html create mode 100644 compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ImplForQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternContractQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternImplQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternStructQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.TestDb.html create mode 100644 compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html create mode 100644 compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html create mode 100644 compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html create mode 100644 compiler-docs/fe_analyzer/display/index.html create mode 100644 compiler-docs/fe_analyzer/display/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html create mode 100644 compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html create mode 100644 compiler-docs/fe_analyzer/display/trait.Displayable.html create mode 100644 compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html create mode 100644 compiler-docs/fe_analyzer/errors/enum.IndexingError.html create mode 100644 compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.error.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.fancy_error.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.to_mem_error.html create mode 100644 compiler-docs/fe_analyzer/errors/fn.type_error.html create mode 100644 compiler-docs/fe_analyzer/errors/index.html create mode 100644 compiler-docs/fe_analyzer/errors/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html create mode 100644 compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html create mode 100644 compiler-docs/fe_analyzer/errors/struct.FatalError.html create mode 100644 compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html create mode 100644 compiler-docs/fe_analyzer/errors/struct.TypeError.html create mode 100644 compiler-docs/fe_analyzer/fn.analyze_ingot.html create mode 100644 compiler-docs/fe_analyzer/fn.analyze_module.html create mode 100644 compiler-docs/fe_analyzer/index.html create mode 100644 compiler-docs/fe_analyzer/namespace/index.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/enum.Item.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/index.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Contract.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Enum.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Function.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Impl.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Module.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Struct.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.StructField.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.StructId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.Trait.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html create mode 100644 compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/index.html create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html create mode 100644 compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html create mode 100644 compiler-docs/fe_analyzer/namespace/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/namespace/types/constant.U256.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.Base.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.Integer.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/enum.Type.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/fn.address_max.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/index.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.Array.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.FeString.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.Generic.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.Map.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html create mode 100644 compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/index.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html create mode 100644 compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html create mode 100644 compiler-docs/fe_analyzer/sidebar-items.js create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html create mode 100644 compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html create mode 100644 compiler-docs/fe_codegen/all.html create mode 100644 compiler-docs/fe_codegen/db/index.html create mode 100644 compiler-docs/fe_codegen/db/sidebar-items.js create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html create mode 100644 compiler-docs/fe_codegen/db/struct.Db.html create mode 100644 compiler-docs/fe_codegen/db/trait.CodegenDb.html create mode 100644 compiler-docs/fe_codegen/index.html create mode 100644 compiler-docs/fe_codegen/sidebar-items.js create mode 100644 compiler-docs/fe_codegen/yul/index.html create mode 100644 compiler-docs/fe_codegen/yul/isel/context/index.html create mode 100644 compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js create mode 100644 compiler-docs/fe_codegen/yul/isel/context/struct.Context.html create mode 100644 compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html create mode 100644 compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html create mode 100644 compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html create mode 100644 compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html create mode 100644 compiler-docs/fe_codegen/yul/isel/fn.lower_function.html create mode 100644 compiler-docs/fe_codegen/yul/isel/fn.lower_test.html create mode 100644 compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html create mode 100644 compiler-docs/fe_codegen/yul/isel/index.html create mode 100644 compiler-docs/fe_codegen/yul/isel/sidebar-items.js create mode 100644 compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html create mode 100644 compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html create mode 100644 compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html create mode 100644 compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html create mode 100644 compiler-docs/fe_codegen/yul/legalize/index.html create mode 100644 compiler-docs/fe_codegen/yul/legalize/sidebar-items.js create mode 100644 compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html create mode 100644 compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html create mode 100644 compiler-docs/fe_codegen/yul/runtime/index.html create mode 100644 compiler-docs/fe_codegen/yul/runtime/sidebar-items.js create mode 100644 compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html create mode 100644 compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html create mode 100644 compiler-docs/fe_codegen/yul/sidebar-items.js create mode 100644 compiler-docs/fe_common/all.html create mode 100644 compiler-docs/fe_common/db/index.html create mode 100644 compiler-docs/fe_common/db/sidebar-items.js create mode 100644 compiler-docs/fe_common/db/struct.FileContentQuery.html create mode 100644 compiler-docs/fe_common/db/struct.FileLineStartsQuery.html create mode 100644 compiler-docs/fe_common/db/struct.FileNameQuery.html create mode 100644 compiler-docs/fe_common/db/struct.InternFileLookupQuery.html create mode 100644 compiler-docs/fe_common/db/struct.InternFileQuery.html create mode 100644 compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html create mode 100644 compiler-docs/fe_common/db/struct.SourceDbStorage.html create mode 100644 compiler-docs/fe_common/db/struct.TestDb.html create mode 100644 compiler-docs/fe_common/db/trait.SourceDb.html create mode 100644 compiler-docs/fe_common/db/trait.Upcast.html create mode 100644 compiler-docs/fe_common/db/trait.UpcastMut.html create mode 100644 compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html create mode 100644 compiler-docs/fe_common/diagnostics/cs/enum.Severity.html create mode 100644 compiler-docs/fe_common/diagnostics/cs/index.html create mode 100644 compiler-docs/fe_common/diagnostics/cs/sidebar-items.js create mode 100644 compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html create mode 100644 compiler-docs/fe_common/diagnostics/cs/struct.Label.html create mode 100644 compiler-docs/fe_common/diagnostics/enum.LabelStyle.html create mode 100644 compiler-docs/fe_common/diagnostics/enum.Severity.html create mode 100644 compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html create mode 100644 compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html create mode 100644 compiler-docs/fe_common/diagnostics/index.html create mode 100644 compiler-docs/fe_common/diagnostics/sidebar-items.js create mode 100644 compiler-docs/fe_common/diagnostics/struct.Diagnostic.html create mode 100644 compiler-docs/fe_common/diagnostics/struct.Label.html create mode 100644 compiler-docs/fe_common/files/enum.FileKind.html create mode 100644 compiler-docs/fe_common/files/enum.Utf8Component.html create mode 100644 compiler-docs/fe_common/files/fn.common_prefix.html create mode 100644 compiler-docs/fe_common/files/index.html create mode 100644 compiler-docs/fe_common/files/sidebar-items.js create mode 100644 compiler-docs/fe_common/files/struct.File.html create mode 100644 compiler-docs/fe_common/files/struct.SourceFileId.html create mode 100644 compiler-docs/fe_common/files/struct.Utf8Path.html create mode 100644 compiler-docs/fe_common/files/struct.Utf8PathBuf.html create mode 100644 compiler-docs/fe_common/index.html create mode 100644 compiler-docs/fe_common/macro.assert_snapshot_wasm!.html create mode 100644 compiler-docs/fe_common/macro.assert_snapshot_wasm.html create mode 100644 compiler-docs/fe_common/macro.assert_strings_eq!.html create mode 100644 compiler-docs/fe_common/macro.assert_strings_eq.html create mode 100644 compiler-docs/fe_common/macro.impl_intern_key!.html create mode 100644 compiler-docs/fe_common/macro.impl_intern_key.html create mode 100644 compiler-docs/fe_common/numeric/enum.Radix.html create mode 100644 compiler-docs/fe_common/numeric/fn.to_hex_str.html create mode 100644 compiler-docs/fe_common/numeric/index.html create mode 100644 compiler-docs/fe_common/numeric/sidebar-items.js create mode 100644 compiler-docs/fe_common/numeric/struct.Literal.html create mode 100644 compiler-docs/fe_common/panic/fn.install_panic_hook.html create mode 100644 compiler-docs/fe_common/panic/index.html create mode 100644 compiler-docs/fe_common/panic/sidebar-items.js create mode 100644 compiler-docs/fe_common/sidebar-items.js create mode 100644 compiler-docs/fe_common/span/struct.Span.html create mode 100644 compiler-docs/fe_common/span/trait.Spanned.html create mode 100644 compiler-docs/fe_common/struct.Span.html create mode 100644 compiler-docs/fe_common/trait.Spanned.html create mode 100644 compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html create mode 100644 compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html create mode 100644 compiler-docs/fe_common/utils/dirs/index.html create mode 100644 compiler-docs/fe_common/utils/dirs/sidebar-items.js create mode 100644 compiler-docs/fe_common/utils/files/enum.DependencyKind.html create mode 100644 compiler-docs/fe_common/utils/files/enum.FileLoader.html create mode 100644 compiler-docs/fe_common/utils/files/enum.ProjectMode.html create mode 100644 compiler-docs/fe_common/utils/files/fn.get_project_root.html create mode 100644 compiler-docs/fe_common/utils/files/index.html create mode 100644 compiler-docs/fe_common/utils/files/sidebar-items.js create mode 100644 compiler-docs/fe_common/utils/files/struct.BuildFiles.html create mode 100644 compiler-docs/fe_common/utils/files/struct.Dependency.html create mode 100644 compiler-docs/fe_common/utils/files/struct.GitDependency.html create mode 100644 compiler-docs/fe_common/utils/files/struct.LocalDependency.html create mode 100644 compiler-docs/fe_common/utils/files/struct.ProjectFiles.html create mode 100644 compiler-docs/fe_common/utils/files/trait.DependencyResolver.html create mode 100644 compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html create mode 100644 compiler-docs/fe_common/utils/git/index.html create mode 100644 compiler-docs/fe_common/utils/git/sidebar-items.js create mode 100644 compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html create mode 100644 compiler-docs/fe_common/utils/humanize/index.html create mode 100644 compiler-docs/fe_common/utils/humanize/sidebar-items.js create mode 100644 compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html create mode 100644 compiler-docs/fe_common/utils/index.html create mode 100644 compiler-docs/fe_common/utils/keccak/fn.full.html create mode 100644 compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html create mode 100644 compiler-docs/fe_common/utils/keccak/fn.partial.html create mode 100644 compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html create mode 100644 compiler-docs/fe_common/utils/keccak/index.html create mode 100644 compiler-docs/fe_common/utils/keccak/sidebar-items.js create mode 100644 compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html create mode 100644 compiler-docs/fe_common/utils/ron/index.html create mode 100644 compiler-docs/fe_common/utils/ron/sidebar-items.js create mode 100644 compiler-docs/fe_common/utils/ron/struct.Diff.html create mode 100644 compiler-docs/fe_common/utils/sidebar-items.js create mode 100644 compiler-docs/fe_compiler_test_utils/all.html create mode 100644 compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.address.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.address_array_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.address_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.bool_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.bytes_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encode_revert.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.int_array_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.int_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.load_contract.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.string_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.tuple_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.uint_token.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.validate_return.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.validate_revert.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.with_executor.html create mode 100644 compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html create mode 100644 compiler-docs/fe_compiler_test_utils/index.html create mode 100644 compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html create mode 100644 compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html create mode 100644 compiler-docs/fe_compiler_test_utils/sidebar-items.js create mode 100644 compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html create mode 100644 compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html create mode 100644 compiler-docs/fe_compiler_test_utils/struct.GasRecord.html create mode 100644 compiler-docs/fe_compiler_test_utils/struct.GasReporter.html create mode 100644 compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html create mode 100644 compiler-docs/fe_compiler_test_utils/struct.Runtime.html create mode 100644 compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html create mode 100644 compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html create mode 100644 compiler-docs/fe_compiler_test_utils/type.Backend.html create mode 100644 compiler-docs/fe_compiler_test_utils/type.Executor.html create mode 100644 compiler-docs/fe_compiler_test_utils/type.StackState.html create mode 100644 compiler-docs/fe_compiler_tests/all.html create mode 100644 compiler-docs/fe_compiler_tests/index.html create mode 100644 compiler-docs/fe_compiler_tests/sidebar-items.js create mode 100644 compiler-docs/fe_compiler_tests_legacy/all.html create mode 100644 compiler-docs/fe_compiler_tests_legacy/index.html create mode 100644 compiler-docs/fe_compiler_tests_legacy/sidebar-items.js create mode 100644 compiler-docs/fe_driver/all.html create mode 100644 compiler-docs/fe_driver/fn.check_ingot.html create mode 100644 compiler-docs/fe_driver/fn.check_single_file.html create mode 100644 compiler-docs/fe_driver/fn.compile_ingot.html create mode 100644 compiler-docs/fe_driver/fn.compile_single_file.html create mode 100644 compiler-docs/fe_driver/fn.dump_mir_single_file.html create mode 100644 compiler-docs/fe_driver/index.html create mode 100644 compiler-docs/fe_driver/sidebar-items.js create mode 100644 compiler-docs/fe_driver/struct.CompileError.html create mode 100644 compiler-docs/fe_driver/struct.CompiledContract.html create mode 100644 compiler-docs/fe_driver/struct.CompiledModule.html create mode 100644 compiler-docs/fe_driver/struct.Db.html create mode 100644 compiler-docs/fe_driver/trait.CodegenDb.html create mode 100644 compiler-docs/fe_library/all.html create mode 100644 compiler-docs/fe_library/constant.STD.html create mode 100644 compiler-docs/fe_library/fn.static_dir_files.html create mode 100644 compiler-docs/fe_library/fn.std_src_files.html create mode 100644 compiler-docs/fe_library/index.html create mode 100644 compiler-docs/fe_library/sidebar-items.js create mode 100644 compiler-docs/fe_mir/all.html create mode 100644 compiler-docs/fe_mir/analysis/cfg/index.html create mode 100644 compiler-docs/fe_mir/analysis/cfg/sidebar-items.js create mode 100644 compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html create mode 100644 compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html create mode 100644 compiler-docs/fe_mir/analysis/domtree/index.html create mode 100644 compiler-docs/fe_mir/analysis/domtree/sidebar-items.js create mode 100644 compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html create mode 100644 compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html create mode 100644 compiler-docs/fe_mir/analysis/index.html create mode 100644 compiler-docs/fe_mir/analysis/loop_tree/index.html create mode 100644 compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js create mode 100644 compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html create mode 100644 compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html create mode 100644 compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html create mode 100644 compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html create mode 100644 compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html create mode 100644 compiler-docs/fe_mir/analysis/post_domtree/index.html create mode 100644 compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js create mode 100644 compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html create mode 100644 compiler-docs/fe_mir/analysis/sidebar-items.js create mode 100644 compiler-docs/fe_mir/db/index.html create mode 100644 compiler-docs/fe_mir/db/sidebar-items.js create mode 100644 compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html create mode 100644 compiler-docs/fe_mir/db/struct.MirDbStorage.html create mode 100644 compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirInternConstQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html create mode 100644 compiler-docs/fe_mir/db/struct.NewDb.html create mode 100644 compiler-docs/fe_mir/db/trait.MirDb.html create mode 100644 compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html create mode 100644 compiler-docs/fe_mir/graphviz/index.html create mode 100644 compiler-docs/fe_mir/graphviz/sidebar-items.js create mode 100644 compiler-docs/fe_mir/index.html create mode 100644 compiler-docs/fe_mir/ir/basic_block/index.html create mode 100644 compiler-docs/fe_mir/ir/basic_block/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html create mode 100644 compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html create mode 100644 compiler-docs/fe_mir/ir/body_builder/index.html create mode 100644 compiler-docs/fe_mir/ir/body_builder/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html create mode 100644 compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html create mode 100644 compiler-docs/fe_mir/ir/body_cursor/index.html create mode 100644 compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html create mode 100644 compiler-docs/fe_mir/ir/body_order/index.html create mode 100644 compiler-docs/fe_mir/ir/body_order/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html create mode 100644 compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html create mode 100644 compiler-docs/fe_mir/ir/constant/index.html create mode 100644 compiler-docs/fe_mir/ir/constant/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/constant/struct.Constant.html create mode 100644 compiler-docs/fe_mir/ir/constant/struct.ConstantId.html create mode 100644 compiler-docs/fe_mir/ir/function/enum.Linkage.html create mode 100644 compiler-docs/fe_mir/ir/function/index.html create mode 100644 compiler-docs/fe_mir/ir/function/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html create mode 100644 compiler-docs/fe_mir/ir/function/struct.FunctionBody.html create mode 100644 compiler-docs/fe_mir/ir/function/struct.FunctionId.html create mode 100644 compiler-docs/fe_mir/ir/function/struct.FunctionParam.html create mode 100644 compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html create mode 100644 compiler-docs/fe_mir/ir/index.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.BinOp.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.CallType.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.CastKind.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.InstKind.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.IterBase.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.UnOp.html create mode 100644 compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html create mode 100644 compiler-docs/fe_mir/ir/inst/index.html create mode 100644 compiler-docs/fe_mir/ir/inst/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/inst/struct.Inst.html create mode 100644 compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html create mode 100644 compiler-docs/fe_mir/ir/inst/type.BlockIter.html create mode 100644 compiler-docs/fe_mir/ir/inst/type.InstId.html create mode 100644 compiler-docs/fe_mir/ir/inst/type.ValueIter.html create mode 100644 compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html create mode 100644 compiler-docs/fe_mir/ir/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/struct.SourceInfo.html create mode 100644 compiler-docs/fe_mir/ir/types/enum.TypeKind.html create mode 100644 compiler-docs/fe_mir/ir/types/index.html create mode 100644 compiler-docs/fe_mir/ir/types/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/types/struct.ArrayDef.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.EnumDef.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.EnumVariant.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.EventDef.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.MapDef.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.StructDef.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.TupleDef.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.Type.html create mode 100644 compiler-docs/fe_mir/ir/types/struct.TypeId.html create mode 100644 compiler-docs/fe_mir/ir/value/enum.AssignableValue.html create mode 100644 compiler-docs/fe_mir/ir/value/enum.Value.html create mode 100644 compiler-docs/fe_mir/ir/value/index.html create mode 100644 compiler-docs/fe_mir/ir/value/sidebar-items.js create mode 100644 compiler-docs/fe_mir/ir/value/struct.Local.html create mode 100644 compiler-docs/fe_mir/ir/value/type.ValueId.html create mode 100644 compiler-docs/fe_mir/pretty_print/index.html create mode 100644 compiler-docs/fe_mir/pretty_print/sidebar-items.js create mode 100644 compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html create mode 100644 compiler-docs/fe_mir/sidebar-items.js create mode 100644 compiler-docs/fe_parser/all.html create mode 100644 compiler-docs/fe_parser/ast/enum.BinOperator.html create mode 100644 compiler-docs/fe_parser/ast/enum.BoolOperator.html create mode 100644 compiler-docs/fe_parser/ast/enum.CompOperator.html create mode 100644 compiler-docs/fe_parser/ast/enum.ContractStmt.html create mode 100644 compiler-docs/fe_parser/ast/enum.Expr.html create mode 100644 compiler-docs/fe_parser/ast/enum.FuncStmt.html create mode 100644 compiler-docs/fe_parser/ast/enum.FunctionArg.html create mode 100644 compiler-docs/fe_parser/ast/enum.GenericArg.html create mode 100644 compiler-docs/fe_parser/ast/enum.GenericParameter.html create mode 100644 compiler-docs/fe_parser/ast/enum.LiteralPattern.html create mode 100644 compiler-docs/fe_parser/ast/enum.ModuleStmt.html create mode 100644 compiler-docs/fe_parser/ast/enum.Pattern.html create mode 100644 compiler-docs/fe_parser/ast/enum.TypeDesc.html create mode 100644 compiler-docs/fe_parser/ast/enum.UnaryOperator.html create mode 100644 compiler-docs/fe_parser/ast/enum.UseTree.html create mode 100644 compiler-docs/fe_parser/ast/enum.VarDeclTarget.html create mode 100644 compiler-docs/fe_parser/ast/enum.VariantKind.html create mode 100644 compiler-docs/fe_parser/ast/index.html create mode 100644 compiler-docs/fe_parser/ast/sidebar-items.js create mode 100644 compiler-docs/fe_parser/ast/struct.CallArg.html create mode 100644 compiler-docs/fe_parser/ast/struct.ConstantDecl.html create mode 100644 compiler-docs/fe_parser/ast/struct.Contract.html create mode 100644 compiler-docs/fe_parser/ast/struct.Enum.html create mode 100644 compiler-docs/fe_parser/ast/struct.Field.html create mode 100644 compiler-docs/fe_parser/ast/struct.Function.html create mode 100644 compiler-docs/fe_parser/ast/struct.FunctionSignature.html create mode 100644 compiler-docs/fe_parser/ast/struct.Impl.html create mode 100644 compiler-docs/fe_parser/ast/struct.MatchArm.html create mode 100644 compiler-docs/fe_parser/ast/struct.Module.html create mode 100644 compiler-docs/fe_parser/ast/struct.Path.html create mode 100644 compiler-docs/fe_parser/ast/struct.Pragma.html create mode 100644 compiler-docs/fe_parser/ast/struct.SmolStr.html create mode 100644 compiler-docs/fe_parser/ast/struct.Struct.html create mode 100644 compiler-docs/fe_parser/ast/struct.Trait.html create mode 100644 compiler-docs/fe_parser/ast/struct.TypeAlias.html create mode 100644 compiler-docs/fe_parser/ast/struct.Use.html create mode 100644 compiler-docs/fe_parser/ast/struct.Variant.html create mode 100644 compiler-docs/fe_parser/fn.parse_file.html create mode 100644 compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html create mode 100644 compiler-docs/fe_parser/grammar/contracts/index.html create mode 100644 compiler-docs/fe_parser/grammar/contracts/sidebar-items.js create mode 100644 compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html create mode 100644 compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html create mode 100644 compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html create mode 100644 compiler-docs/fe_parser/grammar/expressions/index.html create mode 100644 compiler-docs/fe_parser/grammar/expressions/sidebar-items.js create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html create mode 100644 compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/functions/index.html create mode 100644 compiler-docs/fe_parser/grammar/functions/sidebar-items.js create mode 100644 compiler-docs/fe_parser/grammar/index.html create mode 100644 compiler-docs/fe_parser/grammar/module/fn.parse_constant.html create mode 100644 compiler-docs/fe_parser/grammar/module/fn.parse_module.html create mode 100644 compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html create mode 100644 compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html create mode 100644 compiler-docs/fe_parser/grammar/module/fn.parse_use.html create mode 100644 compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html create mode 100644 compiler-docs/fe_parser/grammar/module/index.html create mode 100644 compiler-docs/fe_parser/grammar/module/sidebar-items.js create mode 100644 compiler-docs/fe_parser/grammar/sidebar-items.js create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_field.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html create mode 100644 compiler-docs/fe_parser/grammar/types/fn.parse_variant.html create mode 100644 compiler-docs/fe_parser/grammar/types/index.html create mode 100644 compiler-docs/fe_parser/grammar/types/sidebar-items.js create mode 100644 compiler-docs/fe_parser/index.html create mode 100644 compiler-docs/fe_parser/lexer/enum.TokenKind.html create mode 100644 compiler-docs/fe_parser/lexer/index.html create mode 100644 compiler-docs/fe_parser/lexer/sidebar-items.js create mode 100644 compiler-docs/fe_parser/lexer/struct.Lexer.html create mode 100644 compiler-docs/fe_parser/lexer/struct.Token.html create mode 100644 compiler-docs/fe_parser/lexer/token/enum.TokenKind.html create mode 100644 compiler-docs/fe_parser/lexer/token/struct.Token.html create mode 100644 compiler-docs/fe_parser/node/index.html create mode 100644 compiler-docs/fe_parser/node/sidebar-items.js create mode 100644 compiler-docs/fe_parser/node/struct.Node.html create mode 100644 compiler-docs/fe_parser/node/struct.NodeId.html create mode 100644 compiler-docs/fe_parser/node/struct.Span.html create mode 100644 compiler-docs/fe_parser/node/trait.Spanned.html create mode 100644 compiler-docs/fe_parser/parser/struct.Label.html create mode 100644 compiler-docs/fe_parser/parser/struct.ParseFailed.html create mode 100644 compiler-docs/fe_parser/parser/struct.Parser.html create mode 100644 compiler-docs/fe_parser/parser/type.ParseResult.html create mode 100644 compiler-docs/fe_parser/sidebar-items.js create mode 100644 compiler-docs/fe_parser/struct.Label.html create mode 100644 compiler-docs/fe_parser/struct.ParseFailed.html create mode 100644 compiler-docs/fe_parser/struct.Parser.html create mode 100644 compiler-docs/fe_parser/type.ParseResult.html create mode 100644 compiler-docs/fe_test_files/all.html create mode 100644 compiler-docs/fe_test_files/fn.fixture.html create mode 100644 compiler-docs/fe_test_files/fn.fixture_bytes.html create mode 100644 compiler-docs/fe_test_files/fn.fixture_dir.html create mode 100644 compiler-docs/fe_test_files/fn.fixture_dir_files.html create mode 100644 compiler-docs/fe_test_files/fn.new_fixture_dir_files.html create mode 100644 compiler-docs/fe_test_files/index.html create mode 100644 compiler-docs/fe_test_files/sidebar-items.js create mode 100644 compiler-docs/fe_test_runner/all.html create mode 100644 compiler-docs/fe_test_runner/fn.execute.html create mode 100644 compiler-docs/fe_test_runner/index.html create mode 100644 compiler-docs/fe_test_runner/sidebar-items.js create mode 100644 compiler-docs/fe_test_runner/struct.TestSink.html create mode 100644 compiler-docs/fe_yulc/all.html create mode 100644 compiler-docs/fe_yulc/fn.compile.html create mode 100644 compiler-docs/fe_yulc/fn.compile_single_contract.html create mode 100644 compiler-docs/fe_yulc/index.html create mode 100644 compiler-docs/fe_yulc/sidebar-items.js create mode 100644 compiler-docs/fe_yulc/struct.ContractBytecode.html create mode 100644 compiler-docs/fe_yulc/struct.YulcError.html create mode 100644 compiler-docs/help.html create mode 100644 compiler-docs/search-index.js create mode 100644 compiler-docs/search.desc/fe/fe-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_common/fe_common-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_library/fe_library-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js create mode 100644 compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js create mode 100644 compiler-docs/settings.html create mode 100644 compiler-docs/src-files.js create mode 100644 compiler-docs/src/fe/main.rs.html create mode 100644 compiler-docs/src/fe/task/build.rs.html create mode 100644 compiler-docs/src/fe/task/check.rs.html create mode 100644 compiler-docs/src/fe/task/mod.rs.html create mode 100644 compiler-docs/src/fe/task/new.rs.html create mode 100644 compiler-docs/src/fe_abi/contract.rs.html create mode 100644 compiler-docs/src/fe_abi/event.rs.html create mode 100644 compiler-docs/src/fe_abi/function.rs.html create mode 100644 compiler-docs/src/fe_abi/lib.rs.html create mode 100644 compiler-docs/src/fe_abi/types.rs.html create mode 100644 compiler-docs/src/fe_analyzer/builtins.rs.html create mode 100644 compiler-docs/src/fe_analyzer/constants.rs.html create mode 100644 compiler-docs/src/fe_analyzer/context.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/enums.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/functions.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/impls.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/module.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/structs.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/traits.rs.html create mode 100644 compiler-docs/src/fe_analyzer/db/queries/types.rs.html create mode 100644 compiler-docs/src/fe_analyzer/display.rs.html create mode 100644 compiler-docs/src/fe_analyzer/errors.rs.html create mode 100644 compiler-docs/src/fe_analyzer/lib.rs.html create mode 100644 compiler-docs/src/fe_analyzer/namespace/items.rs.html create mode 100644 compiler-docs/src/fe_analyzer/namespace/mod.rs.html create mode 100644 compiler-docs/src/fe_analyzer/namespace/scopes.rs.html create mode 100644 compiler-docs/src/fe_analyzer/namespace/types.rs.html create mode 100644 compiler-docs/src/fe_analyzer/operations.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/assignments.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/call_args.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/declarations.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/expressions.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/functions.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/mod.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/pragma.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/types.rs.html create mode 100644 compiler-docs/src/fe_analyzer/traversal/utils.rs.html create mode 100644 compiler-docs/src/fe_codegen/db.rs.html create mode 100644 compiler-docs/src/fe_codegen/db/queries.rs.html create mode 100644 compiler-docs/src/fe_codegen/db/queries/abi.rs.html create mode 100644 compiler-docs/src/fe_codegen/db/queries/constant.rs.html create mode 100644 compiler-docs/src/fe_codegen/db/queries/contract.rs.html create mode 100644 compiler-docs/src/fe_codegen/db/queries/function.rs.html create mode 100644 compiler-docs/src/fe_codegen/db/queries/types.rs.html create mode 100644 compiler-docs/src/fe_codegen/lib.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/isel/context.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/isel/contract.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/isel/function.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/isel/mod.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/isel/test.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/legalize/body.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/mod.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/data.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html create mode 100644 compiler-docs/src/fe_codegen/yul/slot_size.rs.html create mode 100644 compiler-docs/src/fe_common/db.rs.html create mode 100644 compiler-docs/src/fe_common/diagnostics.rs.html create mode 100644 compiler-docs/src/fe_common/files.rs.html create mode 100644 compiler-docs/src/fe_common/lib.rs.html create mode 100644 compiler-docs/src/fe_common/numeric.rs.html create mode 100644 compiler-docs/src/fe_common/panic.rs.html create mode 100644 compiler-docs/src/fe_common/span.rs.html create mode 100644 compiler-docs/src/fe_common/utils/dirs.rs.html create mode 100644 compiler-docs/src/fe_common/utils/files.rs.html create mode 100644 compiler-docs/src/fe_common/utils/git.rs.html create mode 100644 compiler-docs/src/fe_common/utils/humanize.rs.html create mode 100644 compiler-docs/src/fe_common/utils/keccak.rs.html create mode 100644 compiler-docs/src/fe_common/utils/mod.rs.html create mode 100644 compiler-docs/src/fe_common/utils/ron.rs.html create mode 100644 compiler-docs/src/fe_compiler_test_utils/lib.rs.html create mode 100644 compiler-docs/src/fe_compiler_tests/lib.rs.html create mode 100644 compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html create mode 100644 compiler-docs/src/fe_driver/lib.rs.html create mode 100644 compiler-docs/src/fe_library/lib.rs.html create mode 100644 compiler-docs/src/fe_mir/analysis/cfg.rs.html create mode 100644 compiler-docs/src/fe_mir/analysis/domtree.rs.html create mode 100644 compiler-docs/src/fe_mir/analysis/loop_tree.rs.html create mode 100644 compiler-docs/src/fe_mir/analysis/mod.rs.html create mode 100644 compiler-docs/src/fe_mir/analysis/post_domtree.rs.html create mode 100644 compiler-docs/src/fe_mir/db.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/constant.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/contract.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/enums.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/function.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/module.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/structs.rs.html create mode 100644 compiler-docs/src/fe_mir/db/queries/types.rs.html create mode 100644 compiler-docs/src/fe_mir/graphviz/block.rs.html create mode 100644 compiler-docs/src/fe_mir/graphviz/function.rs.html create mode 100644 compiler-docs/src/fe_mir/graphviz/mod.rs.html create mode 100644 compiler-docs/src/fe_mir/graphviz/module.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/basic_block.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/body_builder.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/body_cursor.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/body_order.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/constant.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/function.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/inst.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/mod.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/types.rs.html create mode 100644 compiler-docs/src/fe_mir/ir/value.rs.html create mode 100644 compiler-docs/src/fe_mir/lib.rs.html create mode 100644 compiler-docs/src/fe_mir/lower/function.rs.html create mode 100644 compiler-docs/src/fe_mir/lower/mod.rs.html create mode 100644 compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html create mode 100644 compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html create mode 100644 compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html create mode 100644 compiler-docs/src/fe_mir/lower/types.rs.html create mode 100644 compiler-docs/src/fe_mir/pretty_print/inst.rs.html create mode 100644 compiler-docs/src/fe_mir/pretty_print/mod.rs.html create mode 100644 compiler-docs/src/fe_mir/pretty_print/types.rs.html create mode 100644 compiler-docs/src/fe_mir/pretty_print/value.rs.html create mode 100644 compiler-docs/src/fe_parser/ast.rs.html create mode 100644 compiler-docs/src/fe_parser/grammar.rs.html create mode 100644 compiler-docs/src/fe_parser/grammar/contracts.rs.html create mode 100644 compiler-docs/src/fe_parser/grammar/expressions.rs.html create mode 100644 compiler-docs/src/fe_parser/grammar/functions.rs.html create mode 100644 compiler-docs/src/fe_parser/grammar/module.rs.html create mode 100644 compiler-docs/src/fe_parser/grammar/types.rs.html create mode 100644 compiler-docs/src/fe_parser/lexer.rs.html create mode 100644 compiler-docs/src/fe_parser/lexer/token.rs.html create mode 100644 compiler-docs/src/fe_parser/lib.rs.html create mode 100644 compiler-docs/src/fe_parser/node.rs.html create mode 100644 compiler-docs/src/fe_parser/parser.rs.html create mode 100644 compiler-docs/src/fe_test_files/lib.rs.html create mode 100644 compiler-docs/src/fe_test_runner/lib.rs.html create mode 100644 compiler-docs/src/fe_yulc/lib.rs.html create mode 100644 compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt create mode 100644 compiler-docs/static.files/FiraMono-Medium-86f75c8c.woff2 create mode 100644 compiler-docs/static.files/FiraMono-Regular-87c26294.woff2 create mode 100644 compiler-docs/static.files/FiraSans-Italic-81dc35de.woff2 create mode 100644 compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt create mode 100644 compiler-docs/static.files/FiraSans-Medium-e1aa3f0a.woff2 create mode 100644 compiler-docs/static.files/FiraSans-MediumItalic-ccf7e434.woff2 create mode 100644 compiler-docs/static.files/FiraSans-Regular-0fe48ade.woff2 create mode 100644 compiler-docs/static.files/LICENSE-APACHE-a60eea81.txt create mode 100644 compiler-docs/static.files/LICENSE-MIT-23f18e03.txt create mode 100644 compiler-docs/static.files/NanumBarunGothic-13b3dcba.ttf.woff2 create mode 100644 compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt create mode 100644 compiler-docs/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 create mode 100644 compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt create mode 100644 compiler-docs/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 create mode 100644 compiler-docs/static.files/SourceCodePro-Semibold-aa29a496.ttf.woff2 create mode 100644 compiler-docs/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 create mode 100644 compiler-docs/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 create mode 100644 compiler-docs/static.files/SourceSerif4-LICENSE-a2cfd9d5.md create mode 100644 compiler-docs/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 create mode 100644 compiler-docs/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 create mode 100644 compiler-docs/static.files/favicon-044be391.svg create mode 100644 compiler-docs/static.files/favicon-32x32-6580c154.png create mode 100644 compiler-docs/static.files/main-eebb9057.js create mode 100644 compiler-docs/static.files/normalize-9960930a.css create mode 100644 compiler-docs/static.files/noscript-32bb7600.css create mode 100644 compiler-docs/static.files/rust-logo-9a9549ea.svg create mode 100644 compiler-docs/static.files/rustdoc-aa0817cf.css create mode 100644 compiler-docs/static.files/scrape-examples-5e967b76.js create mode 100644 compiler-docs/static.files/search-fa3e91e5.js create mode 100644 compiler-docs/static.files/settings-5514c975.js create mode 100644 compiler-docs/static.files/src-script-813739b1.js create mode 100644 compiler-docs/static.files/storage-68b7e25d.js create mode 100644 compiler-docs/trait.impl/clap/derive/trait.Args.js create mode 100644 compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js create mode 100644 compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js create mode 100644 compiler-docs/trait.impl/clap/derive/trait.Parser.js create mode 100644 compiler-docs/trait.impl/clap/derive/trait.Subcommand.js create mode 100644 compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js create mode 100644 compiler-docs/trait.impl/core/clone/trait.Clone.js create mode 100644 compiler-docs/trait.impl/core/cmp/trait.Eq.js create mode 100644 compiler-docs/trait.impl/core/cmp/trait.Ord.js create mode 100644 compiler-docs/trait.impl/core/cmp/trait.PartialEq.js create mode 100644 compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js create mode 100644 compiler-docs/trait.impl/core/convert/trait.AsRef.js create mode 100644 compiler-docs/trait.impl/core/convert/trait.From.js create mode 100644 compiler-docs/trait.impl/core/convert/trait.TryFrom.js create mode 100644 compiler-docs/trait.impl/core/default/trait.Default.js create mode 100644 compiler-docs/trait.impl/core/error/trait.Error.js create mode 100644 compiler-docs/trait.impl/core/fmt/trait.Debug.js create mode 100644 compiler-docs/trait.impl/core/fmt/trait.Display.js create mode 100644 compiler-docs/trait.impl/core/hash/trait.Hash.js create mode 100644 compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js create mode 100644 compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js create mode 100644 compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js create mode 100644 compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.Copy.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.Freeze.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.Send.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.Sync.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.Unpin.js create mode 100644 compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js create mode 100644 compiler-docs/trait.impl/core/ops/arith/trait.Add.js create mode 100644 compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js create mode 100644 compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js create mode 100644 compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js create mode 100644 compiler-docs/trait.impl/core/str/traits/trait.FromStr.js create mode 100644 compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js create mode 100644 compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js create mode 100644 compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js create mode 100644 compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js create mode 100644 compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js create mode 100644 compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js create mode 100644 compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js create mode 100644 compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js create mode 100644 compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js create mode 100644 compiler-docs/trait.impl/fe_common/db/trait.Upcast.js create mode 100644 compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js create mode 100644 compiler-docs/trait.impl/fe_common/span/trait.Spanned.js create mode 100644 compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js create mode 100644 compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js create mode 100644 compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js create mode 100644 compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js create mode 100644 compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js create mode 100644 compiler-docs/trait.impl/logos/trait.Logos.js create mode 100644 compiler-docs/trait.impl/salsa/interned/trait.InternKey.js create mode 100644 compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js create mode 100644 compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js create mode 100644 compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js create mode 100644 compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js create mode 100644 compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js create mode 100644 compiler-docs/trait.impl/salsa/trait.Database.js create mode 100644 compiler-docs/trait.impl/salsa/trait.Query.js create mode 100644 compiler-docs/trait.impl/salsa/trait.QueryDb.js create mode 100644 compiler-docs/trait.impl/serde/de/trait.Deserialize.js create mode 100644 compiler-docs/trait.impl/serde/ser/trait.Serialize.js create mode 100644 compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js create mode 100644 compiler-docs/type.impl/core/result/enum.Result.js create mode 100644 compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js create mode 100644 compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js create mode 100644 compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js create mode 100644 compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js create mode 100644 compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js create mode 100644 compiler-docs/type.impl/id_arena/struct.Id.js create mode 100644 compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js create mode 100644 devconnect.html create mode 100644 devconnect_ist.png create mode 100644 docs/404.html create mode 100644 docs/FontAwesome/css/font-awesome.css create mode 100644 docs/FontAwesome/fonts/FontAwesome.ttf create mode 100644 docs/FontAwesome/fonts/fontawesome-webfont.eot create mode 100644 docs/FontAwesome/fonts/fontawesome-webfont.svg create mode 100644 docs/FontAwesome/fonts/fontawesome-webfont.ttf create mode 100644 docs/FontAwesome/fonts/fontawesome-webfont.woff create mode 100644 docs/FontAwesome/fonts/fontawesome-webfont.woff2 create mode 100644 docs/ayu-highlight.css create mode 100644 docs/book.js create mode 100644 docs/clipboard.min.js create mode 100644 docs/code_of_conduct.html create mode 100644 docs/contributing.html create mode 100644 docs/css/chrome.css create mode 100644 docs/css/general.css create mode 100644 docs/css/print.css create mode 100644 docs/css/variables.css create mode 100644 docs/development/build.html create mode 100644 docs/development/index.html create mode 100644 docs/development/release.html create mode 100644 docs/elasticlunr.min.js create mode 100644 docs/favicon.png create mode 100644 docs/favicon.svg create mode 100644 docs/fonts/OPEN-SANS-LICENSE.txt create mode 100644 docs/fonts/SOURCE-CODE-PRO-LICENSE.txt create mode 100644 docs/fonts/fonts.css create mode 100644 docs/fonts/open-sans-v17-all-charsets-300.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-300italic.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-600.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-600italic.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-700.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-700italic.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-800.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-800italic.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-italic.woff2 create mode 100644 docs/fonts/open-sans-v17-all-charsets-regular.woff2 create mode 100644 docs/fonts/source-code-pro-v11-all-charsets-500.woff2 create mode 100644 docs/highlight.css create mode 100644 docs/highlight.js create mode 100644 docs/images/fe.png create mode 100644 docs/index.html create mode 100644 docs/mark.min.js create mode 100644 docs/print.html create mode 100644 docs/quickstart/deploy_contract.html create mode 100644 docs/quickstart/first_contract.html create mode 100644 docs/quickstart/index.html create mode 100644 docs/release_notes.html create mode 100644 docs/searcher.js create mode 100644 docs/searchindex.js create mode 100644 docs/searchindex.json create mode 100644 docs/spec/comments.html create mode 100644 docs/spec/data_layout/index.html create mode 100644 docs/spec/data_layout/memory/index.html create mode 100644 docs/spec/data_layout/memory/sequence_types_in_memory.html create mode 100644 docs/spec/data_layout/stack.html create mode 100644 docs/spec/data_layout/storage/constant_size_values_in_storage.html create mode 100644 docs/spec/data_layout/storage/index.html create mode 100644 docs/spec/data_layout/storage/maps_in_storage.html create mode 100644 docs/spec/data_layout/storage/to_mem_function.html create mode 100644 docs/spec/expressions/arithmetic_operators.html create mode 100644 docs/spec/expressions/attribute.html create mode 100644 docs/spec/expressions/boolean_operators.html create mode 100644 docs/spec/expressions/call.html create mode 100644 docs/spec/expressions/comparison_operators.html create mode 100644 docs/spec/expressions/index.html create mode 100644 docs/spec/expressions/indexing.html create mode 100644 docs/spec/expressions/list.html create mode 100644 docs/spec/expressions/literal.html create mode 100644 docs/spec/expressions/name.html create mode 100644 docs/spec/expressions/path.html create mode 100644 docs/spec/expressions/struct.html create mode 100644 docs/spec/expressions/tuple.html create mode 100644 docs/spec/expressions/unary_operators.html create mode 100644 docs/spec/index.html create mode 100644 docs/spec/items/contracts.html create mode 100644 docs/spec/items/enums.html create mode 100644 docs/spec/items/functions/context.html create mode 100644 docs/spec/items/functions/index.html create mode 100644 docs/spec/items/functions/self.html create mode 100644 docs/spec/items/index.html create mode 100644 docs/spec/items/structs.html create mode 100644 docs/spec/items/traits.html create mode 100644 docs/spec/items/type_aliases.html create mode 100644 docs/spec/items/visibility_and_privacy.html create mode 100644 docs/spec/lexical_structure/identifiers.html create mode 100644 docs/spec/lexical_structure/index.html create mode 100644 docs/spec/lexical_structure/keywords.html create mode 100644 docs/spec/lexical_structure/tokens.html create mode 100644 docs/spec/notation.html create mode 100644 docs/spec/statements/assert.html create mode 100644 docs/spec/statements/assign.html create mode 100644 docs/spec/statements/augassign.html create mode 100644 docs/spec/statements/break.html create mode 100644 docs/spec/statements/const.html create mode 100644 docs/spec/statements/continue.html create mode 100644 docs/spec/statements/for.html create mode 100644 docs/spec/statements/if.html create mode 100644 docs/spec/statements/index.html create mode 100644 docs/spec/statements/let.html create mode 100644 docs/spec/statements/match.html create mode 100644 docs/spec/statements/pragma.html create mode 100644 docs/spec/statements/return.html create mode 100644 docs/spec/statements/revert.html create mode 100644 docs/spec/statements/while.html create mode 100644 docs/spec/type_system/index.html create mode 100644 docs/spec/type_system/types/address.html create mode 100644 docs/spec/type_system/types/array.html create mode 100644 docs/spec/type_system/types/boolean.html create mode 100644 docs/spec/type_system/types/contract.html create mode 100644 docs/spec/type_system/types/enum.html create mode 100644 docs/spec/type_system/types/function.html create mode 100644 docs/spec/type_system/types/index.html create mode 100644 docs/spec/type_system/types/map.html create mode 100644 docs/spec/type_system/types/numeric.html create mode 100644 docs/spec/type_system/types/string.html create mode 100644 docs/spec/type_system/types/struct.html create mode 100644 docs/spec/type_system/types/tuple.html create mode 100644 docs/spec/type_system/types/unit.html create mode 100644 docs/std/index.html create mode 100644 docs/std/precompiles.html create mode 100644 docs/theme/custom-highlight.js create mode 100644 docs/theme/reference.css create mode 100644 docs/tomorrow-night.css create mode 100644 docs/user-guide/example_contracts/auction_contract.html create mode 100644 docs/user-guide/example_contracts/index.html create mode 100644 docs/user-guide/external_links.html create mode 100644 docs/user-guide/index.html create mode 100644 docs/user-guide/installation.html create mode 100644 docs/user-guide/projects.html create mode 100644 docs/user-guide/tutorials/auction.html create mode 100644 docs/user-guide/tutorials/index.html create mode 100644 fe-logo-small.svg create mode 100644 fe-logo.svg create mode 100644 index.html create mode 100644 privacy-policy.docx diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..c7fc02bd8f --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +fe-lang.org \ No newline at end of file diff --git a/compiler-docs/.lock b/compiler-docs/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/compiler-docs/crates.js b/compiler-docs/crates.js new file mode 100644 index 0000000000..93cbe18ad9 --- /dev/null +++ b/compiler-docs/crates.js @@ -0,0 +1,2 @@ +window.ALL_CRATES = ["fe","fe_abi","fe_analyzer","fe_codegen","fe_common","fe_compiler_test_utils","fe_compiler_tests","fe_compiler_tests_legacy","fe_driver","fe_library","fe_mir","fe_parser","fe_test_files","fe_test_runner","fe_yulc"]; +//{"start":21,"fragment_lengths":[4,9,14,13,12,25,20,27,12,13,9,12,16,17,10]} \ No newline at end of file diff --git a/compiler-docs/fe/all.html b/compiler-docs/fe/all.html new file mode 100644 index 0000000000..8a7290f6d0 --- /dev/null +++ b/compiler-docs/fe/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe/fn.main.html b/compiler-docs/fe/fn.main.html new file mode 100644 index 0000000000..82130c514b --- /dev/null +++ b/compiler-docs/fe/fn.main.html @@ -0,0 +1 @@ +main in fe - Rust

Function main

Source
pub(crate) fn main()
\ No newline at end of file diff --git a/compiler-docs/fe/index.html b/compiler-docs/fe/index.html new file mode 100644 index 0000000000..3e7a86a51b --- /dev/null +++ b/compiler-docs/fe/index.html @@ -0,0 +1 @@ +fe - Rust

Crate fe

Source

Modules§

task 🔒

Structs§

FelangCli 🔒

Functions§

main 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/sidebar-items.js b/compiler-docs/fe/sidebar-items.js new file mode 100644 index 0000000000..0e912cd34b --- /dev/null +++ b/compiler-docs/fe/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["main"],"mod":["task"],"struct":["FelangCli"]}; \ No newline at end of file diff --git a/compiler-docs/fe/struct.FelangCli.html b/compiler-docs/fe/struct.FelangCli.html new file mode 100644 index 0000000000..4775bcd101 --- /dev/null +++ b/compiler-docs/fe/struct.FelangCli.html @@ -0,0 +1,109 @@ +FelangCli in fe - Rust

Struct FelangCli

Source
pub(crate) struct FelangCli {
+    pub(crate) command: Commands,
+}

Fields§

§command: Commands

Trait Implementations§

Source§

impl Args for FelangCli

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl CommandFactory for FelangCli

Source§

fn into_app<'b>() -> Command<'b>

Deprecated, replaced with CommandFactory::command
Source§

fn into_app_for_update<'b>() -> Command<'b>

Deprecated, replaced with CommandFactory::command_for_update
§

fn command<'help>() -> App<'help>

Build a [Command] that can instantiate Self. Read more
§

fn command_for_update<'help>() -> App<'help>

Build a [Command] that can update self. Read more
Source§

impl FromArgMatches for FelangCli

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

impl Parser for FelangCli

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html b/compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html new file mode 100644 index 0000000000..279c8f306e --- /dev/null +++ b/compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html @@ -0,0 +1 @@ +DEFAULT_OUTPUT_DIR_NAME in fe::task::build - Rust

Constant DEFAULT_OUTPUT_DIR_NAME

Source
const DEFAULT_OUTPUT_DIR_NAME: &str = "output";
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/enum.Emit.html b/compiler-docs/fe/task/build/enum.Emit.html new file mode 100644 index 0000000000..7f420a5ec4 --- /dev/null +++ b/compiler-docs/fe/task/build/enum.Emit.html @@ -0,0 +1,117 @@ +Emit in fe::task::build - Rust

Enum Emit

Source
enum Emit {
+    Abi,
+    Ast,
+    LoweredAst,
+    Bytecode,
+    RuntimeBytecode,
+    Tokens,
+    Yul,
+}

Variants§

§

Abi

§

Ast

§

LoweredAst

§

Bytecode

§

RuntimeBytecode

§

Tokens

§

Yul

Trait Implementations§

Source§

impl Clone for Emit

Source§

fn clone(&self) -> Emit

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Emit

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Ord for Emit

Source§

fn cmp(&self, other: &Emit) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Emit

Source§

fn eq(&self, other: &Emit) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Emit

Source§

fn partial_cmp(&self, other: &Emit) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl ValueEnum for Emit

Source§

fn value_variants<'a>() -> &'a [Self]

All possible argument values, in display order.
Source§

fn to_possible_value<'a>(&self) -> Option<PossibleValue<'a>>

The canonical argument value. Read more
§

fn from_str(input: &str, ignore_case: bool) -> Result<Self, String>

Parse an argument into Self.
Source§

impl Copy for Emit

Source§

impl Eq for Emit

Source§

impl StructuralPartialEq for Emit

Auto Trait Implementations§

§

impl Freeze for Emit

§

impl RefUnwindSafe for Emit

§

impl Send for Emit

§

impl Sync for Emit

§

impl Unpin for Emit

§

impl UnwindSafe for Emit

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DynClone for T
where + T: Clone,

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.build.html b/compiler-docs/fe/task/build/fn.build.html new file mode 100644 index 0000000000..06e47bd07a --- /dev/null +++ b/compiler-docs/fe/task/build/fn.build.html @@ -0,0 +1 @@ +build in fe::task::build - Rust

Function build

Source
pub fn build(compile_arg: BuildArgs)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.build_ingot.html b/compiler-docs/fe/task/build/fn.build_ingot.html new file mode 100644 index 0000000000..731f0f1c63 --- /dev/null +++ b/compiler-docs/fe/task/build/fn.build_ingot.html @@ -0,0 +1 @@ +build_ingot in fe::task::build - Rust

Function build_ingot

Source
fn build_ingot(compile_arg: &BuildArgs) -> (String, CompiledModule)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.build_single_file.html b/compiler-docs/fe/task/build/fn.build_single_file.html new file mode 100644 index 0000000000..9d2e80117f --- /dev/null +++ b/compiler-docs/fe/task/build/fn.build_single_file.html @@ -0,0 +1 @@ +build_single_file in fe::task::build - Rust

Function build_single_file

Source
fn build_single_file(compile_arg: &BuildArgs) -> (String, CompiledModule)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.ioerr_to_string.html b/compiler-docs/fe/task/build/fn.ioerr_to_string.html new file mode 100644 index 0000000000..bf0d40ceb3 --- /dev/null +++ b/compiler-docs/fe/task/build/fn.ioerr_to_string.html @@ -0,0 +1 @@ +ioerr_to_string in fe::task::build - Rust

Function ioerr_to_string

Source
fn ioerr_to_string(error: Error) -> String
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.mir_dump.html b/compiler-docs/fe/task/build/fn.mir_dump.html new file mode 100644 index 0000000000..171a825f4f --- /dev/null +++ b/compiler-docs/fe/task/build/fn.mir_dump.html @@ -0,0 +1 @@ +mir_dump in fe::task::build - Rust

Function mir_dump

Source
fn mir_dump(input_path: &str)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html b/compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html new file mode 100644 index 0000000000..cd45f60fe9 --- /dev/null +++ b/compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html @@ -0,0 +1 @@ +verify_nonexistent_or_empty in fe::task::build - Rust

Function verify_nonexistent_or_empty

Source
fn verify_nonexistent_or_empty(dir: &Path) -> Result<(), String>
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.write_compiled_module.html b/compiler-docs/fe/task/build/fn.write_compiled_module.html new file mode 100644 index 0000000000..28de4cffeb --- /dev/null +++ b/compiler-docs/fe/task/build/fn.write_compiled_module.html @@ -0,0 +1,7 @@ +write_compiled_module in fe::task::build - Rust

Function write_compiled_module

Source
fn write_compiled_module(
+    module: CompiledModule,
+    file_content: &str,
+    targets: &[Emit],
+    output_dir: &str,
+    overwrite: bool,
+) -> Result<(), String>
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.write_output.html b/compiler-docs/fe/task/build/fn.write_output.html new file mode 100644 index 0000000000..e70f5a321b --- /dev/null +++ b/compiler-docs/fe/task/build/fn.write_output.html @@ -0,0 +1 @@ +write_output in fe::task::build - Rust

Function write_output

Source
fn write_output(path: &Path, content: &str) -> Result<(), String>
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/index.html b/compiler-docs/fe/task/build/index.html new file mode 100644 index 0000000000..dc6416c344 --- /dev/null +++ b/compiler-docs/fe/task/build/index.html @@ -0,0 +1 @@ +fe::task::build - Rust

Module build

Source

Structs§

BuildArgs

Enums§

Emit 🔒

Constants§

DEFAULT_OUTPUT_DIR_NAME 🔒

Functions§

build
build_ingot 🔒
build_single_file 🔒
ioerr_to_string 🔒
mir_dump 🔒
verify_nonexistent_or_empty 🔒
write_compiled_module 🔒
write_output 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/sidebar-items.js b/compiler-docs/fe/task/build/sidebar-items.js new file mode 100644 index 0000000000..77dc7c0ee2 --- /dev/null +++ b/compiler-docs/fe/task/build/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_OUTPUT_DIR_NAME"],"enum":["Emit"],"fn":["build","build_ingot","build_single_file","ioerr_to_string","mir_dump","verify_nonexistent_or_empty","write_compiled_module","write_output"],"struct":["BuildArgs"]}; \ No newline at end of file diff --git a/compiler-docs/fe/task/build/struct.BuildArgs.html b/compiler-docs/fe/task/build/struct.BuildArgs.html new file mode 100644 index 0000000000..3063cf4dd9 --- /dev/null +++ b/compiler-docs/fe/task/build/struct.BuildArgs.html @@ -0,0 +1,106 @@ +BuildArgs in fe::task::build - Rust

Struct BuildArgs

Source
pub struct BuildArgs {
+    input_path: String,
+    output_dir: String,
+    emit: Vec<Emit>,
+    mir: bool,
+    overwrite: bool,
+    optimize: Option<bool>,
+}

Fields§

§input_path: String§output_dir: String§emit: Vec<Emit>§mir: bool§overwrite: bool§optimize: Option<bool>

Trait Implementations§

Source§

impl Args for BuildArgs

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl FromArgMatches for BuildArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/check/fn.check.html b/compiler-docs/fe/task/check/fn.check.html new file mode 100644 index 0000000000..2b42078f4a --- /dev/null +++ b/compiler-docs/fe/task/check/fn.check.html @@ -0,0 +1 @@ +check in fe::task::check - Rust

Function check

Source
pub fn check(args: CheckArgs)
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/fn.check_ingot.html b/compiler-docs/fe/task/check/fn.check_ingot.html new file mode 100644 index 0000000000..b4a82e71a4 --- /dev/null +++ b/compiler-docs/fe/task/check/fn.check_ingot.html @@ -0,0 +1 @@ +check_ingot in fe::task::check - Rust

Function check_ingot

Source
fn check_ingot(db: &mut Db, input_path: &str) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/fn.check_single_file.html b/compiler-docs/fe/task/check/fn.check_single_file.html new file mode 100644 index 0000000000..bf273fcae4 --- /dev/null +++ b/compiler-docs/fe/task/check/fn.check_single_file.html @@ -0,0 +1 @@ +check_single_file in fe::task::check - Rust

Function check_single_file

Source
fn check_single_file(db: &mut Db, input_path: &str) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/index.html b/compiler-docs/fe/task/check/index.html new file mode 100644 index 0000000000..003cfb34e9 --- /dev/null +++ b/compiler-docs/fe/task/check/index.html @@ -0,0 +1 @@ +fe::task::check - Rust

Module check

Source

Structs§

CheckArgs

Functions§

check
check_ingot 🔒
check_single_file 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/sidebar-items.js b/compiler-docs/fe/task/check/sidebar-items.js new file mode 100644 index 0000000000..f883328035 --- /dev/null +++ b/compiler-docs/fe/task/check/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["check","check_ingot","check_single_file"],"struct":["CheckArgs"]}; \ No newline at end of file diff --git a/compiler-docs/fe/task/check/struct.CheckArgs.html b/compiler-docs/fe/task/check/struct.CheckArgs.html new file mode 100644 index 0000000000..97749b9dc5 --- /dev/null +++ b/compiler-docs/fe/task/check/struct.CheckArgs.html @@ -0,0 +1,101 @@ +CheckArgs in fe::task::check - Rust

Struct CheckArgs

Source
pub struct CheckArgs {
+    input_path: String,
+}

Fields§

§input_path: String

Trait Implementations§

Source§

impl Args for CheckArgs

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl FromArgMatches for CheckArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/enum.Commands.html b/compiler-docs/fe/task/enum.Commands.html new file mode 100644 index 0000000000..5549dd7a78 --- /dev/null +++ b/compiler-docs/fe/task/enum.Commands.html @@ -0,0 +1,103 @@ +Commands in fe::task - Rust

Enum Commands

Source
pub enum Commands {
+    Build(BuildArgs),
+    Check(CheckArgs),
+    New(NewProjectArgs),
+}

Variants§

Trait Implementations§

Source§

impl FromArgMatches for Commands

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut<'b>( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

impl Subcommand for Commands

Source§

fn augment_subcommands<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_subcommands_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

fn has_subcommand(__clap_name: &str) -> bool

Test whether Self can parse a specific subcommand

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/index.html b/compiler-docs/fe/task/index.html new file mode 100644 index 0000000000..6c8eb00da9 --- /dev/null +++ b/compiler-docs/fe/task/index.html @@ -0,0 +1 @@ +fe::task - Rust

Module task

Source

Re-exports§

pub use build::build;
pub use build::BuildArgs;
pub use check::check;
pub use check::CheckArgs;
pub use new::create_new_project;
pub use new::NewProjectArgs;

Modules§

build 🔒
check 🔒
new 🔒

Enums§

Commands
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html b/compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html new file mode 100644 index 0000000000..4e1d7a71a4 --- /dev/null +++ b/compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html @@ -0,0 +1 @@ +SRC_TEMPLATE_DIR in fe::task::new - Rust

Constant SRC_TEMPLATE_DIR

Source
const SRC_TEMPLATE_DIR: Dir<'_>;
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/fn.create_new_project.html b/compiler-docs/fe/task/new/fn.create_new_project.html new file mode 100644 index 0000000000..1f8b390245 --- /dev/null +++ b/compiler-docs/fe/task/new/fn.create_new_project.html @@ -0,0 +1 @@ +create_new_project in fe::task::new - Rust

Function create_new_project

Source
pub fn create_new_project(args: NewProjectArgs)
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/fn.create_project.html b/compiler-docs/fe/task/new/fn.create_project.html new file mode 100644 index 0000000000..3899c24e82 --- /dev/null +++ b/compiler-docs/fe/task/new/fn.create_project.html @@ -0,0 +1 @@ +create_project in fe::task::new - Rust

Function create_project

Source
fn create_project(name: &str, path: &Path)
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/index.html b/compiler-docs/fe/task/new/index.html new file mode 100644 index 0000000000..9142b7d15d --- /dev/null +++ b/compiler-docs/fe/task/new/index.html @@ -0,0 +1 @@ +fe::task::new - Rust

Module new

Source

Structs§

NewProjectArgs

Constants§

SRC_TEMPLATE_DIR 🔒

Functions§

create_new_project
create_project 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/sidebar-items.js b/compiler-docs/fe/task/new/sidebar-items.js new file mode 100644 index 0000000000..23184c9740 --- /dev/null +++ b/compiler-docs/fe/task/new/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["SRC_TEMPLATE_DIR"],"fn":["create_new_project","create_project"],"struct":["NewProjectArgs"]}; \ No newline at end of file diff --git a/compiler-docs/fe/task/new/struct.NewProjectArgs.html b/compiler-docs/fe/task/new/struct.NewProjectArgs.html new file mode 100644 index 0000000000..8e5a929364 --- /dev/null +++ b/compiler-docs/fe/task/new/struct.NewProjectArgs.html @@ -0,0 +1,101 @@ +NewProjectArgs in fe::task::new - Rust

Struct NewProjectArgs

Source
pub struct NewProjectArgs {
+    name: String,
+}

Fields§

§name: String

Trait Implementations§

Source§

impl Args for NewProjectArgs

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl FromArgMatches for NewProjectArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/sidebar-items.js b/compiler-docs/fe/task/sidebar-items.js new file mode 100644 index 0000000000..d29fbf5b5e --- /dev/null +++ b/compiler-docs/fe/task/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Commands"],"mod":["build","check","new"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/all.html b/compiler-docs/fe_abi/all.html new file mode 100644 index 0000000000..9ec1c72c36 --- /dev/null +++ b/compiler-docs/fe_abi/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_abi/contract/index.html b/compiler-docs/fe_abi/contract/index.html new file mode 100644 index 0000000000..66eac489b8 --- /dev/null +++ b/compiler-docs/fe_abi/contract/index.html @@ -0,0 +1 @@ +fe_abi::contract - Rust

Module contract

Source

Structs§

AbiContract
\ No newline at end of file diff --git a/compiler-docs/fe_abi/contract/sidebar-items.js b/compiler-docs/fe_abi/contract/sidebar-items.js new file mode 100644 index 0000000000..745d35a877 --- /dev/null +++ b/compiler-docs/fe_abi/contract/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AbiContract"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/contract/struct.AbiContract.html b/compiler-docs/fe_abi/contract/struct.AbiContract.html new file mode 100644 index 0000000000..a0a5247575 --- /dev/null +++ b/compiler-docs/fe_abi/contract/struct.AbiContract.html @@ -0,0 +1,20 @@ +AbiContract in fe_abi::contract - Rust

Struct AbiContract

Source
pub struct AbiContract { /* private fields */ }

Implementations§

Source§

impl AbiContract

Source

pub fn new(funcs: Vec<AbiFunction>, events: Vec<AbiEvent>) -> Self

Trait Implementations§

Source§

impl Clone for AbiContract

Source§

fn clone(&self) -> AbiContract

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiContract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiContract

Source§

fn eq(&self, other: &AbiContract) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiContract

Source§

fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiContract

Source§

impl StructuralPartialEq for AbiContract

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/index.html b/compiler-docs/fe_abi/event/index.html new file mode 100644 index 0000000000..60ebefd14e --- /dev/null +++ b/compiler-docs/fe_abi/event/index.html @@ -0,0 +1 @@ +fe_abi::event - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/sidebar-items.js b/compiler-docs/fe_abi/event/sidebar-items.js new file mode 100644 index 0000000000..bc46aa71df --- /dev/null +++ b/compiler-docs/fe_abi/event/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AbiEvent","AbiEventField","AbiEventSignature"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/event/struct.AbiEvent.html b/compiler-docs/fe_abi/event/struct.AbiEvent.html new file mode 100644 index 0000000000..543908885b --- /dev/null +++ b/compiler-docs/fe_abi/event/struct.AbiEvent.html @@ -0,0 +1,26 @@ +AbiEvent in fe_abi::event - Rust

Struct AbiEvent

Source
pub struct AbiEvent {
+    pub ty: &'static str,
+    pub name: String,
+    pub inputs: Vec<AbiEventField>,
+    pub anonymous: bool,
+}

Fields§

§ty: &'static str§name: String§inputs: Vec<AbiEventField>§anonymous: bool

Implementations§

Source§

impl AbiEvent

Source

pub fn new(name: String, fields: Vec<AbiEventField>, anonymous: bool) -> Self

Source

pub fn signature(&self) -> AbiEventSignature

Trait Implementations§

Source§

impl Clone for AbiEvent

Source§

fn clone(&self) -> AbiEvent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiEvent

Source§

fn eq(&self, other: &AbiEvent) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiEvent

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiEvent

Source§

impl StructuralPartialEq for AbiEvent

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/struct.AbiEventField.html b/compiler-docs/fe_abi/event/struct.AbiEventField.html new file mode 100644 index 0000000000..ca33b265c0 --- /dev/null +++ b/compiler-docs/fe_abi/event/struct.AbiEventField.html @@ -0,0 +1,25 @@ +AbiEventField in fe_abi::event - Rust

Struct AbiEventField

Source
pub struct AbiEventField {
+    pub name: String,
+    pub ty: AbiType,
+    pub indexed: bool,
+}

Fields§

§name: String§ty: AbiType§indexed: bool

Implementations§

Source§

impl AbiEventField

Source

pub fn new(name: String, ty: impl Into<AbiType>, indexed: bool) -> Self

Trait Implementations§

Source§

impl Clone for AbiEventField

Source§

fn clone(&self) -> AbiEventField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiEventField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiEventField

Source§

fn eq(&self, other: &AbiEventField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiEventField

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiEventField

Source§

impl StructuralPartialEq for AbiEventField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/struct.AbiEventSignature.html b/compiler-docs/fe_abi/event/struct.AbiEventSignature.html new file mode 100644 index 0000000000..2a88718a1b --- /dev/null +++ b/compiler-docs/fe_abi/event/struct.AbiEventSignature.html @@ -0,0 +1,11 @@ +AbiEventSignature in fe_abi::event - Rust

Struct AbiEventSignature

Source
pub struct AbiEventSignature { /* private fields */ }

Implementations§

Source§

impl AbiEventSignature

Source

pub fn signature(&self) -> &str

Source

pub fn hash_hex(&self) -> String

Source

pub fn hash_raw(&self) -> [u8; 32]

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.AbiFunctionType.html b/compiler-docs/fe_abi/function/enum.AbiFunctionType.html new file mode 100644 index 0000000000..07e47d69f6 --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.AbiFunctionType.html @@ -0,0 +1,27 @@ +AbiFunctionType in fe_abi::function - Rust

Enum AbiFunctionType

Source
pub enum AbiFunctionType {
+    Function,
+    Constructor,
+    Receive,
+    Payable,
+    Fallback,
+}

Variants§

§

Function

§

Constructor

§

Receive

§

Payable

§

Fallback

Trait Implementations§

Source§

impl Clone for AbiFunctionType

Source§

fn clone(&self) -> AbiFunctionType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiFunctionType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiFunctionType

Source§

fn eq(&self, other: &AbiFunctionType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiFunctionType

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for AbiFunctionType

Source§

impl Eq for AbiFunctionType

Source§

impl StructuralPartialEq for AbiFunctionType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.CtxParam.html b/compiler-docs/fe_abi/function/enum.CtxParam.html new file mode 100644 index 0000000000..6cec50bda7 --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.CtxParam.html @@ -0,0 +1,15 @@ +CtxParam in fe_abi::function - Rust

Enum CtxParam

Source
pub enum CtxParam {
+    None,
+    Imm,
+    Mut,
+}

Variants§

§

None

§

Imm

§

Mut

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.SelfParam.html b/compiler-docs/fe_abi/function/enum.SelfParam.html new file mode 100644 index 0000000000..c7015b4cbf --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.SelfParam.html @@ -0,0 +1,15 @@ +SelfParam in fe_abi::function - Rust

Enum SelfParam

Source
pub enum SelfParam {
+    None,
+    Imm,
+    Mut,
+}

Variants§

§

None

§

Imm

§

Mut

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.StateMutability.html b/compiler-docs/fe_abi/function/enum.StateMutability.html new file mode 100644 index 0000000000..230dad6cb9 --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.StateMutability.html @@ -0,0 +1,27 @@ +StateMutability in fe_abi::function - Rust

Enum StateMutability

Source
pub enum StateMutability {
+    Pure,
+    View,
+    Nonpayable,
+    Payable,
+}
Expand description

The mutability of a public function.

+

Variants§

§

Pure

§

View

§

Nonpayable

§

Payable

Implementations§

Trait Implementations§

Source§

impl Clone for StateMutability

Source§

fn clone(&self) -> StateMutability

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StateMutability

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for StateMutability

Source§

fn eq(&self, other: &StateMutability) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for StateMutability

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for StateMutability

Source§

impl StructuralPartialEq for StateMutability

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/index.html b/compiler-docs/fe_abi/function/index.html new file mode 100644 index 0000000000..53d7db5e90 --- /dev/null +++ b/compiler-docs/fe_abi/function/index.html @@ -0,0 +1 @@ +fe_abi::function - Rust

Module function

Source

Structs§

AbiFunction
AbiFunctionSelector

Enums§

AbiFunctionType
CtxParam
SelfParam
StateMutability
The mutability of a public function.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/sidebar-items.js b/compiler-docs/fe_abi/function/sidebar-items.js new file mode 100644 index 0000000000..7dfdacc3d1 --- /dev/null +++ b/compiler-docs/fe_abi/function/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AbiFunctionType","CtxParam","SelfParam","StateMutability"],"struct":["AbiFunction","AbiFunctionSelector"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/function/struct.AbiFunction.html b/compiler-docs/fe_abi/function/struct.AbiFunction.html new file mode 100644 index 0000000000..afe2f86207 --- /dev/null +++ b/compiler-docs/fe_abi/function/struct.AbiFunction.html @@ -0,0 +1,27 @@ +AbiFunction in fe_abi::function - Rust

Struct AbiFunction

Source
pub struct AbiFunction { /* private fields */ }

Implementations§

Source§

impl AbiFunction

Source

pub fn new( + func_type: AbiFunctionType, + name: String, + args: Vec<(String, AbiType)>, + ret_ty: Option<AbiType>, + state_mutability: StateMutability, +) -> Self

Source

pub fn selector(&self) -> AbiFunctionSelector

Trait Implementations§

Source§

impl Clone for AbiFunction

Source§

fn clone(&self) -> AbiFunction

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiFunction

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiFunction

Source§

fn eq(&self, other: &AbiFunction) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiFunction

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiFunction

Source§

impl StructuralPartialEq for AbiFunction

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html b/compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html new file mode 100644 index 0000000000..3e15665f2f --- /dev/null +++ b/compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html @@ -0,0 +1,12 @@ +AbiFunctionSelector in fe_abi::function - Rust

Struct AbiFunctionSelector

Source
pub struct AbiFunctionSelector { /* private fields */ }

Implementations§

Source§

impl AbiFunctionSelector

Source

pub fn selector_signature(&self) -> &str

Source

pub fn selector_raw(&self) -> [u8; 4]

Source

pub fn hex(&self) -> String

Returns first 4 bytes of signature hash in hex.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/index.html b/compiler-docs/fe_abi/index.html new file mode 100644 index 0000000000..2f8dc4b42e --- /dev/null +++ b/compiler-docs/fe_abi/index.html @@ -0,0 +1 @@ +fe_abi - Rust

Crate fe_abi

Source

Modules§

contract
event
function
types
\ No newline at end of file diff --git a/compiler-docs/fe_abi/sidebar-items.js b/compiler-docs/fe_abi/sidebar-items.js new file mode 100644 index 0000000000..16c17313a0 --- /dev/null +++ b/compiler-docs/fe_abi/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["contract","event","function","types"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/types/enum.AbiType.html b/compiler-docs/fe_abi/types/enum.AbiType.html new file mode 100644 index 0000000000..e89e292d38 --- /dev/null +++ b/compiler-docs/fe_abi/types/enum.AbiType.html @@ -0,0 +1,34 @@ +AbiType in fe_abi::types - Rust

Enum AbiType

Source
pub enum AbiType {
+    UInt(usize),
+    Int(usize),
+    Address,
+    Bool,
+    Function,
+    Array {
+        elem_ty: Box<AbiType>,
+        len: usize,
+    },
+    Tuple(Vec<AbiTupleField>),
+    Bytes,
+    String,
+}

Variants§

§

UInt(usize)

§

Int(usize)

§

Address

§

Bool

§

Function

§

Array

Fields

§elem_ty: Box<AbiType>
§len: usize
§

Tuple(Vec<AbiTupleField>)

§

Bytes

§

String

Implementations§

Source§

impl AbiType

Source

pub fn selector_type_name(&self) -> String

Source

pub fn abi_type_name(&self) -> String

Source

pub fn header_size(&self) -> usize

Source

pub fn is_primitive(&self) -> bool

Source

pub fn is_bytes(&self) -> bool

Source

pub fn is_string(&self) -> bool

Source

pub fn is_static(&self) -> bool

Source

pub fn size(&self) -> Option<usize>

Returns bytes size of the encoded type if the type is static.

+

Trait Implementations§

Source§

impl Clone for AbiType

Source§

fn clone(&self) -> AbiType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiType

Source§

fn eq(&self, other: &AbiType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiType

Source§

fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiType

Source§

impl StructuralPartialEq for AbiType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/types/index.html b/compiler-docs/fe_abi/types/index.html new file mode 100644 index 0000000000..cd69943a39 --- /dev/null +++ b/compiler-docs/fe_abi/types/index.html @@ -0,0 +1 @@ +fe_abi::types - Rust

Module types

Source

Structs§

AbiTupleField

Enums§

AbiType
\ No newline at end of file diff --git a/compiler-docs/fe_abi/types/sidebar-items.js b/compiler-docs/fe_abi/types/sidebar-items.js new file mode 100644 index 0000000000..eb93bd85b4 --- /dev/null +++ b/compiler-docs/fe_abi/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AbiType"],"struct":["AbiTupleField"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/types/struct.AbiTupleField.html b/compiler-docs/fe_abi/types/struct.AbiTupleField.html new file mode 100644 index 0000000000..8050698fb6 --- /dev/null +++ b/compiler-docs/fe_abi/types/struct.AbiTupleField.html @@ -0,0 +1,24 @@ +AbiTupleField in fe_abi::types - Rust

Struct AbiTupleField

Source
pub struct AbiTupleField {
+    pub name: String,
+    pub ty: AbiType,
+}

Fields§

§name: String§ty: AbiType

Implementations§

Source§

impl AbiTupleField

Source

pub fn new(name: String, ty: impl Into<AbiType>) -> Self

Trait Implementations§

Source§

impl Clone for AbiTupleField

Source§

fn clone(&self) -> AbiTupleField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiTupleField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiTupleField

Source§

fn eq(&self, other: &AbiTupleField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiTupleField

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiTupleField

Source§

impl StructuralPartialEq for AbiTupleField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/all.html b/compiler-docs/fe_analyzer/all.html new file mode 100644 index 0000000000..5055222619 --- /dev/null +++ b/compiler-docs/fe_analyzer/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Functions

Type Aliases

Constants

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html b/compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html new file mode 100644 index 0000000000..6ce0429d93 --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html @@ -0,0 +1,25 @@ +ContractTypeMethod in fe_analyzer::builtins - Rust

Enum ContractTypeMethod

Source
pub enum ContractTypeMethod {
+    Create,
+    Create2,
+}

Variants§

§

Create

§

Create2

Implementations§

Trait Implementations§

Source§

impl AsRef<str> for ContractTypeMethod

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for ContractTypeMethod

Source§

fn clone(&self) -> ContractTypeMethod

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractTypeMethod

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for ContractTypeMethod

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<ContractTypeMethod, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl PartialEq for ContractTypeMethod

Source§

fn eq(&self, other: &ContractTypeMethod) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl TryFrom<&str> for ContractTypeMethod

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from( + s: &str, +) -> Result<ContractTypeMethod, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for ContractTypeMethod

Source§

impl Eq for ContractTypeMethod

Source§

impl StructuralPartialEq for ContractTypeMethod

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html b/compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html new file mode 100644 index 0000000000..64f1bbfeaf --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html @@ -0,0 +1,33 @@ +GlobalFunction in fe_analyzer::builtins - Rust

Enum GlobalFunction

Source
pub enum GlobalFunction {
+    Keccak256,
+}

Variants§

§

Keccak256

Trait Implementations§

Source§

impl AsRef<str> for GlobalFunction

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for GlobalFunction

Source§

fn clone(&self) -> GlobalFunction

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GlobalFunction

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for GlobalFunction

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<GlobalFunction, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for GlobalFunction

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for GlobalFunction

Source§

impl Ord for GlobalFunction

Source§

fn cmp(&self, other: &GlobalFunction) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for GlobalFunction

Source§

fn eq(&self, other: &GlobalFunction) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for GlobalFunction

Source§

fn partial_cmp(&self, other: &GlobalFunction) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for GlobalFunction

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<GlobalFunction, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for GlobalFunction

Source§

impl Eq for GlobalFunction

Source§

impl StructuralPartialEq for GlobalFunction

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html b/compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html new file mode 100644 index 0000000000..b097b48ecd --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html @@ -0,0 +1,109 @@ +Intrinsic in fe_analyzer::builtins - Rust

Enum Intrinsic

Source
pub enum Intrinsic {
+
Show 76 variants __stop, + __add, + __sub, + __mul, + __div, + __sdiv, + __mod, + __smod, + __exp, + __not, + __lt, + __gt, + __slt, + __sgt, + __eq, + __iszero, + __and, + __or, + __xor, + __byte, + __shl, + __shr, + __sar, + __addmod, + __mulmod, + __signextend, + __keccak256, + __pc, + __pop, + __mload, + __mstore, + __mstore8, + __sload, + __sstore, + __msize, + __gas, + __address, + __balance, + __selfbalance, + __caller, + __callvalue, + __calldataload, + __calldatasize, + __calldatacopy, + __codesize, + __codecopy, + __extcodesize, + __extcodecopy, + __returndatasize, + __returndatacopy, + __extcodehash, + __create, + __create2, + __call, + __callcode, + __delegatecall, + __staticcall, + __return, + __revert, + __selfdestruct, + __invalid, + __log0, + __log1, + __log2, + __log3, + __log4, + __chainid, + __basefee, + __origin, + __gasprice, + __blockhash, + __coinbase, + __timestamp, + __number, + __prevrandao, + __gaslimit, +
}
Expand description

The evm functions exposed by yul.

+

Variants§

§

__stop

§

__add

§

__sub

§

__mul

§

__div

§

__sdiv

§

__mod

§

__smod

§

__exp

§

__not

§

__lt

§

__gt

§

__slt

§

__sgt

§

__eq

§

__iszero

§

__and

§

__or

§

__xor

§

__byte

§

__shl

§

__shr

§

__sar

§

__addmod

§

__mulmod

§

__signextend

§

__keccak256

§

__pc

§

__pop

§

__mload

§

__mstore

§

__mstore8

§

__sload

§

__sstore

§

__msize

§

__gas

§

__address

§

__balance

§

__selfbalance

§

__caller

§

__callvalue

§

__calldataload

§

__calldatasize

§

__calldatacopy

§

__codesize

§

__codecopy

§

__extcodesize

§

__extcodecopy

§

__returndatasize

§

__returndatacopy

§

__extcodehash

§

__create

§

__create2

§

__call

§

__callcode

§

__delegatecall

§

__staticcall

§

__return

§

__revert

§

__selfdestruct

§

__invalid

§

__log0

§

__log1

§

__log2

§

__log3

§

__log4

§

__chainid

§

__basefee

§

__origin

§

__gasprice

§

__blockhash

§

__coinbase

§

__timestamp

§

__number

§

__prevrandao

§

__gaslimit

Implementations§

Source§

impl Intrinsic

Source

pub fn arg_count(&self) -> usize

Source

pub fn return_type(&self) -> Base

Trait Implementations§

Source§

impl AsRef<str> for Intrinsic

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for Intrinsic

Source§

fn clone(&self) -> Intrinsic

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Intrinsic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for Intrinsic

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Intrinsic, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for Intrinsic

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for Intrinsic

Source§

impl Ord for Intrinsic

Source§

fn cmp(&self, other: &Intrinsic) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Intrinsic

Source§

fn eq(&self, other: &Intrinsic) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Intrinsic

Source§

fn partial_cmp(&self, other: &Intrinsic) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for Intrinsic

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<Intrinsic, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for Intrinsic

Source§

impl Eq for Intrinsic

Source§

impl StructuralPartialEq for Intrinsic

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html b/compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html new file mode 100644 index 0000000000..20a0de590d --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html @@ -0,0 +1,25 @@ +ValueMethod in fe_analyzer::builtins - Rust

Enum ValueMethod

Source
pub enum ValueMethod {
+    ToMem,
+    AbiEncode,
+}

Variants§

§

ToMem

§

AbiEncode

Trait Implementations§

Source§

impl AsRef<str> for ValueMethod

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for ValueMethod

Source§

fn clone(&self) -> ValueMethod

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ValueMethod

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for ValueMethod

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<ValueMethod, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for ValueMethod

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ValueMethod

Source§

fn eq(&self, other: &ValueMethod) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl TryFrom<&str> for ValueMethod

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<ValueMethod, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for ValueMethod

Source§

impl Eq for ValueMethod

Source§

impl StructuralPartialEq for ValueMethod

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/index.html b/compiler-docs/fe_analyzer/builtins/index.html new file mode 100644 index 0000000000..d24a8254de --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/index.html @@ -0,0 +1 @@ +fe_analyzer::builtins - Rust

Module builtins

Source

Structs§

GlobalFunctionIter
IntrinsicIter

Enums§

ContractTypeMethod
GlobalFunction
Intrinsic
The evm functions exposed by yul.
ValueMethod
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/sidebar-items.js b/compiler-docs/fe_analyzer/builtins/sidebar-items.js new file mode 100644 index 0000000000..261c3e4c84 --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ContractTypeMethod","GlobalFunction","Intrinsic","ValueMethod"],"struct":["GlobalFunctionIter","IntrinsicIter"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html b/compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html new file mode 100644 index 0000000000..4cbc8c8d2e --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html @@ -0,0 +1,221 @@ +GlobalFunctionIter in fe_analyzer::builtins - Rust

Struct GlobalFunctionIter

Source
pub struct GlobalFunctionIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for GlobalFunctionIter

Source§

fn clone(&self) -> GlobalFunctionIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for GlobalFunctionIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for GlobalFunctionIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for GlobalFunctionIter

Source§

type Item = GlobalFunction

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html b/compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html new file mode 100644 index 0000000000..f4e7ab9d86 --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html @@ -0,0 +1,221 @@ +IntrinsicIter in fe_analyzer::builtins - Rust

Struct IntrinsicIter

Source
pub struct IntrinsicIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for IntrinsicIter

Source§

fn clone(&self) -> IntrinsicIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for IntrinsicIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for IntrinsicIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for IntrinsicIter

Source§

type Item = Intrinsic

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html b/compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html new file mode 100644 index 0000000000..49409555cf --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html @@ -0,0 +1 @@ +EMITTABLE_TRAIT_NAME in fe_analyzer::constants - Rust

Constant EMITTABLE_TRAIT_NAME

Source
pub const EMITTABLE_TRAIT_NAME: &str = "Emittable";
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html b/compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html new file mode 100644 index 0000000000..c7deb53ab1 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html @@ -0,0 +1 @@ +EMIT_FN_NAME in fe_analyzer::constants - Rust

Constant EMIT_FN_NAME

Source
pub const EMIT_FN_NAME: &str = "emit";
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.INDEXED.html b/compiler-docs/fe_analyzer/constants/constant.INDEXED.html new file mode 100644 index 0000000000..e35f5e2582 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.INDEXED.html @@ -0,0 +1 @@ +INDEXED in fe_analyzer::constants - Rust

Constant INDEXED

Source
pub const INDEXED: &str = "indexed";
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html b/compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html new file mode 100644 index 0000000000..969bd77f45 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html @@ -0,0 +1 @@ +MAX_INDEXED_EVENT_FIELDS in fe_analyzer::constants - Rust

Constant MAX_INDEXED_EVENT_FIELDS

Source
pub const MAX_INDEXED_EVENT_FIELDS: usize = 3;
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/index.html b/compiler-docs/fe_analyzer/constants/index.html new file mode 100644 index 0000000000..770c9f3c6a --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/index.html @@ -0,0 +1 @@ +fe_analyzer::constants - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/sidebar-items.js b/compiler-docs/fe_analyzer/constants/sidebar-items.js new file mode 100644 index 0000000000..6d34019cd5 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["EMITTABLE_TRAIT_NAME","EMIT_FN_NAME","INDEXED","MAX_INDEXED_EVENT_FIELDS"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html b/compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html new file mode 100644 index 0000000000..577f7235ad --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html @@ -0,0 +1,26 @@ +AdjustmentKind in fe_analyzer::context - Rust

Enum AdjustmentKind

Source
pub enum AdjustmentKind {
+    Copy,
+    Load,
+    IntSizeIncrease,
+    StringSizeIncrease,
+}

Variants§

§

Copy

§

Load

Load from storage ptr

+
§

IntSizeIncrease

§

StringSizeIncrease

Trait Implementations§

Source§

impl Clone for AdjustmentKind

Source§

fn clone(&self) -> AdjustmentKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AdjustmentKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AdjustmentKind

Source§

fn eq(&self, other: &AdjustmentKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for AdjustmentKind

Source§

impl Eq for AdjustmentKind

Source§

impl StructuralPartialEq for AdjustmentKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.CallType.html b/compiler-docs/fe_analyzer/context/enum.CallType.html new file mode 100644 index 0000000000..f89400e6de --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.CallType.html @@ -0,0 +1,53 @@ +CallType in fe_analyzer::context - Rust

Enum CallType

Source
pub enum CallType {
+    BuiltinFunction(GlobalFunction),
+    Intrinsic(Intrinsic),
+    BuiltinValueMethod {
+        method: ValueMethod,
+        typ: TypeId,
+    },
+    BuiltinAssociatedFunction {
+        contract: ContractId,
+        function: ContractTypeMethod,
+    },
+    AssociatedFunction {
+        typ: TypeId,
+        function: FunctionId,
+    },
+    ValueMethod {
+        typ: TypeId,
+        method: FunctionId,
+    },
+    TraitValueMethod {
+        trait_id: TraitId,
+        method: FunctionSigId,
+        generic_type: Generic,
+    },
+    External {
+        contract: ContractId,
+        function: FunctionId,
+    },
+    Pure(FunctionId),
+    TypeConstructor(TypeId),
+    EnumConstructor(EnumVariantId),
+}
Expand description

The type of a function call.

+

Variants§

§

BuiltinFunction(GlobalFunction)

§

Intrinsic(Intrinsic)

§

BuiltinValueMethod

Fields

§

BuiltinAssociatedFunction

Fields

§contract: ContractId
§

AssociatedFunction

Fields

§function: FunctionId
§

ValueMethod

Fields

§method: FunctionId
§

TraitValueMethod

Fields

§trait_id: TraitId
§generic_type: Generic
§

External

Fields

§contract: ContractId
§function: FunctionId
§

Pure(FunctionId)

§

TypeConstructor(TypeId)

§

EnumConstructor(EnumVariantId)

Implementations§

Source§

impl CallType

Source

pub fn function(&self) -> Option<FunctionId>

Source

pub fn function_name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool

Trait Implementations§

Source§

impl Clone for CallType

Source§

fn clone(&self) -> CallType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for CallType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl PartialEq for CallType

Source§

fn eq(&self, other: &CallType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for CallType

Source§

impl StructuralPartialEq for CallType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.Constant.html b/compiler-docs/fe_analyzer/context/enum.Constant.html new file mode 100644 index 0000000000..846df665b0 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.Constant.html @@ -0,0 +1,34 @@ +Constant in fe_analyzer::context - Rust

Enum Constant

Source
pub enum Constant {
+    Int(BigInt),
+    Address(BigInt),
+    Bool(bool),
+    Str(SmolStr),
+}
Expand description

Represents constant value.

+

Variants§

§

Int(BigInt)

§

Address(BigInt)

§

Bool(bool)

§

Str(SmolStr)

Implementations§

Source§

impl Constant

Source

pub fn from_num_str( + context: &mut dyn AnalyzerContext, + s: &str, + typ: &Type, + span: Span, +) -> Result<Self, ConstEvalError>

Returns constant from numeric literal represented by string.

+
§Panics
+

Panics if s is invalid string for numeric literal.

+

Trait Implementations§

Source§

impl Clone for Constant

Source§

fn clone(&self) -> Constant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Constant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Constant

Source§

fn eq(&self, other: &Constant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Constant

Source§

impl StructuralPartialEq for Constant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.NamedThing.html b/compiler-docs/fe_analyzer/context/enum.NamedThing.html new file mode 100644 index 0000000000..a4e5f66890 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.NamedThing.html @@ -0,0 +1,41 @@ +NamedThing in fe_analyzer::context - Rust

Enum NamedThing

Source
pub enum NamedThing {
+    Item(Item),
+    EnumVariant(EnumVariantId),
+    SelfValue {
+        decl: Option<SelfDecl>,
+        parent: Option<Item>,
+        span: Option<Span>,
+    },
+    Variable {
+        name: SmolStr,
+        typ: Result<TypeId, TypeError>,
+        is_const: bool,
+        span: Span,
+    },
+}

Variants§

§

Item(Item)

§

EnumVariant(EnumVariantId)

§

SelfValue

Fields

§decl: Option<SelfDecl>

Function self parameter.

+
§parent: Option<Item>

The function’s parent, if any. If None, self has been +used in a module-level function.

+
§span: Option<Span>
§

Variable

Fields

§name: SmolStr
§is_const: bool
§span: Span

Implementations§

Source§

impl NamedThing

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_builtin(&self) -> bool

Source

pub fn item_kind_display_name(&self) -> &str

Source

pub fn resolve_path_segment( + &self, + db: &dyn AnalyzerDb, + segment: &SmolStr, +) -> Option<NamedThing>

Trait Implementations§

Source§

impl Clone for NamedThing

Source§

fn clone(&self) -> NamedThing

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for NamedThing

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for NamedThing

Source§

fn eq(&self, other: &NamedThing) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for NamedThing

Source§

impl StructuralPartialEq for NamedThing

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/index.html b/compiler-docs/fe_analyzer/context/index.html new file mode 100644 index 0000000000..685f43f9ea --- /dev/null +++ b/compiler-docs/fe_analyzer/context/index.html @@ -0,0 +1 @@ +fe_analyzer::context - Rust

Module context

Source

Structs§

Adjustment
Analysis
DiagnosticVoucher
This should only be created by AnalyzerContext.
ExpressionAttributes
Contains contextual information relating to an expression AST node.
FunctionBody
Label
TempContext

Enums§

AdjustmentKind
CallType
The type of a function call.
Constant
Represents constant value.
NamedThing

Traits§

AnalyzerContext
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/sidebar-items.js b/compiler-docs/fe_analyzer/context/sidebar-items.js new file mode 100644 index 0000000000..efc87ffddd --- /dev/null +++ b/compiler-docs/fe_analyzer/context/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AdjustmentKind","CallType","Constant","NamedThing"],"struct":["Adjustment","Analysis","DiagnosticVoucher","ExpressionAttributes","FunctionBody","Label","TempContext"],"trait":["AnalyzerContext"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.Adjustment.html b/compiler-docs/fe_analyzer/context/struct.Adjustment.html new file mode 100644 index 0000000000..53e66b80be --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.Adjustment.html @@ -0,0 +1,23 @@ +Adjustment in fe_analyzer::context - Rust

Struct Adjustment

Source
pub struct Adjustment {
+    pub into: TypeId,
+    pub kind: AdjustmentKind,
+}

Fields§

§into: TypeId§kind: AdjustmentKind

Trait Implementations§

Source§

impl Clone for Adjustment

Source§

fn clone(&self) -> Adjustment

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Adjustment

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Adjustment

Source§

fn eq(&self, other: &Adjustment) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Adjustment

Source§

impl Eq for Adjustment

Source§

impl StructuralPartialEq for Adjustment

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.Analysis.html b/compiler-docs/fe_analyzer/context/struct.Analysis.html new file mode 100644 index 0000000000..917432c986 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.Analysis.html @@ -0,0 +1,29 @@ +Analysis in fe_analyzer::context - Rust

Struct Analysis

Source
pub struct Analysis<T> {
+    pub value: T,
+    pub diagnostics: Rc<[Diagnostic]>,
+}

Fields§

§value: T§diagnostics: Rc<[Diagnostic]>

Implementations§

Source§

impl<T> Analysis<T>

Source

pub fn new(value: T, diagnostics: Rc<[Diagnostic]>) -> Self

Source

pub fn sink_diagnostics(&self, sink: &mut impl DiagnosticSink)

Source

pub fn has_diag(&self) -> bool

Trait Implementations§

Source§

impl<T: Clone> Clone for Analysis<T>

Source§

fn clone(&self) -> Analysis<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug> Debug for Analysis<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: Hash> Hash for Analysis<T>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<T: PartialEq> PartialEq for Analysis<T>

Source§

fn eq(&self, other: &Analysis<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<T: Eq> Eq for Analysis<T>

Source§

impl<T> StructuralPartialEq for Analysis<T>

Auto Trait Implementations§

§

impl<T> Freeze for Analysis<T>
where + T: Freeze,

§

impl<T> RefUnwindSafe for Analysis<T>
where + T: RefUnwindSafe,

§

impl<T> !Send for Analysis<T>

§

impl<T> !Sync for Analysis<T>

§

impl<T> Unpin for Analysis<T>
where + T: Unpin,

§

impl<T> UnwindSafe for Analysis<T>
where + T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html b/compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html new file mode 100644 index 0000000000..afa3155d57 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html @@ -0,0 +1,23 @@ +DiagnosticVoucher in fe_analyzer::context - Rust

Struct DiagnosticVoucher

Source
pub struct DiagnosticVoucher(/* private fields */);
Expand description

This should only be created by AnalyzerContext.

+

Implementations§

Trait Implementations§

Source§

impl Clone for DiagnosticVoucher

Source§

fn clone(&self) -> DiagnosticVoucher

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DiagnosticVoucher

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for DiagnosticVoucher

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for DiagnosticVoucher

Source§

fn eq(&self, other: &DiagnosticVoucher) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for DiagnosticVoucher

Source§

impl StructuralPartialEq for DiagnosticVoucher

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html b/compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html new file mode 100644 index 0000000000..526890b1c3 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html @@ -0,0 +1,33 @@ +ExpressionAttributes in fe_analyzer::context - Rust

Struct ExpressionAttributes

Source
pub struct ExpressionAttributes {
+    pub typ: TypeId,
+    pub const_value: Option<Constant>,
+    pub type_adjustments: Vec<Adjustment>,
+}
Expand description

Contains contextual information relating to an expression AST node.

+

Fields§

§typ: TypeId§const_value: Option<Constant>§type_adjustments: Vec<Adjustment>

Implementations§

Trait Implementations§

Source§

impl Clone for ExpressionAttributes

Source§

fn clone(&self) -> ExpressionAttributes

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ExpressionAttributes

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for ExpressionAttributes

Source§

fn format( + &self, + db: &dyn AnalyzerDb, + f: &mut Formatter<'_>, +) -> Result<(), Error>

Source§

impl PartialEq for ExpressionAttributes

Source§

fn eq(&self, other: &ExpressionAttributes) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ExpressionAttributes

Source§

impl StructuralPartialEq for ExpressionAttributes

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.FunctionBody.html b/compiler-docs/fe_analyzer/context/struct.FunctionBody.html new file mode 100644 index 0000000000..47047453f2 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.FunctionBody.html @@ -0,0 +1,26 @@ +FunctionBody in fe_analyzer::context - Rust

Struct FunctionBody

Source
pub struct FunctionBody {
+    pub expressions: IndexMap<NodeId, ExpressionAttributes>,
+    pub matches: IndexMap<NodeId, PatternMatrix>,
+    pub var_types: IndexMap<NodeId, TypeId>,
+    pub calls: IndexMap<NodeId, CallType>,
+    pub spans: HashMap<NodeId, Span>,
+}

Fields§

§expressions: IndexMap<NodeId, ExpressionAttributes>§matches: IndexMap<NodeId, PatternMatrix>§var_types: IndexMap<NodeId, TypeId>§calls: IndexMap<NodeId, CallType>§spans: HashMap<NodeId, Span>

Trait Implementations§

Source§

impl Clone for FunctionBody

Source§

fn clone(&self) -> FunctionBody

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionBody

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionBody

Source§

fn default() -> FunctionBody

Returns the “default value” for a type. Read more
Source§

impl PartialEq for FunctionBody

Source§

fn eq(&self, other: &FunctionBody) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionBody

Source§

impl StructuralPartialEq for FunctionBody

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.Label.html b/compiler-docs/fe_analyzer/context/struct.Label.html new file mode 100644 index 0000000000..0dc1c80e76 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.Label.html @@ -0,0 +1,34 @@ +Label in fe_analyzer::context - Rust

Struct Label

Source
pub struct Label {
+    pub style: LabelStyle,
+    pub span: Span,
+    pub message: String,
+}

Fields§

§style: LabelStyle§span: Span§message: String

Implementations§

Source§

impl Label

Source

pub fn primary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a primary label with the given message. This will underline the +given span with carets (^^^^).

+
Source

pub fn secondary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a secondary label with the given message. This will underline the +given span with hyphens (----).

+
Source

pub fn into_cs_label(self) -> Label<SourceFileId>

Convert into a [codespan_reporting::Diagnostic::Label]

+

Trait Implementations§

Source§

impl Clone for Label

Source§

fn clone(&self) -> Label

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Label

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Hash for Label

Source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Label

Source§

fn eq(&self, other: &Label) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Label

Source§

impl StructuralPartialEq for Label

Auto Trait Implementations§

§

impl Freeze for Label

§

impl RefUnwindSafe for Label

§

impl Send for Label

§

impl Sync for Label

§

impl Unpin for Label

§

impl UnwindSafe for Label

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.TempContext.html b/compiler-docs/fe_analyzer/context/struct.TempContext.html new file mode 100644 index 0000000000..470d480444 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.TempContext.html @@ -0,0 +1,63 @@ +TempContext in fe_analyzer::context - Rust

Struct TempContext

Source
pub struct TempContext {
+    pub diagnostics: RefCell<Vec<Diagnostic>>,
+}

Fields§

§diagnostics: RefCell<Vec<Diagnostic>>

Trait Implementations§

Source§

impl AnalyzerContext for TempContext

Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn resolve_name( + &self, + _name: &str, + _span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn resolve_path( + &self, + _path: &Path, + _span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, _path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, _path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn add_expression(&self, _node: &Node<Expr>, _attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + _node: &Node<Expr>, + _f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, _expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant( + &self, + _name: &Node<SmolStr>, + _expr: &Node<Expr>, + _value: Constant, +)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + _name: &SmolStr, + _span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, _node: &Node<Expr>, _call_type: CallType)

Panics Read more
Source§

fn get_call(&self, _node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, _typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.
Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Source§

impl Default for TempContext

Source§

fn default() -> TempContext

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html b/compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html new file mode 100644 index 0000000000..4d8ed43d32 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html @@ -0,0 +1,178 @@ +AnalyzerContext in fe_analyzer::context - Rust

Trait AnalyzerContext

Source
pub trait AnalyzerContext {
+
Show 27 methods // Required methods + fn resolve_name( + &self, + name: &str, + span: Span, + ) -> Result<Option<NamedThing>, IncompleteItem>; + fn resolve_path( + &self, + path: &Path, + span: Span, + ) -> Result<NamedThing, FatalError>; + fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>; + fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>; + fn add_diagnostic(&self, diag: Diagnostic); + fn db(&self) -> &dyn AnalyzerDb; + fn add_expression( + &self, + node: &Node<Expr>, + attributes: ExpressionAttributes, + ); + fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), + ); + fn expr_typ(&self, expr: &Node<Expr>) -> Type; + fn add_constant( + &self, + name: &Node<SmolStr>, + expr: &Node<Expr>, + value: Constant, + ); + fn constant_value_by_name( + &self, + name: &SmolStr, + span: Span, + ) -> Result<Option<Constant>, IncompleteItem>; + fn parent(&self) -> Item; + fn module(&self) -> ModuleId; + fn parent_function(&self) -> FunctionId; + fn add_call(&self, node: &Node<Expr>, call_type: CallType); + fn get_call(&self, node: &Node<Expr>) -> Option<CallType>; + fn is_in_function(&self) -> bool; + fn inherits_type(&self, typ: BlockScopeType) -> bool; + fn get_context_type(&self) -> Option<TypeId>; + + // Provided methods + fn error( + &self, + message: &str, + label_span: Span, + label: &str, + ) -> DiagnosticVoucher { ... } + fn root_item(&self) -> Item { ... } + fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, + ) -> DiagnosticVoucher { ... } + fn not_yet_implemented( + &self, + feature: &str, + span: Span, + ) -> DiagnosticVoucher { ... } + fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, + ) -> DiagnosticVoucher { ... } + fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, + ) -> DiagnosticVoucher { ... } + fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, + ) -> DiagnosticVoucher { ... } + fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher { ... } +
}

Required Methods§

Source

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors

+
Source

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors

+
Source

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors

+
Source

fn add_diagnostic(&self, diag: Diagnostic)

Source

fn db(&self) -> &dyn AnalyzerDb

Source

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node.

+
§Panics
+

Panics if an entry already exists for the node id.

+
Source

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes.

+
§Panics
+

Panics if an entry does not already exist for the node id.

+
Source

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression.

+
§Panics
+

Panics if type analysis is not performed for an expr.

+
Source

fn add_constant(&self, name: &Node<SmolStr>, expr: &Node<Expr>, value: Constant)

Add evaluated constant value in a constant declaration to the context.

+
Source

fn constant_value_by_name( + &self, + name: &SmolStr, + span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.

+
Source

fn parent(&self) -> Item

Returns an item enclosing current context.

+
§Example
contract Foo:
+    fn foo():
+       if ...:
+           ...
+       else:
+           ...
+

If the context is in then block, then this function returns +Item::Function(..).

+
Source

fn module(&self) -> ModuleId

Returns the module enclosing current context.

+
Source

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context.

+
§Panics
+

Panics if a context is not in a function. Use Self::is_in_function +to determine whether a context is in a function.

+
Source

fn add_call(&self, node: &Node<Expr>, call_type: CallType)

§Panics
+

Panics if a context is not in a function. Use Self::is_in_function +to determine whether a context is in a function.

+
Source

fn get_call(&self, node: &Node<Expr>) -> Option<CallType>

Source

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.

+
Source

fn inherits_type(&self, typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.

+
Source

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.

+

Provided Methods§

Source

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source

fn root_item(&self) -> Item

Returns a non-function item that encloses a context.

+
§Example
contract Foo:
+    fn foo():
+       if ...:
+           ...
+       else:
+           ...
+

If the context is in then block, then this function returns +Item::Type(TypeDef::Contract(..)).

+
Source

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/index.html b/compiler-docs/fe_analyzer/db/index.html new file mode 100644 index 0000000000..a370ea9a1e --- /dev/null +++ b/compiler-docs/fe_analyzer/db/index.html @@ -0,0 +1 @@ +fe_analyzer::db - Rust

Module db

Source

Structs§

AllImplsQuery
AnalyzerDbGroupStorage__
AnalyzerDbStorage
Representative struct for the query group.
ContractAllFieldsQuery
ContractAllFunctionsQuery
ContractCallFunctionQuery
ContractDependencyGraphQuery
ContractFieldMapQuery
ContractFieldTypeQuery
ContractFunctionMapQuery
ContractInitFunctionQuery
ContractPublicFunctionMapQuery
ContractRuntimeDependencyGraphQuery
EnumAllFunctionsQuery
EnumAllVariantsQuery
EnumDependencyGraphQuery
EnumFunctionMapQuery
EnumVariantKindQuery
EnumVariantMapQuery
FunctionBodyQuery
FunctionDependencyGraphQuery
FunctionSignatureQuery
FunctionSigsQuery
ImplAllFunctionsQuery
ImplForQuery
ImplFunctionMapQuery
IngotExternalIngotsQuery
IngotFilesQuery
IngotModulesQuery
IngotRootModuleQuery
InternAttributeLookupQuery
InternAttributeQuery
InternContractFieldLookupQuery
InternContractFieldQuery
InternContractLookupQuery
InternContractQuery
InternEnumLookupQuery
InternEnumQuery
InternEnumVariantLookupQuery
InternEnumVariantQuery
InternFunctionLookupQuery
InternFunctionQuery
InternFunctionSigLookupQuery
InternFunctionSigQuery
InternImplLookupQuery
InternImplQuery
InternIngotLookupQuery
InternIngotQuery
InternModuleConstLookupQuery
InternModuleConstQuery
InternModuleLookupQuery
InternModuleQuery
InternStructFieldLookupQuery
InternStructFieldQuery
InternStructLookupQuery
InternStructQuery
InternTraitLookupQuery
InternTraitQuery
InternTypeAliasLookupQuery
InternTypeAliasQuery
InternTypeLookupQuery
InternTypeQuery
ModuleAllImplsQuery
ModuleAllItemsQuery
ModuleConstantTypeQuery
ModuleConstantValueQuery
ModuleConstantsQuery
ModuleContractsQuery
ModuleFilePathQuery
ModuleImplMapQuery
ModuleIsIncompleteQuery
ModuleItemMapQuery
ModuleParentModuleQuery
ModuleParseQuery
ModuleStructsQuery
ModuleSubmodulesQuery
ModuleTestsQuery
ModuleUsedItemMapQuery
RootIngotQuery
StructAllFieldsQuery
StructAllFunctionsQuery
StructDependencyGraphQuery
StructFieldMapQuery
StructFieldTypeQuery
StructFunctionMapQuery
TestDb
TraitAllFunctionsQuery
TraitFunctionMapQuery
TraitIsImplementedForQuery
TypeAliasTypeQuery

Traits§

AnalyzerDb
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/sidebar-items.js b/compiler-docs/fe_analyzer/db/sidebar-items.js new file mode 100644 index 0000000000..c0c5935442 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AllImplsQuery","AnalyzerDbGroupStorage__","AnalyzerDbStorage","ContractAllFieldsQuery","ContractAllFunctionsQuery","ContractCallFunctionQuery","ContractDependencyGraphQuery","ContractFieldMapQuery","ContractFieldTypeQuery","ContractFunctionMapQuery","ContractInitFunctionQuery","ContractPublicFunctionMapQuery","ContractRuntimeDependencyGraphQuery","EnumAllFunctionsQuery","EnumAllVariantsQuery","EnumDependencyGraphQuery","EnumFunctionMapQuery","EnumVariantKindQuery","EnumVariantMapQuery","FunctionBodyQuery","FunctionDependencyGraphQuery","FunctionSignatureQuery","FunctionSigsQuery","ImplAllFunctionsQuery","ImplForQuery","ImplFunctionMapQuery","IngotExternalIngotsQuery","IngotFilesQuery","IngotModulesQuery","IngotRootModuleQuery","InternAttributeLookupQuery","InternAttributeQuery","InternContractFieldLookupQuery","InternContractFieldQuery","InternContractLookupQuery","InternContractQuery","InternEnumLookupQuery","InternEnumQuery","InternEnumVariantLookupQuery","InternEnumVariantQuery","InternFunctionLookupQuery","InternFunctionQuery","InternFunctionSigLookupQuery","InternFunctionSigQuery","InternImplLookupQuery","InternImplQuery","InternIngotLookupQuery","InternIngotQuery","InternModuleConstLookupQuery","InternModuleConstQuery","InternModuleLookupQuery","InternModuleQuery","InternStructFieldLookupQuery","InternStructFieldQuery","InternStructLookupQuery","InternStructQuery","InternTraitLookupQuery","InternTraitQuery","InternTypeAliasLookupQuery","InternTypeAliasQuery","InternTypeLookupQuery","InternTypeQuery","ModuleAllImplsQuery","ModuleAllItemsQuery","ModuleConstantTypeQuery","ModuleConstantValueQuery","ModuleConstantsQuery","ModuleContractsQuery","ModuleFilePathQuery","ModuleImplMapQuery","ModuleIsIncompleteQuery","ModuleItemMapQuery","ModuleParentModuleQuery","ModuleParseQuery","ModuleStructsQuery","ModuleSubmodulesQuery","ModuleTestsQuery","ModuleUsedItemMapQuery","RootIngotQuery","StructAllFieldsQuery","StructAllFunctionsQuery","StructDependencyGraphQuery","StructFieldMapQuery","StructFieldTypeQuery","StructFunctionMapQuery","TestDb","TraitAllFunctionsQuery","TraitFunctionMapQuery","TraitIsImplementedForQuery","TypeAliasTypeQuery"],"trait":["AnalyzerDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html b/compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html new file mode 100644 index 0000000000..c5240bc929 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html @@ -0,0 +1,46 @@ +AllImplsQuery in fe_analyzer::db - Rust

Struct AllImplsQuery

Source
pub struct AllImplsQuery;

Implementations§

Source§

impl AllImplsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl AllImplsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for AllImplsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for AllImplsQuery

Source§

fn default() -> AllImplsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for AllImplsQuery

Source§

const QUERY_INDEX: u16 = 83u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "all_impls"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ImplId]>

What value does the query return?
Source§

type Storage = DerivedStorage<AllImplsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for AllImplsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for AllImplsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html new file mode 100644 index 0000000000..99521e72b5 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html @@ -0,0 +1,113 @@ +AnalyzerDbGroupStorage__ in fe_analyzer::db - Rust

Struct AnalyzerDbGroupStorage__

Source
pub struct AnalyzerDbGroupStorage__ {
Show 87 fields + pub intern_ingot: Arc<<InternIngotQuery as Query>::Storage>, + pub lookup_intern_ingot: Arc<<InternIngotLookupQuery as Query>::Storage>, + pub intern_module: Arc<<InternModuleQuery as Query>::Storage>, + pub lookup_intern_module: Arc<<InternModuleLookupQuery as Query>::Storage>, + pub intern_module_const: Arc<<InternModuleConstQuery as Query>::Storage>, + pub lookup_intern_module_const: Arc<<InternModuleConstLookupQuery as Query>::Storage>, + pub intern_struct: Arc<<InternStructQuery as Query>::Storage>, + pub lookup_intern_struct: Arc<<InternStructLookupQuery as Query>::Storage>, + pub intern_struct_field: Arc<<InternStructFieldQuery as Query>::Storage>, + pub lookup_intern_struct_field: Arc<<InternStructFieldLookupQuery as Query>::Storage>, + pub intern_enum: Arc<<InternEnumQuery as Query>::Storage>, + pub lookup_intern_enum: Arc<<InternEnumLookupQuery as Query>::Storage>, + pub intern_attribute: Arc<<InternAttributeQuery as Query>::Storage>, + pub lookup_intern_attribute: Arc<<InternAttributeLookupQuery as Query>::Storage>, + pub intern_enum_variant: Arc<<InternEnumVariantQuery as Query>::Storage>, + pub lookup_intern_enum_variant: Arc<<InternEnumVariantLookupQuery as Query>::Storage>, + pub intern_trait: Arc<<InternTraitQuery as Query>::Storage>, + pub lookup_intern_trait: Arc<<InternTraitLookupQuery as Query>::Storage>, + pub intern_impl: Arc<<InternImplQuery as Query>::Storage>, + pub lookup_intern_impl: Arc<<InternImplLookupQuery as Query>::Storage>, + pub intern_type_alias: Arc<<InternTypeAliasQuery as Query>::Storage>, + pub lookup_intern_type_alias: Arc<<InternTypeAliasLookupQuery as Query>::Storage>, + pub intern_contract: Arc<<InternContractQuery as Query>::Storage>, + pub lookup_intern_contract: Arc<<InternContractLookupQuery as Query>::Storage>, + pub intern_contract_field: Arc<<InternContractFieldQuery as Query>::Storage>, + pub lookup_intern_contract_field: Arc<<InternContractFieldLookupQuery as Query>::Storage>, + pub intern_function_sig: Arc<<InternFunctionSigQuery as Query>::Storage>, + pub lookup_intern_function_sig: Arc<<InternFunctionSigLookupQuery as Query>::Storage>, + pub intern_function: Arc<<InternFunctionQuery as Query>::Storage>, + pub lookup_intern_function: Arc<<InternFunctionLookupQuery as Query>::Storage>, + pub intern_type: Arc<<InternTypeQuery as Query>::Storage>, + pub lookup_intern_type: Arc<<InternTypeLookupQuery as Query>::Storage>, + pub ingot_files: Arc<<IngotFilesQuery as Query>::Storage>, + pub ingot_external_ingots: Arc<<IngotExternalIngotsQuery as Query>::Storage>, + pub root_ingot: Arc<<RootIngotQuery as Query>::Storage>, + pub ingot_modules: Arc<<IngotModulesQuery as Query>::Storage>, + pub ingot_root_module: Arc<<IngotRootModuleQuery as Query>::Storage>, + pub module_file_path: Arc<<ModuleFilePathQuery as Query>::Storage>, + pub module_parse: Arc<<ModuleParseQuery as Query>::Storage>, + pub module_is_incomplete: Arc<<ModuleIsIncompleteQuery as Query>::Storage>, + pub module_all_items: Arc<<ModuleAllItemsQuery as Query>::Storage>, + pub module_all_impls: Arc<<ModuleAllImplsQuery as Query>::Storage>, + pub module_item_map: Arc<<ModuleItemMapQuery as Query>::Storage>, + pub module_impl_map: Arc<<ModuleImplMapQuery as Query>::Storage>, + pub module_contracts: Arc<<ModuleContractsQuery as Query>::Storage>, + pub module_structs: Arc<<ModuleStructsQuery as Query>::Storage>, + pub module_constants: Arc<<ModuleConstantsQuery as Query>::Storage>, + pub module_used_item_map: Arc<<ModuleUsedItemMapQuery as Query>::Storage>, + pub module_parent_module: Arc<<ModuleParentModuleQuery as Query>::Storage>, + pub module_submodules: Arc<<ModuleSubmodulesQuery as Query>::Storage>, + pub module_tests: Arc<<ModuleTestsQuery as Query>::Storage>, + pub module_constant_type: Arc<<ModuleConstantTypeQuery as Query>::Storage>, + pub module_constant_value: Arc<<ModuleConstantValueQuery as Query>::Storage>, + pub contract_all_functions: Arc<<ContractAllFunctionsQuery as Query>::Storage>, + pub contract_function_map: Arc<<ContractFunctionMapQuery as Query>::Storage>, + pub contract_public_function_map: Arc<<ContractPublicFunctionMapQuery as Query>::Storage>, + pub contract_init_function: Arc<<ContractInitFunctionQuery as Query>::Storage>, + pub contract_call_function: Arc<<ContractCallFunctionQuery as Query>::Storage>, + pub contract_all_fields: Arc<<ContractAllFieldsQuery as Query>::Storage>, + pub contract_field_map: Arc<<ContractFieldMapQuery as Query>::Storage>, + pub contract_field_type: Arc<<ContractFieldTypeQuery as Query>::Storage>, + pub contract_dependency_graph: Arc<<ContractDependencyGraphQuery as Query>::Storage>, + pub contract_runtime_dependency_graph: Arc<<ContractRuntimeDependencyGraphQuery as Query>::Storage>, + pub function_signature: Arc<<FunctionSignatureQuery as Query>::Storage>, + pub function_body: Arc<<FunctionBodyQuery as Query>::Storage>, + pub function_dependency_graph: Arc<<FunctionDependencyGraphQuery as Query>::Storage>, + pub struct_all_fields: Arc<<StructAllFieldsQuery as Query>::Storage>, + pub struct_field_map: Arc<<StructFieldMapQuery as Query>::Storage>, + pub struct_field_type: Arc<<StructFieldTypeQuery as Query>::Storage>, + pub struct_all_functions: Arc<<StructAllFunctionsQuery as Query>::Storage>, + pub struct_function_map: Arc<<StructFunctionMapQuery as Query>::Storage>, + pub struct_dependency_graph: Arc<<StructDependencyGraphQuery as Query>::Storage>, + pub enum_all_variants: Arc<<EnumAllVariantsQuery as Query>::Storage>, + pub enum_variant_map: Arc<<EnumVariantMapQuery as Query>::Storage>, + pub enum_all_functions: Arc<<EnumAllFunctionsQuery as Query>::Storage>, + pub enum_function_map: Arc<<EnumFunctionMapQuery as Query>::Storage>, + pub enum_dependency_graph: Arc<<EnumDependencyGraphQuery as Query>::Storage>, + pub enum_variant_kind: Arc<<EnumVariantKindQuery as Query>::Storage>, + pub trait_all_functions: Arc<<TraitAllFunctionsQuery as Query>::Storage>, + pub trait_function_map: Arc<<TraitFunctionMapQuery as Query>::Storage>, + pub trait_is_implemented_for: Arc<<TraitIsImplementedForQuery as Query>::Storage>, + pub impl_all_functions: Arc<<ImplAllFunctionsQuery as Query>::Storage>, + pub impl_function_map: Arc<<ImplFunctionMapQuery as Query>::Storage>, + pub all_impls: Arc<<AllImplsQuery as Query>::Storage>, + pub impl_for: Arc<<ImplForQuery as Query>::Storage>, + pub function_sigs: Arc<<FunctionSigsQuery as Query>::Storage>, + pub type_alias_type: Arc<<TypeAliasTypeQuery as Query>::Storage>, +
}

Fields§

§intern_ingot: Arc<<InternIngotQuery as Query>::Storage>§lookup_intern_ingot: Arc<<InternIngotLookupQuery as Query>::Storage>§intern_module: Arc<<InternModuleQuery as Query>::Storage>§lookup_intern_module: Arc<<InternModuleLookupQuery as Query>::Storage>§intern_module_const: Arc<<InternModuleConstQuery as Query>::Storage>§lookup_intern_module_const: Arc<<InternModuleConstLookupQuery as Query>::Storage>§intern_struct: Arc<<InternStructQuery as Query>::Storage>§lookup_intern_struct: Arc<<InternStructLookupQuery as Query>::Storage>§intern_struct_field: Arc<<InternStructFieldQuery as Query>::Storage>§lookup_intern_struct_field: Arc<<InternStructFieldLookupQuery as Query>::Storage>§intern_enum: Arc<<InternEnumQuery as Query>::Storage>§lookup_intern_enum: Arc<<InternEnumLookupQuery as Query>::Storage>§intern_attribute: Arc<<InternAttributeQuery as Query>::Storage>§lookup_intern_attribute: Arc<<InternAttributeLookupQuery as Query>::Storage>§intern_enum_variant: Arc<<InternEnumVariantQuery as Query>::Storage>§lookup_intern_enum_variant: Arc<<InternEnumVariantLookupQuery as Query>::Storage>§intern_trait: Arc<<InternTraitQuery as Query>::Storage>§lookup_intern_trait: Arc<<InternTraitLookupQuery as Query>::Storage>§intern_impl: Arc<<InternImplQuery as Query>::Storage>§lookup_intern_impl: Arc<<InternImplLookupQuery as Query>::Storage>§intern_type_alias: Arc<<InternTypeAliasQuery as Query>::Storage>§lookup_intern_type_alias: Arc<<InternTypeAliasLookupQuery as Query>::Storage>§intern_contract: Arc<<InternContractQuery as Query>::Storage>§lookup_intern_contract: Arc<<InternContractLookupQuery as Query>::Storage>§intern_contract_field: Arc<<InternContractFieldQuery as Query>::Storage>§lookup_intern_contract_field: Arc<<InternContractFieldLookupQuery as Query>::Storage>§intern_function_sig: Arc<<InternFunctionSigQuery as Query>::Storage>§lookup_intern_function_sig: Arc<<InternFunctionSigLookupQuery as Query>::Storage>§intern_function: Arc<<InternFunctionQuery as Query>::Storage>§lookup_intern_function: Arc<<InternFunctionLookupQuery as Query>::Storage>§intern_type: Arc<<InternTypeQuery as Query>::Storage>§lookup_intern_type: Arc<<InternTypeLookupQuery as Query>::Storage>§ingot_files: Arc<<IngotFilesQuery as Query>::Storage>§ingot_external_ingots: Arc<<IngotExternalIngotsQuery as Query>::Storage>§root_ingot: Arc<<RootIngotQuery as Query>::Storage>§ingot_modules: Arc<<IngotModulesQuery as Query>::Storage>§ingot_root_module: Arc<<IngotRootModuleQuery as Query>::Storage>§module_file_path: Arc<<ModuleFilePathQuery as Query>::Storage>§module_parse: Arc<<ModuleParseQuery as Query>::Storage>§module_is_incomplete: Arc<<ModuleIsIncompleteQuery as Query>::Storage>§module_all_items: Arc<<ModuleAllItemsQuery as Query>::Storage>§module_all_impls: Arc<<ModuleAllImplsQuery as Query>::Storage>§module_item_map: Arc<<ModuleItemMapQuery as Query>::Storage>§module_impl_map: Arc<<ModuleImplMapQuery as Query>::Storage>§module_contracts: Arc<<ModuleContractsQuery as Query>::Storage>§module_structs: Arc<<ModuleStructsQuery as Query>::Storage>§module_constants: Arc<<ModuleConstantsQuery as Query>::Storage>§module_used_item_map: Arc<<ModuleUsedItemMapQuery as Query>::Storage>§module_parent_module: Arc<<ModuleParentModuleQuery as Query>::Storage>§module_submodules: Arc<<ModuleSubmodulesQuery as Query>::Storage>§module_tests: Arc<<ModuleTestsQuery as Query>::Storage>§module_constant_type: Arc<<ModuleConstantTypeQuery as Query>::Storage>§module_constant_value: Arc<<ModuleConstantValueQuery as Query>::Storage>§contract_all_functions: Arc<<ContractAllFunctionsQuery as Query>::Storage>§contract_function_map: Arc<<ContractFunctionMapQuery as Query>::Storage>§contract_public_function_map: Arc<<ContractPublicFunctionMapQuery as Query>::Storage>§contract_init_function: Arc<<ContractInitFunctionQuery as Query>::Storage>§contract_call_function: Arc<<ContractCallFunctionQuery as Query>::Storage>§contract_all_fields: Arc<<ContractAllFieldsQuery as Query>::Storage>§contract_field_map: Arc<<ContractFieldMapQuery as Query>::Storage>§contract_field_type: Arc<<ContractFieldTypeQuery as Query>::Storage>§contract_dependency_graph: Arc<<ContractDependencyGraphQuery as Query>::Storage>§contract_runtime_dependency_graph: Arc<<ContractRuntimeDependencyGraphQuery as Query>::Storage>§function_signature: Arc<<FunctionSignatureQuery as Query>::Storage>§function_body: Arc<<FunctionBodyQuery as Query>::Storage>§function_dependency_graph: Arc<<FunctionDependencyGraphQuery as Query>::Storage>§struct_all_fields: Arc<<StructAllFieldsQuery as Query>::Storage>§struct_field_map: Arc<<StructFieldMapQuery as Query>::Storage>§struct_field_type: Arc<<StructFieldTypeQuery as Query>::Storage>§struct_all_functions: Arc<<StructAllFunctionsQuery as Query>::Storage>§struct_function_map: Arc<<StructFunctionMapQuery as Query>::Storage>§struct_dependency_graph: Arc<<StructDependencyGraphQuery as Query>::Storage>§enum_all_variants: Arc<<EnumAllVariantsQuery as Query>::Storage>§enum_variant_map: Arc<<EnumVariantMapQuery as Query>::Storage>§enum_all_functions: Arc<<EnumAllFunctionsQuery as Query>::Storage>§enum_function_map: Arc<<EnumFunctionMapQuery as Query>::Storage>§enum_dependency_graph: Arc<<EnumDependencyGraphQuery as Query>::Storage>§enum_variant_kind: Arc<<EnumVariantKindQuery as Query>::Storage>§trait_all_functions: Arc<<TraitAllFunctionsQuery as Query>::Storage>§trait_function_map: Arc<<TraitFunctionMapQuery as Query>::Storage>§trait_is_implemented_for: Arc<<TraitIsImplementedForQuery as Query>::Storage>§impl_all_functions: Arc<<ImplAllFunctionsQuery as Query>::Storage>§impl_function_map: Arc<<ImplFunctionMapQuery as Query>::Storage>§all_impls: Arc<<AllImplsQuery as Query>::Storage>§impl_for: Arc<<ImplForQuery as Query>::Storage>§function_sigs: Arc<<FunctionSigsQuery as Query>::Storage>§type_alias_type: Arc<<TypeAliasTypeQuery as Query>::Storage>

Implementations§

Source§

impl AnalyzerDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl AnalyzerDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn AnalyzerDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn AnalyzerDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html new file mode 100644 index 0000000000..3f8e33df65 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html @@ -0,0 +1,12 @@ +AnalyzerDbStorage in fe_analyzer::db - Rust

Struct AnalyzerDbStorage

Source
pub struct AnalyzerDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<AnalyzerDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for AnalyzerDbStorage

Source§

type DynDb = dyn AnalyzerDb

Dyn version of the associated database trait.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html new file mode 100644 index 0000000000..5d8ac81e8a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html @@ -0,0 +1,46 @@ +ContractAllFieldsQuery in fe_analyzer::db - Rust

Struct ContractAllFieldsQuery

Source
pub struct ContractAllFieldsQuery;

Implementations§

Source§

impl ContractAllFieldsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractAllFieldsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractAllFieldsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractAllFieldsQuery

Source§

fn default() -> ContractAllFieldsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractAllFieldsQuery

Source§

const QUERY_INDEX: u16 = 58u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_all_fields"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ContractFieldId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractAllFieldsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractAllFieldsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractAllFieldsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html new file mode 100644 index 0000000000..188f5ec338 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html @@ -0,0 +1,46 @@ +ContractAllFunctionsQuery in fe_analyzer::db - Rust

Struct ContractAllFunctionsQuery

Source
pub struct ContractAllFunctionsQuery;

Implementations§

Source§

impl ContractAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractAllFunctionsQuery

Source§

fn default() -> ContractAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 53u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html new file mode 100644 index 0000000000..0180d87564 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html @@ -0,0 +1,46 @@ +ContractCallFunctionQuery in fe_analyzer::db - Rust

Struct ContractCallFunctionQuery

Source
pub struct ContractCallFunctionQuery;

Implementations§

Source§

impl ContractCallFunctionQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractCallFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractCallFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractCallFunctionQuery

Source§

fn default() -> ContractCallFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractCallFunctionQuery

Source§

const QUERY_INDEX: u16 = 57u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_call_function"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Option<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractCallFunctionQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractCallFunctionQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractCallFunctionQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html new file mode 100644 index 0000000000..4a9b9a2d9f --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html @@ -0,0 +1,46 @@ +ContractDependencyGraphQuery in fe_analyzer::db - Rust

Struct ContractDependencyGraphQuery

Source
pub struct ContractDependencyGraphQuery;

Implementations§

Source§

impl ContractDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractDependencyGraphQuery

Source§

fn default() -> ContractDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 61u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = DepGraphWrapper

What value does the query return?
Source§

type Storage = DerivedStorage<ContractDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html new file mode 100644 index 0000000000..c898195876 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html @@ -0,0 +1,46 @@ +ContractFieldMapQuery in fe_analyzer::db - Rust

Struct ContractFieldMapQuery

Source
pub struct ContractFieldMapQuery;

Implementations§

Source§

impl ContractFieldMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractFieldMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractFieldMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractFieldMapQuery

Source§

fn default() -> ContractFieldMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractFieldMapQuery

Source§

const QUERY_INDEX: u16 = 59u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_field_map"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractFieldMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractFieldMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractFieldMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html new file mode 100644 index 0000000000..24bc236413 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html @@ -0,0 +1,46 @@ +ContractFieldTypeQuery in fe_analyzer::db - Rust

Struct ContractFieldTypeQuery

Source
pub struct ContractFieldTypeQuery;

Implementations§

Source§

impl ContractFieldTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractFieldTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractFieldTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractFieldTypeQuery

Source§

fn default() -> ContractFieldTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractFieldTypeQuery

Source§

const QUERY_INDEX: u16 = 60u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_field_type"

Name of the query method (e.g., foo)
Source§

type Key = ContractFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractFieldTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractFieldTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractFieldTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html new file mode 100644 index 0000000000..8441e64474 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html @@ -0,0 +1,46 @@ +ContractFunctionMapQuery in fe_analyzer::db - Rust

Struct ContractFunctionMapQuery

Source
pub struct ContractFunctionMapQuery;

Implementations§

Source§

impl ContractFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractFunctionMapQuery

Source§

fn default() -> ContractFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 54u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_function_map"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html new file mode 100644 index 0000000000..4f27665b25 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html @@ -0,0 +1,46 @@ +ContractInitFunctionQuery in fe_analyzer::db - Rust

Struct ContractInitFunctionQuery

Source
pub struct ContractInitFunctionQuery;

Implementations§

Source§

impl ContractInitFunctionQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractInitFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractInitFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractInitFunctionQuery

Source§

fn default() -> ContractInitFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractInitFunctionQuery

Source§

const QUERY_INDEX: u16 = 56u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_init_function"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Option<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractInitFunctionQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractInitFunctionQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractInitFunctionQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html new file mode 100644 index 0000000000..5b8e12fa9a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html @@ -0,0 +1,46 @@ +ContractPublicFunctionMapQuery in fe_analyzer::db - Rust

Struct ContractPublicFunctionMapQuery

Source
pub struct ContractPublicFunctionMapQuery;

Implementations§

Source§

impl ContractPublicFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractPublicFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractPublicFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractPublicFunctionMapQuery

Source§

fn default() -> ContractPublicFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractPublicFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 55u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_public_function_map"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<IndexMap<SmolStr, FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractPublicFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractPublicFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractPublicFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html new file mode 100644 index 0000000000..4cfc3d6d2a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html @@ -0,0 +1,46 @@ +ContractRuntimeDependencyGraphQuery in fe_analyzer::db - Rust

Struct ContractRuntimeDependencyGraphQuery

Source
pub struct ContractRuntimeDependencyGraphQuery;

Implementations§

Source§

impl ContractRuntimeDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractRuntimeDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractRuntimeDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractRuntimeDependencyGraphQuery

Source§

fn default() -> ContractRuntimeDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractRuntimeDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 62u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_runtime_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = DepGraphWrapper

What value does the query return?
Source§

type Storage = DerivedStorage<ContractRuntimeDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractRuntimeDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractRuntimeDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html new file mode 100644 index 0000000000..308ea807ab --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html @@ -0,0 +1,46 @@ +EnumAllFunctionsQuery in fe_analyzer::db - Rust

Struct EnumAllFunctionsQuery

Source
pub struct EnumAllFunctionsQuery;

Implementations§

Source§

impl EnumAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumAllFunctionsQuery

Source§

fn default() -> EnumAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 74u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html new file mode 100644 index 0000000000..d68a2e2a34 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html @@ -0,0 +1,46 @@ +EnumAllVariantsQuery in fe_analyzer::db - Rust

Struct EnumAllVariantsQuery

Source
pub struct EnumAllVariantsQuery;

Implementations§

Source§

impl EnumAllVariantsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumAllVariantsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumAllVariantsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumAllVariantsQuery

Source§

fn default() -> EnumAllVariantsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumAllVariantsQuery

Source§

const QUERY_INDEX: u16 = 72u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_all_variants"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[EnumVariantId]>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumAllVariantsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumAllVariantsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumAllVariantsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html new file mode 100644 index 0000000000..3b374d9f7a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html @@ -0,0 +1,46 @@ +EnumDependencyGraphQuery in fe_analyzer::db - Rust

Struct EnumDependencyGraphQuery

Source
pub struct EnumDependencyGraphQuery;

Implementations§

Source§

impl EnumDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumDependencyGraphQuery

Source§

fn default() -> EnumDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 76u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<DepGraphWrapper>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html new file mode 100644 index 0000000000..61fd562c64 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html @@ -0,0 +1,46 @@ +EnumFunctionMapQuery in fe_analyzer::db - Rust

Struct EnumFunctionMapQuery

Source
pub struct EnumFunctionMapQuery;

Implementations§

Source§

impl EnumFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumFunctionMapQuery

Source§

fn default() -> EnumFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 75u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_function_map"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html new file mode 100644 index 0000000000..7faec237a5 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html @@ -0,0 +1,46 @@ +EnumVariantKindQuery in fe_analyzer::db - Rust

Struct EnumVariantKindQuery

Source
pub struct EnumVariantKindQuery;

Implementations§

Source§

impl EnumVariantKindQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumVariantKindQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumVariantKindQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumVariantKindQuery

Source§

fn default() -> EnumVariantKindQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumVariantKindQuery

Source§

const QUERY_INDEX: u16 = 77u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_variant_kind"

Name of the query method (e.g., foo)
Source§

type Key = EnumVariantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<EnumVariantKind, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumVariantKindQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumVariantKindQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumVariantKindQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html new file mode 100644 index 0000000000..6a4a1141f2 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html @@ -0,0 +1,46 @@ +EnumVariantMapQuery in fe_analyzer::db - Rust

Struct EnumVariantMapQuery

Source
pub struct EnumVariantMapQuery;

Implementations§

Source§

impl EnumVariantMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumVariantMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumVariantMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumVariantMapQuery

Source§

fn default() -> EnumVariantMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumVariantMapQuery

Source§

const QUERY_INDEX: u16 = 73u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_variant_map"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumVariantMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumVariantMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumVariantMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html new file mode 100644 index 0000000000..297833ea1d --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html @@ -0,0 +1,46 @@ +FunctionBodyQuery in fe_analyzer::db - Rust

Struct FunctionBodyQuery

Source
pub struct FunctionBodyQuery;

Implementations§

Source§

impl FunctionBodyQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionBodyQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionBodyQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionBodyQuery

Source§

fn default() -> FunctionBodyQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionBodyQuery

Source§

const QUERY_INDEX: u16 = 64u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_body"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<FunctionBody>>

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionBodyQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionBodyQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionBodyQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html new file mode 100644 index 0000000000..214ec25ca8 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html @@ -0,0 +1,46 @@ +FunctionDependencyGraphQuery in fe_analyzer::db - Rust

Struct FunctionDependencyGraphQuery

Source
pub struct FunctionDependencyGraphQuery;

Implementations§

Source§

impl FunctionDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionDependencyGraphQuery

Source§

fn default() -> FunctionDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 65u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = DepGraphWrapper

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html new file mode 100644 index 0000000000..7db836b28c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html @@ -0,0 +1,46 @@ +FunctionSignatureQuery in fe_analyzer::db - Rust

Struct FunctionSignatureQuery

Source
pub struct FunctionSignatureQuery;

Implementations§

Source§

impl FunctionSignatureQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionSignatureQuery

Source§

fn default() -> FunctionSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionSignatureQuery

Source§

const QUERY_INDEX: u16 = 63u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionSigId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<FunctionSignature>>

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionSignatureQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html new file mode 100644 index 0000000000..afa29d4743 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html @@ -0,0 +1,46 @@ +FunctionSigsQuery in fe_analyzer::db - Rust

Struct FunctionSigsQuery

Source
pub struct FunctionSigsQuery;

Implementations§

Source§

impl FunctionSigsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionSigsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionSigsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionSigsQuery

Source§

fn default() -> FunctionSigsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionSigsQuery

Source§

const QUERY_INDEX: u16 = 85u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_sigs"

Name of the query method (e.g., foo)
Source§

type Key = (TypeId, SmolStr)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionSigId]>

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionSigsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionSigsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionSigsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html new file mode 100644 index 0000000000..d2601f0d0c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html @@ -0,0 +1,46 @@ +ImplAllFunctionsQuery in fe_analyzer::db - Rust

Struct ImplAllFunctionsQuery

Source
pub struct ImplAllFunctionsQuery;

Implementations§

Source§

impl ImplAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ImplAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ImplAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplAllFunctionsQuery

Source§

fn default() -> ImplAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ImplAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 81u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "impl_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ImplId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ImplAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ImplAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ImplAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ImplForQuery.html b/compiler-docs/fe_analyzer/db/struct.ImplForQuery.html new file mode 100644 index 0000000000..4ac94dbf33 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ImplForQuery.html @@ -0,0 +1,46 @@ +ImplForQuery in fe_analyzer::db - Rust

Struct ImplForQuery

Source
pub struct ImplForQuery;

Implementations§

Source§

impl ImplForQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ImplForQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ImplForQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplForQuery

Source§

fn default() -> ImplForQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ImplForQuery

Source§

const QUERY_INDEX: u16 = 84u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "impl_for"

Name of the query method (e.g., foo)
Source§

type Key = (TypeId, TraitId)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Option<ImplId>

What value does the query return?
Source§

type Storage = DerivedStorage<ImplForQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ImplForQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ImplForQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html new file mode 100644 index 0000000000..186619a7c8 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html @@ -0,0 +1,46 @@ +ImplFunctionMapQuery in fe_analyzer::db - Rust

Struct ImplFunctionMapQuery

Source
pub struct ImplFunctionMapQuery;

Implementations§

Source§

impl ImplFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ImplFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ImplFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplFunctionMapQuery

Source§

fn default() -> ImplFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ImplFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 82u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "impl_function_map"

Name of the query method (e.g., foo)
Source§

type Key = ImplId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ImplFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ImplFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ImplFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html new file mode 100644 index 0000000000..41d55d1ff9 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html @@ -0,0 +1,39 @@ +IngotExternalIngotsQuery in fe_analyzer::db - Rust

Struct IngotExternalIngotsQuery

Source
pub struct IngotExternalIngotsQuery;

Implementations§

Source§

impl IngotExternalIngotsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotExternalIngotsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotExternalIngotsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotExternalIngotsQuery

Source§

fn default() -> IngotExternalIngotsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotExternalIngotsQuery

Source§

const QUERY_INDEX: u16 = 33u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_external_ingots"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<IndexMap<SmolStr, IngotId>>

What value does the query return?
Source§

type Storage = InputStorage<IngotExternalIngotsQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotExternalIngotsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html new file mode 100644 index 0000000000..d787d7bb7e --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html @@ -0,0 +1,39 @@ +IngotFilesQuery in fe_analyzer::db - Rust

Struct IngotFilesQuery

Source
pub struct IngotFilesQuery;

Implementations§

Source§

impl IngotFilesQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotFilesQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotFilesQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotFilesQuery

Source§

fn default() -> IngotFilesQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotFilesQuery

Source§

const QUERY_INDEX: u16 = 32u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_files"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[SourceFileId]>

What value does the query return?
Source§

type Storage = InputStorage<IngotFilesQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotFilesQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html new file mode 100644 index 0000000000..cb8d5de3b9 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html @@ -0,0 +1,46 @@ +IngotModulesQuery in fe_analyzer::db - Rust

Struct IngotModulesQuery

Source
pub struct IngotModulesQuery;

Implementations§

Source§

impl IngotModulesQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotModulesQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotModulesQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotModulesQuery

Source§

fn default() -> IngotModulesQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotModulesQuery

Source§

const QUERY_INDEX: u16 = 35u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_modules"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ModuleId]>

What value does the query return?
Source§

type Storage = DerivedStorage<IngotModulesQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotModulesQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for IngotModulesQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html new file mode 100644 index 0000000000..76f06f8d13 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html @@ -0,0 +1,46 @@ +IngotRootModuleQuery in fe_analyzer::db - Rust

Struct IngotRootModuleQuery

Source
pub struct IngotRootModuleQuery;

Implementations§

Source§

impl IngotRootModuleQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotRootModuleQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotRootModuleQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotRootModuleQuery

Source§

fn default() -> IngotRootModuleQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotRootModuleQuery

Source§

const QUERY_INDEX: u16 = 36u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_root_module"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Option<ModuleId>

What value does the query return?
Source§

type Storage = DerivedStorage<IngotRootModuleQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotRootModuleQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for IngotRootModuleQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html new file mode 100644 index 0000000000..672572971b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html @@ -0,0 +1,39 @@ +InternAttributeLookupQuery in fe_analyzer::db - Rust

Struct InternAttributeLookupQuery

Source
pub struct InternAttributeLookupQuery;

Implementations§

Source§

impl InternAttributeLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternAttributeLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternAttributeLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternAttributeLookupQuery

Source§

fn default() -> InternAttributeLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternAttributeLookupQuery

Source§

const QUERY_INDEX: u16 = 13u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_attribute"

Name of the query method (e.g., foo)
Source§

type Key = AttributeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Attribute>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternAttributeLookupQuery, InternAttributeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternAttributeLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html b/compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html new file mode 100644 index 0000000000..fcdddcb21a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html @@ -0,0 +1,39 @@ +InternAttributeQuery in fe_analyzer::db - Rust

Struct InternAttributeQuery

Source
pub struct InternAttributeQuery;

Implementations§

Source§

impl InternAttributeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternAttributeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternAttributeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternAttributeQuery

Source§

fn default() -> InternAttributeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternAttributeQuery

Source§

const QUERY_INDEX: u16 = 12u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_attribute"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Attribute>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AttributeId

What value does the query return?
Source§

type Storage = InternedStorage<InternAttributeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternAttributeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html new file mode 100644 index 0000000000..cac88e41b3 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html @@ -0,0 +1,39 @@ +InternContractFieldLookupQuery in fe_analyzer::db - Rust

Struct InternContractFieldLookupQuery

Source
pub struct InternContractFieldLookupQuery;

Implementations§

Source§

impl InternContractFieldLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractFieldLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractFieldLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractFieldLookupQuery

Source§

fn default() -> InternContractFieldLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractFieldLookupQuery

Source§

const QUERY_INDEX: u16 = 25u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_contract_field"

Name of the query method (e.g., foo)
Source§

type Key = ContractFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<ContractField>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternContractFieldLookupQuery, InternContractFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractFieldLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html new file mode 100644 index 0000000000..5a6784b97b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html @@ -0,0 +1,39 @@ +InternContractFieldQuery in fe_analyzer::db - Rust

Struct InternContractFieldQuery

Source
pub struct InternContractFieldQuery;

Implementations§

Source§

impl InternContractFieldQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractFieldQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractFieldQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractFieldQuery

Source§

fn default() -> InternContractFieldQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractFieldQuery

Source§

const QUERY_INDEX: u16 = 24u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_contract_field"

Name of the query method (e.g., foo)
Source§

type Key = Rc<ContractField>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ContractFieldId

What value does the query return?
Source§

type Storage = InternedStorage<InternContractFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractFieldQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html new file mode 100644 index 0000000000..2c75382b76 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html @@ -0,0 +1,39 @@ +InternContractLookupQuery in fe_analyzer::db - Rust

Struct InternContractLookupQuery

Source
pub struct InternContractLookupQuery;

Implementations§

Source§

impl InternContractLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractLookupQuery

Source§

fn default() -> InternContractLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractLookupQuery

Source§

const QUERY_INDEX: u16 = 23u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_contract"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Contract>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternContractLookupQuery, InternContractQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractQuery.html new file mode 100644 index 0000000000..3524c4a400 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractQuery.html @@ -0,0 +1,39 @@ +InternContractQuery in fe_analyzer::db - Rust

Struct InternContractQuery

Source
pub struct InternContractQuery;

Implementations§

Source§

impl InternContractQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractQuery

Source§

fn default() -> InternContractQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractQuery

Source§

const QUERY_INDEX: u16 = 22u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_contract"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Contract>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ContractId

What value does the query return?
Source§

type Storage = InternedStorage<InternContractQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html new file mode 100644 index 0000000000..bf8b0e8ec1 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html @@ -0,0 +1,39 @@ +InternEnumLookupQuery in fe_analyzer::db - Rust

Struct InternEnumLookupQuery

Source
pub struct InternEnumLookupQuery;

Implementations§

Source§

impl InternEnumLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumLookupQuery

Source§

fn default() -> InternEnumLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumLookupQuery

Source§

const QUERY_INDEX: u16 = 11u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_enum"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Enum>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternEnumLookupQuery, InternEnumQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html new file mode 100644 index 0000000000..444a2c1b62 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html @@ -0,0 +1,39 @@ +InternEnumQuery in fe_analyzer::db - Rust

Struct InternEnumQuery

Source
pub struct InternEnumQuery;

Implementations§

Source§

impl InternEnumQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumQuery

Source§

fn default() -> InternEnumQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumQuery

Source§

const QUERY_INDEX: u16 = 10u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_enum"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Enum>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = EnumId

What value does the query return?
Source§

type Storage = InternedStorage<InternEnumQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html new file mode 100644 index 0000000000..da8afe1ce7 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html @@ -0,0 +1,39 @@ +InternEnumVariantLookupQuery in fe_analyzer::db - Rust

Struct InternEnumVariantLookupQuery

Source
pub struct InternEnumVariantLookupQuery;

Implementations§

Source§

impl InternEnumVariantLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumVariantLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumVariantLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumVariantLookupQuery

Source§

fn default() -> InternEnumVariantLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumVariantLookupQuery

Source§

const QUERY_INDEX: u16 = 15u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_enum_variant"

Name of the query method (e.g., foo)
Source§

type Key = EnumVariantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<EnumVariant>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternEnumVariantLookupQuery, InternEnumVariantQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumVariantLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html new file mode 100644 index 0000000000..2566fbd534 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html @@ -0,0 +1,39 @@ +InternEnumVariantQuery in fe_analyzer::db - Rust

Struct InternEnumVariantQuery

Source
pub struct InternEnumVariantQuery;

Implementations§

Source§

impl InternEnumVariantQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumVariantQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumVariantQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumVariantQuery

Source§

fn default() -> InternEnumVariantQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumVariantQuery

Source§

const QUERY_INDEX: u16 = 14u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_enum_variant"

Name of the query method (e.g., foo)
Source§

type Key = Rc<EnumVariant>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = EnumVariantId

What value does the query return?
Source§

type Storage = InternedStorage<InternEnumVariantQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumVariantQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html new file mode 100644 index 0000000000..3cbab6ff1f --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html @@ -0,0 +1,39 @@ +InternFunctionLookupQuery in fe_analyzer::db - Rust

Struct InternFunctionLookupQuery

Source
pub struct InternFunctionLookupQuery;

Implementations§

Source§

impl InternFunctionLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionLookupQuery

Source§

fn default() -> InternFunctionLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionLookupQuery

Source§

const QUERY_INDEX: u16 = 29u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_function"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Function>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternFunctionLookupQuery, InternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html new file mode 100644 index 0000000000..cccc00c331 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html @@ -0,0 +1,39 @@ +InternFunctionQuery in fe_analyzer::db - Rust

Struct InternFunctionQuery

Source
pub struct InternFunctionQuery;

Implementations§

Source§

impl InternFunctionQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionQuery

Source§

fn default() -> InternFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionQuery

Source§

const QUERY_INDEX: u16 = 28u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_function"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Function>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = InternedStorage<InternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html new file mode 100644 index 0000000000..371ca265c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html @@ -0,0 +1,39 @@ +InternFunctionSigLookupQuery in fe_analyzer::db - Rust

Struct InternFunctionSigLookupQuery

Source
pub struct InternFunctionSigLookupQuery;

Implementations§

Source§

impl InternFunctionSigLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionSigLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionSigLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionSigLookupQuery

Source§

fn default() -> InternFunctionSigLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionSigLookupQuery

Source§

const QUERY_INDEX: u16 = 27u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_function_sig"

Name of the query method (e.g., foo)
Source§

type Key = FunctionSigId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionSig>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternFunctionSigLookupQuery, InternFunctionSigQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionSigLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html new file mode 100644 index 0000000000..a8955fb2b1 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html @@ -0,0 +1,39 @@ +InternFunctionSigQuery in fe_analyzer::db - Rust

Struct InternFunctionSigQuery

Source
pub struct InternFunctionSigQuery;

Implementations§

Source§

impl InternFunctionSigQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionSigQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionSigQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionSigQuery

Source§

fn default() -> InternFunctionSigQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionSigQuery

Source§

const QUERY_INDEX: u16 = 26u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_function_sig"

Name of the query method (e.g., foo)
Source§

type Key = Rc<FunctionSig>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionSigId

What value does the query return?
Source§

type Storage = InternedStorage<InternFunctionSigQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionSigQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html new file mode 100644 index 0000000000..499a97f977 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html @@ -0,0 +1,39 @@ +InternImplLookupQuery in fe_analyzer::db - Rust

Struct InternImplLookupQuery

Source
pub struct InternImplLookupQuery;

Implementations§

Source§

impl InternImplLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternImplLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternImplLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternImplLookupQuery

Source§

fn default() -> InternImplLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternImplLookupQuery

Source§

const QUERY_INDEX: u16 = 19u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_impl"

Name of the query method (e.g., foo)
Source§

type Key = ImplId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Impl>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternImplLookupQuery, InternImplQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternImplLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternImplQuery.html b/compiler-docs/fe_analyzer/db/struct.InternImplQuery.html new file mode 100644 index 0000000000..b0b814e79b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternImplQuery.html @@ -0,0 +1,39 @@ +InternImplQuery in fe_analyzer::db - Rust

Struct InternImplQuery

Source
pub struct InternImplQuery;

Implementations§

Source§

impl InternImplQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternImplQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternImplQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternImplQuery

Source§

fn default() -> InternImplQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternImplQuery

Source§

const QUERY_INDEX: u16 = 18u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_impl"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Impl>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ImplId

What value does the query return?
Source§

type Storage = InternedStorage<InternImplQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternImplQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html new file mode 100644 index 0000000000..f1d4291e45 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html @@ -0,0 +1,39 @@ +InternIngotLookupQuery in fe_analyzer::db - Rust

Struct InternIngotLookupQuery

Source
pub struct InternIngotLookupQuery;

Implementations§

Source§

impl InternIngotLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternIngotLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternIngotLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternIngotLookupQuery

Source§

fn default() -> InternIngotLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternIngotLookupQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_ingot"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Ingot>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternIngotLookupQuery, InternIngotQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternIngotLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html b/compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html new file mode 100644 index 0000000000..c03e8f5c6b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html @@ -0,0 +1,39 @@ +InternIngotQuery in fe_analyzer::db - Rust

Struct InternIngotQuery

Source
pub struct InternIngotQuery;

Implementations§

Source§

impl InternIngotQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternIngotQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternIngotQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternIngotQuery

Source§

fn default() -> InternIngotQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternIngotQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_ingot"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Ingot>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = IngotId

What value does the query return?
Source§

type Storage = InternedStorage<InternIngotQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternIngotQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html new file mode 100644 index 0000000000..9129f2841b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html @@ -0,0 +1,39 @@ +InternModuleConstLookupQuery in fe_analyzer::db - Rust

Struct InternModuleConstLookupQuery

Source
pub struct InternModuleConstLookupQuery;

Implementations§

Source§

impl InternModuleConstLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleConstLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleConstLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleConstLookupQuery

Source§

fn default() -> InternModuleConstLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleConstLookupQuery

Source§

const QUERY_INDEX: u16 = 5u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_module_const"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<ModuleConstant>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternModuleConstLookupQuery, InternModuleConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleConstLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html new file mode 100644 index 0000000000..11156c9729 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html @@ -0,0 +1,39 @@ +InternModuleConstQuery in fe_analyzer::db - Rust

Struct InternModuleConstQuery

Source
pub struct InternModuleConstQuery;

Implementations§

Source§

impl InternModuleConstQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleConstQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleConstQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleConstQuery

Source§

fn default() -> InternModuleConstQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleConstQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_module_const"

Name of the query method (e.g., foo)
Source§

type Key = Rc<ModuleConstant>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ModuleConstantId

What value does the query return?
Source§

type Storage = InternedStorage<InternModuleConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleConstQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html new file mode 100644 index 0000000000..16be75a9ce --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html @@ -0,0 +1,39 @@ +InternModuleLookupQuery in fe_analyzer::db - Rust

Struct InternModuleLookupQuery

Source
pub struct InternModuleLookupQuery;

Implementations§

Source§

impl InternModuleLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleLookupQuery

Source§

fn default() -> InternModuleLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleLookupQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_module"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Module>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternModuleLookupQuery, InternModuleQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html new file mode 100644 index 0000000000..6de8fb5928 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html @@ -0,0 +1,39 @@ +InternModuleQuery in fe_analyzer::db - Rust

Struct InternModuleQuery

Source
pub struct InternModuleQuery;

Implementations§

Source§

impl InternModuleQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleQuery

Source§

fn default() -> InternModuleQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_module"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Module>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ModuleId

What value does the query return?
Source§

type Storage = InternedStorage<InternModuleQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html new file mode 100644 index 0000000000..aab62a9633 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html @@ -0,0 +1,39 @@ +InternStructFieldLookupQuery in fe_analyzer::db - Rust

Struct InternStructFieldLookupQuery

Source
pub struct InternStructFieldLookupQuery;

Implementations§

Source§

impl InternStructFieldLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructFieldLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructFieldLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructFieldLookupQuery

Source§

fn default() -> InternStructFieldLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructFieldLookupQuery

Source§

const QUERY_INDEX: u16 = 9u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_struct_field"

Name of the query method (e.g., foo)
Source§

type Key = StructFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<StructField>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternStructFieldLookupQuery, InternStructFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructFieldLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html new file mode 100644 index 0000000000..4c25f4edea --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html @@ -0,0 +1,39 @@ +InternStructFieldQuery in fe_analyzer::db - Rust

Struct InternStructFieldQuery

Source
pub struct InternStructFieldQuery;

Implementations§

Source§

impl InternStructFieldQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructFieldQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructFieldQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructFieldQuery

Source§

fn default() -> InternStructFieldQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructFieldQuery

Source§

const QUERY_INDEX: u16 = 8u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_struct_field"

Name of the query method (e.g., foo)
Source§

type Key = Rc<StructField>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = StructFieldId

What value does the query return?
Source§

type Storage = InternedStorage<InternStructFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructFieldQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html new file mode 100644 index 0000000000..0561ba9672 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html @@ -0,0 +1,39 @@ +InternStructLookupQuery in fe_analyzer::db - Rust

Struct InternStructLookupQuery

Source
pub struct InternStructLookupQuery;

Implementations§

Source§

impl InternStructLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructLookupQuery

Source§

fn default() -> InternStructLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructLookupQuery

Source§

const QUERY_INDEX: u16 = 7u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_struct"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Struct>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternStructLookupQuery, InternStructQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructQuery.html new file mode 100644 index 0000000000..77e038d7ab --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructQuery.html @@ -0,0 +1,39 @@ +InternStructQuery in fe_analyzer::db - Rust

Struct InternStructQuery

Source
pub struct InternStructQuery;

Implementations§

Source§

impl InternStructQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructQuery

Source§

fn default() -> InternStructQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructQuery

Source§

const QUERY_INDEX: u16 = 6u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_struct"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Struct>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = StructId

What value does the query return?
Source§

type Storage = InternedStorage<InternStructQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html new file mode 100644 index 0000000000..49627c53ce --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html @@ -0,0 +1,39 @@ +InternTraitLookupQuery in fe_analyzer::db - Rust

Struct InternTraitLookupQuery

Source
pub struct InternTraitLookupQuery;

Implementations§

Source§

impl InternTraitLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTraitLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTraitLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTraitLookupQuery

Source§

fn default() -> InternTraitLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTraitLookupQuery

Source§

const QUERY_INDEX: u16 = 17u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_trait"

Name of the query method (e.g., foo)
Source§

type Key = TraitId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Trait>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternTraitLookupQuery, InternTraitQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTraitLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html new file mode 100644 index 0000000000..10158b546c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html @@ -0,0 +1,39 @@ +InternTraitQuery in fe_analyzer::db - Rust

Struct InternTraitQuery

Source
pub struct InternTraitQuery;

Implementations§

Source§

impl InternTraitQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTraitQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTraitQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTraitQuery

Source§

fn default() -> InternTraitQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTraitQuery

Source§

const QUERY_INDEX: u16 = 16u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_trait"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Trait>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TraitId

What value does the query return?
Source§

type Storage = InternedStorage<InternTraitQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTraitQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html new file mode 100644 index 0000000000..cea85ec198 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html @@ -0,0 +1,39 @@ +InternTypeAliasLookupQuery in fe_analyzer::db - Rust

Struct InternTypeAliasLookupQuery

Source
pub struct InternTypeAliasLookupQuery;

Implementations§

Source§

impl InternTypeAliasLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeAliasLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeAliasLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeAliasLookupQuery

Source§

fn default() -> InternTypeAliasLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeAliasLookupQuery

Source§

const QUERY_INDEX: u16 = 21u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_type_alias"

Name of the query method (e.g., foo)
Source§

type Key = TypeAliasId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<TypeAlias>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternTypeAliasLookupQuery, InternTypeAliasQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeAliasLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html new file mode 100644 index 0000000000..dd604a3c65 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html @@ -0,0 +1,39 @@ +InternTypeAliasQuery in fe_analyzer::db - Rust

Struct InternTypeAliasQuery

Source
pub struct InternTypeAliasQuery;

Implementations§

Source§

impl InternTypeAliasQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeAliasQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeAliasQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeAliasQuery

Source§

fn default() -> InternTypeAliasQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeAliasQuery

Source§

const QUERY_INDEX: u16 = 20u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_type_alias"

Name of the query method (e.g., foo)
Source§

type Key = Rc<TypeAlias>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeAliasId

What value does the query return?
Source§

type Storage = InternedStorage<InternTypeAliasQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeAliasQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html new file mode 100644 index 0000000000..abae3d37ff --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html @@ -0,0 +1,39 @@ +InternTypeLookupQuery in fe_analyzer::db - Rust

Struct InternTypeLookupQuery

Source
pub struct InternTypeLookupQuery;

Implementations§

Source§

impl InternTypeLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeLookupQuery

Source§

fn default() -> InternTypeLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeLookupQuery

Source§

const QUERY_INDEX: u16 = 31u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Type

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternTypeLookupQuery, InternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html new file mode 100644 index 0000000000..cdfbacab86 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html @@ -0,0 +1,39 @@ +InternTypeQuery in fe_analyzer::db - Rust

Struct InternTypeQuery

Source
pub struct InternTypeQuery;

Implementations§

Source§

impl InternTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeQuery

Source§

fn default() -> InternTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeQuery

Source§

const QUERY_INDEX: u16 = 30u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_type"

Name of the query method (e.g., foo)
Source§

type Key = Type

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = InternedStorage<InternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html new file mode 100644 index 0000000000..f501748782 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html @@ -0,0 +1,46 @@ +ModuleAllImplsQuery in fe_analyzer::db - Rust

Struct ModuleAllImplsQuery

Source
pub struct ModuleAllImplsQuery;

Implementations§

Source§

impl ModuleAllImplsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleAllImplsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleAllImplsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleAllImplsQuery

Source§

fn default() -> ModuleAllImplsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleAllImplsQuery

Source§

const QUERY_INDEX: u16 = 41u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_all_impls"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<[ImplId]>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleAllImplsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleAllImplsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleAllImplsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html new file mode 100644 index 0000000000..925c5f1260 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html @@ -0,0 +1,46 @@ +ModuleAllItemsQuery in fe_analyzer::db - Rust

Struct ModuleAllItemsQuery

Source
pub struct ModuleAllItemsQuery;

Implementations§

Source§

impl ModuleAllItemsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleAllItemsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleAllItemsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleAllItemsQuery

Source§

fn default() -> ModuleAllItemsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleAllItemsQuery

Source§

const QUERY_INDEX: u16 = 40u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_all_items"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[Item]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleAllItemsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleAllItemsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleAllItemsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html new file mode 100644 index 0000000000..23389c0595 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html @@ -0,0 +1,46 @@ +ModuleConstantTypeQuery in fe_analyzer::db - Rust

Struct ModuleConstantTypeQuery

Source
pub struct ModuleConstantTypeQuery;

Implementations§

Source§

impl ModuleConstantTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleConstantTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleConstantTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleConstantTypeQuery

Source§

fn default() -> ModuleConstantTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleConstantTypeQuery

Source§

const QUERY_INDEX: u16 = 51u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_constant_type"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleConstantTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleConstantTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleConstantTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html new file mode 100644 index 0000000000..93eddecf14 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html @@ -0,0 +1,46 @@ +ModuleConstantValueQuery in fe_analyzer::db - Rust

Struct ModuleConstantValueQuery

Source
pub struct ModuleConstantValueQuery;

Implementations§

Source§

impl ModuleConstantValueQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleConstantValueQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleConstantValueQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleConstantValueQuery

Source§

fn default() -> ModuleConstantValueQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleConstantValueQuery

Source§

const QUERY_INDEX: u16 = 52u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_constant_value"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<Constant, ConstEvalError>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleConstantValueQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleConstantValueQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleConstantValueQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html new file mode 100644 index 0000000000..92ceb862db --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html @@ -0,0 +1,46 @@ +ModuleConstantsQuery in fe_analyzer::db - Rust

Struct ModuleConstantsQuery

Source
pub struct ModuleConstantsQuery;

Implementations§

Source§

impl ModuleConstantsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleConstantsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleConstantsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleConstantsQuery

Source§

fn default() -> ModuleConstantsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleConstantsQuery

Source§

const QUERY_INDEX: u16 = 46u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_constants"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<ModuleConstantId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleConstantsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleConstantsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleConstantsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html new file mode 100644 index 0000000000..697f53dfcd --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html @@ -0,0 +1,46 @@ +ModuleContractsQuery in fe_analyzer::db - Rust

Struct ModuleContractsQuery

Source
pub struct ModuleContractsQuery;

Implementations§

Source§

impl ModuleContractsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleContractsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleContractsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleContractsQuery

Source§

fn default() -> ModuleContractsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleContractsQuery

Source§

const QUERY_INDEX: u16 = 44u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_contracts"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ContractId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleContractsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleContractsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleContractsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html new file mode 100644 index 0000000000..f39fc1dd50 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html @@ -0,0 +1,46 @@ +ModuleFilePathQuery in fe_analyzer::db - Rust

Struct ModuleFilePathQuery

Source
pub struct ModuleFilePathQuery;

Implementations§

Source§

impl ModuleFilePathQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleFilePathQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleFilePathQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleFilePathQuery

Source§

fn default() -> ModuleFilePathQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleFilePathQuery

Source§

const QUERY_INDEX: u16 = 37u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_file_path"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = SmolStr

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleFilePathQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleFilePathQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleFilePathQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html new file mode 100644 index 0000000000..440b237414 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html @@ -0,0 +1,46 @@ +ModuleImplMapQuery in fe_analyzer::db - Rust

Struct ModuleImplMapQuery

Source
pub struct ModuleImplMapQuery;

Implementations§

Source§

impl ModuleImplMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleImplMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleImplMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleImplMapQuery

Source§

fn default() -> ModuleImplMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleImplMapQuery

Source§

const QUERY_INDEX: u16 = 43u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_impl_map"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleImplMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleImplMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleImplMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html new file mode 100644 index 0000000000..337224339f --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html @@ -0,0 +1,46 @@ +ModuleIsIncompleteQuery in fe_analyzer::db - Rust

Struct ModuleIsIncompleteQuery

Source
pub struct ModuleIsIncompleteQuery;

Implementations§

Source§

impl ModuleIsIncompleteQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleIsIncompleteQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleIsIncompleteQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleIsIncompleteQuery

Source§

fn default() -> ModuleIsIncompleteQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleIsIncompleteQuery

Source§

const QUERY_INDEX: u16 = 39u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_is_incomplete"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = bool

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleIsIncompleteQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleIsIncompleteQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleIsIncompleteQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html new file mode 100644 index 0000000000..372d641cda --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html @@ -0,0 +1,46 @@ +ModuleItemMapQuery in fe_analyzer::db - Rust

Struct ModuleItemMapQuery

Source
pub struct ModuleItemMapQuery;

Implementations§

Source§

impl ModuleItemMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleItemMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleItemMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleItemMapQuery

Source§

fn default() -> ModuleItemMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleItemMapQuery

Source§

const QUERY_INDEX: u16 = 42u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_item_map"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, Item>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleItemMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleItemMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleItemMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html new file mode 100644 index 0000000000..5ad1595697 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html @@ -0,0 +1,46 @@ +ModuleParentModuleQuery in fe_analyzer::db - Rust

Struct ModuleParentModuleQuery

Source
pub struct ModuleParentModuleQuery;

Implementations§

Source§

impl ModuleParentModuleQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleParentModuleQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleParentModuleQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleParentModuleQuery

Source§

fn default() -> ModuleParentModuleQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleParentModuleQuery

Source§

const QUERY_INDEX: u16 = 48u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_parent_module"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Option<ModuleId>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleParentModuleQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleParentModuleQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleParentModuleQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html new file mode 100644 index 0000000000..7ac5786ef4 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html @@ -0,0 +1,46 @@ +ModuleParseQuery in fe_analyzer::db - Rust

Struct ModuleParseQuery

Source
pub struct ModuleParseQuery;

Implementations§

Source§

impl ModuleParseQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleParseQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleParseQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleParseQuery

Source§

fn default() -> ModuleParseQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleParseQuery

Source§

const QUERY_INDEX: u16 = 38u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_parse"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<Module>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleParseQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleParseQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleParseQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html new file mode 100644 index 0000000000..61a9313f0c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html @@ -0,0 +1,46 @@ +ModuleStructsQuery in fe_analyzer::db - Rust

Struct ModuleStructsQuery

Source
pub struct ModuleStructsQuery;

Implementations§

Source§

impl ModuleStructsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleStructsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleStructsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleStructsQuery

Source§

fn default() -> ModuleStructsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleStructsQuery

Source§

const QUERY_INDEX: u16 = 45u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_structs"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[StructId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleStructsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleStructsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleStructsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html new file mode 100644 index 0000000000..0458e651e5 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html @@ -0,0 +1,46 @@ +ModuleSubmodulesQuery in fe_analyzer::db - Rust

Struct ModuleSubmodulesQuery

Source
pub struct ModuleSubmodulesQuery;

Implementations§

Source§

impl ModuleSubmodulesQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleSubmodulesQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleSubmodulesQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleSubmodulesQuery

Source§

fn default() -> ModuleSubmodulesQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleSubmodulesQuery

Source§

const QUERY_INDEX: u16 = 49u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_submodules"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ModuleId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleSubmodulesQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleSubmodulesQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleSubmodulesQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html new file mode 100644 index 0000000000..8a17c81cda --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html @@ -0,0 +1,46 @@ +ModuleTestsQuery in fe_analyzer::db - Rust

Struct ModuleTestsQuery

Source
pub struct ModuleTestsQuery;

Implementations§

Source§

impl ModuleTestsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleTestsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleTestsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleTestsQuery

Source§

fn default() -> ModuleTestsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleTestsQuery

Source§

const QUERY_INDEX: u16 = 50u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_tests"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Vec<FunctionId>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleTestsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleTestsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleTestsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html new file mode 100644 index 0000000000..2642ffd162 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html @@ -0,0 +1,46 @@ +ModuleUsedItemMapQuery in fe_analyzer::db - Rust

Struct ModuleUsedItemMapQuery

Source
pub struct ModuleUsedItemMapQuery;

Implementations§

Source§

impl ModuleUsedItemMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleUsedItemMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleUsedItemMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleUsedItemMapQuery

Source§

fn default() -> ModuleUsedItemMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleUsedItemMapQuery

Source§

const QUERY_INDEX: u16 = 47u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_used_item_map"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleUsedItemMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleUsedItemMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleUsedItemMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html b/compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html new file mode 100644 index 0000000000..b021fefef6 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html @@ -0,0 +1,39 @@ +RootIngotQuery in fe_analyzer::db - Rust

Struct RootIngotQuery

Source
pub struct RootIngotQuery;

Implementations§

Source§

impl RootIngotQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl RootIngotQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for RootIngotQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for RootIngotQuery

Source§

fn default() -> RootIngotQuery

Returns the “default value” for a type. Read more
Source§

impl Query for RootIngotQuery

Source§

const QUERY_INDEX: u16 = 34u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "root_ingot"

Name of the query method (e.g., foo)
Source§

type Key = ()

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = IngotId

What value does the query return?
Source§

type Storage = InputStorage<RootIngotQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for RootIngotQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html b/compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html new file mode 100644 index 0000000000..ff756b032a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html @@ -0,0 +1,46 @@ +StructAllFieldsQuery in fe_analyzer::db - Rust

Struct StructAllFieldsQuery

Source
pub struct StructAllFieldsQuery;

Implementations§

Source§

impl StructAllFieldsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructAllFieldsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructAllFieldsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructAllFieldsQuery

Source§

fn default() -> StructAllFieldsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructAllFieldsQuery

Source§

const QUERY_INDEX: u16 = 66u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_all_fields"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[StructFieldId]>

What value does the query return?
Source§

type Storage = DerivedStorage<StructAllFieldsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructAllFieldsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructAllFieldsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html new file mode 100644 index 0000000000..2ee9aab29c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html @@ -0,0 +1,46 @@ +StructAllFunctionsQuery in fe_analyzer::db - Rust

Struct StructAllFunctionsQuery

Source
pub struct StructAllFunctionsQuery;

Implementations§

Source§

impl StructAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructAllFunctionsQuery

Source§

fn default() -> StructAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 69u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<StructAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html new file mode 100644 index 0000000000..6b72d2e3f3 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html @@ -0,0 +1,46 @@ +StructDependencyGraphQuery in fe_analyzer::db - Rust

Struct StructDependencyGraphQuery

Source
pub struct StructDependencyGraphQuery;

Implementations§

Source§

impl StructDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructDependencyGraphQuery

Source§

fn default() -> StructDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 71u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<DepGraphWrapper>

What value does the query return?
Source§

type Storage = DerivedStorage<StructDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html b/compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html new file mode 100644 index 0000000000..bd43bbb173 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html @@ -0,0 +1,46 @@ +StructFieldMapQuery in fe_analyzer::db - Rust

Struct StructFieldMapQuery

Source
pub struct StructFieldMapQuery;

Implementations§

Source§

impl StructFieldMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructFieldMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructFieldMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructFieldMapQuery

Source§

fn default() -> StructFieldMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructFieldMapQuery

Source§

const QUERY_INDEX: u16 = 67u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_field_map"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<StructFieldMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructFieldMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructFieldMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html new file mode 100644 index 0000000000..75ed50ad53 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html @@ -0,0 +1,46 @@ +StructFieldTypeQuery in fe_analyzer::db - Rust

Struct StructFieldTypeQuery

Source
pub struct StructFieldTypeQuery;

Implementations§

Source§

impl StructFieldTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructFieldTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructFieldTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructFieldTypeQuery

Source§

fn default() -> StructFieldTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructFieldTypeQuery

Source§

const QUERY_INDEX: u16 = 68u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_field_type"

Name of the query method (e.g., foo)
Source§

type Key = StructFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<StructFieldTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructFieldTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructFieldTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html new file mode 100644 index 0000000000..dcdc45f88d --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html @@ -0,0 +1,46 @@ +StructFunctionMapQuery in fe_analyzer::db - Rust

Struct StructFunctionMapQuery

Source
pub struct StructFunctionMapQuery;

Implementations§

Source§

impl StructFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructFunctionMapQuery

Source§

fn default() -> StructFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 70u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_function_map"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<StructFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TestDb.html b/compiler-docs/fe_analyzer/db/struct.TestDb.html new file mode 100644 index 0000000000..62de4a0f87 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TestDb.html @@ -0,0 +1,123 @@ +TestDb in fe_analyzer::db - Rust

Struct TestDb

Source
pub struct TestDb { /* private fields */ }

Trait Implementations§

Source§

impl Database for TestDb

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for TestDb

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for TestDb

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for TestDb

Source§

fn default() -> TestDb

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<AnalyzerDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<SourceDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl Upcast<dyn SourceDb> for TestDb

Source§

fn upcast(&self) -> &(dyn SourceDb + 'static)

Source§

impl UpcastMut<dyn SourceDb> for TestDb

Source§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for TestDb

§

impl RefUnwindSafe for TestDb

§

impl !Send for TestDb

§

impl !Sync for TestDb

§

impl Unpin for TestDb

§

impl UnwindSafe for TestDb

Blanket Implementations§

Source§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

Source§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

Source§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

Source§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

Source§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

Source§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

Source§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

Source§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

Source§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

Source§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

Source§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

Source§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

Source§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

Source§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

Source§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

Source§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

Source§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

Source§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

Source§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

Source§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

Source§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

Source§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

Source§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

Source§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

Source§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

Source§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

Source§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

Source§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

Source§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

Source§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

Source§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

Source§

fn intern_type(&self, key0: Type) -> TypeId

Source§

fn lookup_intern_type(&self, key0: TypeId) -> Type

Source§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

Source§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
Source§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
Source§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

Source§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
Source§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
Source§

fn root_ingot(&self) -> IngotId

Source§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
Source§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
Source§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

Source§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

Source§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

Source§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

Source§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

Source§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

Source§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

Source§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

Source§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

Source§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

Source§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

Source§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

Source§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

Source§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

Source§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

Source§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

Source§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

Source§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

Source§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

Source§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

Source§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

Source§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

Source§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

Source§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

Source§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

Source§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

Source§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

Source§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

Source§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

Source§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

Source§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

Source§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

Source§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

Source§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

Source§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

Source§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

Source§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

Source§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

Source§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

Source§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html new file mode 100644 index 0000000000..77b9992e5d --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html @@ -0,0 +1,46 @@ +TraitAllFunctionsQuery in fe_analyzer::db - Rust

Struct TraitAllFunctionsQuery

Source
pub struct TraitAllFunctionsQuery;

Implementations§

Source§

impl TraitAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TraitAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TraitAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitAllFunctionsQuery

Source§

fn default() -> TraitAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TraitAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 78u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "trait_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = TraitId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionSigId]>

What value does the query return?
Source§

type Storage = DerivedStorage<TraitAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TraitAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TraitAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html new file mode 100644 index 0000000000..cb07bdd92e --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html @@ -0,0 +1,46 @@ +TraitFunctionMapQuery in fe_analyzer::db - Rust

Struct TraitFunctionMapQuery

Source
pub struct TraitFunctionMapQuery;

Implementations§

Source§

impl TraitFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TraitFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TraitFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitFunctionMapQuery

Source§

fn default() -> TraitFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TraitFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 79u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "trait_function_map"

Name of the query method (e.g., foo)
Source§

type Key = TraitId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<TraitFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TraitFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TraitFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html b/compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html new file mode 100644 index 0000000000..e5725533bf --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html @@ -0,0 +1,46 @@ +TraitIsImplementedForQuery in fe_analyzer::db - Rust

Struct TraitIsImplementedForQuery

Source
pub struct TraitIsImplementedForQuery;

Implementations§

Source§

impl TraitIsImplementedForQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TraitIsImplementedForQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TraitIsImplementedForQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitIsImplementedForQuery

Source§

fn default() -> TraitIsImplementedForQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TraitIsImplementedForQuery

Source§

const QUERY_INDEX: u16 = 80u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "trait_is_implemented_for"

Name of the query method (e.g., foo)
Source§

type Key = (TraitId, TypeId)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = bool

What value does the query return?
Source§

type Storage = DerivedStorage<TraitIsImplementedForQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TraitIsImplementedForQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TraitIsImplementedForQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html new file mode 100644 index 0000000000..3531c7dd71 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html @@ -0,0 +1,46 @@ +TypeAliasTypeQuery in fe_analyzer::db - Rust

Struct TypeAliasTypeQuery

Source
pub struct TypeAliasTypeQuery;

Implementations§

Source§

impl TypeAliasTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TypeAliasTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TypeAliasTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TypeAliasTypeQuery

Source§

fn default() -> TypeAliasTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TypeAliasTypeQuery

Source§

const QUERY_INDEX: u16 = 86u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "type_alias_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeAliasId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<TypeAliasTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TypeAliasTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TypeAliasTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html b/compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html new file mode 100644 index 0000000000..9845da493b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html @@ -0,0 +1,318 @@ +AnalyzerDb in fe_analyzer::db - Rust

Trait AnalyzerDb

Source
pub trait AnalyzerDb:
+    Database
+    + HasQueryGroup<AnalyzerDbStorage>
+    + SourceDb
+    + Upcast<dyn SourceDb>
+    + UpcastMut<dyn SourceDb> {
+
Show 93 methods // Required methods + fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId; + fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>; + fn intern_module(&self, key0: Rc<Module>) -> ModuleId; + fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>; + fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId; + fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, + ) -> Rc<ModuleConstant>; + fn intern_struct(&self, key0: Rc<Struct>) -> StructId; + fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>; + fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId; + fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>; + fn intern_enum(&self, key0: Rc<Enum>) -> EnumId; + fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>; + fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId; + fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>; + fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId; + fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>; + fn intern_trait(&self, key0: Rc<Trait>) -> TraitId; + fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>; + fn intern_impl(&self, key0: Rc<Impl>) -> ImplId; + fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>; + fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId; + fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>; + fn intern_contract(&self, key0: Rc<Contract>) -> ContractId; + fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>; + fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId; + fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, + ) -> Rc<ContractField>; + fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId; + fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>; + fn intern_function(&self, key0: Rc<Function>) -> FunctionId; + fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>; + fn intern_type(&self, key0: Type) -> TypeId; + fn lookup_intern_type(&self, key0: TypeId) -> Type; + fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>; + fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>); + fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, + ); + fn ingot_external_ingots( + &self, + key0: IngotId, + ) -> Rc<IndexMap<SmolStr, IngotId>>; + fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + ); + fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, + ); + fn root_ingot(&self) -> IngotId; + fn set_root_ingot(&mut self, value__: IngotId); + fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, + ); + fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>; + fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>; + fn module_file_path(&self, key0: ModuleId) -> SmolStr; + fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>; + fn module_is_incomplete(&self, key0: ModuleId) -> bool; + fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>; + fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>; + fn module_item_map( + &self, + key0: ModuleId, + ) -> Analysis<Rc<IndexMap<SmolStr, Item>>>; + fn module_impl_map( + &self, + key0: ModuleId, + ) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>; + fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>; + fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>; + fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>; + fn module_used_item_map( + &self, + key0: ModuleId, + ) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>; + fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>; + fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>; + fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>; + fn module_constant_type( + &self, + key0: ModuleConstantId, + ) -> Analysis<Result<TypeId, TypeError>>; + fn module_constant_value( + &self, + key0: ModuleConstantId, + ) -> Analysis<Result<Constant, ConstEvalError>>; + fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>; + fn contract_function_map( + &self, + key0: ContractId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn contract_public_function_map( + &self, + key0: ContractId, + ) -> Rc<IndexMap<SmolStr, FunctionId>>; + fn contract_init_function( + &self, + key0: ContractId, + ) -> Analysis<Option<FunctionId>>; + fn contract_call_function( + &self, + key0: ContractId, + ) -> Analysis<Option<FunctionId>>; + fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>; + fn contract_field_map( + &self, + key0: ContractId, + ) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>; + fn contract_field_type( + &self, + key0: ContractFieldId, + ) -> Analysis<Result<TypeId, TypeError>>; + fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper; + fn contract_runtime_dependency_graph( + &self, + key0: ContractId, + ) -> DepGraphWrapper; + fn function_signature( + &self, + key0: FunctionSigId, + ) -> Analysis<Rc<FunctionSignature>>; + fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>; + fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper; + fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>; + fn struct_field_map( + &self, + key0: StructId, + ) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>; + fn struct_field_type( + &self, + key0: StructFieldId, + ) -> Analysis<Result<TypeId, TypeError>>; + fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>; + fn struct_function_map( + &self, + key0: StructId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn struct_dependency_graph( + &self, + key0: StructId, + ) -> Analysis<DepGraphWrapper>; + fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>; + fn enum_variant_map( + &self, + key0: EnumId, + ) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>; + fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>; + fn enum_function_map( + &self, + key0: EnumId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>; + fn enum_variant_kind( + &self, + key0: EnumVariantId, + ) -> Analysis<Result<EnumVariantKind, TypeError>>; + fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>; + fn trait_function_map( + &self, + key0: TraitId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>; + fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool; + fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>; + fn impl_function_map( + &self, + key0: ImplId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>; + fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>; + fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>; + fn type_alias_type( + &self, + key0: TypeAliasId, + ) -> Analysis<Result<TypeId, TypeError>>; +
}

Required Methods§

Source

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

Source

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

Source

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

Source

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

Source

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

Source

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

Source

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

Source

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

Source

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

Source

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

Source

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

Source

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

Source

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

Source

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

Source

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

Source

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

Source

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

Source

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

Source

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

Source

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

Source

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

Source

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

Source

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

Source

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

Source

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

Source

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

Source

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

Source

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

Source

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

Source

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

Source

fn intern_type(&self, key0: Type) -> TypeId

Source

fn lookup_intern_type(&self, key0: TypeId) -> Type

Source

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

Source

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input.

+

See ingot_files for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again.

+

See ingot_files for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

Source

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input.

+

See ingot_external_ingots for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again.

+

See ingot_external_ingots for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn root_ingot(&self) -> IngotId

Source

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input.

+

See root_ingot for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again.

+

See root_ingot for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

Source

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

Source

fn module_file_path(&self, key0: ModuleId) -> SmolStr

Source

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

Source

fn module_is_incomplete(&self, key0: ModuleId) -> bool

Source

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

Source

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

Source

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

Source

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

Source

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

Source

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

Source

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

Source

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

Source

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

Source

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

Source

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

Source

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

Source

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

Source

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

Source

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

Source

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

Source

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

Source

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

Source

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

Source

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

Source

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

Source

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

Source

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

Source

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

Source

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

Source

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

Source

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

Source

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

Source

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

Source

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

Source

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

Source

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

Source

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

Source

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

Source

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

Source

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Implementors§

Source§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/index.html b/compiler-docs/fe_analyzer/display/index.html new file mode 100644 index 0000000000..fd30e471ee --- /dev/null +++ b/compiler-docs/fe_analyzer/display/index.html @@ -0,0 +1 @@ +fe_analyzer::display - Rust

Module display

Source

Structs§

DisplayableWrapper

Traits§

DisplayWithDb
Displayable
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/sidebar-items.js b/compiler-docs/fe_analyzer/display/sidebar-items.js new file mode 100644 index 0000000000..f7c350dff7 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["DisplayableWrapper"],"trait":["DisplayWithDb","Displayable"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html b/compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html new file mode 100644 index 0000000000..fc93dafbd9 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html @@ -0,0 +1,14 @@ +DisplayableWrapper in fe_analyzer::display - Rust

Struct DisplayableWrapper

Source
pub struct DisplayableWrapper<'a, T> { /* private fields */ }

Implementations§

Source§

impl<'a, T> DisplayableWrapper<'a, T>

Source

pub fn new(db: &'a dyn AnalyzerDb, inner: T) -> Self

Source

pub fn child(&self, inner: T) -> Self

Trait Implementations§

Source§

impl<T: DisplayWithDb> Display for DisplayableWrapper<'_, T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for DisplayableWrapper<'a, T>
where + T: Freeze,

§

impl<'a, T> !RefUnwindSafe for DisplayableWrapper<'a, T>

§

impl<'a, T> !Send for DisplayableWrapper<'a, T>

§

impl<'a, T> !Sync for DisplayableWrapper<'a, T>

§

impl<'a, T> Unpin for DisplayableWrapper<'a, T>
where + T: Unpin,

§

impl<'a, T> !UnwindSafe for DisplayableWrapper<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html b/compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html new file mode 100644 index 0000000000..ef93391626 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html @@ -0,0 +1,5 @@ +DisplayWithDb in fe_analyzer::display - Rust

Trait DisplayWithDb

Source
pub trait DisplayWithDb {
+    // Required method
+    fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result;
+}

Required Methods§

Source

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Implementations on Foreign Types§

Source§

impl<T> DisplayWithDb for &T
where + T: DisplayWithDb + ?Sized,

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/trait.Displayable.html b/compiler-docs/fe_analyzer/display/trait.Displayable.html new file mode 100644 index 0000000000..fa0df23414 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/trait.Displayable.html @@ -0,0 +1,10 @@ +Displayable in fe_analyzer::display - Rust

Trait Displayable

Source
pub trait Displayable: DisplayWithDb {
+    // Provided method
+    fn display<'a, 'b>(
+        &'a self,
+        db: &'b dyn AnalyzerDb,
+    ) -> DisplayableWrapper<'b, &'a Self> { ... }
+}

Provided Methods§

Source

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html b/compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html new file mode 100644 index 0000000000..d0e5d19402 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html @@ -0,0 +1,25 @@ +BinaryOperationError in fe_analyzer::errors - Rust

Enum BinaryOperationError

Source
pub enum BinaryOperationError {
+    TypesNotCompatible,
+    TypesNotNumeric,
+    RightTooLarge,
+    RightIsSigned,
+    NotEqualAndUnsigned,
+}
Expand description

Errors that can result from a binary operation

+

Variants§

§

TypesNotCompatible

§

TypesNotNumeric

§

RightTooLarge

§

RightIsSigned

§

NotEqualAndUnsigned

Trait Implementations§

Source§

impl Debug for BinaryOperationError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BinaryOperationError

Source§

fn eq(&self, other: &BinaryOperationError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BinaryOperationError

Source§

impl StructuralPartialEq for BinaryOperationError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/enum.IndexingError.html b/compiler-docs/fe_analyzer/errors/enum.IndexingError.html new file mode 100644 index 0000000000..47ec16a5ff --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/enum.IndexingError.html @@ -0,0 +1,22 @@ +IndexingError in fe_analyzer::errors - Rust

Enum IndexingError

Source
pub enum IndexingError {
+    WrongIndexType,
+    NotSubscriptable,
+}
Expand description

Errors that can result from indexing

+

Variants§

§

WrongIndexType

§

NotSubscriptable

Trait Implementations§

Source§

impl Debug for IndexingError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for IndexingError

Source§

fn eq(&self, other: &IndexingError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for IndexingError

Source§

impl StructuralPartialEq for IndexingError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html b/compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html new file mode 100644 index 0000000000..5575fc21f9 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html @@ -0,0 +1,26 @@ +TypeCoercionError in fe_analyzer::errors - Rust

Enum TypeCoercionError

Source
pub enum TypeCoercionError {
+    RequiresToMem,
+    Incompatible,
+    SelfContractType,
+}
Expand description

Errors that can result from an implicit type coercion

+

Variants§

§

RequiresToMem

Value is in storage and must be explicitly moved with .to_mem()

+
§

Incompatible

Value type cannot be coerced to the expected type

+
§

SelfContractType

self contract used where an external contract value is expected

+

Trait Implementations§

Source§

impl Debug for TypeCoercionError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for TypeCoercionError

Source§

fn eq(&self, other: &TypeCoercionError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeCoercionError

Source§

impl StructuralPartialEq for TypeCoercionError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html b/compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html new file mode 100644 index 0000000000..751bad02c8 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html @@ -0,0 +1,6 @@ +duplicate_name_error in fe_analyzer::errors - Rust

Function duplicate_name_error

Source
pub fn duplicate_name_error(
+    message: &str,
+    name: &str,
+    original: Span,
+    duplicate: Span,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.error.html b/compiler-docs/fe_analyzer/errors/fn.error.html new file mode 100644 index 0000000000..4c55b98f52 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.error.html @@ -0,0 +1,5 @@ +error in fe_analyzer::errors - Rust

Function error

Source
pub fn error(
+    message: impl Into<String>,
+    label_span: Span,
+    label: impl Into<String>,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.fancy_error.html b/compiler-docs/fe_analyzer/errors/fn.fancy_error.html new file mode 100644 index 0000000000..c27dc869d3 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.fancy_error.html @@ -0,0 +1,5 @@ +fancy_error in fe_analyzer::errors - Rust

Function fancy_error

Source
pub fn fancy_error(
+    message: impl Into<String>,
+    labels: Vec<Label>,
+    notes: Vec<String>,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html b/compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html new file mode 100644 index 0000000000..5f028c8a25 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html @@ -0,0 +1,7 @@ +name_conflict_error in fe_analyzer::errors - Rust

Function name_conflict_error

Source
pub fn name_conflict_error(
+    name_kind: &str,
+    name: &str,
+    original: &NamedThing,
+    original_span: Option<Span>,
+    duplicate_span: Span,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html b/compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html new file mode 100644 index 0000000000..e6b7f25353 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html @@ -0,0 +1 @@ +not_yet_implemented in fe_analyzer::errors - Rust

Function not_yet_implemented

Source
pub fn not_yet_implemented(feature: impl Display, span: Span) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html b/compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html new file mode 100644 index 0000000000..1d53810ab0 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html @@ -0,0 +1 @@ +self_contract_type_error in fe_analyzer::errors - Rust

Function self_contract_type_error

Source
pub fn self_contract_type_error(span: Span, typ: &dyn Display) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.to_mem_error.html b/compiler-docs/fe_analyzer/errors/fn.to_mem_error.html new file mode 100644 index 0000000000..b5b5876827 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.to_mem_error.html @@ -0,0 +1 @@ +to_mem_error in fe_analyzer::errors - Rust

Function to_mem_error

Source
pub fn to_mem_error(span: Span) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.type_error.html b/compiler-docs/fe_analyzer/errors/fn.type_error.html new file mode 100644 index 0000000000..964c33edc9 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.type_error.html @@ -0,0 +1,6 @@ +type_error in fe_analyzer::errors - Rust

Function type_error

Source
pub fn type_error(
+    message: impl Into<String>,
+    span: Span,
+    expected: impl Display,
+    actual: impl Display,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/index.html b/compiler-docs/fe_analyzer/errors/index.html new file mode 100644 index 0000000000..21d1532fc0 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/index.html @@ -0,0 +1,7 @@ +fe_analyzer::errors - Rust

Module errors

Source
Expand description

Semantic errors.

+

Structs§

AlreadyDefined
Error to be returned from APIs that should reject duplicate definitions
ConstEvalError
Error indicating constant evaluation failed.
FatalError
Error to be returned when otherwise no meaningful information can be returned. +Can’t be created unless a diagnostic has been emitted, and thus a DiagnosticVoucher +has been obtained. (See comment on TypeError)
IncompleteItem
Error returned by ModuleId::resolve_name if the name is not found, and parsing of the module +failed. In this case, emitting an error message about failure to resolve the name might be misleading, +because the file may in fact contain an item with the given name, somewhere after the syntax error that caused +parsing to fail.
TypeError
Error indicating that a type is invalid.

Enums§

BinaryOperationError
Errors that can result from a binary operation
IndexingError
Errors that can result from indexing
TypeCoercionError
Errors that can result from an implicit type coercion

Functions§

duplicate_name_error
error
fancy_error
name_conflict_error
not_yet_implemented
self_contract_type_error
to_mem_error
type_error
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/sidebar-items.js b/compiler-docs/fe_analyzer/errors/sidebar-items.js new file mode 100644 index 0000000000..79106423cd --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BinaryOperationError","IndexingError","TypeCoercionError"],"fn":["duplicate_name_error","error","fancy_error","name_conflict_error","not_yet_implemented","self_contract_type_error","to_mem_error","type_error"],"struct":["AlreadyDefined","ConstEvalError","FatalError","IncompleteItem","TypeError"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html b/compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html new file mode 100644 index 0000000000..68bab7222c --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html @@ -0,0 +1,12 @@ +AlreadyDefined in fe_analyzer::errors - Rust

Struct AlreadyDefined

Source
pub struct AlreadyDefined(/* private fields */);
Expand description

Error to be returned from APIs that should reject duplicate definitions

+

Implementations§

Trait Implementations§

Source§

impl Debug for AlreadyDefined

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<AlreadyDefined> for FatalError

Source§

fn from(err: AlreadyDefined) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html b/compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html new file mode 100644 index 0000000000..d11229c38f --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html @@ -0,0 +1,33 @@ +ConstEvalError in fe_analyzer::errors - Rust

Struct ConstEvalError

Source
pub struct ConstEvalError(/* private fields */);
Expand description

Error indicating constant evaluation failed.

+

This error emitted when

+
    +
  1. an expression can’t be evaluated in compilation time
  2. +
  3. arithmetic overflow occurred during evaluation
  4. +
  5. zero division is detected during evaluation
  6. +
+

Can’t be created unless a diagnostic has been emitted, and thus a DiagnosticVoucher +has been obtained. (See comment on TypeError)

+

NOTE: Clone is required because these are stored in a salsa db. +Please don’t clone these manually.

+

Implementations§

Trait Implementations§

Source§

impl Clone for ConstEvalError

Source§

fn clone(&self) -> ConstEvalError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstEvalError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<ConstEvalError> for FatalError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<ConstEvalError> for TypeError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for ConstEvalError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for ConstEvalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for ConstEvalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.
Source§

impl Hash for ConstEvalError

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstEvalError

Source§

fn eq(&self, other: &ConstEvalError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ConstEvalError

Source§

impl StructuralPartialEq for ConstEvalError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.FatalError.html b/compiler-docs/fe_analyzer/errors/struct.FatalError.html new file mode 100644 index 0000000000..b1dc54341f --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.FatalError.html @@ -0,0 +1,16 @@ +FatalError in fe_analyzer::errors - Rust

Struct FatalError

Source
pub struct FatalError(/* private fields */);
Expand description

Error to be returned when otherwise no meaningful information can be returned. +Can’t be created unless a diagnostic has been emitted, and thus a DiagnosticVoucher +has been obtained. (See comment on TypeError)

+

Implementations§

Source§

impl FatalError

Source

pub fn new(voucher: DiagnosticVoucher) -> Self

Create a FatalError instance, given a “voucher” +obtained by emitting an error via an AnalyzerContext.

+

Trait Implementations§

Source§

impl Debug for FatalError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<AlreadyDefined> for FatalError

Source§

fn from(err: AlreadyDefined) -> Self

Converts to this type from the input type.
Source§

impl From<ConstEvalError> for FatalError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for ConstEvalError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for TypeError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for FatalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for FatalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html b/compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html new file mode 100644 index 0000000000..2c8c7f1f53 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html @@ -0,0 +1,15 @@ +IncompleteItem in fe_analyzer::errors - Rust

Struct IncompleteItem

Source
pub struct IncompleteItem(/* private fields */);
Expand description

Error returned by ModuleId::resolve_name if the name is not found, and parsing of the module +failed. In this case, emitting an error message about failure to resolve the name might be misleading, +because the file may in fact contain an item with the given name, somewhere after the syntax error that caused +parsing to fail.

+

Implementations§

Source§

impl IncompleteItem

Source

pub fn new() -> Self

Trait Implementations§

Source§

impl Debug for IncompleteItem

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<IncompleteItem> for ConstEvalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for FatalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for TypeError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.TypeError.html b/compiler-docs/fe_analyzer/errors/struct.TypeError.html new file mode 100644 index 0000000000..b152fe77d0 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.TypeError.html @@ -0,0 +1,36 @@ +TypeError in fe_analyzer::errors - Rust

Struct TypeError

Source
pub struct TypeError(/* private fields */);
Expand description

Error indicating that a type is invalid.

+

Note that the “type” of a thing (eg the type of a FunctionParam) +in crate::namespace::types is sometimes represented as a +Result<Type, TypeError>.

+

If, for example, a function parameter has an undefined type, we emit a Diagnostic message, +give that parameter a “type” of Err(TypeError), and carry on. If/when that parameter is +used in the function body, we assume that a diagnostic message about the undefined type +has already been emitted, and halt the analysis of the function body.

+

To ensure that that assumption is sound, a diagnostic must be emitted before creating +a TypeError. So that the rust compiler can help us enforce this rule, a TypeError +cannot be constructed without providing a DiagnosticVoucher. A voucher can be obtained +by calling an error function on an AnalyzerContext. +Please don’t try to work around this restriction.

+

Example: TypeError::new(context.error("something is wrong", some_span, "this thing"))

+

Implementations§

Source§

impl TypeError

Source

pub fn new(voucher: DiagnosticVoucher) -> Self

Trait Implementations§

Source§

impl Clone for TypeError

Source§

fn clone(&self) -> TypeError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<ConstEvalError> for TypeError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for TypeError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for TypeError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for ConstEvalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for FatalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.
Source§

impl Hash for TypeError

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeError

Source§

fn eq(&self, other: &TypeError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeError

Source§

impl StructuralPartialEq for TypeError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/fn.analyze_ingot.html b/compiler-docs/fe_analyzer/fn.analyze_ingot.html new file mode 100644 index 0000000000..86f2e5e22a --- /dev/null +++ b/compiler-docs/fe_analyzer/fn.analyze_ingot.html @@ -0,0 +1,4 @@ +analyze_ingot in fe_analyzer - Rust

Function analyze_ingot

Source
pub fn analyze_ingot(
+    db: &dyn AnalyzerDb,
+    ingot_id: IngotId,
+) -> Result<(), Vec<Diagnostic>>
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/fn.analyze_module.html b/compiler-docs/fe_analyzer/fn.analyze_module.html new file mode 100644 index 0000000000..9c41af7d1c --- /dev/null +++ b/compiler-docs/fe_analyzer/fn.analyze_module.html @@ -0,0 +1,4 @@ +analyze_module in fe_analyzer - Rust

Function analyze_module

Source
pub fn analyze_module(
+    db: &dyn AnalyzerDb,
+    module_id: ModuleId,
+) -> Result<(), Vec<Diagnostic>>
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/index.html b/compiler-docs/fe_analyzer/index.html new file mode 100644 index 0000000000..f2e27b9f9c --- /dev/null +++ b/compiler-docs/fe_analyzer/index.html @@ -0,0 +1,6 @@ +fe_analyzer - Rust

Crate fe_analyzer

Source
Expand description

Fe semantic analysis.

+

This library is used to analyze the semantics of a given Fe AST. It detects +any semantic errors within a given AST and produces a Context instance +that can be used to query contextual information attributed to AST nodes.

+

Re-exports§

pub use db::AnalyzerDb;
pub use db::TestDb;

Modules§

builtins
constants
context
db
display
errors
Semantic errors.
namespace
pattern_analysis
This module includes utility structs and its functions for pattern matching +analysis. The algorithm here is based on Warnings for pattern matching

Functions§

analyze_ingot
analyze_module
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/index.html b/compiler-docs/fe_analyzer/namespace/index.html new file mode 100644 index 0000000000..3720a3591b --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/index.html @@ -0,0 +1 @@ +fe_analyzer::namespace - Rust

Module namespace

Source

Modules§

items
scopes
types
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html b/compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html new file mode 100644 index 0000000000..5def51b881 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html @@ -0,0 +1,26 @@ +DepLocality in fe_analyzer::namespace::items - Rust

Enum DepLocality

Source
pub enum DepLocality {
+    Local,
+    External,
+}
Expand description

DepGraph edge label. “Locality” refers to the deployed state; +Local dependencies are those that will be compiled together, while +External dependencies will only be reachable via an evm CALL* op.

+

Variants§

§

Local

§

External

Trait Implementations§

Source§

impl Clone for DepLocality

Source§

fn clone(&self) -> DepLocality

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DepLocality

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for DepLocality

Source§

fn eq(&self, other: &DepLocality) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for DepLocality

Source§

impl Eq for DepLocality

Source§

impl StructuralPartialEq for DepLocality

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html b/compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html new file mode 100644 index 0000000000..a5162b086c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html @@ -0,0 +1,29 @@ +EnumVariantKind in fe_analyzer::namespace::items - Rust

Enum EnumVariantKind

Source
pub enum EnumVariantKind {
+    Unit,
+    Tuple(SmallVec<[TypeId; 4]>),
+}

Variants§

§

Unit

§

Tuple(SmallVec<[TypeId; 4]>)

Implementations§

Source§

impl EnumVariantKind

Source

pub fn display_name(&self) -> &'static str

Source

pub fn field_len(&self) -> usize

Source

pub fn is_unit(&self) -> bool

Trait Implementations§

Source§

impl Clone for EnumVariantKind

Source§

fn clone(&self) -> EnumVariantKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariantKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for EnumVariantKind

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl Hash for EnumVariantKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumVariantKind

Source§

fn eq(&self, other: &EnumVariantKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumVariantKind

Source§

impl StructuralPartialEq for EnumVariantKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html b/compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html new file mode 100644 index 0000000000..b681730d6b --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html @@ -0,0 +1,29 @@ +IngotMode in fe_analyzer::namespace::items - Rust

Enum IngotMode

Source
pub enum IngotMode {
+    Main,
+    Lib,
+    StandaloneModule,
+}

Variants§

§

Main

The target of compilation. Expected to have a main.fe file.

+
§

Lib

A library; expected to have a lib.fe file.

+
§

StandaloneModule

A fake ingot, created to hold a single module with any filename.

+

Trait Implementations§

Source§

impl Clone for IngotMode

Source§

fn clone(&self) -> IngotMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for IngotMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for IngotMode

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for IngotMode

Source§

fn eq(&self, other: &IngotMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for IngotMode

Source§

impl Eq for IngotMode

Source§

impl StructuralPartialEq for IngotMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.Item.html b/compiler-docs/fe_analyzer/namespace/items/enum.Item.html new file mode 100644 index 0000000000..c1b716737b --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.Item.html @@ -0,0 +1,57 @@ +Item in fe_analyzer::namespace::items - Rust

Enum Item

Source
pub enum Item {
+    Ingot(IngotId),
+    Module(ModuleId),
+    Type(TypeDef),
+    GenericType(GenericType),
+    Trait(TraitId),
+    Impl(ImplId),
+    Function(FunctionId),
+    Constant(ModuleConstantId),
+    BuiltinFunction(GlobalFunction),
+    Intrinsic(Intrinsic),
+    Attribute(AttributeId),
+}
Expand description

A named item. This does not include things inside of +a function body.

+

Variants§

§

Ingot(IngotId)

§

Module(ModuleId)

§

Type(TypeDef)

§

GenericType(GenericType)

§

Trait(TraitId)

§

Impl(ImplId)

§

Function(FunctionId)

§

Constant(ModuleConstantId)

§

BuiltinFunction(GlobalFunction)

§

Intrinsic(Intrinsic)

§

Attribute(AttributeId)

Implementations§

Source§

impl Item

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_builtin(&self) -> bool

Source

pub fn is_struct(&self, val: &StructId) -> bool

Source

pub fn is_contract(&self) -> bool

Source

pub fn item_kind_display_name(&self) -> &'static str

Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item>

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId>

Source

pub fn path(&self, db: &dyn AnalyzerDb) -> Rc<[SmolStr]>

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Option<Rc<DepGraph>>

Source

pub fn resolve_path_segments( + &self, + db: &dyn AnalyzerDb, + segments: &[Node<SmolStr>], +) -> Analysis<Option<NamedThing>>

Source

pub fn function_sig( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<FunctionSigId>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<AttributeId>

Trait Implementations§

Source§

impl Clone for Item

Source§

fn clone(&self) -> Item

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Item

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Item

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Item

Source§

fn cmp(&self, other: &Item) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Item

Source§

fn eq(&self, other: &Item) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Item

Source§

fn partial_cmp(&self, other: &Item) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for Item

Source§

impl Eq for Item

Source§

impl StructuralPartialEq for Item

Auto Trait Implementations§

§

impl Freeze for Item

§

impl RefUnwindSafe for Item

§

impl Send for Item

§

impl Sync for Item

§

impl Unpin for Item

§

impl UnwindSafe for Item

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html b/compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html new file mode 100644 index 0000000000..c11040f90e --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html @@ -0,0 +1,27 @@ +ModuleSource in fe_analyzer::namespace::items - Rust

Enum ModuleSource

Source
pub enum ModuleSource {
+    File(SourceFileId),
+    Dir(SmolStr),
+}

Variants§

§

File(SourceFileId)

§

Dir(SmolStr)

For directory modules without a corresponding source file +(which will soon not be allowed, and this variant can go away).

+

Trait Implementations§

Source§

impl Clone for ModuleSource

Source§

fn clone(&self) -> ModuleSource

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleSource

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleSource

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ModuleSource

Source§

fn eq(&self, other: &ModuleSource) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ModuleSource

Source§

impl StructuralPartialEq for ModuleSource

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html b/compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html new file mode 100644 index 0000000000..ce6f9cb4c5 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html @@ -0,0 +1,41 @@ +TypeDef in fe_analyzer::namespace::items - Rust

Enum TypeDef

Source
pub enum TypeDef {
+    Alias(TypeAliasId),
+    Struct(StructId),
+    Enum(EnumId),
+    Contract(ContractId),
+    Primitive(Base),
+}

Variants§

§

Alias(TypeAliasId)

§

Struct(StructId)

§

Enum(EnumId)

§

Contract(ContractId)

§

Primitive(Base)

Implementations§

Source§

impl TypeDef

Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<Type, TypeError>

Source

pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for TypeDef

Source§

fn clone(&self) -> TypeDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for TypeDef

Source§

fn cmp(&self, other: &TypeDef) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TypeDef

Source§

fn eq(&self, other: &TypeDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TypeDef

Source§

fn partial_cmp(&self, other: &TypeDef) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for TypeDef

Source§

impl Eq for TypeDef

Source§

impl StructuralPartialEq for TypeDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html b/compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html new file mode 100644 index 0000000000..31b4c0fec9 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html @@ -0,0 +1 @@ +builtin_items in fe_analyzer::namespace::items - Rust

Function builtin_items

Source
pub fn builtin_items() -> IndexMap<SmolStr, Item>
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html b/compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html new file mode 100644 index 0000000000..948559add9 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html @@ -0,0 +1,2 @@ +walk_local_dependencies in fe_analyzer::namespace::items - Rust

Function walk_local_dependencies

Source
pub fn walk_local_dependencies<F>(graph: &DepGraph, root: Item, fun: F)
where + F: FnMut(Item),
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/index.html b/compiler-docs/fe_analyzer/namespace/items/index.html new file mode 100644 index 0000000000..8f2b9f2d3d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/index.html @@ -0,0 +1,6 @@ +fe_analyzer::namespace::items - Rust

Module items

Source

Structs§

Attribute
AttributeId
Contract
ContractField
ContractFieldId
ContractId
DepGraphWrapper
Enum
EnumId
EnumVariant
EnumVariantId
Function
FunctionId
FunctionSig
FunctionSigId
Impl
ImplId
Ingot
An Ingot is composed of a tree of Modules (set via +[AnalyzerDb::set_ingot_module_tree]), and doesn’t have direct knowledge of +files.
IngotId
Module
ModuleConstant
ModuleConstantId
ModuleId
Id of a Module, which corresponds to a single Fe source file.
Struct
StructField
StructFieldId
StructId
Trait
TraitId
TypeAlias
TypeAliasId

Enums§

DepLocality
DepGraph edge label. “Locality” refers to the deployed state; +Local dependencies are those that will be compiled together, while +External dependencies will only be reachable via an evm CALL* op.
EnumVariantKind
IngotMode
Item
A named item. This does not include things inside of +a function body.
ModuleSource
TypeDef

Traits§

DiagnosticSink

Functions§

builtin_items
walk_local_dependencies

Type Aliases§

DepGraph
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/items/sidebar-items.js new file mode 100644 index 0000000000..97139cad16 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DepLocality","EnumVariantKind","IngotMode","Item","ModuleSource","TypeDef"],"fn":["builtin_items","walk_local_dependencies"],"struct":["Attribute","AttributeId","Contract","ContractField","ContractFieldId","ContractId","DepGraphWrapper","Enum","EnumId","EnumVariant","EnumVariantId","Function","FunctionId","FunctionSig","FunctionSigId","Impl","ImplId","Ingot","IngotId","Module","ModuleConstant","ModuleConstantId","ModuleId","Struct","StructField","StructFieldId","StructId","Trait","TraitId","TypeAlias","TypeAliasId"],"trait":["DiagnosticSink"],"type":["DepGraph"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html b/compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html new file mode 100644 index 0000000000..89d9ef4004 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html @@ -0,0 +1,25 @@ +Attribute in fe_analyzer::namespace::items - Rust

Struct Attribute

Source
pub struct Attribute {
+    pub ast: Node<SmolStr>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<SmolStr>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Attribute

Source§

fn clone(&self) -> Attribute

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Attribute

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Attribute

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Attribute

Source§

fn eq(&self, other: &Attribute) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Attribute

Source§

impl StructuralPartialEq for Attribute

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html b/compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html new file mode 100644 index 0000000000..c6489f4fc8 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html @@ -0,0 +1,31 @@ +AttributeId in fe_analyzer::namespace::items - Rust

Struct AttributeId

Source
pub struct AttributeId(/* private fields */);

Implementations§

Source§

impl AttributeId

Source

pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Attribute>

Source

pub fn span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn parent(self, db: &dyn AnalyzerDb) -> Item

Trait Implementations§

Source§

impl Clone for AttributeId

Source§

fn clone(&self) -> AttributeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AttributeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for AttributeId

Source§

fn default() -> AttributeId

Returns the “default value” for a type. Read more
Source§

impl Hash for AttributeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for AttributeId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for AttributeId

Source§

fn cmp(&self, other: &AttributeId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for AttributeId

Source§

fn eq(&self, other: &AttributeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for AttributeId

Source§

fn partial_cmp(&self, other: &AttributeId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for AttributeId

Source§

impl Eq for AttributeId

Source§

impl StructuralPartialEq for AttributeId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Contract.html b/compiler-docs/fe_analyzer/namespace/items/struct.Contract.html new file mode 100644 index 0000000000..d219bca379 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Contract.html @@ -0,0 +1,26 @@ +Contract in fe_analyzer::namespace::items - Rust

Struct Contract

Source
pub struct Contract {
+    pub name: SmolStr,
+    pub ast: Node<Contract>,
+    pub module: ModuleId,
+}

Fields§

§name: SmolStr§ast: Node<Contract>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Contract

Source§

fn clone(&self) -> Contract

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Contract

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Contract

Source§

fn eq(&self, other: &Contract) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Contract

Source§

impl StructuralPartialEq for Contract

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html b/compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html new file mode 100644 index 0000000000..3324f30471 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html @@ -0,0 +1,25 @@ +ContractField in fe_analyzer::namespace::items - Rust

Struct ContractField

Source
pub struct ContractField {
+    pub ast: Node<Field>,
+    pub parent: ContractId,
+}

Fields§

§ast: Node<Field>§parent: ContractId

Trait Implementations§

Source§

impl Clone for ContractField

Source§

fn clone(&self) -> ContractField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractField

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ContractField

Source§

fn eq(&self, other: &ContractField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ContractField

Source§

impl StructuralPartialEq for ContractField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html new file mode 100644 index 0000000000..7c9a6ecd43 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html @@ -0,0 +1,35 @@ +ContractFieldId in fe_analyzer::namespace::items - Rust

Struct ContractFieldId

Source
pub struct ContractFieldId(/* private fields */);

Implementations§

Source§

impl ContractFieldId

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ContractField>

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ContractFieldId

Source§

fn clone(&self) -> ContractFieldId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractFieldId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractFieldId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ContractFieldId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ContractFieldId

Source§

fn cmp(&self, other: &ContractFieldId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ContractFieldId

Source§

fn eq(&self, other: &ContractFieldId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ContractFieldId

Source§

fn partial_cmp(&self, other: &ContractFieldId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ContractFieldId

Source§

impl Eq for ContractFieldId

Source§

impl StructuralPartialEq for ContractFieldId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html new file mode 100644 index 0000000000..dd41bdb5c2 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html @@ -0,0 +1,61 @@ +ContractId in fe_analyzer::namespace::items - Rust

Struct ContractId

Source
pub struct ContractId(/* private fields */);

Implementations§

Source§

impl ContractId

Source

pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Contract>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn fields( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, ContractFieldId>>

Source

pub fn field_type( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<Result<TypeId, TypeError>>

Source

pub fn resolve_name( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Result<Option<NamedThing>, IncompleteItem>

Source

pub fn init_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId>

Source

pub fn call_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId>

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

User functions, public and not. Excludes __init__ and __call__.

+
Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Lookup a function by name. Searches all user functions, private or not. +Excludes __init__ and __call__.

+
Source

pub fn public_functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Excludes __init__ and __call__.

+
Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Dependency graph of the contract type, which consists of the field types +and the dependencies of those types.

+

NOTE: Contract items should only

+
Source

pub fn runtime_dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Dependency graph of the (imaginary) __call__ function, which +dispatches to the contract’s public functions.

+
Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ContractId

Source§

fn clone(&self) -> ContractId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ContractId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ContractId

Source§

fn cmp(&self, other: &ContractId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ContractId

Source§

fn eq(&self, other: &ContractId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ContractId

Source§

fn partial_cmp(&self, other: &ContractId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ContractId

Source§

impl Eq for ContractId

Source§

impl StructuralPartialEq for ContractId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html b/compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html new file mode 100644 index 0000000000..b3497021a7 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html @@ -0,0 +1,20 @@ +DepGraphWrapper in fe_analyzer::namespace::items - Rust

Struct DepGraphWrapper

Source
pub struct DepGraphWrapper(pub Rc<DepGraph>);

Tuple Fields§

§0: Rc<DepGraph>

Trait Implementations§

Source§

impl Clone for DepGraphWrapper

Source§

fn clone(&self) -> DepGraphWrapper

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DepGraphWrapper

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for DepGraphWrapper

Source§

fn eq(&self, other: &DepGraphWrapper) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for DepGraphWrapper

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Enum.html b/compiler-docs/fe_analyzer/namespace/items/struct.Enum.html new file mode 100644 index 0000000000..79a4e3b9ff --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Enum.html @@ -0,0 +1,25 @@ +Enum in fe_analyzer::namespace::items - Rust

Struct Enum

Source
pub struct Enum {
+    pub ast: Node<Enum>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<Enum>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Enum

Source§

fn clone(&self) -> Enum

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Enum

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Enum

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Enum

Source§

fn eq(&self, other: &Enum) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Enum

Source§

impl StructuralPartialEq for Enum

Auto Trait Implementations§

§

impl Freeze for Enum

§

impl RefUnwindSafe for Enum

§

impl Send for Enum

§

impl Sync for Enum

§

impl Unpin for Enum

§

impl UnwindSafe for Enum

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html b/compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html new file mode 100644 index 0000000000..ae77c7b576 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html @@ -0,0 +1,41 @@ +EnumId in fe_analyzer::namespace::items - Rust

Struct EnumId

Source
pub struct EnumId(/* private fields */);

Implementations§

Source§

impl EnumId

Source

pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Enum>

Source

pub fn span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn as_type(self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn is_public(self, db: &dyn AnalyzerDb) -> bool

Source

pub fn variant(self, db: &dyn AnalyzerDb, name: &str) -> Option<EnumVariantId>

Source

pub fn variants( + self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, EnumVariantId>>

Source

pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn parent(self, db: &dyn AnalyzerDb) -> Item

Source

pub fn dependency_graph(self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Source

pub fn sink_diagnostics( + self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for EnumId

Source§

fn clone(&self) -> EnumId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumId

Source§

fn default() -> EnumId

Returns the “default value” for a type. Read more
Source§

impl Hash for EnumId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for EnumId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for EnumId

Source§

fn cmp(&self, other: &EnumId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for EnumId

Source§

fn eq(&self, other: &EnumId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for EnumId

Source§

fn partial_cmp(&self, other: &EnumId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for EnumId

Source§

impl Eq for EnumId

Source§

impl StructuralPartialEq for EnumId

Auto Trait Implementations§

§

impl Freeze for EnumId

§

impl RefUnwindSafe for EnumId

§

impl Send for EnumId

§

impl Sync for EnumId

§

impl Unpin for EnumId

§

impl UnwindSafe for EnumId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html new file mode 100644 index 0000000000..081086ef57 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html @@ -0,0 +1,26 @@ +EnumVariant in fe_analyzer::namespace::items - Rust

Struct EnumVariant

Source
pub struct EnumVariant {
+    pub ast: Node<Variant>,
+    pub tag: usize,
+    pub parent: EnumId,
+}

Fields§

§ast: Node<Variant>§tag: usize§parent: EnumId

Trait Implementations§

Source§

impl Clone for EnumVariant

Source§

fn clone(&self) -> EnumVariant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumVariant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumVariant

Source§

fn eq(&self, other: &EnumVariant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumVariant

Source§

impl StructuralPartialEq for EnumVariant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html new file mode 100644 index 0000000000..7fd4822972 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html @@ -0,0 +1,35 @@ +EnumVariantId in fe_analyzer::namespace::items - Rust

Struct EnumVariantId

Source
pub struct EnumVariantId(/* private fields */);

Implementations§

Source§

impl EnumVariantId

Source

pub fn data(self, db: &dyn AnalyzerDb) -> Rc<EnumVariant>

Source

pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name_with_parent(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn kind(self, db: &dyn AnalyzerDb) -> Result<EnumVariantKind, TypeError>

Source

pub fn disc(self, db: &dyn AnalyzerDb) -> usize

Source

pub fn sink_diagnostics( + self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn parent(self, db: &dyn AnalyzerDb) -> EnumId

Trait Implementations§

Source§

impl Clone for EnumVariantId

Source§

fn clone(&self) -> EnumVariantId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariantId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumVariantId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for EnumVariantId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for EnumVariantId

Source§

fn cmp(&self, other: &EnumVariantId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for EnumVariantId

Source§

fn eq(&self, other: &EnumVariantId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for EnumVariantId

Source§

fn partial_cmp(&self, other: &EnumVariantId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for EnumVariantId

Source§

impl Eq for EnumVariantId

Source§

impl StructuralPartialEq for EnumVariantId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Function.html b/compiler-docs/fe_analyzer/namespace/items/struct.Function.html new file mode 100644 index 0000000000..79f20cfa93 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Function.html @@ -0,0 +1,30 @@ +Function in fe_analyzer::namespace::items - Rust

Struct Function

Source
pub struct Function {
+    pub ast: Node<Function>,
+    pub sig: FunctionSigId,
+}

Fields§

§ast: Node<Function>§sig: FunctionSigId

Implementations§

Source§

impl Function

Source

pub fn new( + db: &dyn AnalyzerDb, + ast: &Node<Function>, + parent: Option<Item>, + module: ModuleId, +) -> Self

Trait Implementations§

Source§

impl Clone for Function

Source§

fn clone(&self) -> Function

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Function

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Function

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Function

Source§

fn eq(&self, other: &Function) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Function

Source§

impl StructuralPartialEq for Function

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html new file mode 100644 index 0000000000..6dc9132790 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html @@ -0,0 +1,35 @@ +FunctionId in fe_analyzer::namespace::items - Rust

Struct FunctionId

Source
pub struct FunctionId(/* private fields */);

Implementations§

Source§

impl FunctionId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Function>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<TypeId>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSignature>

Source

pub fn sig(&self, db: &dyn AnalyzerDb) -> FunctionSigId

Source

pub fn body(&self, db: &dyn AnalyzerDb) -> Rc<FunctionBody>

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_test(&self, db: &dyn AnalyzerDb) -> bool

Trait Implementations§

Source§

impl Clone for FunctionId

Source§

fn clone(&self) -> FunctionId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for FunctionId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for FunctionId

Source§

fn cmp(&self, other: &FunctionId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FunctionId

Source§

fn eq(&self, other: &FunctionId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FunctionId

Source§

fn partial_cmp(&self, other: &FunctionId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FunctionId

Source§

impl Eq for FunctionId

Source§

impl StructuralPartialEq for FunctionId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html new file mode 100644 index 0000000000..c64555df44 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html @@ -0,0 +1,26 @@ +FunctionSig in fe_analyzer::namespace::items - Rust

Struct FunctionSig

Source
pub struct FunctionSig {
+    pub ast: Node<FunctionSignature>,
+    pub parent: Option<Item>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<FunctionSignature>§parent: Option<Item>§module: ModuleId

Trait Implementations§

Source§

impl Clone for FunctionSig

Source§

fn clone(&self) -> FunctionSig

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionSig

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSig

Source§

fn eq(&self, other: &FunctionSig) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionSig

Source§

impl StructuralPartialEq for FunctionSig

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html new file mode 100644 index 0000000000..f62e24b02d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html @@ -0,0 +1,40 @@ +FunctionSigId in fe_analyzer::namespace::items - Rust

Struct FunctionSigId

Source
pub struct FunctionSigId(/* private fields */);

Implementations§

Source§

impl FunctionSigId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSig>

Source

pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<TypeId>

Source

pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSignature>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn pub_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn self_item(&self, db: &dyn AnalyzerDb) -> Option<Item>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId>

Looks up the FunctionId based on the parent of the function signature

+
Source

pub fn is_trait_fn(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_module_fn(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_impl_fn(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn generic_params(&self, db: &dyn AnalyzerDb) -> Vec<GenericParameter>

Source

pub fn generic_param( + &self, + db: &dyn AnalyzerDb, + param_name: &str, +) -> Option<GenericParameter>

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for FunctionSigId

Source§

fn clone(&self) -> FunctionSigId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSigId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionSigId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for FunctionSigId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for FunctionSigId

Source§

fn cmp(&self, other: &FunctionSigId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FunctionSigId

Source§

fn eq(&self, other: &FunctionSigId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FunctionSigId

Source§

fn partial_cmp(&self, other: &FunctionSigId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FunctionSigId

Source§

impl Eq for FunctionSigId

Source§

impl StructuralPartialEq for FunctionSigId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Impl.html b/compiler-docs/fe_analyzer/namespace/items/struct.Impl.html new file mode 100644 index 0000000000..ee3a86ef9a --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Impl.html @@ -0,0 +1,27 @@ +Impl in fe_analyzer::namespace::items - Rust

Struct Impl

Source
pub struct Impl {
+    pub trait_id: TraitId,
+    pub receiver: TypeId,
+    pub module: ModuleId,
+    pub ast: Node<Impl>,
+}

Fields§

§trait_id: TraitId§receiver: TypeId§module: ModuleId§ast: Node<Impl>

Trait Implementations§

Source§

impl Clone for Impl

Source§

fn clone(&self) -> Impl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Impl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Impl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Impl

Source§

fn eq(&self, other: &Impl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Impl

Source§

impl StructuralPartialEq for Impl

Auto Trait Implementations§

§

impl Freeze for Impl

§

impl RefUnwindSafe for Impl

§

impl Send for Impl

§

impl Sync for Impl

§

impl Unpin for Impl

§

impl UnwindSafe for Impl

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html new file mode 100644 index 0000000000..48a89f95b5 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html @@ -0,0 +1,46 @@ +ImplId in fe_analyzer::namespace::items - Rust

Struct ImplId

Source
pub struct ImplId(/* private fields */);

Implementations§

Source§

impl ImplId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Impl>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn trait_id(&self, db: &dyn AnalyzerDb) -> TraitId

Source

pub fn receiver(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn is_receiver_type(&self, other: TypeId, db: &dyn AnalyzerDb) -> bool

Returns true if other either is Self or the type of the receiver

+
Source

pub fn can_stand_in_for( + &self, + db: &dyn AnalyzerDb, + type_in_impl: TypeId, + type_in_trait: TypeId, +) -> bool

Returns true if the type_in_impl can stand in for the type_in_trait as a type used +for a parameter or as a return type

+
Source

pub fn ast(&self, db: &dyn AnalyzerDb) -> Node<Impl>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ImplId

Source§

fn clone(&self) -> ImplId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ImplId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplId

Source§

fn default() -> ImplId

Returns the “default value” for a type. Read more
Source§

impl Hash for ImplId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ImplId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ImplId

Source§

fn cmp(&self, other: &ImplId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ImplId

Source§

fn eq(&self, other: &ImplId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ImplId

Source§

fn partial_cmp(&self, other: &ImplId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ImplId

Source§

impl Eq for ImplId

Source§

impl StructuralPartialEq for ImplId

Auto Trait Implementations§

§

impl Freeze for ImplId

§

impl RefUnwindSafe for ImplId

§

impl Send for ImplId

§

impl Sync for ImplId

§

impl Unpin for ImplId

§

impl UnwindSafe for ImplId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html b/compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html new file mode 100644 index 0000000000..058e5650ed --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html @@ -0,0 +1,29 @@ +Ingot in fe_analyzer::namespace::items - Rust

Struct Ingot

Source
pub struct Ingot {
+    pub name: SmolStr,
+    pub mode: IngotMode,
+    pub src_dir: SmolStr,
+}
Expand description

An Ingot is composed of a tree of Modules (set via +[AnalyzerDb::set_ingot_module_tree]), and doesn’t have direct knowledge of +files.

+

Fields§

§name: SmolStr§mode: IngotMode§src_dir: SmolStr

Trait Implementations§

Source§

impl Clone for Ingot

Source§

fn clone(&self) -> Ingot

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Ingot

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Ingot

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Ingot

Source§

fn eq(&self, other: &Ingot) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Ingot

Source§

impl StructuralPartialEq for Ingot

Auto Trait Implementations§

§

impl Freeze for Ingot

§

impl RefUnwindSafe for Ingot

§

impl Send for Ingot

§

impl Sync for Ingot

§

impl Unpin for Ingot

§

impl UnwindSafe for Ingot

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html b/compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html new file mode 100644 index 0000000000..4a789eba51 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html @@ -0,0 +1,53 @@ +IngotId in fe_analyzer::namespace::items - Rust

Struct IngotId

Source
pub struct IngotId(/* private fields */);

Implementations§

Source§

impl IngotId

Source

pub fn std_lib(db: &mut dyn AnalyzerDb) -> Self

Source

pub fn from_build_files( + db: &mut dyn AnalyzerDb, + build_files: &BuildFiles, +) -> Self

Source

pub fn from_files( + db: &mut dyn AnalyzerDb, + name: &str, + mode: IngotMode, + file_kind: FileKind, + files: &[(impl AsRef<str>, impl AsRef<str>)], +) -> Self

Source

pub fn external_ingots( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, IngotId>>

Source

pub fn all_modules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]>

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Ingot>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn root_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId>

Returns the main.fe, or lib.fe module, depending on the ingot “mode” +(IngotMode).

+
Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Source

pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn sink_external_ingot_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for IngotId

Source§

fn clone(&self) -> IngotId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for IngotId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for IngotId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for IngotId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for IngotId

Source§

fn cmp(&self, other: &IngotId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for IngotId

Source§

fn eq(&self, other: &IngotId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for IngotId

Source§

fn partial_cmp(&self, other: &IngotId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for IngotId

Source§

impl Eq for IngotId

Source§

impl StructuralPartialEq for IngotId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Module.html b/compiler-docs/fe_analyzer/namespace/items/struct.Module.html new file mode 100644 index 0000000000..72a0d33237 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Module.html @@ -0,0 +1,26 @@ +Module in fe_analyzer::namespace::items - Rust

Struct Module

Source
pub struct Module {
+    pub name: SmolStr,
+    pub ingot: IngotId,
+    pub source: ModuleSource,
+}

Fields§

§name: SmolStr§ingot: IngotId§source: ModuleSource

Trait Implementations§

Source§

impl Clone for Module

Source§

fn clone(&self) -> Module

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Module

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Module

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Module

Source§

fn eq(&self, other: &Module) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Module

Source§

impl StructuralPartialEq for Module

Auto Trait Implementations§

§

impl Freeze for Module

§

impl RefUnwindSafe for Module

§

impl Send for Module

§

impl Sync for Module

§

impl Unpin for Module

§

impl UnwindSafe for Module

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html new file mode 100644 index 0000000000..8621ae699e --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html @@ -0,0 +1,25 @@ +ModuleConstant in fe_analyzer::namespace::items - Rust

Struct ModuleConstant

Source
pub struct ModuleConstant {
+    pub ast: Node<ConstantDecl>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<ConstantDecl>§module: ModuleId

Trait Implementations§

Source§

impl Clone for ModuleConstant

Source§

fn clone(&self) -> ModuleConstant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleConstant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleConstant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ModuleConstant

Source§

fn eq(&self, other: &ModuleConstant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ModuleConstant

Source§

impl StructuralPartialEq for ModuleConstant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html new file mode 100644 index 0000000000..4599d025b6 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html @@ -0,0 +1,38 @@ +ModuleConstantId in fe_analyzer::namespace::items - Rust

Struct ModuleConstantId

Source
pub struct ModuleConstantId(/* private fields */);

Implementations§

Source§

impl ModuleConstantId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ModuleConstant>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn constant_value( + &self, + db: &dyn AnalyzerDb, +) -> Result<Constant, ConstEvalError>

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn value(&self, db: &dyn AnalyzerDb) -> Expr

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn node_id(&self, db: &dyn AnalyzerDb) -> NodeId

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ModuleConstantId

Source§

fn clone(&self) -> ModuleConstantId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleConstantId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleConstantId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ModuleConstantId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ModuleConstantId

Source§

fn cmp(&self, other: &ModuleConstantId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ModuleConstantId

Source§

fn eq(&self, other: &ModuleConstantId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ModuleConstantId

Source§

fn partial_cmp(&self, other: &ModuleConstantId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ModuleConstantId

Source§

impl Eq for ModuleConstantId

Source§

impl StructuralPartialEq for ModuleConstantId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html new file mode 100644 index 0000000000..8c57f250c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html @@ -0,0 +1,96 @@ +ModuleId in fe_analyzer::namespace::items - Rust

Struct ModuleId

Source
pub struct ModuleId(/* private fields */);
Expand description

Id of a Module, which corresponds to a single Fe source file.

+

Implementations§

Source§

impl ModuleId

Source

pub fn new_standalone( + db: &mut dyn AnalyzerDb, + path: &str, + content: &str, +) -> Self

Source

pub fn new( + db: &dyn AnalyzerDb, + name: &str, + source: ModuleSource, + ingot: IngotId, +) -> Self

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Module>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn file_path_relative_to_src_dir(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn ast(&self, db: &dyn AnalyzerDb) -> Rc<Module>

Source

pub fn ingot(&self, db: &dyn AnalyzerDb) -> IngotId

Source

pub fn is_incomplete(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn all_items(&self, db: &dyn AnalyzerDb) -> Rc<[Item]>

Includes duplicate names

+
Source

pub fn all_impls(&self, db: &dyn AnalyzerDb) -> Rc<[ImplId]>

Includes duplicate names

+
Source

pub fn impls( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<(TraitId, TypeId), ImplId>>

Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Returns a map of the named items in the module

+
Source

pub fn used_items( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, (Span, Item)>>

Returns a name -> (name_span, external_item) map for all use +statements in a module.

+
Source

pub fn tests(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId>

Source

pub fn is_in_scope(&self, db: &dyn AnalyzerDb, item: Item) -> bool

Returns true if the item is in scope of the module.

+
Source

pub fn non_used_internal_items( + &self, + db: &dyn AnalyzerDb, +) -> IndexMap<SmolStr, Item>

Returns all of the internal items, except for used items. This is used +when resolving use statements, as it does not create a query +cycle.

+
Source

pub fn internal_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item>

Returns all of the internal items. Internal items refers to the set of +items visible when inside of a module.

+
Source

pub fn resolve_path( + &self, + db: &dyn AnalyzerDb, + path: &Path, +) -> Analysis<Option<NamedThing>>

Resolve a path that starts with an item defined in the module.

+
Source

pub fn resolve_path_non_used_internal( + &self, + db: &dyn AnalyzerDb, + path: &Path, +) -> Analysis<Option<NamedThing>>

Resolve a path that starts with an internal item. We omit used items to +avoid a query cycle.

+
Source

pub fn resolve_path_internal( + &self, + db: &dyn AnalyzerDb, + path: &Path, +) -> Analysis<Option<NamedThing>>

Resolve a path that starts with an internal item.

+
Source

pub fn resolve_name( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Result<Option<NamedThing>, IncompleteItem>

Returns Err(IncompleteItem) if the name could not be resolved, and the +module was not completely parsed (due to a syntax error).

+
Source

pub fn resolve_constant( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Result<Option<ModuleConstantId>, IncompleteItem>

Source

pub fn submodules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn parent_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId>

Source

pub fn all_contracts(&self, db: &dyn AnalyzerDb) -> Vec<ContractId>

All contracts, including from submodules and including duplicates

+
Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId>

All functions, including from submodules and including duplicates

+
Source

pub fn global_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item>

Returns the map of ingot deps, built-ins, and the ingot itself as +“ingot”.

+
Source

pub fn all_constants(&self, db: &dyn AnalyzerDb) -> Rc<Vec<ModuleConstantId>>

All module constants.

+
Source

pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ModuleId

Source§

fn clone(&self) -> ModuleId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ModuleId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ModuleId

Source§

fn cmp(&self, other: &ModuleId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ModuleId

Source§

fn eq(&self, other: &ModuleId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ModuleId

Source§

fn partial_cmp(&self, other: &ModuleId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ModuleId

Source§

impl Eq for ModuleId

Source§

impl StructuralPartialEq for ModuleId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Struct.html b/compiler-docs/fe_analyzer/namespace/items/struct.Struct.html new file mode 100644 index 0000000000..00de9326eb --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Struct.html @@ -0,0 +1,25 @@ +Struct in fe_analyzer::namespace::items - Rust

Struct Struct

Source
pub struct Struct {
+    pub ast: Node<Struct>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<Struct>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Struct

Source§

fn clone(&self) -> Struct

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Struct

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Struct

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Struct

Source§

fn eq(&self, other: &Struct) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Struct

Source§

impl StructuralPartialEq for Struct

Auto Trait Implementations§

§

impl Freeze for Struct

§

impl RefUnwindSafe for Struct

§

impl Send for Struct

§

impl Sync for Struct

§

impl Unpin for Struct

§

impl UnwindSafe for Struct

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.StructField.html b/compiler-docs/fe_analyzer/namespace/items/struct.StructField.html new file mode 100644 index 0000000000..f279d43f4c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.StructField.html @@ -0,0 +1,25 @@ +StructField in fe_analyzer::namespace::items - Rust

Struct StructField

Source
pub struct StructField {
+    pub ast: Node<Field>,
+    pub parent: StructId,
+}

Fields§

§ast: Node<Field>§parent: StructId

Trait Implementations§

Source§

impl Clone for StructField

Source§

fn clone(&self) -> StructField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for StructField

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for StructField

Source§

fn eq(&self, other: &StructField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for StructField

Source§

impl StructuralPartialEq for StructField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html b/compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html new file mode 100644 index 0000000000..0fa6345312 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html @@ -0,0 +1,35 @@ +StructFieldId in fe_analyzer::namespace::items - Rust

Struct StructFieldId

Source
pub struct StructFieldId(/* private fields */);

Implementations§

Source§

impl StructFieldId

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<StructField>

Source

pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<SmolStr>

Source

pub fn is_indexed(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for StructFieldId

Source§

fn clone(&self) -> StructFieldId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructFieldId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for StructFieldId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for StructFieldId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for StructFieldId

Source§

fn cmp(&self, other: &StructFieldId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for StructFieldId

Source§

fn eq(&self, other: &StructFieldId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for StructFieldId

Source§

fn partial_cmp(&self, other: &StructFieldId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for StructFieldId

Source§

impl Eq for StructFieldId

Source§

impl StructuralPartialEq for StructFieldId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.StructId.html b/compiler-docs/fe_analyzer/namespace/items/struct.StructId.html new file mode 100644 index 0000000000..ba8552b687 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.StructId.html @@ -0,0 +1,41 @@ +StructId in fe_analyzer::namespace::items - Rust

Struct StructId

Source
pub struct StructId(/* private fields */);

Implementations§

Source§

impl StructId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Struct>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn has_private_field(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn field(&self, db: &dyn AnalyzerDb, name: &str) -> Option<StructFieldId>

Source

pub fn fields( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, StructFieldId>>

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for StructId

Source§

fn clone(&self) -> StructId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructId

Source§

fn default() -> StructId

Returns the “default value” for a type. Read more
Source§

impl Hash for StructId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for StructId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for StructId

Source§

fn cmp(&self, other: &StructId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for StructId

Source§

fn eq(&self, other: &StructId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for StructId

Source§

fn partial_cmp(&self, other: &StructId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for StructId

Source§

impl Eq for StructId

Source§

impl StructuralPartialEq for StructId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Trait.html b/compiler-docs/fe_analyzer/namespace/items/struct.Trait.html new file mode 100644 index 0000000000..3f36ddf307 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Trait.html @@ -0,0 +1,25 @@ +Trait in fe_analyzer::namespace::items - Rust

Struct Trait

Source
pub struct Trait {
+    pub ast: Node<Trait>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<Trait>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Trait

Source§

fn clone(&self) -> Trait

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Trait

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Trait

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Trait

Source§

fn eq(&self, other: &Trait) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Trait

Source§

impl StructuralPartialEq for Trait

Auto Trait Implementations§

§

impl Freeze for Trait

§

impl RefUnwindSafe for Trait

§

impl Send for Trait

§

impl Sync for Trait

§

impl Unpin for Trait

§

impl UnwindSafe for Trait

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html b/compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html new file mode 100644 index 0000000000..cb4d3d3b10 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html @@ -0,0 +1,38 @@ +TraitId in fe_analyzer::namespace::items - Rust

Struct TraitId

Source
pub struct TraitId(/* private fields */);

Implementations§

Source§

impl TraitId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Trait>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn as_trait_or_type(&self) -> TraitOrType

Source

pub fn is_implemented_for(&self, db: &dyn AnalyzerDb, ty: TypeId) -> bool

Source

pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_std_trait(&self, db: &dyn AnalyzerDb, name: &str) -> bool

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionSigId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionSigId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for TraitId

Source§

fn clone(&self) -> TraitId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TraitId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitId

Source§

fn default() -> TraitId

Returns the “default value” for a type. Read more
Source§

impl Hash for TraitId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TraitId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for TraitId

Source§

fn cmp(&self, other: &TraitId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TraitId

Source§

fn eq(&self, other: &TraitId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TraitId

Source§

fn partial_cmp(&self, other: &TraitId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for TraitId

Source§

impl Eq for TraitId

Source§

impl StructuralPartialEq for TraitId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html new file mode 100644 index 0000000000..4c4dd7b7cd --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html @@ -0,0 +1,25 @@ +TypeAlias in fe_analyzer::namespace::items - Rust

Struct TypeAlias

Source
pub struct TypeAlias {
+    pub ast: Node<TypeAlias>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<TypeAlias>§module: ModuleId

Trait Implementations§

Source§

impl Clone for TypeAlias

Source§

fn clone(&self) -> TypeAlias

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeAlias

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeAlias

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeAlias

Source§

fn eq(&self, other: &TypeAlias) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeAlias

Source§

impl StructuralPartialEq for TypeAlias

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html new file mode 100644 index 0000000000..5b8eb39f5f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html @@ -0,0 +1,35 @@ +TypeAliasId in fe_analyzer::namespace::items - Rust

Struct TypeAliasId

Source
pub struct TypeAliasId(/* private fields */);

Implementations§

Source§

impl TypeAliasId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<TypeAlias>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for TypeAliasId

Source§

fn clone(&self) -> TypeAliasId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeAliasId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeAliasId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TypeAliasId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for TypeAliasId

Source§

fn cmp(&self, other: &TypeAliasId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TypeAliasId

Source§

fn eq(&self, other: &TypeAliasId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TypeAliasId

Source§

fn partial_cmp(&self, other: &TypeAliasId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for TypeAliasId

Source§

impl Eq for TypeAliasId

Source§

impl StructuralPartialEq for TypeAliasId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html b/compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html new file mode 100644 index 0000000000..5bfa72e0b7 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html @@ -0,0 +1,7 @@ +DiagnosticSink in fe_analyzer::namespace::items - Rust

Trait DiagnosticSink

Source
pub trait DiagnosticSink {
+    // Required method
+    fn push(&mut self, diag: &Diagnostic);
+
+    // Provided method
+    fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>) { ... }
+}

Required Methods§

Source

fn push(&mut self, diag: &Diagnostic)

Provided Methods§

Source

fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>)

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl DiagnosticSink for Vec<Diagnostic>

Source§

fn push(&mut self, diag: &Diagnostic)

Source§

fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>)

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html b/compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html new file mode 100644 index 0000000000..369457b2ca --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html @@ -0,0 +1 @@ +DepGraph in fe_analyzer::namespace::items - Rust

Type Alias DepGraph

Source
pub type DepGraph = DiGraphMap<Item, DepLocality>;

Aliased Type§

pub struct DepGraph { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html b/compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html new file mode 100644 index 0000000000..e4c1799955 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html @@ -0,0 +1,27 @@ +BlockScopeType in fe_analyzer::namespace::scopes - Rust

Enum BlockScopeType

Source
pub enum BlockScopeType {
+    Function,
+    IfElse,
+    Match,
+    MatchArm,
+    Loop,
+    Unsafe,
+}

Variants§

§

Function

§

IfElse

§

Match

§

MatchArm

§

Loop

§

Unsafe

Trait Implementations§

Source§

impl Clone for BlockScopeType

Source§

fn clone(&self) -> BlockScopeType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BlockScopeType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BlockScopeType

Source§

fn eq(&self, other: &BlockScopeType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BlockScopeType

Source§

impl StructuralPartialEq for BlockScopeType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html b/compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html new file mode 100644 index 0000000000..15a54890eb --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html @@ -0,0 +1,7 @@ +check_visibility in fe_analyzer::namespace::scopes - Rust

Function check_visibility

Source
pub fn check_visibility(
+    context: &dyn AnalyzerContext,
+    named_thing: &NamedThing,
+    span: Span,
+)
Expand description

Check an item visibility and sink diagnostics if an item is invisible from +the scope.

+
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/index.html b/compiler-docs/fe_analyzer/namespace/scopes/index.html new file mode 100644 index 0000000000..0da622256d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/index.html @@ -0,0 +1,2 @@ +fe_analyzer::namespace::scopes - Rust

Module scopes

Source

Structs§

BlockScope
FunctionScope
ItemScope

Enums§

BlockScopeType

Functions§

check_visibility
Check an item visibility and sink diagnostics if an item is invisible from +the scope.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js new file mode 100644 index 0000000000..836a614aa1 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BlockScopeType"],"fn":["check_visibility"],"struct":["BlockScope","FunctionScope","ItemScope"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html b/compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html new file mode 100644 index 0000000000..b31e65768f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html @@ -0,0 +1,70 @@ +BlockScope in fe_analyzer::namespace::scopes - Rust

Struct BlockScope

Source
pub struct BlockScope<'a, 'b> {
+    pub root: &'a FunctionScope<'b>,
+    pub parent: Option<&'a BlockScope<'a, 'b>>,
+    pub variable_defs: BTreeMap<String, (TypeId, bool, Span)>,
+    pub constant_defs: RefCell<BTreeMap<String, Constant>>,
+    pub typ: BlockScopeType,
+}

Fields§

§root: &'a FunctionScope<'b>§parent: Option<&'a BlockScope<'a, 'b>>§variable_defs: BTreeMap<String, (TypeId, bool, Span)>

Maps Name -> (Type, is_const, span)

+
§constant_defs: RefCell<BTreeMap<String, Constant>>§typ: BlockScopeType

Implementations§

Source§

impl<'a, 'b> BlockScope<'a, 'b>

Source

pub fn new(root: &'a FunctionScope<'b>, typ: BlockScopeType) -> Self

Source

pub fn new_child(&'a self, typ: BlockScopeType) -> Self

Source

pub fn add_var( + &mut self, + name: &str, + typ: TypeId, + is_const: bool, + span: Span, +) -> Result<(), AlreadyDefined>

Add a variable to the block scope.

+

Trait Implementations§

Source§

impl AnalyzerContext for BlockScope<'_, '_>

Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant(&self, name: &Node<SmolStr>, expr: &Node<Expr>, value: Constant)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + name: &SmolStr, + span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, node: &Node<Expr>, call_type: CallType)

Panics Read more
Source§

fn get_call(&self, node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.
Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Auto Trait Implementations§

§

impl<'a, 'b> !Freeze for BlockScope<'a, 'b>

§

impl<'a, 'b> !RefUnwindSafe for BlockScope<'a, 'b>

§

impl<'a, 'b> !Send for BlockScope<'a, 'b>

§

impl<'a, 'b> !Sync for BlockScope<'a, 'b>

§

impl<'a, 'b> Unpin for BlockScope<'a, 'b>

§

impl<'a, 'b> !UnwindSafe for BlockScope<'a, 'b>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html b/compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html new file mode 100644 index 0000000000..2e30c071c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html @@ -0,0 +1,66 @@ +FunctionScope in fe_analyzer::namespace::scopes - Rust

Struct FunctionScope

Source
pub struct FunctionScope<'a> {
+    pub db: &'a dyn AnalyzerDb,
+    pub function: FunctionId,
+    pub body: RefCell<FunctionBody>,
+    pub diagnostics: RefCell<Vec<Diagnostic>>,
+}

Fields§

§db: &'a dyn AnalyzerDb§function: FunctionId§body: RefCell<FunctionBody>§diagnostics: RefCell<Vec<Diagnostic>>

Implementations§

Source§

impl<'a> FunctionScope<'a>

Source

pub fn new(db: &'a dyn AnalyzerDb, function: FunctionId) -> Self

Source

pub fn function_return_type(&self) -> Result<TypeId, TypeError>

Source

pub fn map_variable_type<T>(&self, node: &Node<T>, typ: TypeId)

Source

pub fn map_pattern_matrix(&self, node: &Node<FuncStmt>, matrix: PatternMatrix)

Trait Implementations§

Source§

impl<'a> AnalyzerContext for FunctionScope<'a>

Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant( + &self, + _name: &Node<SmolStr>, + expr: &Node<Expr>, + value: Constant, +)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + _name: &SmolStr, + _span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, node: &Node<Expr>, call_type: CallType)

Panics Read more
Source§

fn get_call(&self, node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, _typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.
Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Auto Trait Implementations§

§

impl<'a> !Freeze for FunctionScope<'a>

§

impl<'a> !RefUnwindSafe for FunctionScope<'a>

§

impl<'a> !Send for FunctionScope<'a>

§

impl<'a> !Sync for FunctionScope<'a>

§

impl<'a> Unpin for FunctionScope<'a>

§

impl<'a> !UnwindSafe for FunctionScope<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html b/compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html new file mode 100644 index 0000000000..f84042777a --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html @@ -0,0 +1,65 @@ +ItemScope in fe_analyzer::namespace::scopes - Rust

Struct ItemScope

Source
pub struct ItemScope<'a> {
+    pub diagnostics: RefCell<Vec<Diagnostic>>,
+    /* private fields */
+}

Fields§

§diagnostics: RefCell<Vec<Diagnostic>>

Implementations§

Source§

impl<'a> ItemScope<'a>

Source

pub fn new(db: &'a dyn AnalyzerDb, module: ModuleId) -> Self

Trait Implementations§

Source§

impl<'a> AnalyzerContext for ItemScope<'a>

Source§

fn get_context_type(&self) -> Option<TypeId>

Gets std::context::Context if it exists

+
Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant( + &self, + _name: &Node<SmolStr>, + _expr: &Node<Expr>, + _value: Constant, +)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + name: &SmolStr, + _span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, _node: &Node<Expr>, _call_type: CallType)

Panics Read more
Source§

fn get_call(&self, _node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, _typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Auto Trait Implementations§

§

impl<'a> !Freeze for ItemScope<'a>

§

impl<'a> !RefUnwindSafe for ItemScope<'a>

§

impl<'a> !Send for ItemScope<'a>

§

impl<'a> !Sync for ItemScope<'a>

§

impl<'a> Unpin for ItemScope<'a>

§

impl<'a> !UnwindSafe for ItemScope<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/sidebar-items.js new file mode 100644 index 0000000000..46a2407c74 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["items","scopes","types"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/constant.U256.html b/compiler-docs/fe_analyzer/namespace/types/constant.U256.html new file mode 100644 index 0000000000..1e86bcce3f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/constant.U256.html @@ -0,0 +1 @@ +U256 in fe_analyzer::namespace::types - Rust

Constant U256

Source
pub const U256: Base;
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.Base.html b/compiler-docs/fe_analyzer/namespace/types/enum.Base.html new file mode 100644 index 0000000000..b31c825294 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.Base.html @@ -0,0 +1,37 @@ +Base in fe_analyzer::namespace::types - Rust

Enum Base

Source
pub enum Base {
+    Numeric(Integer),
+    Bool,
+    Address,
+    Unit,
+}

Variants§

§

Numeric(Integer)

§

Bool

§

Address

§

Unit

Implementations§

Source§

impl Base

Source

pub fn name(&self) -> SmolStr

Source

pub fn u256() -> Base

Trait Implementations§

Source§

impl Clone for Base

Source§

fn clone(&self) -> Base

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Base

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Base

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Base> for Type

Source§

fn from(value: Base) -> Self

Converts to this type from the input type.
Source§

impl FromStr for Base

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for Base

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Base

Source§

fn cmp(&self, other: &Base) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Base

Source§

fn eq(&self, other: &Base) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Base

Source§

fn partial_cmp(&self, other: &Base) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for Base

Source§

impl Eq for Base

Source§

impl StructuralPartialEq for Base

Auto Trait Implementations§

§

impl Freeze for Base

§

impl RefUnwindSafe for Base

§

impl Send for Base

§

impl Sync for Base

§

impl Unpin for Base

§

impl UnwindSafe for Base

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html b/compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html new file mode 100644 index 0000000000..9abc7cb984 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html @@ -0,0 +1,25 @@ +GenericArg in fe_analyzer::namespace::types - Rust

Enum GenericArg

Source
pub enum GenericArg {
+    Int(usize),
+    Type(TypeId),
+}

Variants§

§

Int(usize)

§

Type(TypeId)

Trait Implementations§

Source§

impl Clone for GenericArg

Source§

fn clone(&self) -> GenericArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericArg

Source§

fn eq(&self, other: &GenericArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for GenericArg

Source§

impl StructuralPartialEq for GenericArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html b/compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html new file mode 100644 index 0000000000..30abd145a4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html @@ -0,0 +1,26 @@ +GenericParamKind in fe_analyzer::namespace::types - Rust

Enum GenericParamKind

Source
pub enum GenericParamKind {
+    Int,
+    PrimitiveType,
+    AnyType,
+}

Variants§

§

Int

§

PrimitiveType

§

AnyType

Trait Implementations§

Source§

impl Clone for GenericParamKind

Source§

fn clone(&self) -> GenericParamKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericParamKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericParamKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericParamKind

Source§

fn eq(&self, other: &GenericParamKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for GenericParamKind

Source§

impl Eq for GenericParamKind

Source§

impl StructuralPartialEq for GenericParamKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html b/compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html new file mode 100644 index 0000000000..c6669994e6 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html @@ -0,0 +1,35 @@ +GenericType in fe_analyzer::namespace::types - Rust

Enum GenericType

Source
pub enum GenericType {
+    Array,
+    String,
+    Map,
+}

Variants§

§

Array

§

String

§

Map

Implementations§

Source§

impl GenericType

Source

pub fn name(&self) -> SmolStr

Source

pub fn params(&self) -> Vec<GenericParam>

Source

pub fn apply(&self, db: &dyn AnalyzerDb, args: &[GenericArg]) -> Option<TypeId>

Trait Implementations§

Source§

impl AsRef<str> for GenericType

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for GenericType

Source§

fn clone(&self) -> GenericType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for GenericType

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<GenericType, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for GenericType

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for GenericType

Source§

impl Ord for GenericType

Source§

fn cmp(&self, other: &GenericType) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for GenericType

Source§

fn eq(&self, other: &GenericType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for GenericType

Source§

fn partial_cmp(&self, other: &GenericType) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for GenericType

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<GenericType, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for GenericType

Source§

impl Eq for GenericType

Source§

impl StructuralPartialEq for GenericType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.Integer.html b/compiler-docs/fe_analyzer/namespace/types/enum.Integer.html new file mode 100644 index 0000000000..22ea8ae69c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.Integer.html @@ -0,0 +1,52 @@ +Integer in fe_analyzer::namespace::types - Rust

Enum Integer

Source
pub enum Integer {
+    U256,
+    U128,
+    U64,
+    U32,
+    U16,
+    U8,
+    I256,
+    I128,
+    I64,
+    I32,
+    I16,
+    I8,
+}

Variants§

§

U256

§

U128

§

U64

§

U32

§

U16

§

U8

§

I256

§

I128

§

I64

§

I32

§

I16

§

I8

Implementations§

Source§

impl Integer

Source

pub fn is_signed(&self) -> bool

Returns true if the integer is signed, otherwise false

+
Source

pub fn size(&self) -> usize

Source

pub fn bits(&self) -> usize

Returns size of integer type in bits.

+
Source

pub fn can_hold(&self, other: Integer) -> bool

Returns true if the integer is at least the same size (or larger) than +other

+
Source

pub fn fits(&self, num: BigInt) -> bool

Returns true if num represents a number that fits the type

+
Source

pub fn max_value(&self) -> BigInt

Returns max value of the integer type.

+
Source

pub fn min_value(&self) -> BigInt

Returns min value of the integer type.

+

Trait Implementations§

Source§

impl AsRef<str> for Integer

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for Integer

Source§

fn clone(&self) -> Integer

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Integer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Integer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for Integer

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Integer, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for Integer

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for Integer

Source§

impl Ord for Integer

Source§

fn cmp(&self, other: &Integer) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Integer

Source§

fn eq(&self, other: &Integer) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Integer

Source§

fn partial_cmp(&self, other: &Integer) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for Integer

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<Integer, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for Integer

Source§

impl Eq for Integer

Source§

impl StructuralPartialEq for Integer

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html b/compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html new file mode 100644 index 0000000000..36d1fb162e --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html @@ -0,0 +1,25 @@ +TraitOrType in fe_analyzer::namespace::types - Rust

Enum TraitOrType

Source
pub enum TraitOrType {
+    TraitId(TraitId),
+    TypeId(TypeId),
+}

Variants§

§

TraitId(TraitId)

§

TypeId(TypeId)

Trait Implementations§

Source§

impl Clone for TraitOrType

Source§

fn clone(&self) -> TraitOrType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TraitOrType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TraitOrType

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TraitOrType

Source§

fn eq(&self, other: &TraitOrType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TraitOrType

Source§

impl StructuralPartialEq for TraitOrType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.Type.html b/compiler-docs/fe_analyzer/namespace/types/enum.Type.html new file mode 100644 index 0000000000..b7db921754 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.Type.html @@ -0,0 +1,48 @@ +Type in fe_analyzer::namespace::types - Rust

Enum Type

Source
pub enum Type {
+
Show 13 variants Base(Base), + Array(Array), + Map(Map), + Tuple(Tuple), + String(FeString), + Contract(ContractId), + SelfContract(ContractId), + SelfType(TraitOrType), + Struct(StructId), + Enum(EnumId), + Generic(Generic), + SPtr(TypeId), + Mut(TypeId), +
}

Variants§

§

Base(Base)

§

Array(Array)

§

Map(Map)

§

Tuple(Tuple)

§

String(FeString)

§

Contract(ContractId)

An “external” contract. Effectively just a newtyped address.

+
§

SelfContract(ContractId)

The type of a contract while it’s being executed. Ie. the type +of self within a contract function.

+
§

SelfType(TraitOrType)

§

Struct(StructId)

§

Enum(EnumId)

§

Generic(Generic)

§

SPtr(TypeId)

§

Mut(TypeId)

Implementations§

Source§

impl Type

Source

pub fn id(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn def_span(&self, context: &dyn AnalyzerContext) -> Option<Span>

Source

pub fn bool() -> Self

Creates an instance of bool.

+
Source

pub fn address() -> Self

Creates an instance of address.

+
Source

pub fn u256() -> Self

Creates an instance of u256.

+
Source

pub fn u8() -> Self

Creates an instance of u8.

+
Source

pub fn unit() -> Self

Creates an instance of ().

+
Source

pub fn is_unit(&self) -> bool

Source

pub fn int(int_type: Integer) -> Self

Source

pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool

Trait Implementations§

Source§

impl Clone for Type

Source§

fn clone(&self) -> Type

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Type

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for Type

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl From<Base> for Type

Source§

fn from(value: Base) -> Self

Converts to this type from the input type.
Source§

impl Hash for Type

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Type

Source§

fn eq(&self, other: &Type) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Type

Source§

impl StructuralPartialEq for Type

Auto Trait Implementations§

§

impl Freeze for Type

§

impl RefUnwindSafe for Type

§

impl !Send for Type

§

impl !Sync for Type

§

impl Unpin for Type

§

impl UnwindSafe for Type

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.address_max.html b/compiler-docs/fe_analyzer/namespace/types/fn.address_max.html new file mode 100644 index 0000000000..a2a6d2e9b4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.address_max.html @@ -0,0 +1 @@ +address_max in fe_analyzer::namespace::types - Rust

Function address_max

Source
pub fn address_max() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html b/compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html new file mode 100644 index 0000000000..ebbfaad3c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html @@ -0,0 +1 @@ +i256_max in fe_analyzer::namespace::types - Rust

Function i256_max

Source
pub fn i256_max() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html b/compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html new file mode 100644 index 0000000000..f479aa572f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html @@ -0,0 +1 @@ +i256_min in fe_analyzer::namespace::types - Rust

Function i256_min

Source
pub fn i256_min() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html b/compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html new file mode 100644 index 0000000000..cbc9d6ab9d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html @@ -0,0 +1 @@ +u256_max in fe_analyzer::namespace::types - Rust

Function u256_max

Source
pub fn u256_max() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html b/compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html new file mode 100644 index 0000000000..37ac9f16f0 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html @@ -0,0 +1 @@ +u256_min in fe_analyzer::namespace::types - Rust

Function u256_min

Source
pub fn u256_min() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/index.html b/compiler-docs/fe_analyzer/namespace/types/index.html new file mode 100644 index 0000000000..ae89345bdc --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/index.html @@ -0,0 +1 @@ +fe_analyzer::namespace::types - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/types/sidebar-items.js new file mode 100644 index 0000000000..97668c6126 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["U256"],"enum":["Base","GenericArg","GenericParamKind","GenericType","Integer","TraitOrType","Type"],"fn":["address_max","i256_max","i256_min","u256_max","u256_min"],"struct":["Array","CtxDecl","FeString","FunctionParam","FunctionSignature","Generic","GenericParam","GenericTypeIter","IntegerIter","Map","SelfDecl","Tuple","TypeId"],"trait":["SafeNames","TypeDowncast"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Array.html b/compiler-docs/fe_analyzer/namespace/types/struct.Array.html new file mode 100644 index 0000000000..cc840a3d31 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Array.html @@ -0,0 +1,25 @@ +Array in fe_analyzer::namespace::types - Rust

Struct Array

Source
pub struct Array {
+    pub size: usize,
+    pub inner: TypeId,
+}

Fields§

§size: usize§inner: TypeId

Trait Implementations§

Source§

impl Clone for Array

Source§

fn clone(&self) -> Array

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Array

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Array

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Array

Source§

fn eq(&self, other: &Array) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Array

Source§

impl Eq for Array

Source§

impl StructuralPartialEq for Array

Auto Trait Implementations§

§

impl Freeze for Array

§

impl RefUnwindSafe for Array

§

impl Send for Array

§

impl Sync for Array

§

impl Unpin for Array

§

impl UnwindSafe for Array

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html b/compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html new file mode 100644 index 0000000000..faac5c0a70 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html @@ -0,0 +1,25 @@ +CtxDecl in fe_analyzer::namespace::types - Rust

Struct CtxDecl

Source
pub struct CtxDecl {
+    pub span: Span,
+    pub mut_: Option<Span>,
+}

Fields§

§span: Span§mut_: Option<Span>

Trait Implementations§

Source§

impl Clone for CtxDecl

Source§

fn clone(&self) -> CtxDecl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CtxDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CtxDecl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CtxDecl

Source§

fn eq(&self, other: &CtxDecl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CtxDecl

Source§

impl Eq for CtxDecl

Source§

impl StructuralPartialEq for CtxDecl

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.FeString.html b/compiler-docs/fe_analyzer/namespace/types/struct.FeString.html new file mode 100644 index 0000000000..912e569017 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.FeString.html @@ -0,0 +1,34 @@ +FeString in fe_analyzer::namespace::types - Rust

Struct FeString

Source
pub struct FeString {
+    pub max_size: usize,
+}

Fields§

§max_size: usize

Trait Implementations§

Source§

impl Clone for FeString

Source§

fn clone(&self) -> FeString

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FeString

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for FeString

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FeString

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for FeString

Source§

fn cmp(&self, other: &FeString) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FeString

Source§

fn eq(&self, other: &FeString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FeString

Source§

fn partial_cmp(&self, other: &FeString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FeString

Source§

impl Eq for FeString

Source§

impl StructuralPartialEq for FeString

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html new file mode 100644 index 0000000000..617cdc27c9 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html @@ -0,0 +1,30 @@ +FunctionParam in fe_analyzer::namespace::types - Rust

Struct FunctionParam

Source
pub struct FunctionParam {
+    pub name: SmolStr,
+    pub typ: Result<TypeId, TypeError>,
+    /* private fields */
+}

Fields§

§name: SmolStr§typ: Result<TypeId, TypeError>

Implementations§

Source§

impl FunctionParam

Source

pub fn new( + label: Option<&str>, + name: &str, + typ: Result<TypeId, TypeError>, +) -> Self

Source

pub fn label(&self) -> Option<&str>

Trait Implementations§

Source§

impl Clone for FunctionParam

Source§

fn clone(&self) -> FunctionParam

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionParam

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionParam

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionParam

Source§

fn eq(&self, other: &FunctionParam) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionParam

Source§

impl StructuralPartialEq for FunctionParam

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html new file mode 100644 index 0000000000..9ec40de98c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html @@ -0,0 +1,31 @@ +FunctionSignature in fe_analyzer::namespace::types - Rust

Struct FunctionSignature

Source
pub struct FunctionSignature {
+    pub self_decl: Option<SelfDecl>,
+    pub ctx_decl: Option<CtxDecl>,
+    pub params: Vec<FunctionParam>,
+    pub return_type: Result<TypeId, TypeError>,
+}

Fields§

§self_decl: Option<SelfDecl>§ctx_decl: Option<CtxDecl>§params: Vec<FunctionParam>§return_type: Result<TypeId, TypeError>

Trait Implementations§

Source§

impl Clone for FunctionSignature

Source§

fn clone(&self) -> FunctionSignature

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for FunctionSignature

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl Hash for FunctionSignature

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSignature

Source§

fn eq(&self, other: &FunctionSignature) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionSignature

Source§

impl StructuralPartialEq for FunctionSignature

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Generic.html b/compiler-docs/fe_analyzer/namespace/types/struct.Generic.html new file mode 100644 index 0000000000..056ae4c8ed --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Generic.html @@ -0,0 +1,34 @@ +Generic in fe_analyzer::namespace::types - Rust

Struct Generic

Source
pub struct Generic {
+    pub name: SmolStr,
+    pub bounds: Rc<[TraitId]>,
+}

Fields§

§name: SmolStr§bounds: Rc<[TraitId]>

Trait Implementations§

Source§

impl Clone for Generic

Source§

fn clone(&self) -> Generic

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Generic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Generic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Generic

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Generic

Source§

fn cmp(&self, other: &Generic) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Generic

Source§

fn eq(&self, other: &Generic) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Generic

Source§

fn partial_cmp(&self, other: &Generic) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Eq for Generic

Source§

impl StructuralPartialEq for Generic

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html b/compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html new file mode 100644 index 0000000000..9479bf5d02 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html @@ -0,0 +1,14 @@ +GenericParam in fe_analyzer::namespace::types - Rust

Struct GenericParam

Source
pub struct GenericParam {
+    pub name: SmolStr,
+    pub kind: GenericParamKind,
+}

Fields§

§name: SmolStr§kind: GenericParamKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html b/compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html new file mode 100644 index 0000000000..2892d21faa --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html @@ -0,0 +1,221 @@ +GenericTypeIter in fe_analyzer::namespace::types - Rust

Struct GenericTypeIter

Source
pub struct GenericTypeIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for GenericTypeIter

Source§

fn clone(&self) -> GenericTypeIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for GenericTypeIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for GenericTypeIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for GenericTypeIter

Source§

type Item = GenericType

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html b/compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html new file mode 100644 index 0000000000..1735a9edab --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html @@ -0,0 +1,221 @@ +IntegerIter in fe_analyzer::namespace::types - Rust

Struct IntegerIter

Source
pub struct IntegerIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for IntegerIter

Source§

fn clone(&self) -> IntegerIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for IntegerIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for IntegerIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for IntegerIter

Source§

type Item = Integer

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Map.html b/compiler-docs/fe_analyzer/namespace/types/struct.Map.html new file mode 100644 index 0000000000..310013f626 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Map.html @@ -0,0 +1,25 @@ +Map in fe_analyzer::namespace::types - Rust

Struct Map

Source
pub struct Map {
+    pub key: TypeId,
+    pub value: TypeId,
+}

Fields§

§key: TypeId§value: TypeId

Trait Implementations§

Source§

impl Clone for Map

Source§

fn clone(&self) -> Map

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Map

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Map

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Map

Source§

fn eq(&self, other: &Map) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Map

Source§

impl StructuralPartialEq for Map

Auto Trait Implementations§

§

impl Freeze for Map

§

impl RefUnwindSafe for Map

§

impl Send for Map

§

impl Sync for Map

§

impl Unpin for Map

§

impl UnwindSafe for Map

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html b/compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html new file mode 100644 index 0000000000..5b79ee103d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html @@ -0,0 +1,25 @@ +SelfDecl in fe_analyzer::namespace::types - Rust

Struct SelfDecl

Source
pub struct SelfDecl {
+    pub span: Span,
+    pub mut_: Option<Span>,
+}

Fields§

§span: Span§mut_: Option<Span>

Implementations§

Source§

impl SelfDecl

Source

pub fn is_mut(&self) -> bool

Trait Implementations§

Source§

impl Clone for SelfDecl

Source§

fn clone(&self) -> SelfDecl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SelfDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for SelfDecl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SelfDecl

Source§

fn eq(&self, other: &SelfDecl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for SelfDecl

Source§

impl Eq for SelfDecl

Source§

impl StructuralPartialEq for SelfDecl

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html b/compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html new file mode 100644 index 0000000000..8d2de2acc4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html @@ -0,0 +1,24 @@ +Tuple in fe_analyzer::namespace::types - Rust

Struct Tuple

Source
pub struct Tuple {
+    pub items: Rc<[TypeId]>,
+}

Fields§

§items: Rc<[TypeId]>

Trait Implementations§

Source§

impl Clone for Tuple

Source§

fn clone(&self) -> Tuple

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Tuple

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Tuple

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Tuple

Source§

fn eq(&self, other: &Tuple) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Tuple

Source§

impl StructuralPartialEq for Tuple

Auto Trait Implementations§

§

impl Freeze for Tuple

§

impl RefUnwindSafe for Tuple

§

impl !Send for Tuple

§

impl !Sync for Tuple

§

impl Unpin for Tuple

§

impl UnwindSafe for Tuple

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html b/compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html new file mode 100644 index 0000000000..de3fc5dce5 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html @@ -0,0 +1,71 @@ +TypeId in fe_analyzer::namespace::types - Rust

Struct TypeId

Source
pub struct TypeId(/* private fields */);

Implementations§

Source§

impl TypeId

Source

pub fn unit(db: &dyn AnalyzerDb) -> Self

Source

pub fn bool(db: &dyn AnalyzerDb) -> Self

Source

pub fn int(db: &dyn AnalyzerDb, int: Integer) -> Self

Source

pub fn address(db: &dyn AnalyzerDb) -> Self

Source

pub fn base(db: &dyn AnalyzerDb, t: Base) -> Self

Source

pub fn tuple(db: &dyn AnalyzerDb, items: &[TypeId]) -> Self

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Type

Source

pub fn deref_typ(&self, db: &dyn AnalyzerDb) -> Type

Source

pub fn deref(self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn make_sptr(self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_primitive(&self, db: &dyn AnalyzerDb) -> bool

true if Type::Base or Type::Contract (which is just an Address)

+
Source

pub fn is_bool(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_contract(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_integer(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_map(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_string(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_self_ty(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn as_struct(&self, db: &dyn AnalyzerDb) -> Option<StructId>

Source

pub fn as_trait_or_type(&self) -> TraitOrType

Source

pub fn is_struct(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_sptr(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_mut(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn kind_display_name(&self, db: &dyn AnalyzerDb) -> &str

Source

pub fn get_impl_for( + &self, + db: &dyn AnalyzerDb, + trait_: TraitId, +) -> Option<ImplId>

Return the impl for the given trait. There can only ever be a single +implementation per concrete type and trait.

+
Source

pub fn trait_function_candidates( + &self, + context: &mut dyn AnalyzerContext, + fn_name: &str, +) -> (Vec<(FunctionId, ImplId)>, Vec<(FunctionId, ImplId)>)

Looks up all possible candidates of the given function name that are implemented via traits. +Groups results in two lists, the first contains all theoretical possible candidates and +the second contains only those that are actually callable because the trait is in scope.

+
Source

pub fn function_sig( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<FunctionSigId>

Signature for the function with the given name defined directly on the type. +Does not consider trait impls.

+
Source

pub fn function_sigs( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Rc<[FunctionSigId]>

Like function_sig but returns a Vec<FunctionSigId> which not only +considers functions natively implemented on the type but also those +that are provided by implemented traits on the type.

+
Source

pub fn self_function( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<FunctionSigId>

Source

pub fn is_emittable(self, db: &dyn AnalyzerDb) -> bool

Returns true if the type qualifies to implement the Emittable trait +TODO: This function should be removed when we add Encode / Decode +trait

+
Source

pub fn is_encodable(self, db: &dyn AnalyzerDb) -> Result<bool, TypeError>

Returns true if the type is encodable in Solidity ABI. +TODO: This function must be removed when we add Encode/Decode trait.

+

Trait Implementations§

Source§

impl Clone for TypeId

Source§

fn clone(&self) -> TypeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TypeId

Source§

fn default() -> TypeId

Returns the “default value” for a type. Read more
Source§

impl DisplayWithDb for TypeId

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl Hash for TypeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TypeId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for TypeId

Source§

fn cmp(&self, other: &TypeId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TypeId

Source§

fn eq(&self, other: &TypeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TypeId

Source§

fn partial_cmp(&self, other: &TypeId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TypeDowncast for TypeId

Source§

fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>

Source§

fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>

Source§

fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>

Source§

fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>

Source§

fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>

Source§

impl Copy for TypeId

Source§

impl Eq for TypeId

Source§

impl StructuralPartialEq for TypeId

Auto Trait Implementations§

§

impl Freeze for TypeId

§

impl RefUnwindSafe for TypeId

§

impl Send for TypeId

§

impl Sync for TypeId

§

impl Unpin for TypeId

§

impl UnwindSafe for TypeId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html b/compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html new file mode 100644 index 0000000000..e96d02553a --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html @@ -0,0 +1,6 @@ +SafeNames in fe_analyzer::namespace::types - Rust

Trait SafeNames

Source
pub trait SafeNames {
+    // Required method
+    fn lower_snake(&self) -> String;
+}
Expand description

Names that can be used to build identifiers without collision.

+

Required Methods§

Source

fn lower_snake(&self) -> String

Name in the lower snake format (e.g. lower_snake_case).

+

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html b/compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html new file mode 100644 index 0000000000..0c94bc4eb2 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html @@ -0,0 +1,8 @@ +TypeDowncast in fe_analyzer::namespace::types - Rust

Trait TypeDowncast

Source
pub trait TypeDowncast {
+    // Required methods
+    fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>;
+    fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>;
+    fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>;
+    fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>;
+    fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>;
+}

Required Methods§

Source

fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>

Source

fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>

Source

fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>

Source

fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>

Source

fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html b/compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html new file mode 100644 index 0000000000..2dbcba7363 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html @@ -0,0 +1,27 @@ +ConstructorKind in fe_analyzer::pattern_analysis - Rust

Enum ConstructorKind

Source
pub enum ConstructorKind {
+    Enum(EnumVariantId),
+    Tuple(TypeId),
+    Struct(StructId),
+    Literal((LiteralPattern, TypeId)),
+}

Variants§

Implementations§

Source§

impl ConstructorKind

Source

pub fn field_types(&self, db: &dyn AnalyzerDb) -> Vec<TypeId>

Source

pub fn arity(&self, db: &dyn AnalyzerDb) -> usize

Source

pub fn ty(&self, db: &dyn AnalyzerDb) -> TypeId

Trait Implementations§

Source§

impl Clone for ConstructorKind

Source§

fn clone(&self) -> ConstructorKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstructorKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConstructorKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstructorKind

Source§

fn eq(&self, other: &ConstructorKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ConstructorKind

Source§

impl Eq for ConstructorKind

Source§

impl StructuralPartialEq for ConstructorKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html b/compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html new file mode 100644 index 0000000000..951e0f884d --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html @@ -0,0 +1,24 @@ +LiteralConstructor in fe_analyzer::pattern_analysis - Rust

Enum LiteralConstructor

Source
pub enum LiteralConstructor {
+    Bool(bool),
+}

Variants§

§

Bool(bool)

Trait Implementations§

Source§

impl Clone for LiteralConstructor

Source§

fn clone(&self) -> LiteralConstructor

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LiteralConstructor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for LiteralConstructor

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for LiteralConstructor

Source§

fn eq(&self, other: &LiteralConstructor) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for LiteralConstructor

Source§

impl Eq for LiteralConstructor

Source§

impl StructuralPartialEq for LiteralConstructor

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html b/compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html new file mode 100644 index 0000000000..377e1569b1 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html @@ -0,0 +1,30 @@ +SimplifiedPatternKind in fe_analyzer::pattern_analysis - Rust

Enum SimplifiedPatternKind

Source
pub enum SimplifiedPatternKind {
+    WildCard(Option<(SmolStr, usize)>),
+    Constructor {
+        kind: ConstructorKind,
+        fields: Vec<SimplifiedPattern>,
+    },
+    Or(Vec<SimplifiedPattern>),
+}

Variants§

§

WildCard(Option<(SmolStr, usize)>)

§

Constructor

§

Or(Vec<SimplifiedPattern>)

Implementations§

Trait Implementations§

Source§

impl Clone for SimplifiedPatternKind

Source§

fn clone(&self) -> SimplifiedPatternKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SimplifiedPatternKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for SimplifiedPatternKind

Source§

fn eq(&self, other: &SimplifiedPatternKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SimplifiedPatternKind

Source§

impl StructuralPartialEq for SimplifiedPatternKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/index.html b/compiler-docs/fe_analyzer/pattern_analysis/index.html new file mode 100644 index 0000000000..a40df913fa --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/index.html @@ -0,0 +1,5 @@ +fe_analyzer::pattern_analysis - Rust

Module pattern_analysis

Source
Expand description

This module includes utility structs and its functions for pattern matching +analysis. The algorithm here is based on Warnings for pattern matching

+

In this module, we assume all types are well-typed, so we can rely on the +type information without checking it.

+

Structs§

PatternMatrix
PatternRowVec
SigmaSet
SimplifiedPattern

Enums§

ConstructorKind
LiteralConstructor
SimplifiedPatternKind
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js b/compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js new file mode 100644 index 0000000000..e090f1131b --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ConstructorKind","LiteralConstructor","SimplifiedPatternKind"],"struct":["PatternMatrix","PatternRowVec","SigmaSet","SimplifiedPattern"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html new file mode 100644 index 0000000000..ab6ef4ef97 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html @@ -0,0 +1,27 @@ +PatternMatrix in fe_analyzer::pattern_analysis - Rust

Struct PatternMatrix

Source
pub struct PatternMatrix { /* private fields */ }

Implementations§

Source§

impl PatternMatrix

Source

pub fn new(rows: Vec<PatternRowVec>) -> Self

Source

pub fn from_arms<'db>( + scope: &'db BlockScope<'db, 'db>, + arms: &[Node<MatchArm>], + ty: TypeId, +) -> Self

Source

pub fn rows(&self) -> &[PatternRowVec]

Source

pub fn into_rows(self) -> Vec<PatternRowVec>

Source

pub fn find_non_exhaustiveness( + &self, + db: &dyn AnalyzerDb, +) -> Option<Vec<SimplifiedPattern>>

Source

pub fn is_row_useful(&self, db: &dyn AnalyzerDb, row: usize) -> bool

Source

pub fn nrows(&self) -> usize

Source

pub fn ncols(&self) -> usize

Source

pub fn swap_col(&mut self, col1: usize, col2: usize)

Source

pub fn sigma_set(&self) -> SigmaSet

Source

pub fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Self

Source

pub fn d_specialize(&self, db: &dyn AnalyzerDb) -> Self

Trait Implementations§

Source§

impl Clone for PatternMatrix

Source§

fn clone(&self) -> PatternMatrix

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PatternMatrix

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PatternMatrix

Source§

fn eq(&self, other: &PatternMatrix) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for PatternMatrix

Source§

impl StructuralPartialEq for PatternMatrix

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html new file mode 100644 index 0000000000..78639564b7 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html @@ -0,0 +1,26 @@ +PatternRowVec in fe_analyzer::pattern_analysis - Rust

Struct PatternRowVec

Source
pub struct PatternRowVec {
+    pub inner: Vec<SimplifiedPattern>,
+}

Fields§

§inner: Vec<SimplifiedPattern>

Implementations§

Source§

impl PatternRowVec

Source

pub fn new(inner: Vec<SimplifiedPattern>) -> Self

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn pats(&self) -> &[SimplifiedPattern]

Source

pub fn head(&self) -> Option<&SimplifiedPattern>

Source

pub fn phi_specialize( + &self, + db: &dyn AnalyzerDb, + ctor: ConstructorKind, +) -> Vec<Self>

Source

pub fn swap(&mut self, a: usize, b: usize)

Source

pub fn d_specialize(&self, _db: &dyn AnalyzerDb) -> Vec<Self>

Source

pub fn collect_column_ctors(&self, column: usize) -> Vec<ConstructorKind>

Trait Implementations§

Source§

impl Clone for PatternRowVec

Source§

fn clone(&self) -> PatternRowVec

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PatternRowVec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PatternRowVec

Source§

fn eq(&self, other: &PatternRowVec) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for PatternRowVec

Source§

impl StructuralPartialEq for PatternRowVec

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html new file mode 100644 index 0000000000..6c24079e20 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html @@ -0,0 +1,23 @@ +SigmaSet in fe_analyzer::pattern_analysis - Rust

Struct SigmaSet

Source
pub struct SigmaSet(/* private fields */);

Implementations§

Source§

impl SigmaSet

Source

pub fn from_rows<'a>( + rows: impl Iterator<Item = &'a PatternRowVec>, + column: usize, +) -> Self

Source

pub fn complete_sigma(db: &dyn AnalyzerDb, ty: TypeId) -> Self

Source

pub fn is_complete(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn iter(&self) -> impl Iterator<Item = &ConstructorKind>

Source

pub fn difference(&self, other: &Self) -> Self

Trait Implementations§

Source§

impl Clone for SigmaSet

Source§

fn clone(&self) -> SigmaSet

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SigmaSet

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl IntoIterator for SigmaSet

Source§

type Item = ConstructorKind

The type of the elements being iterated over.
Source§

type IntoIter = <IndexSet<ConstructorKind> as IntoIterator>::IntoIter

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl PartialEq for SigmaSet

Source§

fn eq(&self, other: &SigmaSet) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SigmaSet

Source§

impl StructuralPartialEq for SigmaSet

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html new file mode 100644 index 0000000000..27a804350c --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html @@ -0,0 +1,27 @@ +SimplifiedPattern in fe_analyzer::pattern_analysis - Rust

Struct SimplifiedPattern

Source
pub struct SimplifiedPattern {
+    pub kind: SimplifiedPatternKind,
+    pub ty: TypeId,
+}

Fields§

§kind: SimplifiedPatternKind§ty: TypeId

Implementations§

Source§

impl SimplifiedPattern

Source

pub fn new(kind: SimplifiedPatternKind, ty: TypeId) -> Self

Source

pub fn wildcard(bind: Option<(SmolStr, usize)>, ty: TypeId) -> Self

Source

pub fn is_wildcard(&self) -> bool

Trait Implementations§

Source§

impl Clone for SimplifiedPattern

Source§

fn clone(&self) -> SimplifiedPattern

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SimplifiedPattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for SimplifiedPattern

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl PartialEq for SimplifiedPattern

Source§

fn eq(&self, other: &SimplifiedPattern) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SimplifiedPattern

Source§

impl StructuralPartialEq for SimplifiedPattern

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/sidebar-items.js b/compiler-docs/fe_analyzer/sidebar-items.js new file mode 100644 index 0000000000..5ac4d35640 --- /dev/null +++ b/compiler-docs/fe_analyzer/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["analyze_ingot","analyze_module"],"mod":["builtins","constants","context","db","display","errors","namespace","pattern_analysis"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html new file mode 100644 index 0000000000..5bba4a1f83 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/enum.ConstructorKind.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html new file mode 100644 index 0000000000..385ee87317 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/enum.LiteralConstructor.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html new file mode 100644 index 0000000000..714b8ce7bb --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html new file mode 100644 index 0000000000..f48ee721f9 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/index.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html new file mode 100644 index 0000000000..dc8b80e32b --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.PatternMatrix.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html new file mode 100644 index 0000000000..e5a150afdc --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.PatternRowVec.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html new file mode 100644 index 0000000000..4213287d15 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.SigmaSet.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html new file mode 100644 index 0000000000..6fa68ba8e1 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/all.html b/compiler-docs/fe_codegen/all.html new file mode 100644 index 0000000000..c0e87cc195 --- /dev/null +++ b/compiler-docs/fe_codegen/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/index.html b/compiler-docs/fe_codegen/db/index.html new file mode 100644 index 0000000000..1a38066f00 --- /dev/null +++ b/compiler-docs/fe_codegen/db/index.html @@ -0,0 +1 @@ +fe_codegen::db - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/sidebar-items.js b/compiler-docs/fe_codegen/db/sidebar-items.js new file mode 100644 index 0000000000..4c04492145 --- /dev/null +++ b/compiler-docs/fe_codegen/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["CodegenAbiContractQuery","CodegenAbiEventQuery","CodegenAbiFunctionArgumentMaximumSizeQuery","CodegenAbiFunctionQuery","CodegenAbiFunctionReturnMaximumSizeQuery","CodegenAbiModuleEventsQuery","CodegenAbiTypeMaximumSizeQuery","CodegenAbiTypeMinimumSizeQuery","CodegenAbiTypeQuery","CodegenConstantStringSymbolNameQuery","CodegenContractDeployerSymbolNameQuery","CodegenContractSymbolNameQuery","CodegenDbGroupStorage__","CodegenDbStorage","CodegenFunctionSymbolNameQuery","CodegenLegalizedBodyQuery","CodegenLegalizedSignatureQuery","CodegenLegalizedTypeQuery","Db"],"trait":["CodegenDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html new file mode 100644 index 0000000000..f65d3458bf --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html @@ -0,0 +1,46 @@ +CodegenAbiContractQuery in fe_codegen::db - Rust

Struct CodegenAbiContractQuery

Source
pub struct CodegenAbiContractQuery;

Implementations§

Source§

impl CodegenAbiContractQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiContractQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiContractQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiContractQuery

Source§

fn default() -> CodegenAbiContractQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiContractQuery

Source§

const QUERY_INDEX: u16 = 7u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_contract"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiContract

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiContractQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiContractQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiContractQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html new file mode 100644 index 0000000000..914576551a --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html @@ -0,0 +1,46 @@ +CodegenAbiEventQuery in fe_codegen::db - Rust

Struct CodegenAbiEventQuery

Source
pub struct CodegenAbiEventQuery;

Implementations§

Source§

impl CodegenAbiEventQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiEventQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiEventQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiEventQuery

Source§

fn default() -> CodegenAbiEventQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiEventQuery

Source§

const QUERY_INDEX: u16 = 6u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_event"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiEvent

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiEventQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiEventQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiEventQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html new file mode 100644 index 0000000000..736705410d --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiFunctionArgumentMaximumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiFunctionArgumentMaximumSizeQuery

Source
pub struct CodegenAbiFunctionArgumentMaximumSizeQuery;

Implementations§

Source§

impl CodegenAbiFunctionArgumentMaximumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiFunctionArgumentMaximumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

fn default() -> CodegenAbiFunctionArgumentMaximumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

const QUERY_INDEX: u16 = 11u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_function_argument_maximum_size"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiFunctionArgumentMaximumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html new file mode 100644 index 0000000000..18c939d5ec --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html @@ -0,0 +1,46 @@ +CodegenAbiFunctionQuery in fe_codegen::db - Rust

Struct CodegenAbiFunctionQuery

Source
pub struct CodegenAbiFunctionQuery;

Implementations§

Source§

impl CodegenAbiFunctionQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiFunctionQuery

Source§

fn default() -> CodegenAbiFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiFunctionQuery

Source§

const QUERY_INDEX: u16 = 5u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_function"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiFunction

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiFunctionQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiFunctionQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiFunctionQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html new file mode 100644 index 0000000000..99ffda96f1 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiFunctionReturnMaximumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiFunctionReturnMaximumSizeQuery

Source
pub struct CodegenAbiFunctionReturnMaximumSizeQuery;

Implementations§

Source§

impl CodegenAbiFunctionReturnMaximumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiFunctionReturnMaximumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

fn default() -> CodegenAbiFunctionReturnMaximumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

const QUERY_INDEX: u16 = 12u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_function_return_maximum_size"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiFunctionReturnMaximumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html new file mode 100644 index 0000000000..2926ea1d2d --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html @@ -0,0 +1,46 @@ +CodegenAbiModuleEventsQuery in fe_codegen::db - Rust

Struct CodegenAbiModuleEventsQuery

Source
pub struct CodegenAbiModuleEventsQuery;

Implementations§

Source§

impl CodegenAbiModuleEventsQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiModuleEventsQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiModuleEventsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiModuleEventsQuery

Source§

fn default() -> CodegenAbiModuleEventsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiModuleEventsQuery

Source§

const QUERY_INDEX: u16 = 8u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_module_events"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Vec<AbiEvent>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiModuleEventsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiModuleEventsQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiModuleEventsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html new file mode 100644 index 0000000000..d858f44113 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiTypeMaximumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiTypeMaximumSizeQuery

Source
pub struct CodegenAbiTypeMaximumSizeQuery;

Implementations§

Source§

impl CodegenAbiTypeMaximumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiTypeMaximumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiTypeMaximumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiTypeMaximumSizeQuery

Source§

fn default() -> CodegenAbiTypeMaximumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiTypeMaximumSizeQuery

Source§

const QUERY_INDEX: u16 = 9u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_type_maximum_size"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiTypeMaximumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiTypeMaximumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiTypeMaximumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html new file mode 100644 index 0000000000..81a39c9dce --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiTypeMinimumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiTypeMinimumSizeQuery

Source
pub struct CodegenAbiTypeMinimumSizeQuery;

Implementations§

Source§

impl CodegenAbiTypeMinimumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiTypeMinimumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiTypeMinimumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiTypeMinimumSizeQuery

Source§

fn default() -> CodegenAbiTypeMinimumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiTypeMinimumSizeQuery

Source§

const QUERY_INDEX: u16 = 10u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_type_minimum_size"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiTypeMinimumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiTypeMinimumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiTypeMinimumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html new file mode 100644 index 0000000000..c1b20815b9 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiTypeQuery in fe_codegen::db - Rust

Struct CodegenAbiTypeQuery

Source
pub struct CodegenAbiTypeQuery;

Implementations§

Source§

impl CodegenAbiTypeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiTypeQuery

Source§

fn default() -> CodegenAbiTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiTypeQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiType

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiTypeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html new file mode 100644 index 0000000000..485e419336 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenConstantStringSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenConstantStringSymbolNameQuery

Source
pub struct CodegenConstantStringSymbolNameQuery;

Implementations§

Source§

impl CodegenConstantStringSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenConstantStringSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenConstantStringSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenConstantStringSymbolNameQuery

Source§

fn default() -> CodegenConstantStringSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenConstantStringSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 15u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_constant_string_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = String

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenConstantStringSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenConstantStringSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenConstantStringSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html new file mode 100644 index 0000000000..3a951dd841 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenContractDeployerSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenContractDeployerSymbolNameQuery

Source
pub struct CodegenContractDeployerSymbolNameQuery;

Implementations§

Source§

impl CodegenContractDeployerSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenContractDeployerSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenContractDeployerSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenContractDeployerSymbolNameQuery

Source§

fn default() -> CodegenContractDeployerSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenContractDeployerSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 14u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_contract_deployer_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenContractDeployerSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenContractDeployerSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenContractDeployerSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html new file mode 100644 index 0000000000..3f0445c149 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenContractSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenContractSymbolNameQuery

Source
pub struct CodegenContractSymbolNameQuery;

Implementations§

Source§

impl CodegenContractSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenContractSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenContractSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenContractSymbolNameQuery

Source§

fn default() -> CodegenContractSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenContractSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 13u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_contract_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenContractSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenContractSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenContractSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html b/compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html new file mode 100644 index 0000000000..229da9fd11 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html @@ -0,0 +1,42 @@ +CodegenDbGroupStorage__ in fe_codegen::db - Rust

Struct CodegenDbGroupStorage__

Source
pub struct CodegenDbGroupStorage__ {
Show 16 fields + pub codegen_legalized_signature: Arc<<CodegenLegalizedSignatureQuery as Query>::Storage>, + pub codegen_legalized_body: Arc<<CodegenLegalizedBodyQuery as Query>::Storage>, + pub codegen_function_symbol_name: Arc<<CodegenFunctionSymbolNameQuery as Query>::Storage>, + pub codegen_legalized_type: Arc<<CodegenLegalizedTypeQuery as Query>::Storage>, + pub codegen_abi_type: Arc<<CodegenAbiTypeQuery as Query>::Storage>, + pub codegen_abi_function: Arc<<CodegenAbiFunctionQuery as Query>::Storage>, + pub codegen_abi_event: Arc<<CodegenAbiEventQuery as Query>::Storage>, + pub codegen_abi_contract: Arc<<CodegenAbiContractQuery as Query>::Storage>, + pub codegen_abi_module_events: Arc<<CodegenAbiModuleEventsQuery as Query>::Storage>, + pub codegen_abi_type_maximum_size: Arc<<CodegenAbiTypeMaximumSizeQuery as Query>::Storage>, + pub codegen_abi_type_minimum_size: Arc<<CodegenAbiTypeMinimumSizeQuery as Query>::Storage>, + pub codegen_abi_function_argument_maximum_size: Arc<<CodegenAbiFunctionArgumentMaximumSizeQuery as Query>::Storage>, + pub codegen_abi_function_return_maximum_size: Arc<<CodegenAbiFunctionReturnMaximumSizeQuery as Query>::Storage>, + pub codegen_contract_symbol_name: Arc<<CodegenContractSymbolNameQuery as Query>::Storage>, + pub codegen_contract_deployer_symbol_name: Arc<<CodegenContractDeployerSymbolNameQuery as Query>::Storage>, + pub codegen_constant_string_symbol_name: Arc<<CodegenConstantStringSymbolNameQuery as Query>::Storage>, +
}

Fields§

§codegen_legalized_signature: Arc<<CodegenLegalizedSignatureQuery as Query>::Storage>§codegen_legalized_body: Arc<<CodegenLegalizedBodyQuery as Query>::Storage>§codegen_function_symbol_name: Arc<<CodegenFunctionSymbolNameQuery as Query>::Storage>§codegen_legalized_type: Arc<<CodegenLegalizedTypeQuery as Query>::Storage>§codegen_abi_type: Arc<<CodegenAbiTypeQuery as Query>::Storage>§codegen_abi_function: Arc<<CodegenAbiFunctionQuery as Query>::Storage>§codegen_abi_event: Arc<<CodegenAbiEventQuery as Query>::Storage>§codegen_abi_contract: Arc<<CodegenAbiContractQuery as Query>::Storage>§codegen_abi_module_events: Arc<<CodegenAbiModuleEventsQuery as Query>::Storage>§codegen_abi_type_maximum_size: Arc<<CodegenAbiTypeMaximumSizeQuery as Query>::Storage>§codegen_abi_type_minimum_size: Arc<<CodegenAbiTypeMinimumSizeQuery as Query>::Storage>§codegen_abi_function_argument_maximum_size: Arc<<CodegenAbiFunctionArgumentMaximumSizeQuery as Query>::Storage>§codegen_abi_function_return_maximum_size: Arc<<CodegenAbiFunctionReturnMaximumSizeQuery as Query>::Storage>§codegen_contract_symbol_name: Arc<<CodegenContractSymbolNameQuery as Query>::Storage>§codegen_contract_deployer_symbol_name: Arc<<CodegenContractDeployerSymbolNameQuery as Query>::Storage>§codegen_constant_string_symbol_name: Arc<<CodegenConstantStringSymbolNameQuery as Query>::Storage>

Implementations§

Source§

impl CodegenDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl CodegenDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn CodegenDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn CodegenDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html b/compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html new file mode 100644 index 0000000000..ffa48cc24e --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html @@ -0,0 +1,12 @@ +CodegenDbStorage in fe_codegen::db - Rust

Struct CodegenDbStorage

Source
pub struct CodegenDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<CodegenDbStorage> for Db

Source§

fn group_storage(&self) -> &<CodegenDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for CodegenDbStorage

Source§

type DynDb = dyn CodegenDb

Dyn version of the associated database trait.
Source§

type GroupStorage = CodegenDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html new file mode 100644 index 0000000000..e42d4d3146 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenFunctionSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenFunctionSymbolNameQuery

Source
pub struct CodegenFunctionSymbolNameQuery;

Implementations§

Source§

impl CodegenFunctionSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenFunctionSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenFunctionSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenFunctionSymbolNameQuery

Source§

fn default() -> CodegenFunctionSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenFunctionSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_function_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenFunctionSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenFunctionSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenFunctionSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html new file mode 100644 index 0000000000..e84e357011 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html @@ -0,0 +1,46 @@ +CodegenLegalizedBodyQuery in fe_codegen::db - Rust

Struct CodegenLegalizedBodyQuery

Source
pub struct CodegenLegalizedBodyQuery;

Implementations§

Source§

impl CodegenLegalizedBodyQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenLegalizedBodyQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenLegalizedBodyQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenLegalizedBodyQuery

Source§

fn default() -> CodegenLegalizedBodyQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenLegalizedBodyQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_legalized_body"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionBody>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenLegalizedBodyQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenLegalizedBodyQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenLegalizedBodyQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html new file mode 100644 index 0000000000..091dc17269 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html @@ -0,0 +1,46 @@ +CodegenLegalizedSignatureQuery in fe_codegen::db - Rust

Struct CodegenLegalizedSignatureQuery

Source
pub struct CodegenLegalizedSignatureQuery;

Implementations§

Source§

impl CodegenLegalizedSignatureQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenLegalizedSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenLegalizedSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenLegalizedSignatureQuery

Source§

fn default() -> CodegenLegalizedSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenLegalizedSignatureQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_legalized_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionSignature>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenLegalizedSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenLegalizedSignatureQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenLegalizedSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html new file mode 100644 index 0000000000..ab681f0db4 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html @@ -0,0 +1,46 @@ +CodegenLegalizedTypeQuery in fe_codegen::db - Rust

Struct CodegenLegalizedTypeQuery

Source
pub struct CodegenLegalizedTypeQuery;

Implementations§

Source§

impl CodegenLegalizedTypeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenLegalizedTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenLegalizedTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenLegalizedTypeQuery

Source§

fn default() -> CodegenLegalizedTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenLegalizedTypeQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_legalized_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenLegalizedTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenLegalizedTypeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenLegalizedTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.Db.html b/compiler-docs/fe_codegen/db/struct.Db.html new file mode 100644 index 0000000000..27f0bcde77 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.Db.html @@ -0,0 +1,135 @@ +Db in fe_codegen::db - Rust

Struct Db

Source
pub struct Db { /* private fields */ }

Trait Implementations§

Source§

impl Database for Db

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for Db

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for Db

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for Db

Source§

fn default() -> Db

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<AnalyzerDbStorage> for Db

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<CodegenDbStorage> for Db

Source§

fn group_storage(&self) -> &<CodegenDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<MirDbStorage> for Db

Source§

fn group_storage(&self) -> &<MirDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<SourceDbStorage> for Db

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl Upcast<dyn AnalyzerDb> for Db

Source§

fn upcast(&self) -> &(dyn AnalyzerDb + 'static)

Source§

impl Upcast<dyn MirDb> for Db

Source§

fn upcast(&self) -> &(dyn MirDb + 'static)

Source§

impl Upcast<dyn SourceDb> for Db

Source§

fn upcast(&self) -> &(dyn SourceDb + 'static)

Source§

impl UpcastMut<dyn AnalyzerDb> for Db

Source§

fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static)

Source§

impl UpcastMut<dyn MirDb> for Db

Source§

fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static)

Source§

impl UpcastMut<dyn SourceDb> for Db

Source§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for Db

§

impl RefUnwindSafe for Db

§

impl !Send for Db

§

impl !Sync for Db

§

impl Unpin for Db

§

impl UnwindSafe for Db

Blanket Implementations§

§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

§

fn intern_type(&self, key0: Type) -> TypeId

§

fn lookup_intern_type(&self, key0: TypeId) -> Type

§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
§

fn root_ingot(&self) -> IngotId

§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/trait.CodegenDb.html b/compiler-docs/fe_codegen/db/trait.CodegenDb.html new file mode 100644 index 0000000000..4b5ef2cd51 --- /dev/null +++ b/compiler-docs/fe_codegen/db/trait.CodegenDb.html @@ -0,0 +1,37 @@ +CodegenDb in fe_codegen::db - Rust

Trait CodegenDb

Source
pub trait CodegenDb:
+    Database
+    + HasQueryGroup<CodegenDbStorage>
+    + MirDb
+    + Upcast<dyn MirDb>
+    + UpcastMut<dyn MirDb> {
+
Show 16 methods // Required methods + fn codegen_legalized_signature( + &self, + key0: FunctionId, + ) -> Rc<FunctionSignature>; + fn codegen_legalized_body(&self, key0: FunctionId) -> Rc<FunctionBody>; + fn codegen_function_symbol_name(&self, key0: FunctionId) -> Rc<String>; + fn codegen_legalized_type(&self, key0: TypeId) -> TypeId; + fn codegen_abi_type(&self, key0: TypeId) -> AbiType; + fn codegen_abi_function(&self, key0: FunctionId) -> AbiFunction; + fn codegen_abi_event(&self, key0: TypeId) -> AbiEvent; + fn codegen_abi_contract(&self, key0: ContractId) -> AbiContract; + fn codegen_abi_module_events(&self, key0: ModuleId) -> Vec<AbiEvent>; + fn codegen_abi_type_maximum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_type_minimum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_function_argument_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_abi_function_return_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_contract_symbol_name(&self, key0: ContractId) -> Rc<String>; + fn codegen_contract_deployer_symbol_name( + &self, + key0: ContractId, + ) -> Rc<String>; + fn codegen_constant_string_symbol_name(&self, key0: String) -> Rc<String>; +
}

Required Methods§

Implementors§

Source§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_codegen/index.html b/compiler-docs/fe_codegen/index.html new file mode 100644 index 0000000000..2c62a0f12a --- /dev/null +++ b/compiler-docs/fe_codegen/index.html @@ -0,0 +1 @@ +fe_codegen - Rust

Crate fe_codegen

Source

Modules§

db
yul
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/sidebar-items.js b/compiler-docs/fe_codegen/sidebar-items.js new file mode 100644 index 0000000000..e5f397f699 --- /dev/null +++ b/compiler-docs/fe_codegen/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["db","yul"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/index.html b/compiler-docs/fe_codegen/yul/index.html new file mode 100644 index 0000000000..9147263c7a --- /dev/null +++ b/compiler-docs/fe_codegen/yul/index.html @@ -0,0 +1 @@ +fe_codegen::yul - Rust

Module yul

Source

Modules§

isel
legalize
runtime
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/context/index.html b/compiler-docs/fe_codegen/yul/isel/context/index.html new file mode 100644 index 0000000000..3e10543d4b --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/context/index.html @@ -0,0 +1 @@ +fe_codegen::yul::isel::context - Rust

Module context

Source

Structs§

Context
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js b/compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js new file mode 100644 index 0000000000..d31239d146 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Context"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/context/struct.Context.html b/compiler-docs/fe_codegen/yul/isel/context/struct.Context.html new file mode 100644 index 0000000000..84b48c7c67 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/context/struct.Context.html @@ -0,0 +1,14 @@ +Context in fe_codegen::yul::isel::context - Rust

Struct Context

Source
pub struct Context {
+    pub runtime: Box<dyn RuntimeProvider>,
+    /* private fields */
+}

Fields§

§runtime: Box<dyn RuntimeProvider>

Trait Implementations§

Source§

impl Default for Context

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Context

§

impl !RefUnwindSafe for Context

§

impl !Send for Context

§

impl !Sync for Context

§

impl Unpin for Context

§

impl !UnwindSafe for Context

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html new file mode 100644 index 0000000000..039910e363 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_contract.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html new file mode 100644 index 0000000000..3fbfe01517 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_contract_deployable.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html new file mode 100644 index 0000000000..828d17fd1e --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html @@ -0,0 +1 @@ +lower_contract in fe_codegen::yul::isel - Rust

Function lower_contract

Source
pub fn lower_contract(db: &dyn CodegenDb, contract: ContractId) -> Object
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html new file mode 100644 index 0000000000..12673712db --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html @@ -0,0 +1,4 @@ +lower_contract_deployable in fe_codegen::yul::isel - Rust

Function lower_contract_deployable

Source
pub fn lower_contract_deployable(
+    db: &dyn CodegenDb,
+    contract: ContractId,
+) -> Object
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_function.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_function.html new file mode 100644 index 0000000000..184aafb3ae --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_function.html @@ -0,0 +1,5 @@ +lower_function in fe_codegen::yul::isel - Rust

Function lower_function

Source
pub fn lower_function(
+    db: &dyn CodegenDb,
+    ctx: &mut Context,
+    function: FunctionId,
+) -> FunctionDefinition
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_test.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_test.html new file mode 100644 index 0000000000..553d1ae480 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_test.html @@ -0,0 +1 @@ +lower_test in fe_codegen::yul::isel - Rust

Function lower_test

Source
pub fn lower_test(db: &dyn CodegenDb, test: FunctionId) -> Object
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html b/compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html new file mode 100644 index 0000000000..52af4a8690 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_function.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/index.html b/compiler-docs/fe_codegen/yul/isel/index.html new file mode 100644 index 0000000000..b8d0126676 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/index.html @@ -0,0 +1 @@ +fe_codegen::yul::isel - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/sidebar-items.js b/compiler-docs/fe_codegen/yul/isel/sidebar-items.js new file mode 100644 index 0000000000..3bec7b23bc --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["lower_contract","lower_contract_deployable","lower_function","lower_test"],"mod":["context"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html b/compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html new file mode 100644 index 0000000000..233f0432fe --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_test.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html b/compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html new file mode 100644 index 0000000000..1834c6bb95 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/legalize/fn.legalize_func_body.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html new file mode 100644 index 0000000000..df95f2f15d --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html @@ -0,0 +1 @@ +legalize_func_body in fe_codegen::yul::legalize - Rust

Function legalize_func_body

Source
pub fn legalize_func_body(db: &dyn CodegenDb, body: &mut FunctionBody)
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html new file mode 100644 index 0000000000..0a0875876d --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html @@ -0,0 +1 @@ +legalize_func_signature in fe_codegen::yul::legalize - Rust

Function legalize_func_signature

Source
pub fn legalize_func_signature(db: &dyn CodegenDb, sig: &mut FunctionSignature)
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/index.html b/compiler-docs/fe_codegen/yul/legalize/index.html new file mode 100644 index 0000000000..e41c80d5c4 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/index.html @@ -0,0 +1 @@ +fe_codegen::yul::legalize - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/sidebar-items.js b/compiler-docs/fe_codegen/yul/legalize/sidebar-items.js new file mode 100644 index 0000000000..c4c368b332 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["legalize_func_body","legalize_func_signature"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html b/compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html new file mode 100644 index 0000000000..7d82aef80b --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/legalize/fn.legalize_func_signature.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html b/compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html new file mode 100644 index 0000000000..ccb48d326d --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html @@ -0,0 +1,16 @@ +AbiSrcLocation in fe_codegen::yul::runtime - Rust

Enum AbiSrcLocation

Source
pub enum AbiSrcLocation {
+    CallData,
+    Memory,
+}

Variants§

§

CallData

§

Memory

Trait Implementations§

Source§

impl Clone for AbiSrcLocation

Source§

fn clone(&self) -> AbiSrcLocation

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiSrcLocation

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Copy for AbiSrcLocation

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/index.html b/compiler-docs/fe_codegen/yul/runtime/index.html new file mode 100644 index 0000000000..10f2234db9 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/index.html @@ -0,0 +1 @@ +fe_codegen::yul::runtime - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/sidebar-items.js b/compiler-docs/fe_codegen/yul/runtime/sidebar-items.js new file mode 100644 index 0000000000..f8894c45b7 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AbiSrcLocation"],"struct":["DefaultRuntimeProvider"],"trait":["RuntimeProvider"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html b/compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html new file mode 100644 index 0000000000..6d6c03d372 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html @@ -0,0 +1,144 @@ +DefaultRuntimeProvider in fe_codegen::yul::runtime - Rust

Struct DefaultRuntimeProvider

Source
pub struct DefaultRuntimeProvider { /* private fields */ }

Trait Implementations§

Source§

impl Debug for DefaultRuntimeProvider

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DefaultRuntimeProvider

Source§

fn default() -> DefaultRuntimeProvider

Returns the “default value” for a type. Read more
Source§

impl RuntimeProvider for DefaultRuntimeProvider

Source§

fn collect_definitions(&self) -> Vec<FunctionDefinition>

Source§

fn alloc(&mut self, _db: &dyn CodegenDb, bytes: Expression) -> Expression

Source§

fn avail(&mut self, _db: &dyn CodegenDb) -> Expression

Source§

fn create( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, +) -> Expression

Source§

fn create2( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + salt: Expression, +) -> Expression

Source§

fn emit( + &mut self, + db: &dyn CodegenDb, + event: Expression, + event_ty: TypeId, +) -> Expression

Source§

fn revert( + &mut self, + db: &dyn CodegenDb, + arg: Option<Expression>, + arg_name: &str, + arg_ty: TypeId, +) -> Expression

Source§

fn external_call( + &mut self, + db: &dyn CodegenDb, + function: FunctionId, + args: Vec<Expression>, +) -> Expression

Source§

fn map_value_ptr( + &mut self, + db: &dyn CodegenDb, + map_ptr: Expression, + key: Expression, + key_ty: TypeId, +) -> Expression

Source§

fn aggregate_init( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + args: Vec<Expression>, + ptr_ty: TypeId, + arg_tys: Vec<TypeId>, +) -> Expression

Source§

fn string_copy( + &mut self, + db: &dyn CodegenDb, + dst: Expression, + data: &str, + is_dst_storage: bool, +) -> Expression

Source§

fn string_construct( + &mut self, + db: &dyn CodegenDb, + data: &str, + string_len: usize, +) -> Expression

Source§

fn ptr_copy( + &mut self, + _db: &dyn CodegenDb, + src: Expression, + dst: Expression, + size: Expression, + is_src_storage: bool, + is_dst_storage: bool, +) -> Expression

Copy data from src to dst. +NOTE: src and dst must be aligned by 32 when a ptr is storage ptr.
Source§

fn ptr_store( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + imm: Expression, + ptr_ty: TypeId, +) -> Expression

Source§

fn ptr_load( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + ptr_ty: TypeId, +) -> Expression

Source§

fn abi_encode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + src_ty: TypeId, + is_dst_storage: bool, +) -> Expression

Source§

fn abi_encode_seq( + &mut self, + db: &dyn CodegenDb, + src: &[Expression], + dst: Expression, + src_tys: &[TypeId], + is_dst_storage: bool, +) -> Expression

Source§

fn abi_decode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + size: Expression, + types: &[TypeId], + abi_loc: AbiSrcLocation, +) -> Expression

Source§

fn safe_add( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_sub( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_mul( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_div( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_mod( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_pow( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn primitive_cast( + &mut self, + db: &dyn CodegenDb, + value: Expression, + from_ty: TypeId, +) -> Expression

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html b/compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html new file mode 100644 index 0000000000..9ce48d6a26 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html @@ -0,0 +1,296 @@ +RuntimeProvider in fe_codegen::yul::runtime - Rust

Trait RuntimeProvider

Source
pub trait RuntimeProvider {
+
Show 25 methods // Required methods + fn collect_definitions(&self) -> Vec<FunctionDefinition>; + fn alloc(&mut self, db: &dyn CodegenDb, size: Expression) -> Expression; + fn avail(&mut self, db: &dyn CodegenDb) -> Expression; + fn create( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + ) -> Expression; + fn create2( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + salt: Expression, + ) -> Expression; + fn emit( + &mut self, + db: &dyn CodegenDb, + event: Expression, + event_ty: TypeId, + ) -> Expression; + fn revert( + &mut self, + db: &dyn CodegenDb, + arg: Option<Expression>, + arg_name: &str, + arg_ty: TypeId, + ) -> Expression; + fn external_call( + &mut self, + db: &dyn CodegenDb, + function: FunctionId, + args: Vec<Expression>, + ) -> Expression; + fn map_value_ptr( + &mut self, + db: &dyn CodegenDb, + map_ptr: Expression, + key: Expression, + key_ty: TypeId, + ) -> Expression; + fn aggregate_init( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + args: Vec<Expression>, + ptr_ty: TypeId, + arg_tys: Vec<TypeId>, + ) -> Expression; + fn string_copy( + &mut self, + db: &dyn CodegenDb, + dst: Expression, + data: &str, + is_dst_storage: bool, + ) -> Expression; + fn string_construct( + &mut self, + db: &dyn CodegenDb, + data: &str, + string_len: usize, + ) -> Expression; + fn ptr_copy( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + size: Expression, + is_src_storage: bool, + is_dst_storage: bool, + ) -> Expression; + fn ptr_store( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + imm: Expression, + ptr_ty: TypeId, + ) -> Expression; + fn ptr_load( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + ptr_ty: TypeId, + ) -> Expression; + fn abi_encode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + src_ty: TypeId, + is_dst_storage: bool, + ) -> Expression; + fn abi_encode_seq( + &mut self, + db: &dyn CodegenDb, + src: &[Expression], + dst: Expression, + src_tys: &[TypeId], + is_dst_storage: bool, + ) -> Expression; + fn abi_decode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + size: Expression, + types: &[TypeId], + abi_loc: AbiSrcLocation, + ) -> Expression; + fn safe_add( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_sub( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_mul( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_div( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_mod( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_pow( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + + // Provided method + fn primitive_cast( + &mut self, + db: &dyn CodegenDb, + value: Expression, + from_ty: TypeId, + ) -> Expression { ... } +
}

Required Methods§

Source

fn collect_definitions(&self) -> Vec<FunctionDefinition>

Source

fn alloc(&mut self, db: &dyn CodegenDb, size: Expression) -> Expression

Source

fn avail(&mut self, db: &dyn CodegenDb) -> Expression

Source

fn create( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, +) -> Expression

Source

fn create2( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + salt: Expression, +) -> Expression

Source

fn emit( + &mut self, + db: &dyn CodegenDb, + event: Expression, + event_ty: TypeId, +) -> Expression

Source

fn revert( + &mut self, + db: &dyn CodegenDb, + arg: Option<Expression>, + arg_name: &str, + arg_ty: TypeId, +) -> Expression

Source

fn external_call( + &mut self, + db: &dyn CodegenDb, + function: FunctionId, + args: Vec<Expression>, +) -> Expression

Source

fn map_value_ptr( + &mut self, + db: &dyn CodegenDb, + map_ptr: Expression, + key: Expression, + key_ty: TypeId, +) -> Expression

Source

fn aggregate_init( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + args: Vec<Expression>, + ptr_ty: TypeId, + arg_tys: Vec<TypeId>, +) -> Expression

Source

fn string_copy( + &mut self, + db: &dyn CodegenDb, + dst: Expression, + data: &str, + is_dst_storage: bool, +) -> Expression

Source

fn string_construct( + &mut self, + db: &dyn CodegenDb, + data: &str, + string_len: usize, +) -> Expression

Source

fn ptr_copy( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + size: Expression, + is_src_storage: bool, + is_dst_storage: bool, +) -> Expression

Copy data from src to dst. +NOTE: src and dst must be aligned by 32 when a ptr is storage ptr.

+
Source

fn ptr_store( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + imm: Expression, + ptr_ty: TypeId, +) -> Expression

Source

fn ptr_load( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + ptr_ty: TypeId, +) -> Expression

Source

fn abi_encode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + src_ty: TypeId, + is_dst_storage: bool, +) -> Expression

Source

fn abi_encode_seq( + &mut self, + db: &dyn CodegenDb, + src: &[Expression], + dst: Expression, + src_tys: &[TypeId], + is_dst_storage: bool, +) -> Expression

Source

fn abi_decode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + size: Expression, + types: &[TypeId], + abi_loc: AbiSrcLocation, +) -> Expression

Source

fn safe_add( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_sub( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_mul( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_div( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_mod( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_pow( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Provided Methods§

Source

fn primitive_cast( + &mut self, + db: &dyn CodegenDb, + value: Expression, + from_ty: TypeId, +) -> Expression

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/sidebar-items.js b/compiler-docs/fe_codegen/yul/sidebar-items.js new file mode 100644 index 0000000000..6684c69798 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["isel","legalize","runtime"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/all.html b/compiler-docs/fe_common/all.html new file mode 100644 index 0000000000..dd834c8a65 --- /dev/null +++ b/compiler-docs/fe_common/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/index.html b/compiler-docs/fe_common/db/index.html new file mode 100644 index 0000000000..4d8a2d8d44 --- /dev/null +++ b/compiler-docs/fe_common/db/index.html @@ -0,0 +1 @@ +fe_common::db - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/sidebar-items.js b/compiler-docs/fe_common/db/sidebar-items.js new file mode 100644 index 0000000000..0dbd491578 --- /dev/null +++ b/compiler-docs/fe_common/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["FileContentQuery","FileLineStartsQuery","FileNameQuery","InternFileLookupQuery","InternFileQuery","SourceDbGroupStorage__","SourceDbStorage","TestDb"],"trait":["SourceDb","Upcast","UpcastMut"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.FileContentQuery.html b/compiler-docs/fe_common/db/struct.FileContentQuery.html new file mode 100644 index 0000000000..f3088329e5 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.FileContentQuery.html @@ -0,0 +1,39 @@ +FileContentQuery in fe_common::db - Rust

Struct FileContentQuery

Source
pub struct FileContentQuery;

Implementations§

Source§

impl FileContentQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FileContentQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FileContentQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FileContentQuery

Source§

fn default() -> FileContentQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FileContentQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "file_content"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<str>

What value does the query return?
Source§

type Storage = InputStorage<FileContentQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FileContentQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.FileLineStartsQuery.html b/compiler-docs/fe_common/db/struct.FileLineStartsQuery.html new file mode 100644 index 0000000000..3cda608ce0 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.FileLineStartsQuery.html @@ -0,0 +1,46 @@ +FileLineStartsQuery in fe_common::db - Rust

Struct FileLineStartsQuery

Source
pub struct FileLineStartsQuery;

Implementations§

Source§

impl FileLineStartsQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FileLineStartsQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FileLineStartsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FileLineStartsQuery

Source§

fn default() -> FileLineStartsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FileLineStartsQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "file_line_starts"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[usize]>

What value does the query return?
Source§

type Storage = DerivedStorage<FileLineStartsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FileLineStartsQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FileLineStartsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.FileNameQuery.html b/compiler-docs/fe_common/db/struct.FileNameQuery.html new file mode 100644 index 0000000000..b10fedaa97 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.FileNameQuery.html @@ -0,0 +1,46 @@ +FileNameQuery in fe_common::db - Rust

Struct FileNameQuery

Source
pub struct FileNameQuery;

Implementations§

Source§

impl FileNameQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FileNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FileNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FileNameQuery

Source§

fn default() -> FileNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FileNameQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "file_name"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = SmolStr

What value does the query return?
Source§

type Storage = DerivedStorage<FileNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FileNameQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FileNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.InternFileLookupQuery.html b/compiler-docs/fe_common/db/struct.InternFileLookupQuery.html new file mode 100644 index 0000000000..88c73e05e7 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.InternFileLookupQuery.html @@ -0,0 +1,39 @@ +InternFileLookupQuery in fe_common::db - Rust

Struct InternFileLookupQuery

Source
pub struct InternFileLookupQuery;

Implementations§

Source§

impl InternFileLookupQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFileLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFileLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFileLookupQuery

Source§

fn default() -> InternFileLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFileLookupQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_file"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = File

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternFileLookupQuery, InternFileQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFileLookupQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.InternFileQuery.html b/compiler-docs/fe_common/db/struct.InternFileQuery.html new file mode 100644 index 0000000000..e38ab8918d --- /dev/null +++ b/compiler-docs/fe_common/db/struct.InternFileQuery.html @@ -0,0 +1,39 @@ +InternFileQuery in fe_common::db - Rust

Struct InternFileQuery

Source
pub struct InternFileQuery;

Implementations§

Source§

impl InternFileQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFileQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFileQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFileQuery

Source§

fn default() -> InternFileQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFileQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_file"

Name of the query method (e.g., foo)
Source§

type Key = File

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = SourceFileId

What value does the query return?
Source§

type Storage = InternedStorage<InternFileQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFileQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html b/compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html new file mode 100644 index 0000000000..b25fcc2497 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html @@ -0,0 +1,31 @@ +SourceDbGroupStorage__ in fe_common::db - Rust

Struct SourceDbGroupStorage__

Source
pub struct SourceDbGroupStorage__ {
+    pub intern_file: Arc<<InternFileQuery as Query>::Storage>,
+    pub lookup_intern_file: Arc<<InternFileLookupQuery as Query>::Storage>,
+    pub file_content: Arc<<FileContentQuery as Query>::Storage>,
+    pub file_line_starts: Arc<<FileLineStartsQuery as Query>::Storage>,
+    pub file_name: Arc<<FileNameQuery as Query>::Storage>,
+}

Fields§

§intern_file: Arc<<InternFileQuery as Query>::Storage>§lookup_intern_file: Arc<<InternFileLookupQuery as Query>::Storage>§file_content: Arc<<FileContentQuery as Query>::Storage>§file_line_starts: Arc<<FileLineStartsQuery as Query>::Storage>§file_name: Arc<<FileNameQuery as Query>::Storage>

Implementations§

Source§

impl SourceDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl SourceDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn SourceDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn SourceDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.SourceDbStorage.html b/compiler-docs/fe_common/db/struct.SourceDbStorage.html new file mode 100644 index 0000000000..20326d65d1 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.SourceDbStorage.html @@ -0,0 +1,12 @@ +SourceDbStorage in fe_common::db - Rust

Struct SourceDbStorage

Source
pub struct SourceDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<SourceDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for SourceDbStorage

Source§

type DynDb = dyn SourceDb

Dyn version of the associated database trait.
Source§

type GroupStorage = SourceDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.TestDb.html b/compiler-docs/fe_common/db/struct.TestDb.html new file mode 100644 index 0000000000..a5f44d6a28 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.TestDb.html @@ -0,0 +1,32 @@ +TestDb in fe_common::db - Rust

Struct TestDb

Source
pub struct TestDb { /* private fields */ }

Trait Implementations§

Source§

impl Database for TestDb

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for TestDb

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for TestDb

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for TestDb

Source§

fn default() -> TestDb

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<SourceDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.

Auto Trait Implementations§

§

impl !Freeze for TestDb

§

impl RefUnwindSafe for TestDb

§

impl !Send for TestDb

§

impl !Sync for TestDb

§

impl Unpin for TestDb

§

impl UnwindSafe for TestDb

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/trait.SourceDb.html b/compiler-docs/fe_common/db/trait.SourceDb.html new file mode 100644 index 0000000000..8dff6797f7 --- /dev/null +++ b/compiler-docs/fe_common/db/trait.SourceDb.html @@ -0,0 +1,33 @@ +SourceDb in fe_common::db - Rust

Trait SourceDb

Source
pub trait SourceDb: Database + HasQueryGroup<SourceDbStorage> {
+    // Required methods
+    fn intern_file(&self, key0: File) -> SourceFileId;
+    fn lookup_intern_file(&self, key0: SourceFileId) -> File;
+    fn file_content(&self, key0: SourceFileId) -> Rc<str>;
+    fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>);
+    fn set_file_content_with_durability(
+        &mut self,
+        key0: SourceFileId,
+        value__: Rc<str>,
+        durability__: Durability,
+    );
+    fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>;
+    fn file_name(&self, key0: SourceFileId) -> SmolStr;
+}

Required Methods§

Source

fn intern_file(&self, key0: File) -> SourceFileId

Source

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)

+
Source

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input.

+

See file_content for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again.

+

See file_content for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source

fn file_name(&self, key0: SourceFileId) -> SmolStr

Implementors§

Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_common/db/trait.Upcast.html b/compiler-docs/fe_common/db/trait.Upcast.html new file mode 100644 index 0000000000..27ebc91e53 --- /dev/null +++ b/compiler-docs/fe_common/db/trait.Upcast.html @@ -0,0 +1,4 @@ +Upcast in fe_common::db - Rust

Trait Upcast

Source
pub trait Upcast<T: ?Sized> {
+    // Required method
+    fn upcast(&self) -> &T;
+}

Required Methods§

Source

fn upcast(&self) -> &T

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/db/trait.UpcastMut.html b/compiler-docs/fe_common/db/trait.UpcastMut.html new file mode 100644 index 0000000000..a95b363fee --- /dev/null +++ b/compiler-docs/fe_common/db/trait.UpcastMut.html @@ -0,0 +1,4 @@ +UpcastMut in fe_common::db - Rust

Trait UpcastMut

Source
pub trait UpcastMut<T: ?Sized> {
+    // Required method
+    fn upcast_mut(&mut self) -> &mut T;
+}

Required Methods§

Source

fn upcast_mut(&mut self) -> &mut T

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html b/compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html new file mode 100644 index 0000000000..0477a90a0c --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html @@ -0,0 +1,28 @@ +LabelStyle in fe_common::diagnostics::cs - Rust

Enum LabelStyle

pub enum LabelStyle {
+    Primary,
+    Secondary,
+}

Variants§

§

Primary

Labels that describe the primary cause of a diagnostic.

+
§

Secondary

Labels that provide additional context for a diagnostic.

+

Trait Implementations§

§

impl Clone for LabelStyle

§

fn clone(&self) -> LabelStyle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for LabelStyle

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl From<LabelStyle> for LabelStyle

Source§

fn from(other: LabelStyle) -> LabelStyle

Converts to this type from the input type.
§

impl PartialEq for LabelStyle

§

fn eq(&self, other: &LabelStyle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for LabelStyle

§

fn partial_cmp(&self, other: &LabelStyle) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Copy for LabelStyle

§

impl Eq for LabelStyle

§

impl StructuralPartialEq for LabelStyle

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/enum.Severity.html b/compiler-docs/fe_common/diagnostics/cs/enum.Severity.html new file mode 100644 index 0000000000..684fcb944e --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/enum.Severity.html @@ -0,0 +1,46 @@ +Severity in fe_common::diagnostics::cs - Rust

Enum Severity

pub enum Severity {
+    Bug,
+    Error,
+    Warning,
+    Note,
+    Help,
+}
Expand description

A severity level for diagnostic messages.

+

These are ordered in the following way:

+ +
use codespan_reporting::diagnostic::Severity;
+
+assert!(Severity::Bug > Severity::Error);
+assert!(Severity::Error > Severity::Warning);
+assert!(Severity::Warning > Severity::Note);
+assert!(Severity::Note > Severity::Help);
+

Variants§

§

Bug

An unexpected bug.

+
§

Error

An error.

+
§

Warning

A warning.

+
§

Note

A note.

+
§

Help

A help message.

+

Trait Implementations§

§

impl Clone for Severity

§

fn clone(&self) -> Severity

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Severity

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Hash for Severity

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for Severity

§

fn eq(&self, other: &Severity) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for Severity

§

fn partial_cmp(&self, other: &Severity) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Copy for Severity

§

impl Eq for Severity

§

impl StructuralPartialEq for Severity

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/index.html b/compiler-docs/fe_common/diagnostics/cs/index.html new file mode 100644 index 0000000000..f6aff2a335 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/index.html @@ -0,0 +1,3 @@ +fe_common::diagnostics::cs - Rust

Module cs

Expand description

Diagnostic data structures.

+

Structs§

Diagnostic
Represents a diagnostic message that can provide information like errors and +warnings to the user.
Label
A label describing an underlined region of code associated with a diagnostic.

Enums§

LabelStyle
Severity
A severity level for diagnostic messages.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/sidebar-items.js b/compiler-docs/fe_common/diagnostics/cs/sidebar-items.js new file mode 100644 index 0000000000..7d8844f436 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["LabelStyle","Severity"],"struct":["Diagnostic","Label"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html b/compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html new file mode 100644 index 0000000000..0f20f85412 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html @@ -0,0 +1,59 @@ +Diagnostic in fe_common::diagnostics::cs - Rust

Struct Diagnostic

pub struct Diagnostic<FileId> {
+    pub severity: Severity,
+    pub code: Option<String>,
+    pub message: String,
+    pub labels: Vec<Label<FileId>>,
+    pub notes: Vec<String>,
+}
Expand description

Represents a diagnostic message that can provide information like errors and +warnings to the user.

+

The position of a Diagnostic is considered to be the position of the Label that has the earliest starting position and has the highest style which appears in all the labels of the diagnostic.

+

Fields§

§severity: Severity

The overall severity of the diagnostic

+
§code: Option<String>

An optional code that identifies this diagnostic.

+
§message: String

The main message associated with this diagnostic.

+

These should not include line breaks, and in order support the ‘short’ +diagnostic display mod, the message should be specific enough to make +sense on its own, without additional context provided by labels and notes.

+
§labels: Vec<Label<FileId>>

Source labels that describe the cause of the diagnostic. +The order of the labels inside the vector does not have any meaning. +The labels are always arranged in the order they appear in the source code.

+
§notes: Vec<String>

Notes that are associated with the primary cause of the diagnostic. +These can include line breaks for improved formatting.

+

Implementations§

§

impl<FileId> Diagnostic<FileId>

pub fn new(severity: Severity) -> Diagnostic<FileId>

Create a new diagnostic.

+

pub fn bug() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Bug.

+

pub fn error() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Error.

+

pub fn warning() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Warning.

+

pub fn note() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Note.

+

pub fn help() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Help.

+

pub fn with_code(self, code: impl Into<String>) -> Diagnostic<FileId>

Set the error code of the diagnostic.

+

pub fn with_message(self, message: impl Into<String>) -> Diagnostic<FileId>

Set the message of the diagnostic.

+

pub fn with_labels(self, labels: Vec<Label<FileId>>) -> Diagnostic<FileId>

Add some labels to the diagnostic.

+

pub fn with_notes(self, notes: Vec<String>) -> Diagnostic<FileId>

Add some notes to the diagnostic.

+

Trait Implementations§

§

impl<FileId> Clone for Diagnostic<FileId>
where + FileId: Clone,

§

fn clone(&self) -> Diagnostic<FileId>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<FileId> Debug for Diagnostic<FileId>
where + FileId: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<FileId> PartialEq for Diagnostic<FileId>
where + FileId: PartialEq,

§

fn eq(&self, other: &Diagnostic<FileId>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<FileId> Eq for Diagnostic<FileId>
where + FileId: Eq,

§

impl<FileId> StructuralPartialEq for Diagnostic<FileId>

Auto Trait Implementations§

§

impl<FileId> Freeze for Diagnostic<FileId>

§

impl<FileId> RefUnwindSafe for Diagnostic<FileId>
where + FileId: RefUnwindSafe,

§

impl<FileId> Send for Diagnostic<FileId>
where + FileId: Send,

§

impl<FileId> Sync for Diagnostic<FileId>
where + FileId: Sync,

§

impl<FileId> Unpin for Diagnostic<FileId>
where + FileId: Unpin,

§

impl<FileId> UnwindSafe for Diagnostic<FileId>
where + FileId: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/struct.Label.html b/compiler-docs/fe_common/diagnostics/cs/struct.Label.html new file mode 100644 index 0000000000..5bdd0ba665 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/struct.Label.html @@ -0,0 +1,52 @@ +Label in fe_common::diagnostics::cs - Rust

Struct Label

pub struct Label<FileId> {
+    pub style: LabelStyle,
+    pub file_id: FileId,
+    pub range: Range<usize>,
+    pub message: String,
+}
Expand description

A label describing an underlined region of code associated with a diagnostic.

+

Fields§

§style: LabelStyle

The style of the label.

+
§file_id: FileId

The file that we are labelling.

+
§range: Range<usize>

The range in bytes we are going to include in the final snippet.

+
§message: String

An optional message to provide some additional information for the +underlined code. These should not include line breaks.

+

Implementations§

§

impl<FileId> Label<FileId>

pub fn new( + style: LabelStyle, + file_id: FileId, + range: impl Into<Range<usize>>, +) -> Label<FileId>

Create a new label.

+

pub fn primary(file_id: FileId, range: impl Into<Range<usize>>) -> Label<FileId>

Create a new label with a style of LabelStyle::Primary.

+

pub fn secondary( + file_id: FileId, + range: impl Into<Range<usize>>, +) -> Label<FileId>

Create a new label with a style of LabelStyle::Secondary.

+

pub fn with_message(self, message: impl Into<String>) -> Label<FileId>

Add a message to the diagnostic.

+

Trait Implementations§

§

impl<FileId> Clone for Label<FileId>
where + FileId: Clone,

§

fn clone(&self) -> Label<FileId>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<FileId> Debug for Label<FileId>
where + FileId: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<FileId> PartialEq for Label<FileId>
where + FileId: PartialEq,

§

fn eq(&self, other: &Label<FileId>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<FileId> Eq for Label<FileId>
where + FileId: Eq,

§

impl<FileId> StructuralPartialEq for Label<FileId>

Auto Trait Implementations§

§

impl<FileId> Freeze for Label<FileId>
where + FileId: Freeze,

§

impl<FileId> RefUnwindSafe for Label<FileId>
where + FileId: RefUnwindSafe,

§

impl<FileId> Send for Label<FileId>
where + FileId: Send,

§

impl<FileId> Sync for Label<FileId>
where + FileId: Sync,

§

impl<FileId> Unpin for Label<FileId>
where + FileId: Unpin,

§

impl<FileId> UnwindSafe for Label<FileId>
where + FileId: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/enum.LabelStyle.html b/compiler-docs/fe_common/diagnostics/enum.LabelStyle.html new file mode 100644 index 0000000000..0038871f01 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/enum.LabelStyle.html @@ -0,0 +1,25 @@ +LabelStyle in fe_common::diagnostics - Rust

Enum LabelStyle

Source
pub enum LabelStyle {
+    Primary,
+    Secondary,
+}

Variants§

§

Primary

§

Secondary

Trait Implementations§

Source§

impl Clone for LabelStyle

Source§

fn clone(&self) -> LabelStyle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LabelStyle

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<LabelStyle> for LabelStyle

Source§

fn from(other: LabelStyle) -> LabelStyle

Converts to this type from the input type.
Source§

impl Hash for LabelStyle

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for LabelStyle

Source§

fn eq(&self, other: &LabelStyle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for LabelStyle

Source§

impl Eq for LabelStyle

Source§

impl StructuralPartialEq for LabelStyle

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/enum.Severity.html b/compiler-docs/fe_common/diagnostics/enum.Severity.html new file mode 100644 index 0000000000..7d2acc1776 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/enum.Severity.html @@ -0,0 +1,46 @@ +Severity in fe_common::diagnostics - Rust

Enum Severity

pub enum Severity {
+    Bug,
+    Error,
+    Warning,
+    Note,
+    Help,
+}
Expand description

A severity level for diagnostic messages.

+

These are ordered in the following way:

+ +
use codespan_reporting::diagnostic::Severity;
+
+assert!(Severity::Bug > Severity::Error);
+assert!(Severity::Error > Severity::Warning);
+assert!(Severity::Warning > Severity::Note);
+assert!(Severity::Note > Severity::Help);
+

Variants§

§

Bug

An unexpected bug.

+
§

Error

An error.

+
§

Warning

A warning.

+
§

Note

A note.

+
§

Help

A help message.

+

Trait Implementations§

§

impl Clone for Severity

§

fn clone(&self) -> Severity

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Severity

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Hash for Severity

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for Severity

§

fn eq(&self, other: &Severity) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for Severity

§

fn partial_cmp(&self, other: &Severity) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Copy for Severity

§

impl Eq for Severity

§

impl StructuralPartialEq for Severity

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html b/compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html new file mode 100644 index 0000000000..9b8f102f54 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html @@ -0,0 +1,5 @@ +diagnostics_string in fe_common::diagnostics - Rust

Function diagnostics_string

Source
pub fn diagnostics_string(
+    db: &dyn SourceDb,
+    diagnostics: &[Diagnostic],
+) -> String
Expand description

Format the given diagnostics as a string.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html b/compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html new file mode 100644 index 0000000000..3f075ba6d4 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html @@ -0,0 +1,2 @@ +print_diagnostics in fe_common::diagnostics - Rust

Function print_diagnostics

Source
pub fn print_diagnostics(db: &dyn SourceDb, diagnostics: &[Diagnostic])
Expand description

Print the given diagnostics to stderr.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/index.html b/compiler-docs/fe_common/diagnostics/index.html new file mode 100644 index 0000000000..92681af402 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/index.html @@ -0,0 +1 @@ +fe_common::diagnostics - Rust

Module diagnostics

Source

Modules§

cs
Diagnostic data structures.

Structs§

Diagnostic
Label

Enums§

LabelStyle
Severity
A severity level for diagnostic messages.

Functions§

diagnostics_string
Format the given diagnostics as a string.
print_diagnostics
Print the given diagnostics to stderr.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/sidebar-items.js b/compiler-docs/fe_common/diagnostics/sidebar-items.js new file mode 100644 index 0000000000..5e0b6da6a8 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["LabelStyle","Severity"],"fn":["diagnostics_string","print_diagnostics"],"mod":["cs"],"struct":["Diagnostic","Label"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/struct.Diagnostic.html b/compiler-docs/fe_common/diagnostics/struct.Diagnostic.html new file mode 100644 index 0000000000..f86c13f20f --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/struct.Diagnostic.html @@ -0,0 +1,27 @@ +Diagnostic in fe_common::diagnostics - Rust

Struct Diagnostic

Source
pub struct Diagnostic {
+    pub severity: Severity,
+    pub message: String,
+    pub labels: Vec<Label>,
+    pub notes: Vec<String>,
+}

Fields§

§severity: Severity§message: String§labels: Vec<Label>§notes: Vec<String>

Implementations§

Source§

impl Diagnostic

Source

pub fn into_cs(self) -> Diagnostic<SourceFileId>

Source

pub fn error(message: String) -> Self

Trait Implementations§

Source§

impl Clone for Diagnostic

Source§

fn clone(&self) -> Diagnostic

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Diagnostic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Diagnostic

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Diagnostic

Source§

fn eq(&self, other: &Diagnostic) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Diagnostic

Source§

impl StructuralPartialEq for Diagnostic

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/struct.Label.html b/compiler-docs/fe_common/diagnostics/struct.Label.html new file mode 100644 index 0000000000..0b234605b0 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/struct.Label.html @@ -0,0 +1,31 @@ +Label in fe_common::diagnostics - Rust

Struct Label

Source
pub struct Label {
+    pub style: LabelStyle,
+    pub span: Span,
+    pub message: String,
+}

Fields§

§style: LabelStyle§span: Span§message: String

Implementations§

Source§

impl Label

Source

pub fn primary<S: Into<String>>(span: Span, message: S) -> Self

Create a primary label with the given message. This will underline the +given span with carets (^^^^).

+
Source

pub fn secondary<S: Into<String>>(span: Span, message: S) -> Self

Create a secondary label with the given message. This will underline the +given span with hyphens (----).

+
Source

pub fn into_cs_label(self) -> Label<SourceFileId>

Convert into a [codespan_reporting::Diagnostic::Label]

+

Trait Implementations§

Source§

impl Clone for Label

Source§

fn clone(&self) -> Label

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Label

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Label

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Label

Source§

fn eq(&self, other: &Label) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Label

Source§

impl StructuralPartialEq for Label

Auto Trait Implementations§

§

impl Freeze for Label

§

impl RefUnwindSafe for Label

§

impl Send for Label

§

impl Sync for Label

§

impl Unpin for Label

§

impl UnwindSafe for Label

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/enum.FileKind.html b/compiler-docs/fe_common/files/enum.FileKind.html new file mode 100644 index 0000000000..31a9ce3600 --- /dev/null +++ b/compiler-docs/fe_common/files/enum.FileKind.html @@ -0,0 +1,27 @@ +FileKind in fe_common::files - Rust

Enum FileKind

Source
pub enum FileKind {
+    Local,
+    Std,
+}

Variants§

§

Local

User file; either part of the target project or an imported ingot

+
§

Std

File is part of the fe standard library

+

Trait Implementations§

Source§

impl Clone for FileKind

Source§

fn clone(&self) -> FileKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FileKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FileKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FileKind

Source§

fn eq(&self, other: &FileKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for FileKind

Source§

impl Eq for FileKind

Source§

impl StructuralPartialEq for FileKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/enum.Utf8Component.html b/compiler-docs/fe_common/files/enum.Utf8Component.html new file mode 100644 index 0000000000..7340642b8f --- /dev/null +++ b/compiler-docs/fe_common/files/enum.Utf8Component.html @@ -0,0 +1,79 @@ +Utf8Component in fe_common::files - Rust

Enum Utf8Component

pub enum Utf8Component<'a> {
+    Prefix(Utf8PrefixComponent<'a>),
+    RootDir,
+    CurDir,
+    ParentDir,
+    Normal(&'a str),
+}
Expand description

A single component of a path.

+

A Utf8Component roughly corresponds to a substring between path separators +(/ or \).

+

This enum is created by iterating over [Utf8Components], which in turn is +created by the components method on Utf8Path.

+

§Examples

+
use camino::{Utf8Component, Utf8Path};
+
+let path = Utf8Path::new("/tmp/foo/bar.txt");
+let components = path.components().collect::<Vec<_>>();
+assert_eq!(&components, &[
+    Utf8Component::RootDir,
+    Utf8Component::Normal("tmp"),
+    Utf8Component::Normal("foo"),
+    Utf8Component::Normal("bar.txt"),
+]);
+

Variants§

§

Prefix(Utf8PrefixComponent<'a>)

A Windows path prefix, e.g., C: or \\server\share.

+

There is a large variety of prefix types, see [Utf8Prefix]’s documentation +for more.

+

Does not occur on Unix.

+
§

RootDir

The root directory component, appears after any prefix and before anything else.

+

It represents a separator that designates that a path starts from root.

+
§

CurDir

A reference to the current directory, i.e., ..

+
§

ParentDir

A reference to the parent directory, i.e., ...

+
§

Normal(&'a str)

A normal component, e.g., a and b in a/b.

+

This variant is the most common one, it represents references to files +or directories.

+

Implementations§

§

impl<'a> Utf8Component<'a>

pub fn as_str(&self) -> &'a str

Extracts the underlying str slice.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("./tmp/foo/bar.txt");
+let components: Vec<_> = path.components().map(|comp| comp.as_str()).collect();
+assert_eq!(&components, &[".", "tmp", "foo", "bar.txt"]);
+

pub fn as_os_str(&self) -> &'a OsStr

Extracts the underlying OsStr slice.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("./tmp/foo/bar.txt");
+let components: Vec<_> = path.components().map(|comp| comp.as_os_str()).collect();
+assert_eq!(&components, &[".", "tmp", "foo", "bar.txt"]);
+

Trait Implementations§

§

impl AsRef<OsStr> for Utf8Component<'_>

§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Path> for Utf8Component<'_>

§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8Component<'_>

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<str> for Utf8Component<'_>

§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
§

impl<'a> Clone for Utf8Component<'a>

§

fn clone(&self) -> Utf8Component<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<'a> Debug for Utf8Component<'a>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'a> Display for Utf8Component<'a>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'a> Hash for Utf8Component<'a>

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl<'a> Ord for Utf8Component<'a>

§

fn cmp(&self, other: &Utf8Component<'a>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
§

impl<'a> PartialEq for Utf8Component<'a>

§

fn eq(&self, other: &Utf8Component<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a> PartialOrd for Utf8Component<'a>

§

fn partial_cmp(&self, other: &Utf8Component<'a>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a> Copy for Utf8Component<'a>

§

impl<'a> Eq for Utf8Component<'a>

§

impl<'a> StructuralPartialEq for Utf8Component<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for Utf8Component<'a>

§

impl<'a> RefUnwindSafe for Utf8Component<'a>

§

impl<'a> Send for Utf8Component<'a>

§

impl<'a> Sync for Utf8Component<'a>

§

impl<'a> Unpin for Utf8Component<'a>

§

impl<'a> UnwindSafe for Utf8Component<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/fn.common_prefix.html b/compiler-docs/fe_common/files/fn.common_prefix.html new file mode 100644 index 0000000000..e561b808cf --- /dev/null +++ b/compiler-docs/fe_common/files/fn.common_prefix.html @@ -0,0 +1,3 @@ +common_prefix in fe_common::files - Rust

Function common_prefix

Source
pub fn common_prefix(left: &Utf8Path, right: &Utf8Path) -> Utf8PathBuf
Expand description

Returns the common prefix of two paths. If the paths are identical, +returns the path parent.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/index.html b/compiler-docs/fe_common/files/index.html new file mode 100644 index 0000000000..1de297a896 --- /dev/null +++ b/compiler-docs/fe_common/files/index.html @@ -0,0 +1,2 @@ +fe_common::files - Rust

Module files

Source

Re-exports§

pub use fe_library::include_dir;

Structs§

File
SourceFileId
Utf8Path
A slice of a UTF-8 path (akin to str).
Utf8PathBuf
An owned, mutable UTF-8 path (akin to String).

Enums§

FileKind
Utf8Component
A single component of a path.

Functions§

common_prefix
Returns the common prefix of two paths. If the paths are identical, +returns the path parent.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/sidebar-items.js b/compiler-docs/fe_common/files/sidebar-items.js new file mode 100644 index 0000000000..2d536dd89a --- /dev/null +++ b/compiler-docs/fe_common/files/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["FileKind","Utf8Component"],"fn":["common_prefix"],"struct":["File","SourceFileId","Utf8Path","Utf8PathBuf"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.File.html b/compiler-docs/fe_common/files/struct.File.html new file mode 100644 index 0000000000..1010a0e9cb --- /dev/null +++ b/compiler-docs/fe_common/files/struct.File.html @@ -0,0 +1,30 @@ +File in fe_common::files - Rust

Struct File

Source
pub struct File {
+    pub kind: FileKind,
+    pub path: Rc<Utf8PathBuf>,
+}

Fields§

§kind: FileKind

Differentiates between local source files and fe std lib +files, which may have the same path (for salsa’s sake).

+
§path: Rc<Utf8PathBuf>

Path of the file. May include src/ dir or longer prefix; +this prefix will be stored in the Ingot::src_path, and stripped +off as needed.

+

Trait Implementations§

Source§

impl Clone for File

Source§

fn clone(&self) -> File

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for File

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for File

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for File

Source§

fn eq(&self, other: &File) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for File

Source§

impl StructuralPartialEq for File

Auto Trait Implementations§

§

impl Freeze for File

§

impl RefUnwindSafe for File

§

impl !Send for File

§

impl !Sync for File

§

impl Unpin for File

§

impl UnwindSafe for File

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.SourceFileId.html b/compiler-docs/fe_common/files/struct.SourceFileId.html new file mode 100644 index 0000000000..1d866de848 --- /dev/null +++ b/compiler-docs/fe_common/files/struct.SourceFileId.html @@ -0,0 +1,33 @@ +SourceFileId in fe_common::files - Rust

Struct SourceFileId

Source
pub struct SourceFileId(/* private fields */);

Implementations§

Source§

impl SourceFileId

Source

pub fn new_local(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self

Source

pub fn new_std(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self

Source

pub fn new( + db: &mut dyn SourceDb, + kind: FileKind, + path: &str, + content: Rc<str>, +) -> Self

Source

pub fn path(&self, db: &dyn SourceDb) -> Rc<Utf8PathBuf>

Source

pub fn content(&self, db: &dyn SourceDb) -> Rc<str>

Source

pub fn line_index(&self, db: &dyn SourceDb, byte_index: usize) -> usize

Source

pub fn line_range( + &self, + db: &dyn SourceDb, + line_index: usize, +) -> Option<Range<usize>>

Source

pub fn dummy_file() -> Self

Source

pub fn is_dummy(self) -> bool

Trait Implementations§

Source§

impl Clone for SourceFileId

Source§

fn clone(&self) -> SourceFileId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SourceFileId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for SourceFileId

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for SourceFileId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for SourceFileId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl PartialEq for SourceFileId

Source§

fn eq(&self, other: &SourceFileId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for SourceFileId

Source§

impl Eq for SourceFileId

Source§

impl StructuralPartialEq for SourceFileId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.Utf8Path.html b/compiler-docs/fe_common/files/struct.Utf8Path.html new file mode 100644 index 0000000000..eef3a2983b --- /dev/null +++ b/compiler-docs/fe_common/files/struct.Utf8Path.html @@ -0,0 +1,667 @@ +Utf8Path in fe_common::files - Rust

Struct Utf8Path

pub struct Utf8Path(/* private fields */);
Expand description

A slice of a UTF-8 path (akin to str).

+

This type supports a number of operations for inspecting a path, including +breaking the path into its components (separated by / on Unix and by either +/ or \ on Windows), extracting the file name, determining whether the path +is absolute, and so on.

+

This is an unsized type, meaning that it must always be used behind a +pointer like & or Box. For an owned version of this type, +see Utf8PathBuf.

+

§Examples

+
use camino::Utf8Path;
+
+// Note: this example does work on Windows
+let path = Utf8Path::new("./foo/bar.txt");
+
+let parent = path.parent();
+assert_eq!(parent, Some(Utf8Path::new("./foo")));
+
+let file_stem = path.file_stem();
+assert_eq!(file_stem, Some("bar"));
+
+let extension = path.extension();
+assert_eq!(extension, Some("txt"));
+

Implementations§

§

impl Utf8Path

pub fn new(s: &(impl AsRef<str> + ?Sized)) -> &Utf8Path

Directly wraps a string slice as a Utf8Path slice.

+

This is a cost-free conversion.

+
§Examples
+
use camino::Utf8Path;
+
+Utf8Path::new("foo.txt");
+

You can create Utf8Paths from Strings, or even other Utf8Paths:

+ +
use camino::Utf8Path;
+
+let string = String::from("foo.txt");
+let from_string = Utf8Path::new(&string);
+let from_path = Utf8Path::new(&from_string);
+assert_eq!(from_string, from_path);
+

pub fn from_path(path: &Path) -> Option<&Utf8Path>

Converts a Path to a Utf8Path.

+

Returns None if the path is not valid UTF-8.

+

For a version that returns a type that implements std::error::Error, use the +TryFrom<&Path> impl.

+
§Examples
+
use camino::Utf8Path;
+use std::ffi::OsStr;
+use std::os::unix::ffi::OsStrExt;
+use std::path::Path;
+
+let unicode_path = Path::new("/valid/unicode");
+Utf8Path::from_path(unicode_path).expect("valid Unicode path succeeded");
+
+// Paths on Unix can be non-UTF-8.
+let non_unicode_str = OsStr::from_bytes(b"\xFF\xFF\xFF");
+let non_unicode_path = Path::new(non_unicode_str);
+assert!(Utf8Path::from_path(non_unicode_path).is_none(), "non-Unicode path failed");
+

pub fn as_std_path(&self) -> &Path

Converts a Utf8Path to a Path.

+

This is equivalent to the AsRef<&Path> for &Utf8Path impl, but may aid in type inference.

+
§Examples
+
use camino::Utf8Path;
+use std::path::Path;
+
+let utf8_path = Utf8Path::new("foo.txt");
+let std_path: &Path = utf8_path.as_std_path();
+assert_eq!(std_path.to_str(), Some("foo.txt"));
+
+// Convert back to a Utf8Path.
+let new_utf8_path = Utf8Path::from_path(std_path).unwrap();
+assert_eq!(new_utf8_path, "foo.txt");
+

pub fn as_str(&self) -> &str

Yields the underlying str slice.

+

Unlike Path::to_str, this always returns a slice because the contents of a Utf8Path +are guaranteed to be valid UTF-8.

+
§Examples
+
use camino::Utf8Path;
+
+let s = Utf8Path::new("foo.txt").as_str();
+assert_eq!(s, "foo.txt");
+

pub fn as_os_str(&self) -> &OsStr

Yields the underlying OsStr slice.

+
§Examples
+
use camino::Utf8Path;
+
+let os_str = Utf8Path::new("foo.txt").as_os_str();
+assert_eq!(os_str, std::ffi::OsStr::new("foo.txt"));
+

pub fn to_path_buf(&self) -> Utf8PathBuf

Converts a Utf8Path to an owned Utf8PathBuf.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path_buf = Utf8Path::new("foo.txt").to_path_buf();
+assert_eq!(path_buf, Utf8PathBuf::from("foo.txt"));
+

pub fn is_absolute(&self) -> bool

Returns true if the Utf8Path is absolute, i.e., if it is independent of +the current directory.

+
    +
  • +

    On Unix, a path is absolute if it starts with the root, so +is_absolute and has_root are equivalent.

    +
  • +
  • +

    On Windows, a path is absolute if it has a prefix and starts with the +root: c:\windows is absolute, while c:temp and \temp are not.

    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(!Utf8Path::new("foo.txt").is_absolute());
+

pub fn is_relative(&self) -> bool

Returns true if the Utf8Path is relative, i.e., not absolute.

+

See is_absolute’s documentation for more details.

+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("foo.txt").is_relative());
+

pub fn has_root(&self) -> bool

Returns true if the Utf8Path has a root.

+
    +
  • +

    On Unix, a path has a root if it begins with /.

    +
  • +
  • +

    On Windows, a path has a root if it:

    +
      +
    • has no prefix and begins with a separator, e.g., \windows
    • +
    • has a prefix followed by a separator, e.g., c:\windows but not c:windows
    • +
    • has any non-disk prefix, e.g., \\server\share
    • +
    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("/etc/passwd").has_root());
+

pub fn parent(&self) -> Option<&Utf8Path>

Returns the Path without its final component, if there is one.

+

Returns None if the path terminates in a root or prefix.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/foo/bar");
+let parent = path.parent().unwrap();
+assert_eq!(parent, Utf8Path::new("/foo"));
+
+let grand_parent = parent.parent().unwrap();
+assert_eq!(grand_parent, Utf8Path::new("/"));
+assert_eq!(grand_parent.parent(), None);
+

pub fn ancestors(&self) -> Utf8Ancestors<'_>

Produces an iterator over Utf8Path and its ancestors.

+

The iterator will yield the Utf8Path that is returned if the parent method is used zero +or more times. That means, the iterator will yield &self, &self.parent().unwrap(), +&self.parent().unwrap().parent().unwrap() and so on. If the parent method returns +None, the iterator will do likewise. The iterator will always yield at least one value, +namely &self.

+
§Examples
+
use camino::Utf8Path;
+
+let mut ancestors = Utf8Path::new("/foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/")));
+assert_eq!(ancestors.next(), None);
+
+let mut ancestors = Utf8Path::new("../foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("..")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("")));
+assert_eq!(ancestors.next(), None);
+

pub fn file_name(&self) -> Option<&str>

Returns the final component of the Utf8Path, if there is one.

+

If the path is a normal file, this is the file name. If it’s the path of a directory, this +is the directory name.

+

Returns None if the path terminates in ...

+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!(Some("bin"), Utf8Path::new("/usr/bin/").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("tmp/foo.txt").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.//").file_name());
+assert_eq!(None, Utf8Path::new("foo.txt/..").file_name());
+assert_eq!(None, Utf8Path::new("/").file_name());
+

pub fn strip_prefix( + &self, + base: impl AsRef<Path>, +) -> Result<&Utf8Path, StripPrefixError>

Returns a path that, when joined onto base, yields self.

+
§Errors
+

If base is not a prefix of self (i.e., starts_with +returns false), returns Err.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/test/haha/foo.txt");
+
+assert_eq!(path.strip_prefix("/"), Ok(Utf8Path::new("test/haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt"), Ok(Utf8Path::new("")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt/"), Ok(Utf8Path::new("")));
+
+assert!(path.strip_prefix("test").is_err());
+assert!(path.strip_prefix("/haha").is_err());
+
+let prefix = Utf8PathBuf::from("/test/");
+assert_eq!(path.strip_prefix(prefix), Ok(Utf8Path::new("haha/foo.txt")));
+

pub fn starts_with(&self, base: impl AsRef<Path>) -> bool

Determines whether base is a prefix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/passwd");
+
+assert!(path.starts_with("/etc"));
+assert!(path.starts_with("/etc/"));
+assert!(path.starts_with("/etc/passwd"));
+assert!(path.starts_with("/etc/passwd/")); // extra slash is okay
+assert!(path.starts_with("/etc/passwd///")); // multiple extra slashes are okay
+
+assert!(!path.starts_with("/e"));
+assert!(!path.starts_with("/etc/passwd.txt"));
+
+assert!(!Utf8Path::new("/etc/foo.rs").starts_with("/etc/foo"));
+

pub fn ends_with(&self, base: impl AsRef<Path>) -> bool

Determines whether child is a suffix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/resolv.conf");
+
+assert!(path.ends_with("resolv.conf"));
+assert!(path.ends_with("etc/resolv.conf"));
+assert!(path.ends_with("/etc/resolv.conf"));
+
+assert!(!path.ends_with("/resolv.conf"));
+assert!(!path.ends_with("conf")); // use .extension() instead
+

pub fn file_stem(&self) -> Option<&str>

Extracts the stem (non-extension) portion of self.file_name.

+

The stem is:

+
    +
  • None, if there is no file name;
  • +
  • The entire file name if there is no embedded .;
  • +
  • The entire file name if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name before the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("foo", Utf8Path::new("foo.rs").file_stem().unwrap());
+assert_eq!("foo.tar", Utf8Path::new("foo.tar.gz").file_stem().unwrap());
+

pub fn extension(&self) -> Option<&str>

Extracts the extension of self.file_name, if possible.

+

The extension is:

+
    +
  • None, if there is no file name;
  • +
  • None, if there is no embedded .;
  • +
  • None, if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name after the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("rs", Utf8Path::new("foo.rs").extension().unwrap());
+assert_eq!("gz", Utf8Path::new("foo.tar.gz").extension().unwrap());
+

pub fn join(&self, path: impl AsRef<Utf8Path>) -> Utf8PathBuf

Creates an owned Utf8PathBuf with path adjoined to self.

+

See Utf8PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+assert_eq!(Utf8Path::new("/etc").join("passwd"), Utf8PathBuf::from("/etc/passwd"));
+

pub fn join_os(&self, path: impl AsRef<Path>) -> PathBuf

Creates an owned PathBuf with path adjoined to self.

+

See PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+assert_eq!(Utf8Path::new("/etc").join_os("passwd"), PathBuf::from("/etc/passwd"));
+

pub fn with_file_name(&self, file_name: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given file name.

+

See Utf8PathBuf::set_file_name for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/tmp/foo.txt");
+assert_eq!(path.with_file_name("bar.txt"), Utf8PathBuf::from("/tmp/bar.txt"));
+
+let path = Utf8Path::new("/tmp");
+assert_eq!(path.with_file_name("var"), Utf8PathBuf::from("/var"));
+

pub fn with_extension(&self, extension: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given extension.

+

See Utf8PathBuf::set_extension for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("foo.rs");
+assert_eq!(path.with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+
+let path = Utf8Path::new("foo.tar.gz");
+assert_eq!(path.with_extension(""), Utf8PathBuf::from("foo.tar"));
+assert_eq!(path.with_extension("xz"), Utf8PathBuf::from("foo.tar.xz"));
+assert_eq!(path.with_extension("").with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+

pub fn components(&self) -> Utf8Components<'_>

Produces an iterator over the Utf8Components of the path.

+

When parsing the path, there is a small amount of normalization:

+
    +
  • +

    Repeated separators are ignored, so a/b and a//b both have +a and b as components.

    +
  • +
  • +

    Occurrences of . are normalized away, except if they are at the +beginning of the path. For example, a/./b, a/b/, a/b/. and +a/b all have a and b as components, but ./a/b starts with +an additional CurDir component.

    +
  • +
  • +

    A trailing slash is normalized away, /a/b and /a/b/ are equivalent.

    +
  • +
+

Note that no other normalization takes place; in particular, a/c +and a/b/../c are distinct, to account for the possibility that b +is a symbolic link (so its parent isn’t a).

+
§Examples
+
use camino::{Utf8Component, Utf8Path};
+
+let mut components = Utf8Path::new("/tmp/foo.txt").components();
+
+assert_eq!(components.next(), Some(Utf8Component::RootDir));
+assert_eq!(components.next(), Some(Utf8Component::Normal("tmp")));
+assert_eq!(components.next(), Some(Utf8Component::Normal("foo.txt")));
+assert_eq!(components.next(), None)
+

pub fn iter(&self) -> Iter<'_>

Produces an iterator over the path’s components viewed as str +slices.

+

For more information about the particulars of how the path is separated +into components, see components.

+
§Examples
+
use camino::Utf8Path;
+
+let mut it = Utf8Path::new("/tmp/foo.txt").iter();
+assert_eq!(it.next(), Some(std::path::MAIN_SEPARATOR.to_string().as_str()));
+assert_eq!(it.next(), Some("tmp"));
+assert_eq!(it.next(), Some("foo.txt"));
+assert_eq!(it.next(), None)
+

pub fn metadata(&self) -> Result<Metadata, Error>

Queries the file system to get information about a file, directory, etc.

+

This function will traverse symbolic links to query information about the +destination file.

+

This is an alias to fs::metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.metadata().expect("metadata call failed");
+println!("{:?}", metadata.file_type());
+

Queries the metadata about a file without following symlinks.

+

This is an alias to fs::symlink_metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.symlink_metadata().expect("symlink_metadata call failed");
+println!("{:?}", metadata.file_type());
+

pub fn canonicalize(&self) -> Result<PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +canonicalize_utf8.

+

This is an alias to fs::canonicalize.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize().unwrap(), PathBuf::from("/foo/test/bar.rs"));
+

pub fn canonicalize_utf8(&self) -> Result<Utf8PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see +canonicalize.

+
§Errors
+

The I/O operation may return an error: see the fs::canonicalize +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize_utf8().unwrap(), Utf8PathBuf::from("/foo/test/bar.rs"));
+

Reads a symbolic link, returning the file that the link points to.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +read_link_utf8.

+

This is an alias to fs::read_link.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link().expect("read_link call failed");
+

Reads a symbolic link, returning the file that the link points to.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see read_link.

+
§Errors
+

The I/O operation may return an error: see the fs::read_link +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link_utf8().expect("read_link call failed");
+

pub fn read_dir(&self) -> Result<ReadDir, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<fs::DirEntry>. New +errors may be encountered after an iterator is initially constructed.

+

This is an alias to fs::read_dir.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{:?}", entry.path());
+    }
+}
+

pub fn read_dir_utf8(&self) -> Result<ReadDirUtf8, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<[Utf8DirEntry]>. New +errors may be encountered after an iterator is initially constructed.

+
§Errors
+

The I/O operation may return an error: see the fs::read_dir +documentation for more.

+

If a directory entry is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir_utf8().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{}", entry.path());
+    }
+}
+

pub fn exists(&self) -> bool

Returns true if the path points at an existing entity.

+

Warning: this method may be error-prone, consider using try_exists() instead! +It also has a risk of introducing time-of-check to time-of-use (TOCTOU) bugs.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").exists());
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata.

+

pub fn try_exists(&self) -> Result<bool, Error>

Returns Ok(true) if the path points at an existing entity.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return Ok(false).

+

As opposed to the exists() method, this one doesn’t silently ignore errors +unrelated to the path not existing. (E.g. it will return Err(_) in case of permission +denied on some of the parent directories.)

+

Note that while this avoids some pitfalls of the exists() method, it still can not +prevent time-of-check to time-of-use (TOCTOU) bugs. You should only use it in scenarios +where those bugs are not an issue.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").try_exists().expect("Can't check existence of file does_not_exist.txt"));
+assert!(Utf8Path::new("/root/secret_file.txt").try_exists().is_err());
+

pub fn is_file(&self) -> bool

Returns true if the path exists on disk and is pointing at a regular file.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_file(), false);
+assert_eq!(Utf8Path::new("a_file.txt").is_file(), true);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_file if it was Ok.

+

When the goal is simply to read from (or write to) the source, the most +reliable way to test the source can be read (or written to) is to open +it. Only using is_file can break workflows like diff <( prog_a ) on +a Unix-like system for example. See fs::File::open or +fs::OpenOptions::open for more information.

+

pub fn is_dir(&self) -> bool

Returns true if the path exists on disk and is pointing at a directory.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_dir(), true);
+assert_eq!(Utf8Path::new("a_file.txt").is_dir(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_dir if it was Ok.

+

Returns true if the path exists on disk and is pointing at a symbolic link.

+

This function will not traverse symbolic links. +In case of a broken symbolic link this will also return true.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+use std::os::unix::fs::symlink;
+
+let link_path = Utf8Path::new("link");
+symlink("/origin_does_not_exist/", link_path).unwrap();
+assert_eq!(link_path.is_symlink(), true);
+assert_eq!(link_path.exists(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call Utf8Path::symlink_metadata and handle its Result. Then call +fs::Metadata::is_symlink if it was Ok.

+

pub fn into_path_buf(self: Box<Utf8Path>) -> Utf8PathBuf

Converts a Box<Utf8Path> into a Utf8PathBuf without copying or allocating.

+

Trait Implementations§

§

impl AsRef<OsStr> for Utf8Path

§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Path> for Utf8Path

§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8Component<'_>

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8Path

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8PathBuf

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for str

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<str> for Utf8Path

§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
§

impl Borrow<Utf8Path> for Utf8PathBuf

§

fn borrow(&self) -> &Utf8Path

Immutably borrows from an owned value. Read more
§

impl Debug for Utf8Path

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Display for Utf8Path

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'a> From<&'a str> for &'a Utf8Path

§

fn from(s: &'a str) -> &'a Utf8Path

Converts to this type from the input type.
§

impl Hash for Utf8Path

§

fn hash<H>(&self, state: &mut H)
where + H: Hasher,

Feeds this value into the given Hasher. Read more
§

impl<'a> IntoIterator for &'a Utf8Path

§

type Item = &'a str

The type of the elements being iterated over.
§

type IntoIter = Iter<'a>

Which kind of iterator are we turning this into?
§

fn into_iter(self) -> Iter<'a>

Creates an iterator from a value. Read more
§

impl Ord for Utf8Path

§

fn cmp(&self, other: &Utf8Path) -> Ordering

This method returns an Ordering between self and other. Read more
§

impl<'a, 'b> PartialEq<&'a OsStr> for Utf8Path

§

fn eq(&self, other: &&'a OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Path> for Utf8Path

§

fn eq(&self, other: &&'a Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for OsStr

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for Path

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for str

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a str> for Utf8Path

§

fn eq(&self, other: &&'a str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, OsStr>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, OsStr>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Path>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Utf8Path>> for &'b Utf8Path

§

fn eq(&self, other: &Cow<'a, Utf8Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Utf8Path>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, Utf8Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, str>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, str>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'b, OsStr>> for &'a Utf8Path

§

fn eq(&self, other: &Cow<'b, OsStr>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'b, Path>> for &'a Utf8Path

§

fn eq(&self, other: &Cow<'b, Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'b, str>> for &'a Utf8Path

§

fn eq(&self, other: &Cow<'b, str>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsStr> for &'a Utf8Path

§

fn eq(&self, other: &OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsStr> for Utf8Path

§

fn eq(&self, other: &OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsString> for &'a Utf8Path

§

fn eq(&self, other: &OsString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsString> for Utf8Path

§

fn eq(&self, other: &OsString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Path> for &'a Utf8Path

§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Path> for Utf8Path

§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<PathBuf> for &'a Utf8Path

§

fn eq(&self, other: &PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<PathBuf> for Utf8Path

§

fn eq(&self, other: &PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<String> for &'a Utf8Path

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<String> for Utf8Path

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for &'a OsStr

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for &'a Path

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for &'a str

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for OsStr

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for Path

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for str

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<str> for &'a Utf8Path

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<str> for Utf8Path

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq for Utf8Path

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialOrd<&'a OsStr> for Utf8Path

§

fn partial_cmp(&self, other: &&'a OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Path> for Utf8Path

§

fn partial_cmp(&self, other: &&'a Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for OsStr

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for Path

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for str

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a str> for Utf8Path

§

fn partial_cmp(&self, other: &&'a str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, OsStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Path>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Utf8Path>> for &'b Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, Utf8Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Utf8Path>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, Utf8Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, str>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'b, OsStr>> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Cow<'b, OsStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'b, Path>> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Cow<'b, Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'b, str>> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Cow<'b, str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsStr> for &'a Utf8Path

§

fn partial_cmp(&self, other: &OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsStr> for Utf8Path

§

fn partial_cmp(&self, other: &OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsString> for &'a Utf8Path

§

fn partial_cmp(&self, other: &OsString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsString> for Utf8Path

§

fn partial_cmp(&self, other: &OsString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Path> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Path> for Utf8Path

§

fn partial_cmp(&self, other: &Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<PathBuf> for &'a Utf8Path

§

fn partial_cmp(&self, other: &PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<PathBuf> for Utf8Path

§

fn partial_cmp(&self, other: &PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<String> for &'a Utf8Path

§

fn partial_cmp(&self, other: &String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<String> for Utf8Path

§

fn partial_cmp(&self, other: &String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for &'a OsStr

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for &'a Path

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for &'a str

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for OsStr

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for Path

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for str

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<str> for &'a Utf8Path

§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<str> for Utf8Path

§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl PartialOrd for Utf8Path

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl ToOwned for Utf8Path

§

type Owned = Utf8PathBuf

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> Utf8PathBuf

Creates owned data from borrowed data, usually by cloning. Read more
1.63.0 · Source§

fn clone_into(&self, target: &mut Self::Owned)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<'a> TryFrom<&'a Path> for &'a Utf8Path

§

type Error = FromPathError

The type returned in the event of a conversion error.
§

fn try_from( + path: &'a Path, +) -> Result<&'a Utf8Path, <&'a Utf8Path as TryFrom<&'a Path>>::Error>

Performs the conversion.
§

impl Eq for Utf8Path

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.Utf8PathBuf.html b/compiler-docs/fe_common/files/struct.Utf8PathBuf.html new file mode 100644 index 0000000000..32735f1084 --- /dev/null +++ b/compiler-docs/fe_common/files/struct.Utf8PathBuf.html @@ -0,0 +1,768 @@ +Utf8PathBuf in fe_common::files - Rust

Struct Utf8PathBuf

pub struct Utf8PathBuf(/* private fields */);
Expand description

An owned, mutable UTF-8 path (akin to String).

+

This type provides methods like push and set_extension that mutate +the path in place. It also implements Deref to Utf8Path, meaning that +all methods on Utf8Path slices are available on Utf8PathBuf values as well.

+

§Examples

+

You can use push to build up a Utf8PathBuf from +components:

+ +
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::new();
+
+path.push(r"C:\");
+path.push("windows");
+path.push("system32");
+
+path.set_extension("dll");
+

However, push is best used for dynamic situations. This is a better way +to do this when you know all of the components ahead of time:

+ +
use camino::Utf8PathBuf;
+
+let path: Utf8PathBuf = [r"C:\", "windows", "system32.dll"].iter().collect();
+

We can still do better than this! Since these are all strings, we can use +From::from:

+ +
use camino::Utf8PathBuf;
+
+let path = Utf8PathBuf::from(r"C:\windows\system32.dll");
+

Which method works best depends on what kind of situation you’re in.

+

Implementations§

§

impl Utf8PathBuf

pub fn new() -> Utf8PathBuf

Allocates an empty Utf8PathBuf.

+
§Examples
+
use camino::Utf8PathBuf;
+
+let path = Utf8PathBuf::new();
+

pub fn from_path_buf(path: PathBuf) -> Result<Utf8PathBuf, PathBuf>

Creates a new Utf8PathBuf from a PathBuf containing valid UTF-8 characters.

+

Errors with the original PathBuf if it is not valid UTF-8.

+

For a version that returns a type that implements std::error::Error, use the +TryFrom<PathBuf> impl.

+
§Examples
+
use camino::Utf8PathBuf;
+use std::ffi::OsStr;
+use std::os::unix::ffi::OsStrExt;
+use std::path::PathBuf;
+
+let unicode_path = PathBuf::from("/valid/unicode");
+Utf8PathBuf::from_path_buf(unicode_path).expect("valid Unicode path succeeded");
+
+// Paths on Unix can be non-UTF-8.
+let non_unicode_str = OsStr::from_bytes(b"\xFF\xFF\xFF");
+let non_unicode_path = PathBuf::from(non_unicode_str);
+Utf8PathBuf::from_path_buf(non_unicode_path).expect_err("non-Unicode path failed");
+

pub fn into_std_path_buf(self) -> PathBuf

Converts a Utf8PathBuf to a PathBuf.

+

This is equivalent to the From<Utf8PathBuf> for PathBuf impl, but may aid in type +inference.

+
§Examples
+
use camino::Utf8PathBuf;
+use std::path::PathBuf;
+
+let utf8_path_buf = Utf8PathBuf::from("foo.txt");
+let std_path_buf = utf8_path_buf.into_std_path_buf();
+assert_eq!(std_path_buf.to_str(), Some("foo.txt"));
+
+// Convert back to a Utf8PathBuf.
+let new_utf8_path_buf = Utf8PathBuf::from_path_buf(std_path_buf).unwrap();
+assert_eq!(new_utf8_path_buf, "foo.txt");
+

pub fn with_capacity(capacity: usize) -> Utf8PathBuf

Creates a new Utf8PathBuf with a given capacity used to create the internal PathBuf. +See with_capacity defined on PathBuf.

+

Requires Rust 1.44 or newer.

+
§Examples
+
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::with_capacity(10);
+let capacity = path.capacity();
+
+// This push is done without reallocating
+path.push(r"C:\");
+
+assert_eq!(capacity, path.capacity());
+

pub fn as_path(&self) -> &Utf8Path

Coerces to a Utf8Path slice.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let p = Utf8PathBuf::from("/test");
+assert_eq!(Utf8Path::new("/test"), p.as_path());
+

pub fn push(&mut self, path: impl AsRef<Utf8Path>)

Extends self with path.

+

If path is absolute, it replaces the current path.

+

On Windows:

+
    +
  • if path has a root but no prefix (e.g., \windows), it +replaces everything except for the prefix (if any) of self.
  • +
  • if path has a prefix but no root, it replaces self.
  • +
+
§Examples
+

Pushing a relative path extends the existing path:

+ +
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::from("/tmp");
+path.push("file.bk");
+assert_eq!(path, Utf8PathBuf::from("/tmp/file.bk"));
+

Pushing an absolute path replaces the existing path:

+ +
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::from("/tmp");
+path.push("/etc");
+assert_eq!(path, Utf8PathBuf::from("/etc"));
+

pub fn pop(&mut self) -> bool

Truncates self to self.parent.

+

Returns false and does nothing if self.parent is None. +Otherwise, returns true.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let mut p = Utf8PathBuf::from("/spirited/away.rs");
+
+p.pop();
+assert_eq!(Utf8Path::new("/spirited"), p);
+p.pop();
+assert_eq!(Utf8Path::new("/"), p);
+

pub fn set_file_name(&mut self, file_name: impl AsRef<str>)

Updates self.file_name to file_name.

+

If self.file_name was None, this is equivalent to pushing +file_name.

+

Otherwise it is equivalent to calling pop and then pushing +file_name. The new path will be a sibling of the original path. +(That is, it will have the same parent.)

+
§Examples
+
use camino::Utf8PathBuf;
+
+let mut buf = Utf8PathBuf::from("/");
+assert_eq!(buf.file_name(), None);
+buf.set_file_name("bar");
+assert_eq!(buf, Utf8PathBuf::from("/bar"));
+assert!(buf.file_name().is_some());
+buf.set_file_name("baz.txt");
+assert_eq!(buf, Utf8PathBuf::from("/baz.txt"));
+

pub fn set_extension(&mut self, extension: impl AsRef<str>) -> bool

Updates self.extension to extension.

+

Returns false and does nothing if self.file_name is None, +returns true and updates the extension otherwise.

+

If self.extension is None, the extension is added; otherwise +it is replaced.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let mut p = Utf8PathBuf::from("/feel/the");
+
+p.set_extension("force");
+assert_eq!(Utf8Path::new("/feel/the.force"), p.as_path());
+
+p.set_extension("dark_side");
+assert_eq!(Utf8Path::new("/feel/the.dark_side"), p.as_path());
+

pub fn into_string(self) -> String

Consumes the Utf8PathBuf, yielding its internal String storage.

+
§Examples
+
use camino::Utf8PathBuf;
+
+let p = Utf8PathBuf::from("/the/head");
+let s = p.into_string();
+assert_eq!(s, "/the/head");
+

pub fn into_os_string(self) -> OsString

Consumes the Utf8PathBuf, yielding its internal OsString storage.

+
§Examples
+
use camino::Utf8PathBuf;
+use std::ffi::OsStr;
+
+let p = Utf8PathBuf::from("/the/head");
+let s = p.into_os_string();
+assert_eq!(s, OsStr::new("/the/head"));
+

pub fn into_boxed_path(self) -> Box<Utf8Path>

Converts this Utf8PathBuf into a boxed Utf8Path.

+

pub fn capacity(&self) -> usize

Invokes capacity on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn clear(&mut self)

Invokes clear on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn reserve(&mut self, additional: usize)

Invokes reserve on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Invokes try_reserve on the underlying instance of PathBuf.

+

Requires Rust 1.63 or newer.

+

pub fn reserve_exact(&mut self, additional: usize)

Invokes reserve_exact on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn try_reserve_exact( + &mut self, + additional: usize, +) -> Result<(), TryReserveError>

Invokes try_reserve_exact on the underlying instance of PathBuf.

+

Requires Rust 1.63 or newer.

+

pub fn shrink_to_fit(&mut self)

Invokes shrink_to_fit on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn shrink_to(&mut self, min_capacity: usize)

Invokes shrink_to on the underlying instance of PathBuf.

+

Requires Rust 1.56 or newer.

+

Methods from Deref<Target = Utf8Path>§

pub fn as_std_path(&self) -> &Path

Converts a Utf8Path to a Path.

+

This is equivalent to the AsRef<&Path> for &Utf8Path impl, but may aid in type inference.

+
§Examples
+
use camino::Utf8Path;
+use std::path::Path;
+
+let utf8_path = Utf8Path::new("foo.txt");
+let std_path: &Path = utf8_path.as_std_path();
+assert_eq!(std_path.to_str(), Some("foo.txt"));
+
+// Convert back to a Utf8Path.
+let new_utf8_path = Utf8Path::from_path(std_path).unwrap();
+assert_eq!(new_utf8_path, "foo.txt");
+

pub fn as_str(&self) -> &str

Yields the underlying str slice.

+

Unlike Path::to_str, this always returns a slice because the contents of a Utf8Path +are guaranteed to be valid UTF-8.

+
§Examples
+
use camino::Utf8Path;
+
+let s = Utf8Path::new("foo.txt").as_str();
+assert_eq!(s, "foo.txt");
+

pub fn as_os_str(&self) -> &OsStr

Yields the underlying OsStr slice.

+
§Examples
+
use camino::Utf8Path;
+
+let os_str = Utf8Path::new("foo.txt").as_os_str();
+assert_eq!(os_str, std::ffi::OsStr::new("foo.txt"));
+

pub fn to_path_buf(&self) -> Utf8PathBuf

Converts a Utf8Path to an owned Utf8PathBuf.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path_buf = Utf8Path::new("foo.txt").to_path_buf();
+assert_eq!(path_buf, Utf8PathBuf::from("foo.txt"));
+

pub fn is_absolute(&self) -> bool

Returns true if the Utf8Path is absolute, i.e., if it is independent of +the current directory.

+
    +
  • +

    On Unix, a path is absolute if it starts with the root, so +is_absolute and has_root are equivalent.

    +
  • +
  • +

    On Windows, a path is absolute if it has a prefix and starts with the +root: c:\windows is absolute, while c:temp and \temp are not.

    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(!Utf8Path::new("foo.txt").is_absolute());
+

pub fn is_relative(&self) -> bool

Returns true if the Utf8Path is relative, i.e., not absolute.

+

See is_absolute’s documentation for more details.

+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("foo.txt").is_relative());
+

pub fn has_root(&self) -> bool

Returns true if the Utf8Path has a root.

+
    +
  • +

    On Unix, a path has a root if it begins with /.

    +
  • +
  • +

    On Windows, a path has a root if it:

    +
      +
    • has no prefix and begins with a separator, e.g., \windows
    • +
    • has a prefix followed by a separator, e.g., c:\windows but not c:windows
    • +
    • has any non-disk prefix, e.g., \\server\share
    • +
    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("/etc/passwd").has_root());
+

pub fn parent(&self) -> Option<&Utf8Path>

Returns the Path without its final component, if there is one.

+

Returns None if the path terminates in a root or prefix.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/foo/bar");
+let parent = path.parent().unwrap();
+assert_eq!(parent, Utf8Path::new("/foo"));
+
+let grand_parent = parent.parent().unwrap();
+assert_eq!(grand_parent, Utf8Path::new("/"));
+assert_eq!(grand_parent.parent(), None);
+

pub fn ancestors(&self) -> Utf8Ancestors<'_>

Produces an iterator over Utf8Path and its ancestors.

+

The iterator will yield the Utf8Path that is returned if the parent method is used zero +or more times. That means, the iterator will yield &self, &self.parent().unwrap(), +&self.parent().unwrap().parent().unwrap() and so on. If the parent method returns +None, the iterator will do likewise. The iterator will always yield at least one value, +namely &self.

+
§Examples
+
use camino::Utf8Path;
+
+let mut ancestors = Utf8Path::new("/foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/")));
+assert_eq!(ancestors.next(), None);
+
+let mut ancestors = Utf8Path::new("../foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("..")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("")));
+assert_eq!(ancestors.next(), None);
+

pub fn file_name(&self) -> Option<&str>

Returns the final component of the Utf8Path, if there is one.

+

If the path is a normal file, this is the file name. If it’s the path of a directory, this +is the directory name.

+

Returns None if the path terminates in ...

+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!(Some("bin"), Utf8Path::new("/usr/bin/").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("tmp/foo.txt").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.//").file_name());
+assert_eq!(None, Utf8Path::new("foo.txt/..").file_name());
+assert_eq!(None, Utf8Path::new("/").file_name());
+

pub fn strip_prefix( + &self, + base: impl AsRef<Path>, +) -> Result<&Utf8Path, StripPrefixError>

Returns a path that, when joined onto base, yields self.

+
§Errors
+

If base is not a prefix of self (i.e., starts_with +returns false), returns Err.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/test/haha/foo.txt");
+
+assert_eq!(path.strip_prefix("/"), Ok(Utf8Path::new("test/haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt"), Ok(Utf8Path::new("")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt/"), Ok(Utf8Path::new("")));
+
+assert!(path.strip_prefix("test").is_err());
+assert!(path.strip_prefix("/haha").is_err());
+
+let prefix = Utf8PathBuf::from("/test/");
+assert_eq!(path.strip_prefix(prefix), Ok(Utf8Path::new("haha/foo.txt")));
+

pub fn starts_with(&self, base: impl AsRef<Path>) -> bool

Determines whether base is a prefix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/passwd");
+
+assert!(path.starts_with("/etc"));
+assert!(path.starts_with("/etc/"));
+assert!(path.starts_with("/etc/passwd"));
+assert!(path.starts_with("/etc/passwd/")); // extra slash is okay
+assert!(path.starts_with("/etc/passwd///")); // multiple extra slashes are okay
+
+assert!(!path.starts_with("/e"));
+assert!(!path.starts_with("/etc/passwd.txt"));
+
+assert!(!Utf8Path::new("/etc/foo.rs").starts_with("/etc/foo"));
+

pub fn ends_with(&self, base: impl AsRef<Path>) -> bool

Determines whether child is a suffix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/resolv.conf");
+
+assert!(path.ends_with("resolv.conf"));
+assert!(path.ends_with("etc/resolv.conf"));
+assert!(path.ends_with("/etc/resolv.conf"));
+
+assert!(!path.ends_with("/resolv.conf"));
+assert!(!path.ends_with("conf")); // use .extension() instead
+

pub fn file_stem(&self) -> Option<&str>

Extracts the stem (non-extension) portion of self.file_name.

+

The stem is:

+
    +
  • None, if there is no file name;
  • +
  • The entire file name if there is no embedded .;
  • +
  • The entire file name if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name before the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("foo", Utf8Path::new("foo.rs").file_stem().unwrap());
+assert_eq!("foo.tar", Utf8Path::new("foo.tar.gz").file_stem().unwrap());
+

pub fn extension(&self) -> Option<&str>

Extracts the extension of self.file_name, if possible.

+

The extension is:

+
    +
  • None, if there is no file name;
  • +
  • None, if there is no embedded .;
  • +
  • None, if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name after the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("rs", Utf8Path::new("foo.rs").extension().unwrap());
+assert_eq!("gz", Utf8Path::new("foo.tar.gz").extension().unwrap());
+

pub fn join(&self, path: impl AsRef<Utf8Path>) -> Utf8PathBuf

Creates an owned Utf8PathBuf with path adjoined to self.

+

See Utf8PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+assert_eq!(Utf8Path::new("/etc").join("passwd"), Utf8PathBuf::from("/etc/passwd"));
+

pub fn join_os(&self, path: impl AsRef<Path>) -> PathBuf

Creates an owned PathBuf with path adjoined to self.

+

See PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+assert_eq!(Utf8Path::new("/etc").join_os("passwd"), PathBuf::from("/etc/passwd"));
+

pub fn with_file_name(&self, file_name: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given file name.

+

See Utf8PathBuf::set_file_name for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/tmp/foo.txt");
+assert_eq!(path.with_file_name("bar.txt"), Utf8PathBuf::from("/tmp/bar.txt"));
+
+let path = Utf8Path::new("/tmp");
+assert_eq!(path.with_file_name("var"), Utf8PathBuf::from("/var"));
+

pub fn with_extension(&self, extension: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given extension.

+

See Utf8PathBuf::set_extension for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("foo.rs");
+assert_eq!(path.with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+
+let path = Utf8Path::new("foo.tar.gz");
+assert_eq!(path.with_extension(""), Utf8PathBuf::from("foo.tar"));
+assert_eq!(path.with_extension("xz"), Utf8PathBuf::from("foo.tar.xz"));
+assert_eq!(path.with_extension("").with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+

pub fn components(&self) -> Utf8Components<'_>

Produces an iterator over the Utf8Components of the path.

+

When parsing the path, there is a small amount of normalization:

+
    +
  • +

    Repeated separators are ignored, so a/b and a//b both have +a and b as components.

    +
  • +
  • +

    Occurrences of . are normalized away, except if they are at the +beginning of the path. For example, a/./b, a/b/, a/b/. and +a/b all have a and b as components, but ./a/b starts with +an additional CurDir component.

    +
  • +
  • +

    A trailing slash is normalized away, /a/b and /a/b/ are equivalent.

    +
  • +
+

Note that no other normalization takes place; in particular, a/c +and a/b/../c are distinct, to account for the possibility that b +is a symbolic link (so its parent isn’t a).

+
§Examples
+
use camino::{Utf8Component, Utf8Path};
+
+let mut components = Utf8Path::new("/tmp/foo.txt").components();
+
+assert_eq!(components.next(), Some(Utf8Component::RootDir));
+assert_eq!(components.next(), Some(Utf8Component::Normal("tmp")));
+assert_eq!(components.next(), Some(Utf8Component::Normal("foo.txt")));
+assert_eq!(components.next(), None)
+

pub fn iter(&self) -> Iter<'_>

Produces an iterator over the path’s components viewed as str +slices.

+

For more information about the particulars of how the path is separated +into components, see components.

+
§Examples
+
use camino::Utf8Path;
+
+let mut it = Utf8Path::new("/tmp/foo.txt").iter();
+assert_eq!(it.next(), Some(std::path::MAIN_SEPARATOR.to_string().as_str()));
+assert_eq!(it.next(), Some("tmp"));
+assert_eq!(it.next(), Some("foo.txt"));
+assert_eq!(it.next(), None)
+

pub fn metadata(&self) -> Result<Metadata, Error>

Queries the file system to get information about a file, directory, etc.

+

This function will traverse symbolic links to query information about the +destination file.

+

This is an alias to fs::metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.metadata().expect("metadata call failed");
+println!("{:?}", metadata.file_type());
+

Queries the metadata about a file without following symlinks.

+

This is an alias to fs::symlink_metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.symlink_metadata().expect("symlink_metadata call failed");
+println!("{:?}", metadata.file_type());
+

pub fn canonicalize(&self) -> Result<PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +canonicalize_utf8.

+

This is an alias to fs::canonicalize.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize().unwrap(), PathBuf::from("/foo/test/bar.rs"));
+

pub fn canonicalize_utf8(&self) -> Result<Utf8PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see +canonicalize.

+
§Errors
+

The I/O operation may return an error: see the fs::canonicalize +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize_utf8().unwrap(), Utf8PathBuf::from("/foo/test/bar.rs"));
+

Reads a symbolic link, returning the file that the link points to.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +read_link_utf8.

+

This is an alias to fs::read_link.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link().expect("read_link call failed");
+

Reads a symbolic link, returning the file that the link points to.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see read_link.

+
§Errors
+

The I/O operation may return an error: see the fs::read_link +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link_utf8().expect("read_link call failed");
+

pub fn read_dir(&self) -> Result<ReadDir, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<fs::DirEntry>. New +errors may be encountered after an iterator is initially constructed.

+

This is an alias to fs::read_dir.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{:?}", entry.path());
+    }
+}
+

pub fn read_dir_utf8(&self) -> Result<ReadDirUtf8, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<[Utf8DirEntry]>. New +errors may be encountered after an iterator is initially constructed.

+
§Errors
+

The I/O operation may return an error: see the fs::read_dir +documentation for more.

+

If a directory entry is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir_utf8().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{}", entry.path());
+    }
+}
+

pub fn exists(&self) -> bool

Returns true if the path points at an existing entity.

+

Warning: this method may be error-prone, consider using try_exists() instead! +It also has a risk of introducing time-of-check to time-of-use (TOCTOU) bugs.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").exists());
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata.

+

pub fn try_exists(&self) -> Result<bool, Error>

Returns Ok(true) if the path points at an existing entity.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return Ok(false).

+

As opposed to the exists() method, this one doesn’t silently ignore errors +unrelated to the path not existing. (E.g. it will return Err(_) in case of permission +denied on some of the parent directories.)

+

Note that while this avoids some pitfalls of the exists() method, it still can not +prevent time-of-check to time-of-use (TOCTOU) bugs. You should only use it in scenarios +where those bugs are not an issue.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").try_exists().expect("Can't check existence of file does_not_exist.txt"));
+assert!(Utf8Path::new("/root/secret_file.txt").try_exists().is_err());
+

pub fn is_file(&self) -> bool

Returns true if the path exists on disk and is pointing at a regular file.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_file(), false);
+assert_eq!(Utf8Path::new("a_file.txt").is_file(), true);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_file if it was Ok.

+

When the goal is simply to read from (or write to) the source, the most +reliable way to test the source can be read (or written to) is to open +it. Only using is_file can break workflows like diff <( prog_a ) on +a Unix-like system for example. See fs::File::open or +fs::OpenOptions::open for more information.

+

pub fn is_dir(&self) -> bool

Returns true if the path exists on disk and is pointing at a directory.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_dir(), true);
+assert_eq!(Utf8Path::new("a_file.txt").is_dir(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_dir if it was Ok.

+

Returns true if the path exists on disk and is pointing at a symbolic link.

+

This function will not traverse symbolic links. +In case of a broken symbolic link this will also return true.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+use std::os::unix::fs::symlink;
+
+let link_path = Utf8Path::new("link");
+symlink("/origin_does_not_exist/", link_path).unwrap();
+assert_eq!(link_path.is_symlink(), true);
+assert_eq!(link_path.exists(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call Utf8Path::symlink_metadata and handle its Result. Then call +fs::Metadata::is_symlink if it was Ok.

+

Trait Implementations§

§

impl AsRef<OsStr> for Utf8PathBuf

§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Path> for Utf8PathBuf

§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8PathBuf

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<str> for Utf8PathBuf

§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
§

impl Borrow<Utf8Path> for Utf8PathBuf

§

fn borrow(&self) -> &Utf8Path

Immutably borrows from an owned value. Read more
§

impl Clone for Utf8PathBuf

§

fn clone(&self) -> Utf8PathBuf

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Utf8PathBuf

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for Utf8PathBuf

§

fn default() -> Utf8PathBuf

Returns the “default value” for a type. Read more
§

impl Deref for Utf8PathBuf

§

type Target = Utf8Path

The resulting type after dereferencing.
§

fn deref(&self) -> &Utf8Path

Dereferences the value.
§

impl Display for Utf8PathBuf

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<P> Extend<P> for Utf8PathBuf
where + P: AsRef<Utf8Path>,

§

fn extend<I>(&mut self, iter: I)
where + I: IntoIterator<Item = P>,

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
§

impl<T> From<&T> for Utf8PathBuf
where + T: AsRef<str> + ?Sized,

§

fn from(s: &T) -> Utf8PathBuf

Converts to this type from the input type.
§

impl From<Box<Utf8Path>> for Utf8PathBuf

§

fn from(path: Box<Utf8Path>) -> Utf8PathBuf

Converts to this type from the input type.
§

impl<'a> From<Cow<'a, Utf8Path>> for Utf8PathBuf

§

fn from(path: Cow<'a, Utf8Path>) -> Utf8PathBuf

Converts to this type from the input type.
§

impl From<String> for Utf8PathBuf

§

fn from(string: String) -> Utf8PathBuf

Converts to this type from the input type.
§

impl<P> FromIterator<P> for Utf8PathBuf
where + P: AsRef<Utf8Path>,

§

fn from_iter<I>(iter: I) -> Utf8PathBuf
where + I: IntoIterator<Item = P>,

Creates a value from an iterator. Read more
§

impl FromStr for Utf8PathBuf

§

type Err = Infallible

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<Utf8PathBuf, <Utf8PathBuf as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl Hash for Utf8PathBuf

§

fn hash<H>(&self, state: &mut H)
where + H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl<'a> IntoIterator for &'a Utf8PathBuf

§

type Item = &'a str

The type of the elements being iterated over.
§

type IntoIter = Iter<'a>

Which kind of iterator are we turning this into?
§

fn into_iter(self) -> Iter<'a>

Creates an iterator from a value. Read more
§

impl Ord for Utf8PathBuf

§

fn cmp(&self, other: &Utf8PathBuf) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
§

impl<'a, 'b> PartialEq<&'a OsStr> for Utf8PathBuf

§

fn eq(&self, other: &&'a OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Path> for Utf8PathBuf

§

fn eq(&self, other: &&'a Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a str> for Utf8PathBuf

§

fn eq(&self, other: &&'a str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, OsStr>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, OsStr>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Path>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Utf8Path>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, Utf8Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, str>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, str>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsStr> for Utf8PathBuf

§

fn eq(&self, other: &OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsString> for Utf8PathBuf

§

fn eq(&self, other: &OsString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Path> for Utf8PathBuf

§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<PathBuf> for Utf8PathBuf

§

fn eq(&self, other: &PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<String> for Utf8PathBuf

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a OsStr

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a str

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for OsStr

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for str

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<str> for Utf8PathBuf

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq for Utf8PathBuf

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialOrd<&'a OsStr> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a str> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, OsStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Path>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Utf8Path>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, Utf8Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, str>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsStr> for Utf8PathBuf

§

fn partial_cmp(&self, other: &OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsString> for Utf8PathBuf

§

fn partial_cmp(&self, other: &OsString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<PathBuf> for Utf8PathBuf

§

fn partial_cmp(&self, other: &PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<String> for Utf8PathBuf

§

fn partial_cmp(&self, other: &String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a OsStr

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a str

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for OsStr

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for str

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<str> for Utf8PathBuf

§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl PartialOrd for Utf8PathBuf

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl TryFrom<PathBuf> for Utf8PathBuf

§

type Error = FromPathBufError

The type returned in the event of a conversion error.
§

fn try_from( + path: PathBuf, +) -> Result<Utf8PathBuf, <Utf8PathBuf as TryFrom<PathBuf>>::Error>

Performs the conversion.
§

impl Eq for Utf8PathBuf

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<P, T> Receiver for P
where + P: Deref<Target = T> + ?Sized, + T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/index.html b/compiler-docs/fe_common/index.html new file mode 100644 index 0000000000..1ebb99b7d7 --- /dev/null +++ b/compiler-docs/fe_common/index.html @@ -0,0 +1,2 @@ +fe_common - Rust

Crate fe_common

Source

Re-exports§

pub use files::File;
pub use files::FileKind;
pub use files::SourceFileId;

Modules§

db
diagnostics
files
numeric
panic
utils

Macros§

assert_snapshot_wasm
assert_strings_eq
Compare the given strings and panic when not equal with a colorized line +diff.
impl_intern_key

Structs§

Span
An exclusive span of byte offsets in a source file.

Traits§

Spanned
\ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_snapshot_wasm!.html b/compiler-docs/fe_common/macro.assert_snapshot_wasm!.html new file mode 100644 index 0000000000..bbfb81b29d --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_snapshot_wasm!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_snapshot_wasm.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_snapshot_wasm.html b/compiler-docs/fe_common/macro.assert_snapshot_wasm.html new file mode 100644 index 0000000000..4a38efda6f --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_snapshot_wasm.html @@ -0,0 +1,3 @@ +assert_snapshot_wasm in fe_common - Rust

Macro assert_snapshot_wasm

Source
macro_rules! assert_snapshot_wasm {
+    ($path:expr, $actual:expr) => { ... };
+}
\ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_strings_eq!.html b/compiler-docs/fe_common/macro.assert_strings_eq!.html new file mode 100644 index 0000000000..65aac92273 --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_strings_eq!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_strings_eq.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_strings_eq.html b/compiler-docs/fe_common/macro.assert_strings_eq.html new file mode 100644 index 0000000000..cbeb698ad1 --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_strings_eq.html @@ -0,0 +1,7 @@ +assert_strings_eq in fe_common - Rust

Macro assert_strings_eq

Source
macro_rules! assert_strings_eq {
+    ($left:expr, $right:expr,) => { ... };
+    ($left:expr, $right:expr) => { ... };
+    ($left:expr, $right:expr, $($args:tt)*) => { ... };
+}
Expand description

Compare the given strings and panic when not equal with a colorized line +diff.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/macro.impl_intern_key!.html b/compiler-docs/fe_common/macro.impl_intern_key!.html new file mode 100644 index 0000000000..76c12bee1d --- /dev/null +++ b/compiler-docs/fe_common/macro.impl_intern_key!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.impl_intern_key.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/macro.impl_intern_key.html b/compiler-docs/fe_common/macro.impl_intern_key.html new file mode 100644 index 0000000000..de6ddd06cf --- /dev/null +++ b/compiler-docs/fe_common/macro.impl_intern_key.html @@ -0,0 +1,3 @@ +impl_intern_key in fe_common - Rust

Macro impl_intern_key

Source
macro_rules! impl_intern_key {
+    ($name:ident) => { ... };
+}
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/enum.Radix.html b/compiler-docs/fe_common/numeric/enum.Radix.html new file mode 100644 index 0000000000..93f441cea5 --- /dev/null +++ b/compiler-docs/fe_common/numeric/enum.Radix.html @@ -0,0 +1,27 @@ +Radix in fe_common::numeric - Rust

Enum Radix

Source
pub enum Radix {
+    Hexadecimal,
+    Decimal,
+    Octal,
+    Binary,
+}
Expand description

A type that represents the radix of a numeric literal.

+

Variants§

§

Hexadecimal

§

Decimal

§

Octal

§

Binary

Implementations§

Source§

impl Radix

Source

pub fn as_num(self) -> u32

Returns number representation of the radix.

+

Trait Implementations§

Source§

impl Clone for Radix

Source§

fn clone(&self) -> Radix

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Radix

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Radix

Source§

fn eq(&self, other: &Radix) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Radix

Source§

impl Eq for Radix

Source§

impl StructuralPartialEq for Radix

Auto Trait Implementations§

§

impl Freeze for Radix

§

impl RefUnwindSafe for Radix

§

impl Send for Radix

§

impl Sync for Radix

§

impl Unpin for Radix

§

impl UnwindSafe for Radix

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/fn.to_hex_str.html b/compiler-docs/fe_common/numeric/fn.to_hex_str.html new file mode 100644 index 0000000000..8f80143a9e --- /dev/null +++ b/compiler-docs/fe_common/numeric/fn.to_hex_str.html @@ -0,0 +1 @@ +to_hex_str in fe_common::numeric - Rust

Function to_hex_str

Source
pub fn to_hex_str(val: &BigInt) -> String
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/index.html b/compiler-docs/fe_common/numeric/index.html new file mode 100644 index 0000000000..26ea7e7c18 --- /dev/null +++ b/compiler-docs/fe_common/numeric/index.html @@ -0,0 +1 @@ +fe_common::numeric - Rust

Module numeric

Source

Structs§

Literal
A helper type to interpret a numeric literal represented by string.

Enums§

Radix
A type that represents the radix of a numeric literal.

Functions§

to_hex_str
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/sidebar-items.js b/compiler-docs/fe_common/numeric/sidebar-items.js new file mode 100644 index 0000000000..df6d260a4b --- /dev/null +++ b/compiler-docs/fe_common/numeric/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Radix"],"fn":["to_hex_str"],"struct":["Literal"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/struct.Literal.html b/compiler-docs/fe_common/numeric/struct.Literal.html new file mode 100644 index 0000000000..091e1054b6 --- /dev/null +++ b/compiler-docs/fe_common/numeric/struct.Literal.html @@ -0,0 +1,16 @@ +Literal in fe_common::numeric - Rust

Struct Literal

Source
pub struct Literal<'a> { /* private fields */ }
Expand description

A helper type to interpret a numeric literal represented by string.

+

Implementations§

Source§

impl<'a> Literal<'a>

Source

pub fn new(src: &'a str) -> Self

Source

pub fn parse<T: Num>(&self) -> Result<T, T::FromStrRadixErr>

Parse the numeric literal to T.

+
Source

pub fn radix(&self) -> Radix

Returns radix of the numeric literal.

+

Trait Implementations§

Source§

impl<'a> Clone for Literal<'a>

Source§

fn clone(&self) -> Literal<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for Literal<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Literal<'a>

§

impl<'a> RefUnwindSafe for Literal<'a>

§

impl<'a> Send for Literal<'a>

§

impl<'a> Sync for Literal<'a>

§

impl<'a> Unpin for Literal<'a>

§

impl<'a> UnwindSafe for Literal<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/panic/fn.install_panic_hook.html b/compiler-docs/fe_common/panic/fn.install_panic_hook.html new file mode 100644 index 0000000000..f689368c1f --- /dev/null +++ b/compiler-docs/fe_common/panic/fn.install_panic_hook.html @@ -0,0 +1 @@ +install_panic_hook in fe_common::panic - Rust

Function install_panic_hook

Source
pub fn install_panic_hook()
\ No newline at end of file diff --git a/compiler-docs/fe_common/panic/index.html b/compiler-docs/fe_common/panic/index.html new file mode 100644 index 0000000000..363a29d643 --- /dev/null +++ b/compiler-docs/fe_common/panic/index.html @@ -0,0 +1 @@ +fe_common::panic - Rust

Module panic

Source

Functions§

install_panic_hook
\ No newline at end of file diff --git a/compiler-docs/fe_common/panic/sidebar-items.js b/compiler-docs/fe_common/panic/sidebar-items.js new file mode 100644 index 0000000000..0ddac1d609 --- /dev/null +++ b/compiler-docs/fe_common/panic/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["install_panic_hook"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/sidebar-items.js b/compiler-docs/fe_common/sidebar-items.js new file mode 100644 index 0000000000..61d4b4f207 --- /dev/null +++ b/compiler-docs/fe_common/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"macro":["assert_snapshot_wasm","assert_strings_eq","impl_intern_key"],"mod":["db","diagnostics","files","numeric","panic","utils"],"struct":["Span"],"trait":["Spanned"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/span/struct.Span.html b/compiler-docs/fe_common/span/struct.Span.html new file mode 100644 index 0000000000..bed03a2164 --- /dev/null +++ b/compiler-docs/fe_common/span/struct.Span.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_common/struct.Span.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/span/trait.Spanned.html b/compiler-docs/fe_common/span/trait.Spanned.html new file mode 100644 index 0000000000..879084c593 --- /dev/null +++ b/compiler-docs/fe_common/span/trait.Spanned.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_common/trait.Spanned.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/struct.Span.html b/compiler-docs/fe_common/struct.Span.html new file mode 100644 index 0000000000..c10dd82ed6 --- /dev/null +++ b/compiler-docs/fe_common/struct.Span.html @@ -0,0 +1,37 @@ +Span in fe_common - Rust

Struct Span

Source
pub struct Span {
+    pub file_id: SourceFileId,
+    pub start: usize,
+    pub end: usize,
+}
Expand description

An exclusive span of byte offsets in a source file.

+

Fields§

§file_id: SourceFileId§start: usize

A byte offset specifying the inclusive start of a span.

+
§end: usize

A byte offset specifying the exclusive end of a span.

+

Implementations§

Source§

impl Span

Source

pub fn new(file_id: SourceFileId, start: usize, end: usize) -> Self

Source

pub fn zero(file_id: SourceFileId) -> Self

Source

pub fn dummy() -> Self

Source

pub fn is_dummy(&self) -> bool

Source

pub fn from_pair<S, E>(start_elem: S, end_elem: E) -> Self
where + S: Into<Span>, + E: Into<Span>,

Trait Implementations§

Source§

impl<'a, T> Add<&'a T> for Span
where + T: Spanned,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &'a T) -> Self

Performs the + operation. Read more
Source§

impl<'a, T> Add<Option<&'a T>> for Span
where + Span: Add<&'a T, Output = Self>,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<&'a T>) -> Self

Performs the + operation. Read more
Source§

impl Add<Option<Span>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<Span>) -> Self

Performs the + operation. Read more
Source§

impl Add for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Self) -> Self

Performs the + operation. Read more
Source§

impl<T> AddAssign<T> for Span
where + Span: Add<T, Output = Self>,

Source§

fn add_assign(&mut self, other: T)

Performs the += operation. Read more
Source§

impl Clone for Span

Source§

fn clone(&self) -> Span

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Span

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Span

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl From<Span> for Range<usize>

Source§

fn from(span: Span) -> Self

Converts to this type from the input type.
Source§

impl Hash for Span

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Span

Source§

fn eq(&self, other: &Span) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Span

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for Span

Source§

impl Eq for Span

Source§

impl StructuralPartialEq for Span

Auto Trait Implementations§

§

impl Freeze for Span

§

impl RefUnwindSafe for Span

§

impl Send for Span

§

impl Sync for Span

§

impl Unpin for Span

§

impl UnwindSafe for Span

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_common/trait.Spanned.html b/compiler-docs/fe_common/trait.Spanned.html new file mode 100644 index 0000000000..c60650fd47 --- /dev/null +++ b/compiler-docs/fe_common/trait.Spanned.html @@ -0,0 +1,4 @@ +Spanned in fe_common - Rust

Trait Spanned

Source
pub trait Spanned {
+    // Required method
+    fn span(&self) -> Span;
+}

Required Methods§

Source

fn span(&self) -> Span

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html b/compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html new file mode 100644 index 0000000000..59ba5c4eb1 --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html @@ -0,0 +1 @@ +get_fe_deps in fe_common::utils::dirs - Rust

Function get_fe_deps

Source
pub fn get_fe_deps() -> PathBuf
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html b/compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html new file mode 100644 index 0000000000..226f38fb74 --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html @@ -0,0 +1 @@ +get_fe_home in fe_common::utils::dirs - Rust

Function get_fe_home

Source
pub fn get_fe_home() -> PathBuf
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/index.html b/compiler-docs/fe_common/utils/dirs/index.html new file mode 100644 index 0000000000..f0b817ca1f --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/index.html @@ -0,0 +1 @@ +fe_common::utils::dirs - Rust

Module dirs

Source

Functions§

get_fe_deps
get_fe_home
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/sidebar-items.js b/compiler-docs/fe_common/utils/dirs/sidebar-items.js new file mode 100644 index 0000000000..bc67f01f09 --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["get_fe_deps","get_fe_home"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/enum.DependencyKind.html b/compiler-docs/fe_common/utils/files/enum.DependencyKind.html new file mode 100644 index 0000000000..f2c5951cfa --- /dev/null +++ b/compiler-docs/fe_common/utils/files/enum.DependencyKind.html @@ -0,0 +1,16 @@ +DependencyKind in fe_common::utils::files - Rust

Enum DependencyKind

Source
pub enum DependencyKind {
+    Local(LocalDependency),
+    Git(GitDependency),
+}

Variants§

Trait Implementations§

Source§

impl Clone for DependencyKind

Source§

fn clone(&self) -> DependencyKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/enum.FileLoader.html b/compiler-docs/fe_common/utils/files/enum.FileLoader.html new file mode 100644 index 0000000000..d39651a4d0 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/enum.FileLoader.html @@ -0,0 +1,14 @@ +FileLoader in fe_common::utils::files - Rust

Enum FileLoader

Source
pub enum FileLoader {
+    Static(Vec<(&'static str, &'static str)>),
+    Fs,
+}

Variants§

§

Static(Vec<(&'static str, &'static str)>)

§

Fs

Implementations§

Source§

impl FileLoader

Source

pub fn canonicalize_path(&self, path: &str) -> Result<SmolStr, String>

Source

pub fn fe_files(&self, path: &str) -> Result<Vec<(String, String)>, String>

Source

pub fn file_content(&self, path: &str) -> Result<String, String>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/enum.ProjectMode.html b/compiler-docs/fe_common/utils/files/enum.ProjectMode.html new file mode 100644 index 0000000000..d48bec817d --- /dev/null +++ b/compiler-docs/fe_common/utils/files/enum.ProjectMode.html @@ -0,0 +1,23 @@ +ProjectMode in fe_common::utils::files - Rust

Enum ProjectMode

Source
pub enum ProjectMode {
+    Main,
+    Lib,
+}

Variants§

§

Main

§

Lib

Trait Implementations§

Source§

impl Clone for ProjectMode

Source§

fn clone(&self) -> ProjectMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl PartialEq for ProjectMode

Source§

fn eq(&self, other: &ProjectMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ProjectMode

Source§

impl Eq for ProjectMode

Source§

impl StructuralPartialEq for ProjectMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/fn.get_project_root.html b/compiler-docs/fe_common/utils/files/fn.get_project_root.html new file mode 100644 index 0000000000..c5ae00e171 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/fn.get_project_root.html @@ -0,0 +1,2 @@ +get_project_root in fe_common::utils::files - Rust

Function get_project_root

Source
pub fn get_project_root() -> Option<String>
Expand description

Returns the root path of the current Fe project

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/index.html b/compiler-docs/fe_common/utils/files/index.html new file mode 100644 index 0000000000..9ee0b8570c --- /dev/null +++ b/compiler-docs/fe_common/utils/files/index.html @@ -0,0 +1 @@ +fe_common::utils::files - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/sidebar-items.js b/compiler-docs/fe_common/utils/files/sidebar-items.js new file mode 100644 index 0000000000..aceea560a2 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DependencyKind","FileLoader","ProjectMode"],"fn":["get_project_root"],"struct":["BuildFiles","Dependency","GitDependency","LocalDependency","ProjectFiles"],"trait":["DependencyResolver"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.BuildFiles.html b/compiler-docs/fe_common/utils/files/struct.BuildFiles.html new file mode 100644 index 0000000000..42ab88cbc3 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.BuildFiles.html @@ -0,0 +1,19 @@ +BuildFiles in fe_common::utils::files - Rust

Struct BuildFiles

Source
pub struct BuildFiles {
+    pub root_project_path: SmolStr,
+    pub project_files: IndexMap<SmolStr, ProjectFiles>,
+}

Fields§

§root_project_path: SmolStr§project_files: IndexMap<SmolStr, ProjectFiles>

Implementations§

Source§

impl BuildFiles

Source

pub fn root_project_mode(&self) -> ProjectMode

Source

pub fn load_fs(root_path: &str) -> Result<Self, String>

Build files are loaded from the file system.

+
Source

pub fn load_static( + files: Vec<(&'static str, &'static str)>, + root_path: &str, +) -> Result<Self, String>

Build files are loaded from static file vector.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.Dependency.html b/compiler-docs/fe_common/utils/files/struct.Dependency.html new file mode 100644 index 0000000000..76f735a660 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.Dependency.html @@ -0,0 +1,18 @@ +Dependency in fe_common::utils::files - Rust

Struct Dependency

Source
pub struct Dependency {
+    pub name: SmolStr,
+    pub version: Option<SmolStr>,
+    pub canonicalized_path: SmolStr,
+    pub kind: DependencyKind,
+}

Fields§

§name: SmolStr§version: Option<SmolStr>§canonicalized_path: SmolStr§kind: DependencyKind

Trait Implementations§

Source§

impl Clone for Dependency

Source§

fn clone(&self) -> Dependency

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.GitDependency.html b/compiler-docs/fe_common/utils/files/struct.GitDependency.html new file mode 100644 index 0000000000..f00df75ff5 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.GitDependency.html @@ -0,0 +1,16 @@ +GitDependency in fe_common::utils::files - Rust

Struct GitDependency

Source
pub struct GitDependency { /* private fields */ }

Trait Implementations§

Source§

impl Clone for GitDependency

Source§

fn clone(&self) -> GitDependency

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DependencyResolver for GitDependency

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.LocalDependency.html b/compiler-docs/fe_common/utils/files/struct.LocalDependency.html new file mode 100644 index 0000000000..c11c14eb93 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.LocalDependency.html @@ -0,0 +1,16 @@ +LocalDependency in fe_common::utils::files - Rust

Struct LocalDependency

Source
pub struct LocalDependency;

Trait Implementations§

Source§

impl Clone for LocalDependency

Source§

fn clone(&self) -> LocalDependency

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DependencyResolver for LocalDependency

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.ProjectFiles.html b/compiler-docs/fe_common/utils/files/struct.ProjectFiles.html new file mode 100644 index 0000000000..384bca33d5 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.ProjectFiles.html @@ -0,0 +1,17 @@ +ProjectFiles in fe_common::utils::files - Rust

Struct ProjectFiles

Source
pub struct ProjectFiles {
+    pub name: SmolStr,
+    pub version: SmolStr,
+    pub mode: ProjectMode,
+    pub dependencies: Vec<Dependency>,
+    pub src: Vec<(String, String)>,
+}

Fields§

§name: SmolStr§version: SmolStr§mode: ProjectMode§dependencies: Vec<Dependency>§src: Vec<(String, String)>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/trait.DependencyResolver.html b/compiler-docs/fe_common/utils/files/trait.DependencyResolver.html new file mode 100644 index 0000000000..76f6fe6752 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/trait.DependencyResolver.html @@ -0,0 +1,10 @@ +DependencyResolver in fe_common::utils::files - Rust

Trait DependencyResolver

Source
pub trait DependencyResolver {
+    // Required method
+    fn resolve(
+        dep: &Dependency,
+        loader: &FileLoader,
+    ) -> Result<ProjectFiles, String>;
+}

Required Methods§

Source

fn resolve( + dep: &Dependency, + loader: &FileLoader, +) -> Result<ProjectFiles, String>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html b/compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html new file mode 100644 index 0000000000..ce992939e4 --- /dev/null +++ b/compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html @@ -0,0 +1,7 @@ +fetch_and_checkout in fe_common::utils::git - Rust

Function fetch_and_checkout

Source
pub fn fetch_and_checkout<P: AsRef<Path>>(
+    remote: &str,
+    target_directory: P,
+    refspec: &str,
+) -> Result<(), Box<dyn Error>>
Expand description

Fetch and checkout the specified refspec from the remote repository without +fetching any additional history.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/git/index.html b/compiler-docs/fe_common/utils/git/index.html new file mode 100644 index 0000000000..8d00af3236 --- /dev/null +++ b/compiler-docs/fe_common/utils/git/index.html @@ -0,0 +1,2 @@ +fe_common::utils::git - Rust

Module git

Source

Functions§

fetch_and_checkout
Fetch and checkout the specified refspec from the remote repository without +fetching any additional history.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/git/sidebar-items.js b/compiler-docs/fe_common/utils/git/sidebar-items.js new file mode 100644 index 0000000000..8528f078b2 --- /dev/null +++ b/compiler-docs/fe_common/utils/git/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["fetch_and_checkout"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html b/compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html new file mode 100644 index 0000000000..dc346697ce --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html @@ -0,0 +1,4 @@ +pluralize_conditionally in fe_common::utils::humanize - Rust

Function pluralize_conditionally

Source
pub fn pluralize_conditionally(
+    pluralizable: impl Pluralizable,
+    count: usize,
+) -> String
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/index.html b/compiler-docs/fe_common/utils/humanize/index.html new file mode 100644 index 0000000000..e714338f1f --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/index.html @@ -0,0 +1 @@ +fe_common::utils::humanize - Rust

Module humanize

Source

Traits§

Pluralizable
A trait to derive plural or singular representations from

Functions§

pluralize_conditionally
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/sidebar-items.js b/compiler-docs/fe_common/utils/humanize/sidebar-items.js new file mode 100644 index 0000000000..226b3cfd33 --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["pluralize_conditionally"],"trait":["Pluralizable"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html b/compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html new file mode 100644 index 0000000000..62b5047cdc --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html @@ -0,0 +1,6 @@ +Pluralizable in fe_common::utils::humanize - Rust

Trait Pluralizable

Source
pub trait Pluralizable {
+    // Required methods
+    fn to_plural(&self) -> String;
+    fn to_singular(&self) -> String;
+}
Expand description

A trait to derive plural or singular representations from

+

Required Methods§

Implementations on Foreign Types§

Source§

impl Pluralizable for &str

Source§

impl Pluralizable for (&str, &str)

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/index.html b/compiler-docs/fe_common/utils/index.html new file mode 100644 index 0000000000..e29f9937cf --- /dev/null +++ b/compiler-docs/fe_common/utils/index.html @@ -0,0 +1 @@ +fe_common::utils - Rust

Module utils

Source

Modules§

dirs
files
git
humanize
keccak
ron
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.full.html b/compiler-docs/fe_common/utils/keccak/fn.full.html new file mode 100644 index 0000000000..eae7751a1f --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.full.html @@ -0,0 +1,2 @@ +full in fe_common::utils::keccak - Rust

Function full

Source
pub fn full(content: &[u8]) -> String
Expand description

Get the full 32 byte hash of the content.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html b/compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html new file mode 100644 index 0000000000..4875dd9f6d --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html @@ -0,0 +1,2 @@ +full_as_bytes in fe_common::utils::keccak - Rust

Function full_as_bytes

Source
pub fn full_as_bytes(content: &[u8]) -> [u8; 32]
Expand description

Get the full 32 byte hash of the content as a byte array.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.partial.html b/compiler-docs/fe_common/utils/keccak/fn.partial.html new file mode 100644 index 0000000000..c8f99c577d --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.partial.html @@ -0,0 +1,2 @@ +partial in fe_common::utils::keccak - Rust

Function partial

Source
pub fn partial(content: &[u8], size: usize) -> String
Expand description

Take the first size number of bytes of the hash with no padding.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html b/compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html new file mode 100644 index 0000000000..78ad17e1b4 --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html @@ -0,0 +1,3 @@ +partial_right_padded in fe_common::utils::keccak - Rust

Function partial_right_padded

Source
pub fn partial_right_padded(content: &[u8], size: usize) -> String
Expand description

Take the first size number of bytes of the hash and pad the right side +with zeros to 32 bytes.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/index.html b/compiler-docs/fe_common/utils/keccak/index.html new file mode 100644 index 0000000000..5f7bcd3adf --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/index.html @@ -0,0 +1,2 @@ +fe_common::utils::keccak - Rust

Module keccak

Source

Functions§

full
Get the full 32 byte hash of the content.
full_as_bytes
Get the full 32 byte hash of the content as a byte array.
partial
Take the first size number of bytes of the hash with no padding.
partial_right_padded
Take the first size number of bytes of the hash and pad the right side +with zeros to 32 bytes.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/sidebar-items.js b/compiler-docs/fe_common/utils/keccak/sidebar-items.js new file mode 100644 index 0000000000..13bdbf8279 --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["full","full_as_bytes","partial","partial_right_padded"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html b/compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html new file mode 100644 index 0000000000..d21af9c847 --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html @@ -0,0 +1,4 @@ +to_ron_string_pretty in fe_common::utils::ron - Rust

Function to_ron_string_pretty

Source
pub fn to_ron_string_pretty<T>(value: &T) -> Result<String>
where + T: Serialize,
Expand description

Convenience function to serialize objects in RON format with custom pretty +printing config and struct names.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/index.html b/compiler-docs/fe_common/utils/ron/index.html new file mode 100644 index 0000000000..e88903f7ce --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/index.html @@ -0,0 +1,2 @@ +fe_common::utils::ron - Rust

Module ron

Source

Structs§

Diff
Wrapper struct for formatting changesets from the difference package.

Functions§

to_ron_string_pretty
Convenience function to serialize objects in RON format with custom pretty +printing config and struct names.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/sidebar-items.js b/compiler-docs/fe_common/utils/ron/sidebar-items.js new file mode 100644 index 0000000000..dc250fef05 --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["to_ron_string_pretty"],"struct":["Diff"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/struct.Diff.html b/compiler-docs/fe_common/utils/ron/struct.Diff.html new file mode 100644 index 0000000000..91680fb65c --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/struct.Diff.html @@ -0,0 +1,13 @@ +Diff in fe_common::utils::ron - Rust

Struct Diff

Source
pub struct Diff(/* private fields */);
Expand description

Wrapper struct for formatting changesets from the difference package.

+

Implementations§

Source§

impl Diff

Source

pub fn new(left: &str, right: &str) -> Self

Trait Implementations§

Source§

impl Display for Diff

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl Freeze for Diff

§

impl RefUnwindSafe for Diff

§

impl Send for Diff

§

impl Sync for Diff

§

impl Unpin for Diff

§

impl UnwindSafe for Diff

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/sidebar-items.js b/compiler-docs/fe_common/utils/sidebar-items.js new file mode 100644 index 0000000000..857e59addd --- /dev/null +++ b/compiler-docs/fe_common/utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["dirs","files","git","humanize","keccak","ron"]}; \ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/all.html b/compiler-docs/fe_compiler_test_utils/all.html new file mode 100644 index 0000000000..5ab06ebe07 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html b/compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html new file mode 100644 index 0000000000..5d87febe45 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html @@ -0,0 +1 @@ +DEFAULT_CALLER in fe_compiler_test_utils - Rust

Constant DEFAULT_CALLER

Source
pub const DEFAULT_CALLER: &str = "1000000000000000000000000000000000000001";
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.address.html b/compiler-docs/fe_compiler_test_utils/fn.address.html new file mode 100644 index 0000000000..d37d1ae5cd --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.address.html @@ -0,0 +1 @@ +address in fe_compiler_test_utils - Rust

Function address

Source
pub fn address(s: &str) -> H160
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.address_array_token.html b/compiler-docs/fe_compiler_test_utils/fn.address_array_token.html new file mode 100644 index 0000000000..b164cd0f51 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.address_array_token.html @@ -0,0 +1 @@ +address_array_token in fe_compiler_test_utils - Rust

Function address_array_token

Source
pub fn address_array_token(v: &[&str]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.address_token.html b/compiler-docs/fe_compiler_test_utils/fn.address_token.html new file mode 100644 index 0000000000..08d52c02b6 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.address_token.html @@ -0,0 +1 @@ +address_token in fe_compiler_test_utils - Rust

Function address_token

Source
pub fn address_token(s: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.bool_token.html b/compiler-docs/fe_compiler_test_utils/fn.bool_token.html new file mode 100644 index 0000000000..3f548b1659 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.bool_token.html @@ -0,0 +1 @@ +bool_token in fe_compiler_test_utils - Rust

Function bool_token

Source
pub fn bool_token(val: bool) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.bytes_token.html b/compiler-docs/fe_compiler_test_utils/fn.bytes_token.html new file mode 100644 index 0000000000..5c9b7aaa05 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.bytes_token.html @@ -0,0 +1 @@ +bytes_token in fe_compiler_test_utils - Rust

Function bytes_token

Source
pub fn bytes_token(s: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html b/compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html new file mode 100644 index 0000000000..b09ca4ab4b --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html @@ -0,0 +1 @@ +encode_error_reason in fe_compiler_test_utils - Rust

Function encode_error_reason

Source
pub fn encode_error_reason(reason: &str) -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encode_revert.html b/compiler-docs/fe_compiler_test_utils/fn.encode_revert.html new file mode 100644 index 0000000000..c08fcff184 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encode_revert.html @@ -0,0 +1 @@ +encode_revert in fe_compiler_test_utils - Rust

Function encode_revert

Source
pub fn encode_revert(selector: &str, input: &[Token]) -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html new file mode 100644 index 0000000000..330cc65a80 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html @@ -0,0 +1 @@ +encoded_div_or_mod_by_zero in fe_compiler_test_utils - Rust

Function encoded_div_or_mod_by_zero

Source
pub fn encoded_div_or_mod_by_zero() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html new file mode 100644 index 0000000000..b68cde4706 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html @@ -0,0 +1 @@ +encoded_invalid_abi_data in fe_compiler_test_utils - Rust

Function encoded_invalid_abi_data

Source
pub fn encoded_invalid_abi_data() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html new file mode 100644 index 0000000000..6ee4d1f621 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html @@ -0,0 +1 @@ +encoded_over_or_underflow in fe_compiler_test_utils - Rust

Function encoded_over_or_underflow

Source
pub fn encoded_over_or_underflow() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html new file mode 100644 index 0000000000..d7889832a7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html @@ -0,0 +1 @@ +encoded_panic_assert in fe_compiler_test_utils - Rust

Function encoded_panic_assert

Source
pub fn encoded_panic_assert() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html new file mode 100644 index 0000000000..1f39c449b8 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html @@ -0,0 +1 @@ +encoded_panic_out_of_bounds in fe_compiler_test_utils - Rust

Function encoded_panic_out_of_bounds

Source
pub fn encoded_panic_out_of_bounds() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html b/compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html new file mode 100644 index 0000000000..db030cee6b --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html @@ -0,0 +1,3 @@ +get_2s_complement_for_negative in fe_compiler_test_utils - Rust

Function get_2s_complement_for_negative

Source
pub fn get_2s_complement_for_negative(assume_negative: U256) -> U256
Expand description

To get the 2s complement value for e.g. -128 call +get_2s_complement_for_negative(128)

+
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.int_array_token.html b/compiler-docs/fe_compiler_test_utils/fn.int_array_token.html new file mode 100644 index 0000000000..c59daa8d78 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.int_array_token.html @@ -0,0 +1 @@ +int_array_token in fe_compiler_test_utils - Rust

Function int_array_token

Source
pub fn int_array_token(v: &[i64]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.int_token.html b/compiler-docs/fe_compiler_test_utils/fn.int_token.html new file mode 100644 index 0000000000..7347357ed3 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.int_token.html @@ -0,0 +1 @@ +int_token in fe_compiler_test_utils - Rust

Function int_token

Source
pub fn int_token(val: i64) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.load_contract.html b/compiler-docs/fe_compiler_test_utils/fn.load_contract.html new file mode 100644 index 0000000000..5c9017eeb5 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.load_contract.html @@ -0,0 +1,5 @@ +load_contract in fe_compiler_test_utils - Rust

Function load_contract

Source
pub fn load_contract(
+    address: H160,
+    fixture: &str,
+    contract_name: &str,
+) -> ContractHarness
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.string_token.html b/compiler-docs/fe_compiler_test_utils/fn.string_token.html new file mode 100644 index 0000000000..5223361e2e --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.string_token.html @@ -0,0 +1 @@ +string_token in fe_compiler_test_utils - Rust

Function string_token

Source
pub fn string_token(s: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html b/compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html new file mode 100644 index 0000000000..5d64a3cddb --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html @@ -0,0 +1 @@ +to_2s_complement in fe_compiler_test_utils - Rust

Function to_2s_complement

Source
pub fn to_2s_complement(val: i64) -> U256
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.tuple_token.html b/compiler-docs/fe_compiler_test_utils/fn.tuple_token.html new file mode 100644 index 0000000000..bd2aab6260 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.tuple_token.html @@ -0,0 +1 @@ +tuple_token in fe_compiler_test_utils - Rust

Function tuple_token

Source
pub fn tuple_token(tokens: &[Token]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html b/compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html new file mode 100644 index 0000000000..74d2777805 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html @@ -0,0 +1 @@ +uint_array_token in fe_compiler_test_utils - Rust

Function uint_array_token

Source
pub fn uint_array_token(v: &[u64]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.uint_token.html b/compiler-docs/fe_compiler_test_utils/fn.uint_token.html new file mode 100644 index 0000000000..0710810dc3 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.uint_token.html @@ -0,0 +1 @@ +uint_token in fe_compiler_test_utils - Rust

Function uint_token

Source
pub fn uint_token(n: u64) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html b/compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html new file mode 100644 index 0000000000..5770769964 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html @@ -0,0 +1 @@ +uint_token_from_dec_str in fe_compiler_test_utils - Rust

Function uint_token_from_dec_str

Source
pub fn uint_token_from_dec_str(val: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.validate_return.html b/compiler-docs/fe_compiler_test_utils/fn.validate_return.html new file mode 100644 index 0000000000..e7033057ef --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.validate_return.html @@ -0,0 +1,4 @@ +validate_return in fe_compiler_test_utils - Rust

Function validate_return

Source
pub fn validate_return(
+    capture: Capture<(ExitReason, Vec<u8>), Infallible>,
+    expected_data: &[u8],
+)
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.validate_revert.html b/compiler-docs/fe_compiler_test_utils/fn.validate_revert.html new file mode 100644 index 0000000000..c6af880f0e --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.validate_revert.html @@ -0,0 +1,4 @@ +validate_revert in fe_compiler_test_utils - Rust

Function validate_revert

Source
pub fn validate_revert(
+    capture: Capture<(ExitReason, Vec<u8>), Infallible>,
+    expected_data: &[u8],
+)
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.with_executor.html b/compiler-docs/fe_compiler_test_utils/fn.with_executor.html new file mode 100644 index 0000000000..8f325c58d7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.with_executor.html @@ -0,0 +1 @@ +with_executor in fe_compiler_test_utils - Rust

Function with_executor

Source
pub fn with_executor(test: &dyn Fn(Executor<'_, '_>))
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html b/compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html new file mode 100644 index 0000000000..c05ff70c57 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html @@ -0,0 +1,4 @@ +with_executor_backend in fe_compiler_test_utils - Rust

Function with_executor_backend

Source
pub fn with_executor_backend(
+    backend: Backend<'_>,
+    test: &dyn Fn(Executor<'_, '_>),
+)
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/index.html b/compiler-docs/fe_compiler_test_utils/index.html new file mode 100644 index 0000000000..c1df8d89b7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/index.html @@ -0,0 +1,2 @@ +fe_compiler_test_utils - Rust

Crate fe_compiler_test_utils

Source

Macros§

assert_harness_gas_report

Structs§

ContractHarness
ExecutionOutput
GasRecord
GasReporter
NumericAbiTokenBounds
Runtime
SolidityCompileError

Constants§

DEFAULT_CALLER

Traits§

ToBeBytes

Functions§

address
address_array_token
address_token
bool_token
bytes_token
encode_error_reason
encode_revert
encoded_div_or_mod_by_zero
encoded_invalid_abi_data
encoded_over_or_underflow
encoded_panic_assert
encoded_panic_out_of_bounds
get_2s_complement_for_negative
To get the 2s complement value for e.g. -128 call +get_2s_complement_for_negative(128)
int_array_token
int_token
load_contract
string_token
to_2s_complement
tuple_token
uint_array_token
uint_token
uint_token_from_dec_str
validate_return
validate_revert
with_executor
with_executor_backend

Type Aliases§

Backend
Executor
StackState
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html new file mode 100644 index 0000000000..97bc8a73cd --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_harness_gas_report.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html new file mode 100644 index 0000000000..bb3416948b --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html @@ -0,0 +1,4 @@ +assert_harness_gas_report in fe_compiler_test_utils - Rust

Macro assert_harness_gas_report

Source
macro_rules! assert_harness_gas_report {
+    ($harness: expr) => { ... };
+    ($harness: expr, $($expr:expr),*) => { ... };
+}
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/sidebar-items.js b/compiler-docs/fe_compiler_test_utils/sidebar-items.js new file mode 100644 index 0000000000..5f4f697188 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_CALLER"],"fn":["address","address_array_token","address_token","bool_token","bytes_token","encode_error_reason","encode_revert","encoded_div_or_mod_by_zero","encoded_invalid_abi_data","encoded_over_or_underflow","encoded_panic_assert","encoded_panic_out_of_bounds","get_2s_complement_for_negative","int_array_token","int_token","load_contract","string_token","to_2s_complement","tuple_token","uint_array_token","uint_token","uint_token_from_dec_str","validate_return","validate_revert","with_executor","with_executor_backend"],"macro":["assert_harness_gas_report"],"struct":["ContractHarness","ExecutionOutput","GasRecord","GasReporter","NumericAbiTokenBounds","Runtime","SolidityCompileError"],"trait":["ToBeBytes"],"type":["Backend","Executor","StackState"]}; \ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html b/compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html new file mode 100644 index 0000000000..8fd4a022b8 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html @@ -0,0 +1,143 @@ +ContractHarness in fe_compiler_test_utils - Rust

Struct ContractHarness

Source
pub struct ContractHarness {
+    pub gas_reporter: GasReporter,
+    pub address: H160,
+    pub abi: Contract,
+    pub caller: H160,
+    pub value: U256,
+}

Fields§

§gas_reporter: GasReporter§address: H160§abi: Contract§caller: H160§value: U256

Implementations§

Source§

impl ContractHarness

Source

pub fn capture_call( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], +) -> Capture<(ExitReason, Vec<u8>), Infallible>

Source

pub fn build_calldata(&self, name: &str, input: &[Token]) -> Vec<u8>

Source

pub fn capture_call_raw_bytes( + &self, + executor: &mut Executor<'_, '_>, + input: Vec<u8>, +) -> Capture<(ExitReason, Vec<u8>), Infallible>

Source

pub fn test_function( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], + output: Option<&Token>, +)

Source

pub fn call_function( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], +) -> Option<Token>

Source

pub fn test_function_reverts( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], + revert_data: &[u8], +)

Source

pub fn test_call_reverts( + &self, + executor: &mut Executor<'_, '_>, + input: Vec<u8>, + revert_data: &[u8], +)

Source

pub fn test_function_returns( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], + return_data: &[u8], +)

Source

pub fn test_call_returns( + &self, + executor: &mut Executor<'_, '_>, + input: Vec<u8>, + return_data: &[u8], +)

Source

pub fn events_emitted( + &self, + executor: Executor<'_, '_>, + events: &[(&str, &[Token])], +)

Source

pub fn set_caller(&mut self, caller: H160)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html b/compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html new file mode 100644 index 0000000000..b998e92e46 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html @@ -0,0 +1,95 @@ +ExecutionOutput in fe_compiler_test_utils - Rust

Struct ExecutionOutput

Source
pub struct ExecutionOutput { /* private fields */ }

Implementations§

Source§

impl ExecutionOutput

Source

pub fn new(exit_reason: ExitReason, data: Vec<u8>) -> ExecutionOutput

Create an ExecutionOutput instance

+
Source

pub fn expect_success(self) -> ExecutionOutput

Panic if the execution did not succeed.

+
Source

pub fn expect_revert(self) -> ExecutionOutput

Panic if the execution did not revert.

+
Source

pub fn expect_revert_reason(self, reason: &str) -> ExecutionOutput

Panic if the output is not an encoded error reason of the given string.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.GasRecord.html b/compiler-docs/fe_compiler_test_utils/struct.GasRecord.html new file mode 100644 index 0000000000..1aaebd0efb --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.GasRecord.html @@ -0,0 +1,94 @@ +GasRecord in fe_compiler_test_utils - Rust

Struct GasRecord

Source
pub struct GasRecord {
+    pub description: String,
+    pub gas_used: u64,
+}

Fields§

§description: String§gas_used: u64

Trait Implementations§

Source§

impl Debug for GasRecord

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.GasReporter.html b/compiler-docs/fe_compiler_test_utils/struct.GasReporter.html new file mode 100644 index 0000000000..6223d4a672 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.GasReporter.html @@ -0,0 +1,97 @@ +GasReporter in fe_compiler_test_utils - Rust

Struct GasReporter

Source
pub struct GasReporter { /* private fields */ }

Implementations§

Source§

impl GasReporter

Source

pub fn add_record(&self, description: &str, gas_used: u64)

Source

pub fn add_func_call_record( + &self, + function: &str, + input: &[Token], + gas_used: u64, +)

Trait Implementations§

Source§

impl Debug for GasReporter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for GasReporter

Source§

fn default() -> GasReporter

Returns the “default value” for a type. Read more
Source§

impl Display for GasReporter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html b/compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html new file mode 100644 index 0000000000..2d97a55d89 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html @@ -0,0 +1,97 @@ +NumericAbiTokenBounds in fe_compiler_test_utils - Rust

Struct NumericAbiTokenBounds

Source
pub struct NumericAbiTokenBounds {
+    pub size: u64,
+    pub u_min: Token,
+    pub i_min: Token,
+    pub u_max: Token,
+    pub i_max: Token,
+}

Fields§

§size: u64§u_min: Token§i_min: Token§u_max: Token§i_max: Token

Implementations§

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.Runtime.html b/compiler-docs/fe_compiler_test_utils/struct.Runtime.html new file mode 100644 index 0000000000..4506f479a7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.Runtime.html @@ -0,0 +1,95 @@ +Runtime in fe_compiler_test_utils - Rust

Struct Runtime

Source
pub struct Runtime { /* private fields */ }

Implementations§

Source§

impl Runtime

Source

pub fn new() -> Runtime

Create a new Runtime instance.

+
Source

pub fn with_functions(self, fns: Vec<Statement>) -> Runtime

Add the given set of functions

+
Source

pub fn with_test_statements(self, statements: Vec<Statement>) -> Runtime

Add the given set of test statements

+
Source

pub fn with_data(self, data: Vec<Data>) -> Runtime

Source

pub fn to_yul(&self) -> Object

Generate the top level YUL object

+

Trait Implementations§

Source§

impl Default for Runtime

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html b/compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html new file mode 100644 index 0000000000..82bec50605 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html @@ -0,0 +1,92 @@ +SolidityCompileError in fe_compiler_test_utils - Rust

Struct SolidityCompileError

Source
pub struct SolidityCompileError(/* private fields */);

Trait Implementations§

Source§

impl Debug for SolidityCompileError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for SolidityCompileError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for SolidityCompileError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html b/compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html new file mode 100644 index 0000000000..6809b229e9 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html @@ -0,0 +1,4 @@ +ToBeBytes in fe_compiler_test_utils - Rust

Trait ToBeBytes

Source
pub trait ToBeBytes {
+    // Required method
+    fn to_be_bytes(&self) -> [u8; 32];
+}

Required Methods§

Source

fn to_be_bytes(&self) -> [u8; 32]

Implementations on Foreign Types§

Source§

impl ToBeBytes for U256

Source§

fn to_be_bytes(&self) -> [u8; 32]

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/type.Backend.html b/compiler-docs/fe_compiler_test_utils/type.Backend.html new file mode 100644 index 0000000000..6340948d78 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/type.Backend.html @@ -0,0 +1 @@ +Backend in fe_compiler_test_utils - Rust

Type Alias Backend

Source
pub type Backend<'a> = MemoryBackend<'a>;

Aliased Type§

pub struct Backend<'a> { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/type.Executor.html b/compiler-docs/fe_compiler_test_utils/type.Executor.html new file mode 100644 index 0000000000..26753627d5 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/type.Executor.html @@ -0,0 +1 @@ +Executor in fe_compiler_test_utils - Rust

Type Alias Executor

Source
pub type Executor<'a, 'b> = StackExecutor<'a, 'b, StackState<'a>, ()>;

Aliased Type§

pub struct Executor<'a, 'b> { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/type.StackState.html b/compiler-docs/fe_compiler_test_utils/type.StackState.html new file mode 100644 index 0000000000..1a6adc0de3 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/type.StackState.html @@ -0,0 +1 @@ +StackState in fe_compiler_test_utils - Rust

Type Alias StackState

Source
pub type StackState<'a> = MemoryStackState<'a, 'a, Backend<'a>>;

Aliased Type§

pub struct StackState<'a> { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests/all.html b/compiler-docs/fe_compiler_tests/all.html new file mode 100644 index 0000000000..16f71b01c1 --- /dev/null +++ b/compiler-docs/fe_compiler_tests/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests/index.html b/compiler-docs/fe_compiler_tests/index.html new file mode 100644 index 0000000000..4ba358bfb4 --- /dev/null +++ b/compiler-docs/fe_compiler_tests/index.html @@ -0,0 +1 @@ +fe_compiler_tests - Rust

Crate fe_compiler_tests

Source
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests/sidebar-items.js b/compiler-docs/fe_compiler_tests/sidebar-items.js new file mode 100644 index 0000000000..5244ce01cc --- /dev/null +++ b/compiler-docs/fe_compiler_tests/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {}; \ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests_legacy/all.html b/compiler-docs/fe_compiler_tests_legacy/all.html new file mode 100644 index 0000000000..7ecc0ba639 --- /dev/null +++ b/compiler-docs/fe_compiler_tests_legacy/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests_legacy/index.html b/compiler-docs/fe_compiler_tests_legacy/index.html new file mode 100644 index 0000000000..1e573826d2 --- /dev/null +++ b/compiler-docs/fe_compiler_tests_legacy/index.html @@ -0,0 +1 @@ +fe_compiler_tests_legacy - Rust

Crate fe_compiler_tests_legacy

Source
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests_legacy/sidebar-items.js b/compiler-docs/fe_compiler_tests_legacy/sidebar-items.js new file mode 100644 index 0000000000..5244ce01cc --- /dev/null +++ b/compiler-docs/fe_compiler_tests_legacy/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {}; \ No newline at end of file diff --git a/compiler-docs/fe_driver/all.html b/compiler-docs/fe_driver/all.html new file mode 100644 index 0000000000..dfd00c6f60 --- /dev/null +++ b/compiler-docs/fe_driver/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.check_ingot.html b/compiler-docs/fe_driver/fn.check_ingot.html new file mode 100644 index 0000000000..9687a30bee --- /dev/null +++ b/compiler-docs/fe_driver/fn.check_ingot.html @@ -0,0 +1 @@ +check_ingot in fe_driver - Rust

Function check_ingot

Source
pub fn check_ingot(db: &mut Db, build_files: &BuildFiles) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.check_single_file.html b/compiler-docs/fe_driver/fn.check_single_file.html new file mode 100644 index 0000000000..378ac4d7fe --- /dev/null +++ b/compiler-docs/fe_driver/fn.check_single_file.html @@ -0,0 +1 @@ +check_single_file in fe_driver - Rust

Function check_single_file

Source
pub fn check_single_file(db: &mut Db, path: &str, src: &str) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.compile_ingot.html b/compiler-docs/fe_driver/fn.compile_ingot.html new file mode 100644 index 0000000000..d3e7ddfc29 --- /dev/null +++ b/compiler-docs/fe_driver/fn.compile_ingot.html @@ -0,0 +1,10 @@ +compile_ingot in fe_driver - Rust

Function compile_ingot

Source
pub fn compile_ingot(
+    db: &mut Db,
+    build_files: &BuildFiles,
+    with_bytecode: bool,
+    with_runtime_bytecode: bool,
+    optimize: bool,
+) -> Result<CompiledModule, CompileError>
Expand description

Compiles the main module of a project.

+

If with_bytecode is set to false, the compiler will skip the final Yul -> +Bytecode pass. This is useful when debugging invalid Yul code.

+
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.compile_single_file.html b/compiler-docs/fe_driver/fn.compile_single_file.html new file mode 100644 index 0000000000..7437677f56 --- /dev/null +++ b/compiler-docs/fe_driver/fn.compile_single_file.html @@ -0,0 +1,8 @@ +compile_single_file in fe_driver - Rust

Function compile_single_file

Source
pub fn compile_single_file(
+    db: &mut Db,
+    path: &str,
+    src: &str,
+    with_bytecode: bool,
+    with_runtime_bytecode: bool,
+    optimize: bool,
+) -> Result<CompiledModule, CompileError>
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.dump_mir_single_file.html b/compiler-docs/fe_driver/fn.dump_mir_single_file.html new file mode 100644 index 0000000000..31c8f5e8a1 --- /dev/null +++ b/compiler-docs/fe_driver/fn.dump_mir_single_file.html @@ -0,0 +1,6 @@ +dump_mir_single_file in fe_driver - Rust

Function dump_mir_single_file

Source
pub fn dump_mir_single_file(
+    db: &mut Db,
+    path: &str,
+    src: &str,
+) -> Result<String, CompileError>
Expand description

Returns graphviz string.

+
\ No newline at end of file diff --git a/compiler-docs/fe_driver/index.html b/compiler-docs/fe_driver/index.html new file mode 100644 index 0000000000..c413065619 --- /dev/null +++ b/compiler-docs/fe_driver/index.html @@ -0,0 +1 @@ +fe_driver - Rust

Crate fe_driver

Source

Structs§

CompileError
CompiledContract
The artifacts of a compiled contract.
CompiledModule
The artifacts of a compiled module.
Db

Traits§

CodegenDb

Functions§

check_ingot
check_single_file
compile_ingot
Compiles the main module of a project.
compile_single_file
dump_mir_single_file
Returns graphviz string.
\ No newline at end of file diff --git a/compiler-docs/fe_driver/sidebar-items.js b/compiler-docs/fe_driver/sidebar-items.js new file mode 100644 index 0000000000..742ac793e3 --- /dev/null +++ b/compiler-docs/fe_driver/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["check_ingot","check_single_file","compile_ingot","compile_single_file","dump_mir_single_file"],"struct":["CompileError","CompiledContract","CompiledModule","Db"],"trait":["CodegenDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.CompileError.html b/compiler-docs/fe_driver/struct.CompileError.html new file mode 100644 index 0000000000..ecd3d9103e --- /dev/null +++ b/compiler-docs/fe_driver/struct.CompileError.html @@ -0,0 +1,91 @@ +CompileError in fe_driver - Rust

Struct CompileError

Source
pub struct CompileError(pub Vec<Diagnostic>);

Tuple Fields§

§0: Vec<Diagnostic>

Trait Implementations§

Source§

impl Debug for CompileError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.CompiledContract.html b/compiler-docs/fe_driver/struct.CompiledContract.html new file mode 100644 index 0000000000..30d2cfc3cf --- /dev/null +++ b/compiler-docs/fe_driver/struct.CompiledContract.html @@ -0,0 +1,96 @@ +CompiledContract in fe_driver - Rust

Struct CompiledContract

Source
pub struct CompiledContract {
+    pub json_abi: String,
+    pub yul: String,
+    pub origin: ContractId,
+}
Expand description

The artifacts of a compiled contract.

+

Fields§

§json_abi: String§yul: String§origin: ContractId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.CompiledModule.html b/compiler-docs/fe_driver/struct.CompiledModule.html new file mode 100644 index 0000000000..db442bc9c2 --- /dev/null +++ b/compiler-docs/fe_driver/struct.CompiledModule.html @@ -0,0 +1,96 @@ +CompiledModule in fe_driver - Rust

Struct CompiledModule

Source
pub struct CompiledModule {
+    pub src_ast: String,
+    pub lowered_ast: String,
+    pub contracts: IndexMap<String, CompiledContract>,
+}
Expand description

The artifacts of a compiled module.

+

Fields§

§src_ast: String§lowered_ast: String§contracts: IndexMap<String, CompiledContract>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.Db.html b/compiler-docs/fe_driver/struct.Db.html new file mode 100644 index 0000000000..a89b27e003 --- /dev/null +++ b/compiler-docs/fe_driver/struct.Db.html @@ -0,0 +1,210 @@ +Db in fe_driver - Rust

Struct Db

pub struct Db { /* private fields */ }

Trait Implementations§

§

impl Database for Db

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
§

impl Default for Db

§

fn default() -> Db

Returns the “default value” for a type. Read more
§

impl Upcast<dyn AnalyzerDb> for Db

§

fn upcast(&self) -> &(dyn AnalyzerDb + 'static)

§

impl Upcast<dyn MirDb> for Db

§

fn upcast(&self) -> &(dyn MirDb + 'static)

§

impl Upcast<dyn SourceDb> for Db

§

fn upcast(&self) -> &(dyn SourceDb + 'static)

§

impl UpcastMut<dyn AnalyzerDb> for Db

§

fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static)

§

impl UpcastMut<dyn MirDb> for Db

§

fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static)

§

impl UpcastMut<dyn SourceDb> for Db

§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for Db

§

impl RefUnwindSafe for Db

§

impl !Send for Db

§

impl !Sync for Db

§

impl Unpin for Db

§

impl UnwindSafe for Db

Blanket Implementations§

§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

§

fn intern_type(&self, key0: Type) -> TypeId

§

fn lookup_intern_type(&self, key0: TypeId) -> Type

§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
§

fn root_ingot(&self) -> IngotId

§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/trait.CodegenDb.html b/compiler-docs/fe_driver/trait.CodegenDb.html new file mode 100644 index 0000000000..cd53280ad6 --- /dev/null +++ b/compiler-docs/fe_driver/trait.CodegenDb.html @@ -0,0 +1,37 @@ +CodegenDb in fe_driver - Rust

Trait CodegenDb

pub trait CodegenDb:
+    Database
+    + HasQueryGroup<CodegenDbStorage>
+    + MirDb
+    + Upcast<dyn MirDb>
+    + UpcastMut<dyn MirDb> {
+
Show 16 methods // Required methods + fn codegen_legalized_signature( + &self, + key0: FunctionId, + ) -> Rc<FunctionSignature>; + fn codegen_legalized_body(&self, key0: FunctionId) -> Rc<FunctionBody>; + fn codegen_function_symbol_name(&self, key0: FunctionId) -> Rc<String>; + fn codegen_legalized_type(&self, key0: TypeId) -> TypeId; + fn codegen_abi_type(&self, key0: TypeId) -> AbiType; + fn codegen_abi_function(&self, key0: FunctionId) -> AbiFunction; + fn codegen_abi_event(&self, key0: TypeId) -> AbiEvent; + fn codegen_abi_contract(&self, key0: ContractId) -> AbiContract; + fn codegen_abi_module_events(&self, key0: ModuleId) -> Vec<AbiEvent>; + fn codegen_abi_type_maximum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_type_minimum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_function_argument_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_abi_function_return_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_contract_symbol_name(&self, key0: ContractId) -> Rc<String>; + fn codegen_contract_deployer_symbol_name( + &self, + key0: ContractId, + ) -> Rc<String>; + fn codegen_constant_string_symbol_name(&self, key0: String) -> Rc<String>; +
}

Required Methods§

Implementors§

§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_library/all.html b/compiler-docs/fe_library/all.html new file mode 100644 index 0000000000..456cf3aa87 --- /dev/null +++ b/compiler-docs/fe_library/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Functions

Constants

\ No newline at end of file diff --git a/compiler-docs/fe_library/constant.STD.html b/compiler-docs/fe_library/constant.STD.html new file mode 100644 index 0000000000..bda11b4880 --- /dev/null +++ b/compiler-docs/fe_library/constant.STD.html @@ -0,0 +1 @@ +STD in fe_library - Rust

Constant STD

Source
pub const STD: Dir<'_>;
\ No newline at end of file diff --git a/compiler-docs/fe_library/fn.static_dir_files.html b/compiler-docs/fe_library/fn.static_dir_files.html new file mode 100644 index 0000000000..d14ac89816 --- /dev/null +++ b/compiler-docs/fe_library/fn.static_dir_files.html @@ -0,0 +1,3 @@ +static_dir_files in fe_library - Rust

Function static_dir_files

Source
pub fn static_dir_files(
+    dir: &'static Dir<'_>,
+) -> Vec<(&'static str, &'static str)>
\ No newline at end of file diff --git a/compiler-docs/fe_library/fn.std_src_files.html b/compiler-docs/fe_library/fn.std_src_files.html new file mode 100644 index 0000000000..e92c15d9ea --- /dev/null +++ b/compiler-docs/fe_library/fn.std_src_files.html @@ -0,0 +1 @@ +std_src_files in fe_library - Rust

Function std_src_files

Source
pub fn std_src_files() -> Vec<(&'static str, &'static str)>
\ No newline at end of file diff --git a/compiler-docs/fe_library/index.html b/compiler-docs/fe_library/index.html new file mode 100644 index 0000000000..b165d60e6a --- /dev/null +++ b/compiler-docs/fe_library/index.html @@ -0,0 +1 @@ +fe_library - Rust

Crate fe_library

Source

Re-exports§

pub use ::include_dir;

Constants§

STD

Functions§

static_dir_files
std_src_files
\ No newline at end of file diff --git a/compiler-docs/fe_library/sidebar-items.js b/compiler-docs/fe_library/sidebar-items.js new file mode 100644 index 0000000000..93c2f1794f --- /dev/null +++ b/compiler-docs/fe_library/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["STD"],"fn":["static_dir_files","std_src_files"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/all.html b/compiler-docs/fe_mir/all.html new file mode 100644 index 0000000000..9c8df6ec82 --- /dev/null +++ b/compiler-docs/fe_mir/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Functions

Type Aliases

\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/index.html b/compiler-docs/fe_mir/analysis/cfg/index.html new file mode 100644 index 0000000000..c0c908c146 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/index.html @@ -0,0 +1 @@ +fe_mir::analysis::cfg - Rust

Module cfg

Source

Structs§

CfgPostOrder
ControlFlowGraph
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/sidebar-items.js b/compiler-docs/fe_mir/analysis/cfg/sidebar-items.js new file mode 100644 index 0000000000..3b53904b73 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["CfgPostOrder","ControlFlowGraph"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html b/compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html new file mode 100644 index 0000000000..c36ddc1305 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html @@ -0,0 +1,209 @@ +CfgPostOrder in fe_mir::analysis::cfg - Rust

Struct CfgPostOrder

Source
pub struct CfgPostOrder<'a> { /* private fields */ }

Trait Implementations§

Source§

impl<'a> Iterator for CfgPostOrder<'a>

Source§

type Item = Id<BasicBlock>

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<BasicBlockId>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for CfgPostOrder<'a>

§

impl<'a> RefUnwindSafe for CfgPostOrder<'a>

§

impl<'a> Send for CfgPostOrder<'a>

§

impl<'a> Sync for CfgPostOrder<'a>

§

impl<'a> Unpin for CfgPostOrder<'a>

§

impl<'a> UnwindSafe for CfgPostOrder<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html b/compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html new file mode 100644 index 0000000000..8db3152ae7 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html @@ -0,0 +1,20 @@ +ControlFlowGraph in fe_mir::analysis::cfg - Rust

Struct ControlFlowGraph

Source
pub struct ControlFlowGraph { /* private fields */ }

Implementations§

Source§

impl ControlFlowGraph

Source

pub fn compute(func: &FunctionBody) -> Self

Source

pub fn entry(&self) -> BasicBlockId

Source

pub fn preds(&self, block: BasicBlockId) -> &[BasicBlockId]

Source

pub fn succs(&self, block: BasicBlockId) -> &[BasicBlockId]

Source

pub fn post_order(&self) -> CfgPostOrder<'_>

Trait Implementations§

Source§

impl Clone for ControlFlowGraph

Source§

fn clone(&self) -> ControlFlowGraph

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ControlFlowGraph

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for ControlFlowGraph

Source§

fn eq(&self, other: &ControlFlowGraph) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ControlFlowGraph

Source§

impl StructuralPartialEq for ControlFlowGraph

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/index.html b/compiler-docs/fe_mir/analysis/domtree/index.html new file mode 100644 index 0000000000..3e7b24321d --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/index.html @@ -0,0 +1,4 @@ +fe_mir::analysis::domtree - Rust

Module domtree

Source
Expand description

This module contains dominator tree related structs.

+

The algorithm is based on Keith D. Cooper., Timothy J. Harvey., and Ken +Kennedy.: A Simple, Fast Dominance Algorithm: https://www.cs.rice.edu/~keith/EMBED/dom.pdf

+

Structs§

DFSet
Dominance frontiers of each blocks.
DomTree
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/sidebar-items.js b/compiler-docs/fe_mir/analysis/domtree/sidebar-items.js new file mode 100644 index 0000000000..e91f8a7dfa --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["DFSet","DomTree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html b/compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html new file mode 100644 index 0000000000..6056cee1b2 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html @@ -0,0 +1,17 @@ +DFSet in fe_mir::analysis::domtree - Rust

Struct DFSet

Source
pub struct DFSet(/* private fields */);
Expand description

Dominance frontiers of each blocks.

+

Implementations§

Source§

impl DFSet

Source

pub fn frontiers( + &self, + block: BasicBlockId, +) -> Option<impl Iterator<Item = BasicBlockId> + '_>

Returns all dominance frontieres of a block.

+
Source

pub fn frontier_num(&self, block: BasicBlockId) -> usize

Returns number of frontier blocks of a block.

+

Trait Implementations§

Source§

impl Debug for DFSet

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DFSet

Source§

fn default() -> DFSet

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for DFSet

§

impl RefUnwindSafe for DFSet

§

impl Send for DFSet

§

impl Sync for DFSet

§

impl Unpin for DFSet

§

impl UnwindSafe for DFSet

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html b/compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html new file mode 100644 index 0000000000..f2dc405d4f --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html @@ -0,0 +1,25 @@ +DomTree in fe_mir::analysis::domtree - Rust

Struct DomTree

Source
pub struct DomTree { /* private fields */ }

Implementations§

Source§

impl DomTree

Source

pub fn compute(cfg: &ControlFlowGraph) -> Self

Source

pub fn idom(&self, block: BasicBlockId) -> Option<BasicBlockId>

Returns the immediate dominator of the block. +Returns None if the block is unreachable from the entry block, or the +block is the entry block itself.

+
Source

pub fn strictly_dominates( + &self, + block1: BasicBlockId, + block2: BasicBlockId, +) -> bool

Returns true if block1 strictly dominates block2.

+
Source

pub fn dominates(&self, block1: BasicBlockId, block2: BasicBlockId) -> bool

Returns true if block1 dominates block2.

+
Source

pub fn is_reachable(&self, block: BasicBlockId) -> bool

Returns true if block is reachable from the entry block.

+
Source

pub fn rpo(&self) -> &[BasicBlockId]

Returns blocks in RPO.

+
Source

pub fn compute_df(&self, cfg: &ControlFlowGraph) -> DFSet

Compute dominance frontiers of each blocks.

+

Trait Implementations§

Source§

impl Clone for DomTree

Source§

fn clone(&self) -> DomTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DomTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/index.html b/compiler-docs/fe_mir/analysis/index.html new file mode 100644 index 0000000000..d69ba9b466 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/index.html @@ -0,0 +1 @@ +fe_mir::analysis - Rust

Module analysis

Source

Re-exports§

pub use cfg::ControlFlowGraph;
pub use domtree::DomTree;
pub use loop_tree::LoopTree;
pub use post_domtree::PostDomTree;

Modules§

cfg
domtree
This module contains dominator tree related structs.
loop_tree
post_domtree
This module contains implementation of Post Dominator Tree.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/index.html b/compiler-docs/fe_mir/analysis/loop_tree/index.html new file mode 100644 index 0000000000..5d694d77f0 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/index.html @@ -0,0 +1 @@ +fe_mir::analysis::loop_tree - Rust

Module loop_tree

Source

Structs§

BlocksInLoopPostOrder
Loop
LoopTree

Type Aliases§

LoopId
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js b/compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js new file mode 100644 index 0000000000..2c5cf81800 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BlocksInLoopPostOrder","Loop","LoopTree"],"type":["LoopId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html b/compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html new file mode 100644 index 0000000000..0d8b9bb3f4 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html @@ -0,0 +1,209 @@ +BlocksInLoopPostOrder in fe_mir::analysis::loop_tree - Rust

Struct BlocksInLoopPostOrder

Source
pub struct BlocksInLoopPostOrder<'a, 'b> { /* private fields */ }

Trait Implementations§

Source§

impl<'a, 'b> Iterator for BlocksInLoopPostOrder<'a, 'b>

Source§

type Item = Id<BasicBlock>

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a, 'b> Freeze for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> RefUnwindSafe for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> Send for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> Sync for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> Unpin for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> UnwindSafe for BlocksInLoopPostOrder<'a, 'b>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html b/compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html new file mode 100644 index 0000000000..45edf5afeb --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html @@ -0,0 +1,27 @@ +Loop in fe_mir::analysis::loop_tree - Rust

Struct Loop

Source
pub struct Loop {
+    pub header: BasicBlockId,
+    pub parent: Option<LoopId>,
+    pub children: Vec<LoopId>,
+}

Fields§

§header: BasicBlockId

A header of the loop.

+
§parent: Option<LoopId>

A parent loop that includes the loop.

+
§children: Vec<LoopId>

Child loops that the loop includes.

+

Trait Implementations§

Source§

impl Clone for Loop

Source§

fn clone(&self) -> Loop

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Loop

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Loop

Source§

fn eq(&self, other: &Loop) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Loop

Source§

impl StructuralPartialEq for Loop

Auto Trait Implementations§

§

impl Freeze for Loop

§

impl RefUnwindSafe for Loop

§

impl Send for Loop

§

impl Sync for Loop

§

impl Unpin for Loop

§

impl UnwindSafe for Loop

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html b/compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html new file mode 100644 index 0000000000..64294d9bb8 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html @@ -0,0 +1,27 @@ +LoopTree in fe_mir::analysis::loop_tree - Rust

Struct LoopTree

Source
pub struct LoopTree { /* private fields */ }

Implementations§

Source§

impl LoopTree

Source

pub fn compute(cfg: &ControlFlowGraph, domtree: &DomTree) -> Self

Source

pub fn iter_blocks_post_order<'a, 'b>( + &'a self, + cfg: &'b ControlFlowGraph, + lp: LoopId, +) -> BlocksInLoopPostOrder<'a, 'b>

Returns all blocks in the loop.

+
Source

pub fn loops(&self) -> impl Iterator<Item = LoopId> + '_

Returns all loops in a function body. +An outer loop is guaranteed to be iterated before its inner loops.

+
Source

pub fn loop_num(&self) -> usize

Returns number of loops found.

+
Source

pub fn is_block_in_loop(&self, block: BasicBlockId, lp: LoopId) -> bool

Returns true if the block is in the lp.

+
Source

pub fn loop_header(&self, lp: LoopId) -> BasicBlockId

Returns header block of the lp.

+
Source

pub fn parent_loop(&self, lp: LoopId) -> Option<LoopId>

Get parent loop of the lp if exists.

+
Source

pub fn loop_of_block(&self, block: BasicBlockId) -> Option<LoopId>

Returns the loop that the block belongs to. +If the block belongs to multiple loops, then returns the innermost +loop.

+

Trait Implementations§

Source§

impl Clone for LoopTree

Source§

fn clone(&self) -> LoopTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LoopTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for LoopTree

Source§

fn default() -> LoopTree

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html b/compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html new file mode 100644 index 0000000000..7c55163770 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html @@ -0,0 +1 @@ +LoopId in fe_mir::analysis::loop_tree - Rust

Type Alias LoopId

Source
pub type LoopId = Id<Loop>;

Aliased Type§

pub struct LoopId { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html b/compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html new file mode 100644 index 0000000000..494070de3a --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html @@ -0,0 +1,24 @@ +PostIDom in fe_mir::analysis::post_domtree - Rust

Enum PostIDom

Source
pub enum PostIDom {
+    DummyEntry,
+    DummyExit,
+    Block(BasicBlockId),
+}

Variants§

§

DummyEntry

§

DummyExit

§

Block(BasicBlockId)

Trait Implementations§

Source§

impl Clone for PostIDom

Source§

fn clone(&self) -> PostIDom

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PostIDom

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PostIDom

Source§

fn eq(&self, other: &PostIDom) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for PostIDom

Source§

impl Eq for PostIDom

Source§

impl StructuralPartialEq for PostIDom

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/index.html b/compiler-docs/fe_mir/analysis/post_domtree/index.html new file mode 100644 index 0000000000..3ed8fc4a2d --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/index.html @@ -0,0 +1,2 @@ +fe_mir::analysis::post_domtree - Rust

Module post_domtree

Source
Expand description

This module contains implementation of Post Dominator Tree.

+

Structs§

PostDomTree

Enums§

PostIDom
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js b/compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js new file mode 100644 index 0000000000..be2c288fe1 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["PostIDom"],"struct":["PostDomTree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html b/compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html new file mode 100644 index 0000000000..5504c775ad --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html @@ -0,0 +1,12 @@ +PostDomTree in fe_mir::analysis::post_domtree - Rust

Struct PostDomTree

Source
pub struct PostDomTree { /* private fields */ }

Implementations§

Source§

impl PostDomTree

Source

pub fn compute(func: &FunctionBody) -> Self

Source

pub fn post_idom(&self, block: BasicBlockId) -> PostIDom

Source

pub fn is_reachable(&self, block: BasicBlockId) -> bool

Returns true if block is reachable from the exit blocks.

+

Trait Implementations§

Source§

impl Debug for PostDomTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/sidebar-items.js b/compiler-docs/fe_mir/analysis/sidebar-items.js new file mode 100644 index 0000000000..9a48888d34 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["cfg","domtree","loop_tree","post_domtree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/db/index.html b/compiler-docs/fe_mir/db/index.html new file mode 100644 index 0000000000..48f3e99882 --- /dev/null +++ b/compiler-docs/fe_mir/db/index.html @@ -0,0 +1 @@ +fe_mir::db - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/sidebar-items.js b/compiler-docs/fe_mir/db/sidebar-items.js new file mode 100644 index 0000000000..7064af42a5 --- /dev/null +++ b/compiler-docs/fe_mir/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["MirDbGroupStorage__","MirDbStorage","MirInternConstLookupQuery","MirInternConstQuery","MirInternFunctionLookupQuery","MirInternFunctionQuery","MirInternTypeLookupQuery","MirInternTypeQuery","MirLowerContractAllFunctionsQuery","MirLowerEnumAllFunctionsQuery","MirLowerModuleAllFunctionsQuery","MirLowerStructAllFunctionsQuery","MirLoweredConstantQuery","MirLoweredFuncBodyQuery","MirLoweredFuncSignatureQuery","MirLoweredMonomorphizedFuncSignatureQuery","MirLoweredPseudoMonomorphizedFuncSignatureQuery","MirLoweredTypeQuery","NewDb"],"trait":["MirDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html b/compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html new file mode 100644 index 0000000000..4249ad5526 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html @@ -0,0 +1,42 @@ +MirDbGroupStorage__ in fe_mir::db - Rust

Struct MirDbGroupStorage__

Source
pub struct MirDbGroupStorage__ {
Show 16 fields + pub mir_intern_const: Arc<<MirInternConstQuery as Query>::Storage>, + pub lookup_mir_intern_const: Arc<<MirInternConstLookupQuery as Query>::Storage>, + pub mir_intern_type: Arc<<MirInternTypeQuery as Query>::Storage>, + pub lookup_mir_intern_type: Arc<<MirInternTypeLookupQuery as Query>::Storage>, + pub mir_intern_function: Arc<<MirInternFunctionQuery as Query>::Storage>, + pub lookup_mir_intern_function: Arc<<MirInternFunctionLookupQuery as Query>::Storage>, + pub mir_lower_module_all_functions: Arc<<MirLowerModuleAllFunctionsQuery as Query>::Storage>, + pub mir_lower_contract_all_functions: Arc<<MirLowerContractAllFunctionsQuery as Query>::Storage>, + pub mir_lower_struct_all_functions: Arc<<MirLowerStructAllFunctionsQuery as Query>::Storage>, + pub mir_lower_enum_all_functions: Arc<<MirLowerEnumAllFunctionsQuery as Query>::Storage>, + pub mir_lowered_type: Arc<<MirLoweredTypeQuery as Query>::Storage>, + pub mir_lowered_constant: Arc<<MirLoweredConstantQuery as Query>::Storage>, + pub mir_lowered_func_signature: Arc<<MirLoweredFuncSignatureQuery as Query>::Storage>, + pub mir_lowered_monomorphized_func_signature: Arc<<MirLoweredMonomorphizedFuncSignatureQuery as Query>::Storage>, + pub mir_lowered_pseudo_monomorphized_func_signature: Arc<<MirLoweredPseudoMonomorphizedFuncSignatureQuery as Query>::Storage>, + pub mir_lowered_func_body: Arc<<MirLoweredFuncBodyQuery as Query>::Storage>, +
}

Fields§

§mir_intern_const: Arc<<MirInternConstQuery as Query>::Storage>§lookup_mir_intern_const: Arc<<MirInternConstLookupQuery as Query>::Storage>§mir_intern_type: Arc<<MirInternTypeQuery as Query>::Storage>§lookup_mir_intern_type: Arc<<MirInternTypeLookupQuery as Query>::Storage>§mir_intern_function: Arc<<MirInternFunctionQuery as Query>::Storage>§lookup_mir_intern_function: Arc<<MirInternFunctionLookupQuery as Query>::Storage>§mir_lower_module_all_functions: Arc<<MirLowerModuleAllFunctionsQuery as Query>::Storage>§mir_lower_contract_all_functions: Arc<<MirLowerContractAllFunctionsQuery as Query>::Storage>§mir_lower_struct_all_functions: Arc<<MirLowerStructAllFunctionsQuery as Query>::Storage>§mir_lower_enum_all_functions: Arc<<MirLowerEnumAllFunctionsQuery as Query>::Storage>§mir_lowered_type: Arc<<MirLoweredTypeQuery as Query>::Storage>§mir_lowered_constant: Arc<<MirLoweredConstantQuery as Query>::Storage>§mir_lowered_func_signature: Arc<<MirLoweredFuncSignatureQuery as Query>::Storage>§mir_lowered_monomorphized_func_signature: Arc<<MirLoweredMonomorphizedFuncSignatureQuery as Query>::Storage>§mir_lowered_pseudo_monomorphized_func_signature: Arc<<MirLoweredPseudoMonomorphizedFuncSignatureQuery as Query>::Storage>§mir_lowered_func_body: Arc<<MirLoweredFuncBodyQuery as Query>::Storage>

Implementations§

Source§

impl MirDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl MirDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn MirDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn MirDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirDbStorage.html b/compiler-docs/fe_mir/db/struct.MirDbStorage.html new file mode 100644 index 0000000000..137d60a809 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirDbStorage.html @@ -0,0 +1,12 @@ +MirDbStorage in fe_mir::db - Rust

Struct MirDbStorage

Source
pub struct MirDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<MirDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<MirDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for MirDbStorage

Source§

type DynDb = dyn MirDb

Dyn version of the associated database trait.
Source§

type GroupStorage = MirDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html b/compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html new file mode 100644 index 0000000000..040e130c70 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html @@ -0,0 +1,39 @@ +MirInternConstLookupQuery in fe_mir::db - Rust

Struct MirInternConstLookupQuery

Source
pub struct MirInternConstLookupQuery;

Implementations§

Source§

impl MirInternConstLookupQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternConstLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternConstLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternConstLookupQuery

Source§

fn default() -> MirInternConstLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternConstLookupQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_mir_intern_const"

Name of the query method (e.g., foo)
Source§

type Key = ConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Constant>

What value does the query return?
Source§

type Storage = LookupInternedStorage<MirInternConstLookupQuery, MirInternConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternConstLookupQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternConstQuery.html b/compiler-docs/fe_mir/db/struct.MirInternConstQuery.html new file mode 100644 index 0000000000..c69327e0b8 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternConstQuery.html @@ -0,0 +1,39 @@ +MirInternConstQuery in fe_mir::db - Rust

Struct MirInternConstQuery

Source
pub struct MirInternConstQuery;

Implementations§

Source§

impl MirInternConstQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternConstQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternConstQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternConstQuery

Source§

fn default() -> MirInternConstQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternConstQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_intern_const"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Constant>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ConstantId

What value does the query return?
Source§

type Storage = InternedStorage<MirInternConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternConstQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html b/compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html new file mode 100644 index 0000000000..7ba92e6ec5 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html @@ -0,0 +1,39 @@ +MirInternFunctionLookupQuery in fe_mir::db - Rust

Struct MirInternFunctionLookupQuery

Source
pub struct MirInternFunctionLookupQuery;

Implementations§

Source§

impl MirInternFunctionLookupQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternFunctionLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternFunctionLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternFunctionLookupQuery

Source§

fn default() -> MirInternFunctionLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternFunctionLookupQuery

Source§

const QUERY_INDEX: u16 = 5u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_mir_intern_function"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionSignature>

What value does the query return?
Source§

type Storage = LookupInternedStorage<MirInternFunctionLookupQuery, MirInternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternFunctionLookupQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html b/compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html new file mode 100644 index 0000000000..814e451840 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html @@ -0,0 +1,39 @@ +MirInternFunctionQuery in fe_mir::db - Rust

Struct MirInternFunctionQuery

Source
pub struct MirInternFunctionQuery;

Implementations§

Source§

impl MirInternFunctionQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternFunctionQuery

Source§

fn default() -> MirInternFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternFunctionQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_intern_function"

Name of the query method (e.g., foo)
Source§

type Key = Rc<FunctionSignature>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = InternedStorage<MirInternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternFunctionQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html b/compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html new file mode 100644 index 0000000000..a717fa0b11 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html @@ -0,0 +1,39 @@ +MirInternTypeLookupQuery in fe_mir::db - Rust

Struct MirInternTypeLookupQuery

Source
pub struct MirInternTypeLookupQuery;

Implementations§

Source§

impl MirInternTypeLookupQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternTypeLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternTypeLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternTypeLookupQuery

Source§

fn default() -> MirInternTypeLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternTypeLookupQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_mir_intern_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Type>

What value does the query return?
Source§

type Storage = LookupInternedStorage<MirInternTypeLookupQuery, MirInternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternTypeLookupQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html b/compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html new file mode 100644 index 0000000000..a94291a1ea --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html @@ -0,0 +1,39 @@ +MirInternTypeQuery in fe_mir::db - Rust

Struct MirInternTypeQuery

Source
pub struct MirInternTypeQuery;

Implementations§

Source§

impl MirInternTypeQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternTypeQuery

Source§

fn default() -> MirInternTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternTypeQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_intern_type"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Type>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = InternedStorage<MirInternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternTypeQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html new file mode 100644 index 0000000000..d343940f3b --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerContractAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerContractAllFunctionsQuery

Source
pub struct MirLowerContractAllFunctionsQuery;

Implementations§

Source§

impl MirLowerContractAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerContractAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerContractAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerContractAllFunctionsQuery

Source§

fn default() -> MirLowerContractAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerContractAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 7u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_contract_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerContractAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerContractAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerContractAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html new file mode 100644 index 0000000000..6b1cb45289 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerEnumAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerEnumAllFunctionsQuery

Source
pub struct MirLowerEnumAllFunctionsQuery;

Implementations§

Source§

impl MirLowerEnumAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerEnumAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerEnumAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerEnumAllFunctionsQuery

Source§

fn default() -> MirLowerEnumAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerEnumAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 9u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_enum_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerEnumAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerEnumAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerEnumAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html new file mode 100644 index 0000000000..7e48b06e89 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerModuleAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerModuleAllFunctionsQuery

Source
pub struct MirLowerModuleAllFunctionsQuery;

Implementations§

Source§

impl MirLowerModuleAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerModuleAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerModuleAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerModuleAllFunctionsQuery

Source§

fn default() -> MirLowerModuleAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerModuleAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 6u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_module_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerModuleAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerModuleAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerModuleAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html new file mode 100644 index 0000000000..8a5c8dd113 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerStructAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerStructAllFunctionsQuery

Source
pub struct MirLowerStructAllFunctionsQuery;

Implementations§

Source§

impl MirLowerStructAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerStructAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerStructAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerStructAllFunctionsQuery

Source§

fn default() -> MirLowerStructAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerStructAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 8u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_struct_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerStructAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerStructAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerStructAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html new file mode 100644 index 0000000000..7c4bb4f825 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html @@ -0,0 +1,46 @@ +MirLoweredConstantQuery in fe_mir::db - Rust

Struct MirLoweredConstantQuery

Source
pub struct MirLoweredConstantQuery;

Implementations§

Source§

impl MirLoweredConstantQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredConstantQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredConstantQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredConstantQuery

Source§

fn default() -> MirLoweredConstantQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredConstantQuery

Source§

const QUERY_INDEX: u16 = 11u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_constant"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ConstantId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredConstantQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredConstantQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredConstantQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html new file mode 100644 index 0000000000..fb2cc7a21a --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html @@ -0,0 +1,46 @@ +MirLoweredFuncBodyQuery in fe_mir::db - Rust

Struct MirLoweredFuncBodyQuery

Source
pub struct MirLoweredFuncBodyQuery;

Implementations§

Source§

impl MirLoweredFuncBodyQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredFuncBodyQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredFuncBodyQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredFuncBodyQuery

Source§

fn default() -> MirLoweredFuncBodyQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredFuncBodyQuery

Source§

const QUERY_INDEX: u16 = 15u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_func_body"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionBody>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredFuncBodyQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredFuncBodyQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredFuncBodyQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html new file mode 100644 index 0000000000..616c8fce5f --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html @@ -0,0 +1,46 @@ +MirLoweredFuncSignatureQuery in fe_mir::db - Rust

Struct MirLoweredFuncSignatureQuery

Source
pub struct MirLoweredFuncSignatureQuery;

Implementations§

Source§

impl MirLoweredFuncSignatureQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredFuncSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredFuncSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredFuncSignatureQuery

Source§

fn default() -> MirLoweredFuncSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredFuncSignatureQuery

Source§

const QUERY_INDEX: u16 = 12u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_func_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredFuncSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredFuncSignatureQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredFuncSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html new file mode 100644 index 0000000000..30088a086a --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html @@ -0,0 +1,46 @@ +MirLoweredMonomorphizedFuncSignatureQuery in fe_mir::db - Rust

Struct MirLoweredMonomorphizedFuncSignatureQuery

Source
pub struct MirLoweredMonomorphizedFuncSignatureQuery;

Implementations§

Source§

impl MirLoweredMonomorphizedFuncSignatureQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredMonomorphizedFuncSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredMonomorphizedFuncSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredMonomorphizedFuncSignatureQuery

Source§

fn default() -> MirLoweredMonomorphizedFuncSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredMonomorphizedFuncSignatureQuery

Source§

const QUERY_INDEX: u16 = 13u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_monomorphized_func_signature"

Name of the query method (e.g., foo)
Source§

type Key = (FunctionId, BTreeMap<SmolStr, TypeId>)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredMonomorphizedFuncSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredMonomorphizedFuncSignatureQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredMonomorphizedFuncSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html new file mode 100644 index 0000000000..f5ce19797a --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html @@ -0,0 +1,46 @@ +MirLoweredPseudoMonomorphizedFuncSignatureQuery in fe_mir::db - Rust

Struct MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source
pub struct MirLoweredPseudoMonomorphizedFuncSignatureQuery;

Implementations§

Source§

impl MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

fn default() -> MirLoweredPseudoMonomorphizedFuncSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

const QUERY_INDEX: u16 = 14u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_pseudo_monomorphized_func_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredPseudoMonomorphizedFuncSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html new file mode 100644 index 0000000000..7453f7999f --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html @@ -0,0 +1,46 @@ +MirLoweredTypeQuery in fe_mir::db - Rust

Struct MirLoweredTypeQuery

Source
pub struct MirLoweredTypeQuery;

Implementations§

Source§

impl MirLoweredTypeQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredTypeQuery

Source§

fn default() -> MirLoweredTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredTypeQuery

Source§

const QUERY_INDEX: u16 = 10u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredTypeQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.NewDb.html b/compiler-docs/fe_mir/db/struct.NewDb.html new file mode 100644 index 0000000000..d42c23bd83 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.NewDb.html @@ -0,0 +1,134 @@ +NewDb in fe_mir::db - Rust

Struct NewDb

Source
pub struct NewDb { /* private fields */ }

Trait Implementations§

Source§

impl Database for NewDb

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for NewDb

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for NewDb

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for NewDb

Source§

fn default() -> NewDb

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<AnalyzerDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<MirDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<MirDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<SourceDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl Upcast<dyn AnalyzerDb> for NewDb

Source§

fn upcast(&self) -> &(dyn AnalyzerDb + 'static)

Source§

impl Upcast<dyn SourceDb> for NewDb

Source§

fn upcast(&self) -> &(dyn SourceDb + 'static)

Source§

impl UpcastMut<dyn AnalyzerDb> for NewDb

Source§

fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static)

Source§

impl UpcastMut<dyn SourceDb> for NewDb

Source§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for NewDb

§

impl RefUnwindSafe for NewDb

§

impl !Send for NewDb

§

impl !Sync for NewDb

§

impl Unpin for NewDb

§

impl UnwindSafe for NewDb

Blanket Implementations§

§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

§

fn intern_type(&self, key0: Type) -> TypeId

§

fn lookup_intern_type(&self, key0: TypeId) -> Type

§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
§

fn root_ingot(&self) -> IngotId

§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

§

fn intern_file(&self, key0: File) -> SourceFileId

§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/trait.MirDb.html b/compiler-docs/fe_mir/db/trait.MirDb.html new file mode 100644 index 0000000000..dfbad8a2b2 --- /dev/null +++ b/compiler-docs/fe_mir/db/trait.MirDb.html @@ -0,0 +1,54 @@ +MirDb in fe_mir::db - Rust

Trait MirDb

Source
pub trait MirDb:
+    Database
+    + HasQueryGroup<MirDbStorage>
+    + AnalyzerDb
+    + Upcast<dyn AnalyzerDb>
+    + UpcastMut<dyn AnalyzerDb> {
+
Show 16 methods // Required methods + fn mir_intern_const(&self, key0: Rc<Constant>) -> ConstantId; + fn lookup_mir_intern_const(&self, key0: ConstantId) -> Rc<Constant>; + fn mir_intern_type(&self, key0: Rc<Type>) -> TypeId; + fn lookup_mir_intern_type(&self, key0: TypeId) -> Rc<Type>; + fn mir_intern_function(&self, key0: Rc<FunctionSignature>) -> FunctionId; + fn lookup_mir_intern_function( + &self, + key0: FunctionId, + ) -> Rc<FunctionSignature>; + fn mir_lower_module_all_functions( + &self, + key0: ModuleId, + ) -> Rc<Vec<FunctionId>>; + fn mir_lower_contract_all_functions( + &self, + key0: ContractId, + ) -> Rc<Vec<FunctionId>>; + fn mir_lower_struct_all_functions( + &self, + key0: StructId, + ) -> Rc<Vec<FunctionId>>; + fn mir_lower_enum_all_functions(&self, key0: EnumId) -> Rc<Vec<FunctionId>>; + fn mir_lowered_type(&self, key0: TypeId) -> TypeId; + fn mir_lowered_constant(&self, key0: ModuleConstantId) -> ConstantId; + fn mir_lowered_func_signature(&self, key0: FunctionId) -> FunctionId; + fn mir_lowered_monomorphized_func_signature( + &self, + key0: FunctionId, + key1: BTreeMap<SmolStr, TypeId>, + ) -> FunctionId; + fn mir_lowered_pseudo_monomorphized_func_signature( + &self, + key0: FunctionId, + ) -> FunctionId; + fn mir_lowered_func_body(&self, key0: FunctionId) -> Rc<FunctionBody>; +
}

Required Methods§

Source

fn mir_intern_const(&self, key0: Rc<Constant>) -> ConstantId

Source

fn lookup_mir_intern_const(&self, key0: ConstantId) -> Rc<Constant>

Source

fn mir_intern_type(&self, key0: Rc<Type>) -> TypeId

Source

fn lookup_mir_intern_type(&self, key0: TypeId) -> Rc<Type>

Source

fn mir_intern_function(&self, key0: Rc<FunctionSignature>) -> FunctionId

Source

fn lookup_mir_intern_function(&self, key0: FunctionId) -> Rc<FunctionSignature>

Source

fn mir_lower_module_all_functions(&self, key0: ModuleId) -> Rc<Vec<FunctionId>>

Source

fn mir_lower_contract_all_functions( + &self, + key0: ContractId, +) -> Rc<Vec<FunctionId>>

Source

fn mir_lower_struct_all_functions(&self, key0: StructId) -> Rc<Vec<FunctionId>>

Source

fn mir_lower_enum_all_functions(&self, key0: EnumId) -> Rc<Vec<FunctionId>>

Source

fn mir_lowered_type(&self, key0: TypeId) -> TypeId

Source

fn mir_lowered_constant(&self, key0: ModuleConstantId) -> ConstantId

Source

fn mir_lowered_func_signature(&self, key0: FunctionId) -> FunctionId

Source

fn mir_lowered_monomorphized_func_signature( + &self, + key0: FunctionId, + key1: BTreeMap<SmolStr, TypeId>, +) -> FunctionId

Source

fn mir_lowered_pseudo_monomorphized_func_signature( + &self, + key0: FunctionId, +) -> FunctionId

Source

fn mir_lowered_func_body(&self, key0: FunctionId) -> Rc<FunctionBody>

Implementors§

Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html b/compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html new file mode 100644 index 0000000000..73bab9b041 --- /dev/null +++ b/compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html @@ -0,0 +1,6 @@ +write_mir_graphs in fe_mir::graphviz - Rust

Function write_mir_graphs

Source
pub fn write_mir_graphs<W: Write>(
+    db: &dyn MirDb,
+    module: ModuleId,
+    w: &mut W,
+) -> Result<()>
Expand description

Writes mir graphs of functions in a module.

+
\ No newline at end of file diff --git a/compiler-docs/fe_mir/graphviz/index.html b/compiler-docs/fe_mir/graphviz/index.html new file mode 100644 index 0000000000..8d7ebfe042 --- /dev/null +++ b/compiler-docs/fe_mir/graphviz/index.html @@ -0,0 +1 @@ +fe_mir::graphviz - Rust

Module graphviz

Source

Functions§

write_mir_graphs
Writes mir graphs of functions in a module.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/graphviz/sidebar-items.js b/compiler-docs/fe_mir/graphviz/sidebar-items.js new file mode 100644 index 0000000000..cd5ad48797 --- /dev/null +++ b/compiler-docs/fe_mir/graphviz/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["write_mir_graphs"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/index.html b/compiler-docs/fe_mir/index.html new file mode 100644 index 0000000000..7437765bc5 --- /dev/null +++ b/compiler-docs/fe_mir/index.html @@ -0,0 +1 @@ +fe_mir - Rust

Crate fe_mir

Source

Modules§

analysis
db
graphviz
ir
pretty_print
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/index.html b/compiler-docs/fe_mir/ir/basic_block/index.html new file mode 100644 index 0000000000..ba57a62618 --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/index.html @@ -0,0 +1 @@ +fe_mir::ir::basic_block - Rust

Module basic_block

Source

Structs§

BasicBlock

Type Aliases§

BasicBlockId
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/sidebar-items.js b/compiler-docs/fe_mir/ir/basic_block/sidebar-items.js new file mode 100644 index 0000000000..50c3409a66 --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BasicBlock"],"type":["BasicBlockId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html b/compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html new file mode 100644 index 0000000000..0277f7719a --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html @@ -0,0 +1,22 @@ +BasicBlock in fe_mir::ir::basic_block - Rust

Struct BasicBlock

Source
pub struct BasicBlock {}

Trait Implementations§

Source§

impl Clone for BasicBlock

Source§

fn clone(&self) -> BasicBlock

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BasicBlock

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BasicBlock

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BasicBlock

Source§

fn eq(&self, other: &BasicBlock) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for BasicBlock

Source§

impl Eq for BasicBlock

Source§

impl StructuralPartialEq for BasicBlock

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html b/compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html new file mode 100644 index 0000000000..03c5664ec2 --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html @@ -0,0 +1 @@ +BasicBlockId in fe_mir::ir::basic_block - Rust

Type Alias BasicBlockId

Source
pub type BasicBlockId = Id<BasicBlock>;

Aliased Type§

pub struct BasicBlockId { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_builder/index.html b/compiler-docs/fe_mir/ir/body_builder/index.html new file mode 100644 index 0000000000..d22e13a9b9 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_builder/index.html @@ -0,0 +1 @@ +fe_mir::ir::body_builder - Rust

Module body_builder

Source

Structs§

BodyBuilder
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_builder/sidebar-items.js b/compiler-docs/fe_mir/ir/body_builder/sidebar-items.js new file mode 100644 index 0000000000..24f416595a --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_builder/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BodyBuilder"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html b/compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html new file mode 100644 index 0000000000..178a890525 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html @@ -0,0 +1,104 @@ +BodyBuilder in fe_mir::ir::body_builder - Rust

Struct BodyBuilder

Source
pub struct BodyBuilder {
+    pub body: FunctionBody,
+    /* private fields */
+}

Fields§

§body: FunctionBody

Implementations§

Source§

impl BodyBuilder

Source

pub fn new(fid: FunctionId, source: SourceInfo) -> Self

Source

pub fn build(self) -> FunctionBody

Source

pub fn func_id(&self) -> FunctionId

Source

pub fn make_block(&mut self) -> BasicBlockId

Source

pub fn make_value(&mut self, value: impl Into<Value>) -> ValueId

Source

pub fn map_result(&mut self, inst: InstId, result: AssignableValue)

Source

pub fn inst_result(&mut self, inst: InstId) -> Option<&AssignableValue>

Source

pub fn move_to_block(&mut self, block: BasicBlockId)

Source

pub fn move_to_block_top(&mut self, block: BasicBlockId)

Source

pub fn make_unit(&mut self, unit_ty: TypeId) -> ValueId

Source

pub fn make_imm(&mut self, imm: BigInt, ty: TypeId) -> ValueId

Source

pub fn make_imm_from_bool(&mut self, imm: bool, ty: TypeId) -> ValueId

Source

pub fn make_constant(&mut self, constant: ConstantId, ty: TypeId) -> ValueId

Source

pub fn declare(&mut self, local: Local) -> ValueId

Source

pub fn store_func_arg(&mut self, local: Local) -> ValueId

Source

pub fn not(&mut self, value: ValueId, source: SourceInfo) -> InstId

Source

pub fn neg(&mut self, value: ValueId, source: SourceInfo) -> InstId

Source

pub fn inv(&mut self, value: ValueId, source: SourceInfo) -> InstId

Source

pub fn add(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn sub(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn mul(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn div(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn modulo( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn pow(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn shl(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn shr(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn bit_or( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn bit_xor( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn bit_and( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn logical_and( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn logical_or( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn eq(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn ne(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn ge(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn gt(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn le(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn lt(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn primitive_cast( + &mut self, + value: ValueId, + result_ty: TypeId, + source: SourceInfo, +) -> InstId

Source

pub fn untag_cast( + &mut self, + value: ValueId, + result_ty: TypeId, + source: SourceInfo, +) -> InstId

Source

pub fn aggregate_construct( + &mut self, + ty: TypeId, + args: Vec<ValueId>, + source: SourceInfo, +) -> InstId

Source

pub fn bind(&mut self, src: ValueId, source: SourceInfo) -> InstId

Source

pub fn mem_copy(&mut self, src: ValueId, source: SourceInfo) -> InstId

Source

pub fn load(&mut self, src: ValueId, source: SourceInfo) -> InstId

Source

pub fn aggregate_access( + &mut self, + value: ValueId, + indices: Vec<ValueId>, + source: SourceInfo, +) -> InstId

Source

pub fn map_access( + &mut self, + value: ValueId, + key: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn call( + &mut self, + func: FunctionId, + args: Vec<ValueId>, + call_type: CallType, + source: SourceInfo, +) -> InstId

Source

pub fn keccak256(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn abi_encode(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn create( + &mut self, + value: ValueId, + contract: ContractId, + source: SourceInfo, +) -> InstId

Source

pub fn create2( + &mut self, + value: ValueId, + salt: ValueId, + contract: ContractId, + source: SourceInfo, +) -> InstId

Source

pub fn yul_intrinsic( + &mut self, + op: YulIntrinsicOp, + args: Vec<ValueId>, + source: SourceInfo, +) -> InstId

Source

pub fn jump(&mut self, dest: BasicBlockId, source: SourceInfo) -> InstId

Source

pub fn branch( + &mut self, + cond: ValueId, + then: BasicBlockId, + else_: BasicBlockId, + source: SourceInfo, +) -> InstId

Source

pub fn switch( + &mut self, + disc: ValueId, + table: SwitchTable, + default: Option<BasicBlockId>, + source: SourceInfo, +) -> InstId

Source

pub fn revert(&mut self, arg: Option<ValueId>, source: SourceInfo) -> InstId

Source

pub fn emit(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn ret(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn nop(&mut self, source: SourceInfo) -> InstId

Source

pub fn value_ty(&mut self, value: ValueId) -> TypeId

Source

pub fn value_data(&mut self, value: ValueId) -> &Value

Source

pub fn is_block_terminated(&mut self, block: BasicBlockId) -> bool

Returns true if current block is terminated.

+
Source

pub fn is_current_block_terminated(&mut self) -> bool

Source

pub fn current_block(&mut self) -> BasicBlockId

Source

pub fn remove_inst(&mut self, inst: InstId)

Source

pub fn inst_data(&self, inst: InstId) -> &Inst

Trait Implementations§

Source§

impl Debug for BodyBuilder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html b/compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html new file mode 100644 index 0000000000..34c0fbb7a4 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html @@ -0,0 +1,26 @@ +CursorLocation in fe_mir::ir::body_cursor - Rust

Enum CursorLocation

Source
pub enum CursorLocation {
+    Inst(InstId),
+    BlockTop(BasicBlockId),
+    BlockBottom(BasicBlockId),
+    NoWhere,
+}
Expand description

Specify a current location of BodyCursor

+

Variants§

§

Inst(InstId)

§

BlockTop(BasicBlockId)

§

BlockBottom(BasicBlockId)

§

NoWhere

Trait Implementations§

Source§

impl Clone for CursorLocation

Source§

fn clone(&self) -> CursorLocation

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CursorLocation

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for CursorLocation

Source§

fn eq(&self, other: &CursorLocation) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CursorLocation

Source§

impl Eq for CursorLocation

Source§

impl StructuralPartialEq for CursorLocation

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/index.html b/compiler-docs/fe_mir/ir/body_cursor/index.html new file mode 100644 index 0000000000..ca1f9b4094 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/index.html @@ -0,0 +1,3 @@ +fe_mir::ir::body_cursor - Rust

Module body_cursor

Source
Expand description

This module provides a collection of structs to modify function body +in-place.

+

Structs§

BodyCursor

Enums§

CursorLocation
Specify a current location of BodyCursor
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js b/compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js new file mode 100644 index 0000000000..bb2e01db68 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["CursorLocation"],"struct":["BodyCursor"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html b/compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html new file mode 100644 index 0000000000..637200d350 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html @@ -0,0 +1,35 @@ +BodyCursor in fe_mir::ir::body_cursor - Rust

Struct BodyCursor

Source
pub struct BodyCursor<'a> { /* private fields */ }

Implementations§

Source§

impl<'a> BodyCursor<'a>

Source

pub fn new(body: &'a mut FunctionBody, loc: CursorLocation) -> Self

Source

pub fn new_at_entry(body: &'a mut FunctionBody) -> Self

Source

pub fn set_loc(&mut self, loc: CursorLocation)

Source

pub fn loc(&self) -> CursorLocation

Source

pub fn next_loc(&self) -> CursorLocation

Source

pub fn prev_loc(&self) -> CursorLocation

Source

pub fn next_block(&self) -> Option<BasicBlockId>

Source

pub fn prev_block(&self) -> Option<BasicBlockId>

Source

pub fn proceed(&mut self)

Source

pub fn back(&mut self)

Source

pub fn body(&self) -> &FunctionBody

Source

pub fn body_mut(&mut self) -> &mut FunctionBody

Source

pub fn set_to_entry(&mut self)

Sets a cursor to an entry block.

+
Source

pub fn insert_inst(&mut self, inst: InstId)

Insert InstId to a location where a cursor points. +If you need to store and insert Inst, use [store_and_insert_inst].

+
§Panics
+

Panics if a cursor points CursorLocation::NoWhere.

+
Source

pub fn store_and_insert_inst(&mut self, data: Inst) -> InstId

Source

pub fn remove_inst(&mut self)

Remove a current pointed Inst from a function body. A cursor +proceeds to a next inst.

+
§Panics
+

Panics if a cursor doesn’t point CursorLocation::Inst.

+
Source

pub fn remove_block(&mut self)

Remove a current pointed block and contained insts from a function +body. A cursor proceeds to a next block.

+
§Panics
+

Panics if a cursor doesn’t point CursorLocation::Inst.

+
Source

pub fn insert_block(&mut self, block: BasicBlockId)

Insert BasicBlockId to a location where a cursor points. +If you need to store and insert BasicBlock, use +[store_and_insert_block].

+
§Panics
+

Panics if a cursor points CursorLocation::NoWhere.

+
Source

pub fn store_and_insert_block(&mut self, block: BasicBlock) -> BasicBlockId

Source

pub fn map_result(&mut self, result: AssignableValue) -> Option<ValueId>

Source

pub fn expect_inst(&self) -> InstId

Returns current inst that cursor points.

+
§Panics
+

Panics if a cursor doesn’t point CursorLocation::Inst.

+
Source

pub fn expect_block(&self) -> BasicBlockId

Returns current block that cursor points.

+
§Panics
+

Panics if a cursor points CursorLocation::NoWhere.

+

Auto Trait Implementations§

§

impl<'a> Freeze for BodyCursor<'a>

§

impl<'a> RefUnwindSafe for BodyCursor<'a>

§

impl<'a> Send for BodyCursor<'a>

§

impl<'a> Sync for BodyCursor<'a>

§

impl<'a> Unpin for BodyCursor<'a>

§

impl<'a> !UnwindSafe for BodyCursor<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_order/index.html b/compiler-docs/fe_mir/ir/body_order/index.html new file mode 100644 index 0000000000..b90dd98fe0 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_order/index.html @@ -0,0 +1 @@ +fe_mir::ir::body_order - Rust

Module body_order

Source

Structs§

BodyOrder
Represents basic block order and instruction order.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_order/sidebar-items.js b/compiler-docs/fe_mir/ir/body_order/sidebar-items.js new file mode 100644 index 0000000000..a8e1023e35 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_order/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BodyOrder"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html b/compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html new file mode 100644 index 0000000000..fcf587721c --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html @@ -0,0 +1,132 @@ +BodyOrder in fe_mir::ir::body_order - Rust

Struct BodyOrder

Source
pub struct BodyOrder { /* private fields */ }
Expand description

Represents basic block order and instruction order.

+

Implementations§

Source§

impl BodyOrder

Source

pub fn new(entry_block: BasicBlockId) -> Self

Source

pub fn entry(&self) -> BasicBlockId

Returns an entry block of a function body.

+
Source

pub fn last_block(&self) -> BasicBlockId

Returns a last block of a function body.

+
Source

pub fn is_block_empty(&self, block: BasicBlockId) -> bool

Returns true if a block doesn’t contain any block.

+
Source

pub fn is_block_inserted(&self, block: BasicBlockId) -> bool

Returns true if a function body contains a given block.

+
Source

pub fn block_num(&self) -> usize

Returns a number of block in a function.

+
Source

pub fn prev_block(&self, block: BasicBlockId) -> Option<BasicBlockId>

Returns a previous block of a given block.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn next_block(&self, block: BasicBlockId) -> Option<BasicBlockId>

Returns a next block of a given block.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn is_inst_inserted(&self, inst: InstId) -> bool

Returns true is a given inst is inserted.

+
Source

pub fn first_inst(&self, block: BasicBlockId) -> Option<InstId>

Returns first instruction of a block if exists.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn terminator( + &self, + store: &BodyDataStore, + block: BasicBlockId, +) -> Option<InstId>

Returns a terminator instruction of a block.

+
§Panics
+

Panics if

+
    +
  1. block is not inserted yet.
  2. +
+
Source

pub fn is_terminated(&self, store: &BodyDataStore, block: BasicBlockId) -> bool

Returns true if a block is terminated.

+
Source

pub fn last_inst(&self, block: BasicBlockId) -> Option<InstId>

Returns a last instruction of a block.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn prev_inst(&self, inst: InstId) -> Option<InstId>

Returns a previous instruction of a given inst.

+
§Panics
+

Panics if inst is not inserted yet.

+
Source

pub fn next_inst(&self, inst: InstId) -> Option<InstId>

Returns a next instruction of a given inst.

+
§Panics
+

Panics if inst is not inserted yet.

+
Source

pub fn inst_block(&self, inst: InstId) -> BasicBlockId

Returns a block to which a given inst belongs.

+
§Panics
+

Panics if inst is not inserted yet.

+
Source

pub fn iter_block(&self) -> impl Iterator<Item = BasicBlockId> + '_

Returns an iterator which iterates all basic blocks in a function body +in pre-order.

+
Source

pub fn iter_inst( + &self, + block: BasicBlockId, +) -> impl Iterator<Item = InstId> + '_

Returns an iterator which iterates all instruction in a given block in +pre-order.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn append_block(&mut self, block: BasicBlockId)

Appends a given block to a function body.

+
§Panics
+

Panics if a given block is already inserted to a function.

+
Source

pub fn insert_block_before_block( + &mut self, + block: BasicBlockId, + before: BasicBlockId, +)

Inserts a given block before a before block.

+
§Panics
+

Panics if

+
    +
  1. a given block is already inserted.
  2. +
  3. a given before block is NOTE inserted yet.
  4. +
+
Source

pub fn insert_block_after_block( + &mut self, + block: BasicBlockId, + after: BasicBlockId, +)

Inserts a given block after a after block.

+
§Panics
+

Panics if

+
    +
  1. a given block is already inserted.
  2. +
  3. a given after block is NOTE inserted yet.
  4. +
+
Source

pub fn remove_block(&mut self, block: BasicBlockId)

Remove a given block from a function. All instructions in a block are +also removed.

+
§Panics
+

Panics if

+
    +
  1. a given block is NOT inserted.
  2. +
  3. a block is the last one block in a function.
  4. +
+
Source

pub fn append_inst(&mut self, inst: InstId, block: BasicBlockId)

Appends inst to the end of a block

+
§Panics
+

Panics if

+
    +
  1. a given block is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn prepend_inst(&mut self, inst: InstId, block: BasicBlockId)

Prepends inst to the beginning of a block

+
§Panics
+

Panics if

+
    +
  1. a given block is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn insert_inst_before_inst(&mut self, inst: InstId, before: InstId)

Insert inst before before inst.

+
§Panics
+

Panics if

+
    +
  1. a given before is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn insert_inst_after(&mut self, inst: InstId, after: InstId)

Insert inst after after inst.

+
§Panics
+

Panics if

+
    +
  1. a given after is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn remove_inst(&mut self, inst: InstId)

Remove instruction from the function body.

+
§Panics
+

Panics if a given inst is not inserted.

+

Trait Implementations§

Source§

impl Clone for BodyOrder

Source§

fn clone(&self) -> BodyOrder

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BodyOrder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BodyOrder

Source§

fn eq(&self, other: &BodyOrder) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BodyOrder

Source§

impl StructuralPartialEq for BodyOrder

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html b/compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html new file mode 100644 index 0000000000..bc237784ce --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html @@ -0,0 +1,26 @@ +ConstantValue in fe_mir::ir::constant - Rust

Enum ConstantValue

Source
pub enum ConstantValue {
+    Immediate(BigInt),
+    Str(SmolStr),
+    Bool(bool),
+}

Variants§

§

Immediate(BigInt)

§

Str(SmolStr)

§

Bool(bool)

Trait Implementations§

Source§

impl Clone for ConstantValue

Source§

fn clone(&self) -> ConstantValue

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstantValue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Constant> for ConstantValue

Source§

fn from(value: Constant) -> Self

Converts to this type from the input type.
Source§

impl Hash for ConstantValue

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstantValue

Source§

fn eq(&self, other: &ConstantValue) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ConstantValue

Source§

impl StructuralPartialEq for ConstantValue

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/index.html b/compiler-docs/fe_mir/ir/constant/index.html new file mode 100644 index 0000000000..e2ca2ff9cf --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/index.html @@ -0,0 +1 @@ +fe_mir::ir::constant - Rust

Module constant

Source

Structs§

Constant
ConstantId
An interned Id for Constant.

Enums§

ConstantValue
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/sidebar-items.js b/compiler-docs/fe_mir/ir/constant/sidebar-items.js new file mode 100644 index 0000000000..7ae3b94cad --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ConstantValue"],"struct":["Constant","ConstantId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/struct.Constant.html b/compiler-docs/fe_mir/ir/constant/struct.Constant.html new file mode 100644 index 0000000000..45b90e1b45 --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/struct.Constant.html @@ -0,0 +1,33 @@ +Constant in fe_mir::ir::constant - Rust

Struct Constant

Source
pub struct Constant {
+    pub name: SmolStr,
+    pub value: ConstantValue,
+    pub ty: TypeId,
+    pub module_id: ModuleId,
+    pub source: SourceInfo,
+}

Fields§

§name: SmolStr

A name of a constant.

+
§value: ConstantValue

A value of a constant.

+
§ty: TypeId

A type of a constant.

+
§module_id: ModuleId

A module where a constant is declared.

+
§source: SourceInfo

A span where a constant is declared.

+

Trait Implementations§

Source§

impl Clone for Constant

Source§

fn clone(&self) -> Constant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Constant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Constant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Constant

Source§

fn eq(&self, other: &Constant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Constant

Source§

impl StructuralPartialEq for Constant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/struct.ConstantId.html b/compiler-docs/fe_mir/ir/constant/struct.ConstantId.html new file mode 100644 index 0000000000..de18db7ec9 --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/struct.ConstantId.html @@ -0,0 +1,23 @@ +ConstantId in fe_mir::ir::constant - Rust

Struct ConstantId

Source
pub struct ConstantId(/* private fields */);
Expand description

An interned Id for Constant.

+

Implementations§

Source§

impl ConstantId

Source

pub fn data(self, db: &dyn MirDb) -> Rc<Constant>

Source

pub fn ty(self, db: &dyn MirDb) -> TypeId

Trait Implementations§

Source§

impl Clone for ConstantId

Source§

fn clone(&self) -> ConstantId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstantId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConstantId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ConstantId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl PartialEq for ConstantId

Source§

fn eq(&self, other: &ConstantId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ConstantId

Source§

impl Eq for ConstantId

Source§

impl StructuralPartialEq for ConstantId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/enum.Linkage.html b/compiler-docs/fe_mir/ir/function/enum.Linkage.html new file mode 100644 index 0000000000..553c2b9735 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/enum.Linkage.html @@ -0,0 +1,31 @@ +Linkage in fe_mir::ir::function - Rust

Enum Linkage

Source
pub enum Linkage {
+    Private,
+    Public,
+    Export,
+}

Variants§

§

Private

A function can only be called within the same module.

+
§

Public

A function can be called from other modules, but can NOT be called from +other accounts and transactions.

+
§

Export

A function can be called from other modules, and also can be called from +other accounts and transactions.

+

Implementations§

Trait Implementations§

Source§

impl Clone for Linkage

Source§

fn clone(&self) -> Linkage

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Linkage

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Linkage

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Linkage

Source§

fn eq(&self, other: &Linkage) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Linkage

Source§

impl Eq for Linkage

Source§

impl StructuralPartialEq for Linkage

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/index.html b/compiler-docs/fe_mir/ir/function/index.html new file mode 100644 index 0000000000..2a9fdf35ac --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/index.html @@ -0,0 +1,3 @@ +fe_mir::ir::function - Rust

Module function

Source

Structs§

BodyDataStore
A collection of basic block, instructions and values appear in a function +body.
FunctionBody
A function body, which is not stored in salsa db to enable in-place +transformation.
FunctionId
FunctionParam
FunctionSignature
Represents function signature.

Enums§

Linkage
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/sidebar-items.js b/compiler-docs/fe_mir/ir/function/sidebar-items.js new file mode 100644 index 0000000000..e32c20ed9a --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Linkage"],"struct":["BodyDataStore","FunctionBody","FunctionId","FunctionParam","FunctionSignature"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html b/compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html new file mode 100644 index 0000000000..e836f8eba5 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html @@ -0,0 +1,29 @@ +BodyDataStore in fe_mir::ir::function - Rust

Struct BodyDataStore

Source
pub struct BodyDataStore { /* private fields */ }
Expand description

A collection of basic block, instructions and values appear in a function +body.

+

Implementations§

Source§

impl BodyDataStore

Source

pub fn store_inst(&mut self, inst: Inst) -> InstId

Source

pub fn inst_data(&self, inst: InstId) -> &Inst

Source

pub fn inst_data_mut(&mut self, inst: InstId) -> &mut Inst

Source

pub fn replace_inst(&mut self, inst: InstId, new: Inst) -> Inst

Source

pub fn store_value(&mut self, value: Value) -> ValueId

Source

pub fn is_nop(&self, inst: InstId) -> bool

Source

pub fn is_terminator(&self, inst: InstId) -> bool

Source

pub fn branch_info(&self, inst: InstId) -> BranchInfo<'_>

Source

pub fn value_data(&self, value: ValueId) -> &Value

Source

pub fn value_data_mut(&mut self, value: ValueId) -> &mut Value

Source

pub fn values(&self) -> impl Iterator<Item = &Value>

Source

pub fn values_mut(&mut self) -> impl Iterator<Item = &mut Value>

Source

pub fn store_block(&mut self, block: BasicBlock) -> BasicBlockId

Source

pub fn inst_result(&self, inst: InstId) -> Option<&AssignableValue>

Returns an instruction result

+
Source

pub fn map_result(&mut self, inst: InstId, result: AssignableValue)

Source

pub fn remove_inst_result(&mut self, inst: InstId) -> Option<AssignableValue>

Source

pub fn rewrite_branch_dest( + &mut self, + inst: InstId, + from: BasicBlockId, + to: BasicBlockId, +)

Source

pub fn value_ty(&self, vid: ValueId) -> TypeId

Source

pub fn locals(&self) -> &[ValueId]

Source

pub fn locals_mut(&mut self) -> &[ValueId]

Source

pub fn func_args(&self) -> impl Iterator<Item = ValueId> + '_

Source

pub fn func_args_mut(&mut self) -> impl Iterator<Item = &mut Value>

Source

pub fn local_name(&self, value: ValueId) -> Option<&str>

Returns Some(local_name) if value is Value::Local.

+
Source

pub fn replace_value(&mut self, value: ValueId, to: Value) -> Value

Trait Implementations§

Source§

impl Clone for BodyDataStore

Source§

fn clone(&self) -> BodyDataStore

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BodyDataStore

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for BodyDataStore

Source§

fn default() -> BodyDataStore

Returns the “default value” for a type. Read more
Source§

impl PartialEq for BodyDataStore

Source§

fn eq(&self, other: &BodyDataStore) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BodyDataStore

Source§

impl StructuralPartialEq for BodyDataStore

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionBody.html b/compiler-docs/fe_mir/ir/function/struct.FunctionBody.html new file mode 100644 index 0000000000..9d9352964c --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionBody.html @@ -0,0 +1,28 @@ +FunctionBody in fe_mir::ir::function - Rust

Struct FunctionBody

Source
pub struct FunctionBody {
+    pub fid: FunctionId,
+    pub store: BodyDataStore,
+    pub order: BodyOrder,
+    pub source: SourceInfo,
+}
Expand description

A function body, which is not stored in salsa db to enable in-place +transformation.

+

Fields§

§fid: FunctionId§store: BodyDataStore§order: BodyOrder

Tracks order of basic blocks and instructions in a function body.

+
§source: SourceInfo

Implementations§

Source§

impl FunctionBody

Source

pub fn new(fid: FunctionId, source: SourceInfo) -> Self

Trait Implementations§

Source§

impl Clone for FunctionBody

Source§

fn clone(&self) -> FunctionBody

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionBody

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for FunctionBody

Source§

fn eq(&self, other: &FunctionBody) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionBody

Source§

impl StructuralPartialEq for FunctionBody

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionId.html b/compiler-docs/fe_mir/ir/function/struct.FunctionId.html new file mode 100644 index 0000000000..4b8d4f1a4d --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionId.html @@ -0,0 +1,33 @@ +FunctionId in fe_mir::ir::function - Rust

Struct FunctionId

Source
pub struct FunctionId(pub u32);

Tuple Fields§

§0: u32

Implementations§

Source§

impl FunctionId

Source

pub fn signature(self, db: &dyn MirDb) -> Rc<FunctionSignature>

Source

pub fn return_type(self, db: &dyn MirDb) -> Option<TypeId>

Source

pub fn linkage(self, db: &dyn MirDb) -> Linkage

Source

pub fn analyzer_func(self, db: &dyn MirDb) -> FunctionId

Source

pub fn body(self, db: &dyn MirDb) -> Rc<FunctionBody>

Source

pub fn module(self, db: &dyn MirDb) -> ModuleId

Source

pub fn is_contract_init(self, db: &dyn MirDb) -> bool

Source

pub fn type_suffix(&self, db: &dyn MirDb) -> SmolStr

Returns a type suffix if a generic function was monomorphized

+
Source

pub fn name(&self, db: &dyn MirDb) -> SmolStr

Source

pub fn debug_name(self, db: &dyn MirDb) -> SmolStr

Returns class_name::fn_name if a function is a method else fn_name.

+
Source

pub fn returns_aggregate(self, db: &dyn MirDb) -> bool

Trait Implementations§

Source§

impl Clone for FunctionId

Source§

fn clone(&self) -> FunctionId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for FunctionId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for FunctionId

Source§

fn cmp(&self, other: &FunctionId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FunctionId

Source§

fn eq(&self, other: &FunctionId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FunctionId

Source§

fn partial_cmp(&self, other: &FunctionId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FunctionId

Source§

impl Eq for FunctionId

Source§

impl StructuralPartialEq for FunctionId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionParam.html b/compiler-docs/fe_mir/ir/function/struct.FunctionParam.html new file mode 100644 index 0000000000..4c7a826bd5 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionParam.html @@ -0,0 +1,26 @@ +FunctionParam in fe_mir::ir::function - Rust

Struct FunctionParam

Source
pub struct FunctionParam {
+    pub name: SmolStr,
+    pub ty: TypeId,
+    pub source: SourceInfo,
+}

Fields§

§name: SmolStr§ty: TypeId§source: SourceInfo

Trait Implementations§

Source§

impl Clone for FunctionParam

Source§

fn clone(&self) -> FunctionParam

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionParam

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionParam

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionParam

Source§

fn eq(&self, other: &FunctionParam) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionParam

Source§

impl StructuralPartialEq for FunctionParam

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html b/compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html new file mode 100644 index 0000000000..4d14026e65 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html @@ -0,0 +1,30 @@ +FunctionSignature in fe_mir::ir::function - Rust

Struct FunctionSignature

Source
pub struct FunctionSignature {
+    pub params: Vec<FunctionParam>,
+    pub resolved_generics: BTreeMap<SmolStr, TypeId>,
+    pub return_type: Option<TypeId>,
+    pub module_id: ModuleId,
+    pub analyzer_func_id: FunctionId,
+    pub linkage: Linkage,
+}
Expand description

Represents function signature.

+

Fields§

§params: Vec<FunctionParam>§resolved_generics: BTreeMap<SmolStr, TypeId>§return_type: Option<TypeId>§module_id: ModuleId§analyzer_func_id: FunctionId§linkage: Linkage

Trait Implementations§

Source§

impl Clone for FunctionSignature

Source§

fn clone(&self) -> FunctionSignature

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionSignature

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSignature

Source§

fn eq(&self, other: &FunctionSignature) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionSignature

Source§

impl StructuralPartialEq for FunctionSignature

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/index.html b/compiler-docs/fe_mir/ir/index.html new file mode 100644 index 0000000000..438c527979 --- /dev/null +++ b/compiler-docs/fe_mir/ir/index.html @@ -0,0 +1,3 @@ +fe_mir::ir - Rust

Module ir

Source

Re-exports§

pub use basic_block::BasicBlock;
pub use basic_block::BasicBlockId;
pub use constant::Constant;
pub use constant::ConstantId;
pub use function::FunctionBody;
pub use function::FunctionId;
pub use function::FunctionParam;
pub use function::FunctionSignature;
pub use inst::Inst;
pub use inst::InstId;
pub use types::Type;
pub use types::TypeId;
pub use types::TypeKind;
pub use value::Value;
pub use value::ValueId;

Modules§

basic_block
body_builder
body_cursor
This module provides a collection of structs to modify function body +in-place.
body_order
constant
function
inst
types
value

Structs§

SourceInfo
An original source information that indicates where mir entities derive +from. SourceInfo is mainly used for diagnostics.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.BinOp.html b/compiler-docs/fe_mir/ir/inst/enum.BinOp.html new file mode 100644 index 0000000000..cd8f2e668f --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.BinOp.html @@ -0,0 +1,43 @@ +BinOp in fe_mir::ir::inst - Rust

Enum BinOp

Source
pub enum BinOp {
+
Show 19 variants Add, + Sub, + Mul, + Div, + Mod, + Pow, + Shl, + Shr, + BitOr, + BitXor, + BitAnd, + LogicalAnd, + LogicalOr, + Eq, + Ne, + Ge, + Gt, + Le, + Lt, +
}

Variants§

§

Add

§

Sub

§

Mul

§

Div

§

Mod

§

Pow

§

Shl

§

Shr

§

BitOr

§

BitXor

§

BitAnd

§

LogicalAnd

§

LogicalOr

§

Eq

§

Ne

§

Ge

§

Gt

§

Le

§

Lt

Trait Implementations§

Source§

impl Clone for BinOp

Source§

fn clone(&self) -> BinOp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BinOp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for BinOp

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BinOp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BinOp

Source§

fn eq(&self, other: &BinOp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for BinOp

Source§

impl Eq for BinOp

Source§

impl StructuralPartialEq for BinOp

Auto Trait Implementations§

§

impl Freeze for BinOp

§

impl RefUnwindSafe for BinOp

§

impl Send for BinOp

§

impl Sync for BinOp

§

impl Unpin for BinOp

§

impl UnwindSafe for BinOp

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html b/compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html new file mode 100644 index 0000000000..3484beccf7 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html @@ -0,0 +1,16 @@ +BranchInfo in fe_mir::ir::inst - Rust

Enum BranchInfo

Source
pub enum BranchInfo<'a> {
+    NotBranch,
+    Jump(BasicBlockId),
+    Branch(ValueId, BasicBlockId, BasicBlockId),
+    Switch(ValueId, &'a SwitchTable, Option<BasicBlockId>),
+}

Variants§

Implementations§

Source§

impl<'a> BranchInfo<'a>

Source

pub fn is_not_a_branch(&self) -> bool

Source

pub fn block_iter(&self) -> BlockIter<'_>

Auto Trait Implementations§

§

impl<'a> Freeze for BranchInfo<'a>

§

impl<'a> RefUnwindSafe for BranchInfo<'a>

§

impl<'a> Send for BranchInfo<'a>

§

impl<'a> Sync for BranchInfo<'a>

§

impl<'a> Unpin for BranchInfo<'a>

§

impl<'a> UnwindSafe for BranchInfo<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.CallType.html b/compiler-docs/fe_mir/ir/inst/enum.CallType.html new file mode 100644 index 0000000000..3d699b305d --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.CallType.html @@ -0,0 +1,26 @@ +CallType in fe_mir::ir::inst - Rust

Enum CallType

Source
pub enum CallType {
+    Internal,
+    External,
+}

Variants§

§

Internal

§

External

Trait Implementations§

Source§

impl Clone for CallType

Source§

fn clone(&self) -> CallType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for CallType

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CallType

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CallType

Source§

fn eq(&self, other: &CallType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CallType

Source§

impl Eq for CallType

Source§

impl StructuralPartialEq for CallType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.CastKind.html b/compiler-docs/fe_mir/ir/inst/enum.CastKind.html new file mode 100644 index 0000000000..0dc34b1ebc --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.CastKind.html @@ -0,0 +1,27 @@ +CastKind in fe_mir::ir::inst - Rust

Enum CastKind

Source
pub enum CastKind {
+    Primitive,
+    Untag,
+}

Variants§

§

Primitive

A cast from a primitive type to a primitive type.

+
§

Untag

A cast from an enum type to its underlying type.

+

Trait Implementations§

Source§

impl Clone for CastKind

Source§

fn clone(&self) -> CastKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CastKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CastKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CastKind

Source§

fn eq(&self, other: &CastKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for CastKind

Source§

impl StructuralPartialEq for CastKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.InstKind.html b/compiler-docs/fe_mir/ir/inst/enum.InstKind.html new file mode 100644 index 0000000000..8612818ed4 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.InstKind.html @@ -0,0 +1,121 @@ +InstKind in fe_mir::ir::inst - Rust

Enum InstKind

Source
pub enum InstKind {
+
Show 23 variants Declare { + local: ValueId, + }, + Unary { + op: UnOp, + value: ValueId, + }, + Binary { + op: BinOp, + lhs: ValueId, + rhs: ValueId, + }, + Cast { + kind: CastKind, + value: ValueId, + to: TypeId, + }, + AggregateConstruct { + ty: TypeId, + args: Vec<ValueId>, + }, + Bind { + src: ValueId, + }, + MemCopy { + src: ValueId, + }, + Load { + src: ValueId, + }, + AggregateAccess { + value: ValueId, + indices: Vec<ValueId>, + }, + MapAccess { + key: ValueId, + value: ValueId, + }, + Call { + func: FunctionId, + args: Vec<ValueId>, + call_type: CallType, + }, + Jump { + dest: BasicBlockId, + }, + Branch { + cond: ValueId, + then: BasicBlockId, + else_: BasicBlockId, + }, + Switch { + disc: ValueId, + table: SwitchTable, + default: Option<BasicBlockId>, + }, + Revert { + arg: Option<ValueId>, + }, + Emit { + arg: ValueId, + }, + Return { + arg: Option<ValueId>, + }, + Keccak256 { + arg: ValueId, + }, + AbiEncode { + arg: ValueId, + }, + Nop, + Create { + value: ValueId, + contract: ContractId, + }, + Create2 { + value: ValueId, + salt: ValueId, + contract: ContractId, + }, + YulIntrinsic { + op: YulIntrinsicOp, + args: Vec<ValueId>, + }, +
}

Variants§

§

Declare

This is not a real instruction, just used to tag a position where a +local is declared.

+

Fields

§local: ValueId
§

Unary

Unary instruction.

+

Fields

§op: UnOp
§value: ValueId
§

Binary

Binary instruction.

+

Fields

§

Cast

Fields

§value: ValueId
§

AggregateConstruct

Constructs aggregate value, i.e. struct, tuple and array.

+

Fields

§args: Vec<ValueId>
§

Bind

Fields

§

MemCopy

Fields

§

Load

Load a primitive value from a ptr

+

Fields

§

AggregateAccess

Access to aggregate fields or elements.

+

§Example

struct Foo:
+    x: i32
+    y: Array<i32, 8>
+

foo.y is lowered into `AggregateAccess(foo, [1])’ for example.

+

Fields

§value: ValueId
§indices: Vec<ValueId>
§

MapAccess

Fields

§value: ValueId
§

Call

Fields

§args: Vec<ValueId>
§call_type: CallType
§

Jump

Unconditional jump instruction.

+

Fields

§

Branch

Conditional branching instruction.

+

Fields

§cond: ValueId
§

Switch

Fields

§disc: ValueId
§

Revert

Fields

§

Emit

Fields

§

Return

Fields

§

Keccak256

Fields

§

AbiEncode

Fields

§

Nop

§

Create

Fields

§value: ValueId
§contract: ContractId
§

Create2

Fields

§value: ValueId
§salt: ValueId
§contract: ContractId
§

YulIntrinsic

Trait Implementations§

Source§

impl Clone for InstKind

Source§

fn clone(&self) -> InstKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for InstKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for InstKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for InstKind

Source§

fn eq(&self, other: &InstKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for InstKind

Source§

impl StructuralPartialEq for InstKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.IterBase.html b/compiler-docs/fe_mir/ir/inst/enum.IterBase.html new file mode 100644 index 0000000000..41791364cd --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.IterBase.html @@ -0,0 +1,231 @@ +IterBase in fe_mir::ir::inst - Rust

Enum IterBase

Source
pub enum IterBase<'a, T> {
+    Zero,
+    One(Option<T>),
+    Slice(Iter<'a, T>),
+    Chain(Box<IterBase<'a, T>>, Box<IterBase<'a, T>>),
+}

Variants§

§

Zero

§

One(Option<T>)

§

Slice(Iter<'a, T>)

§

Chain(Box<IterBase<'a, T>>, Box<IterBase<'a, T>>)

Trait Implementations§

Source§

impl<'a, T> Iterator for IterBase<'a, T>
where + T: Copy,

Source§

type Item = T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for IterBase<'a, T>
where + T: Freeze,

§

impl<'a, T> RefUnwindSafe for IterBase<'a, T>
where + T: RefUnwindSafe,

§

impl<'a, T> Send for IterBase<'a, T>
where + T: Send + Sync,

§

impl<'a, T> Sync for IterBase<'a, T>
where + T: Sync,

§

impl<'a, T> Unpin for IterBase<'a, T>
where + T: Unpin,

§

impl<'a, T> UnwindSafe for IterBase<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<I> UnicodeNormalization<I> for I
where + I: Iterator<Item = char>,

§

fn nfd(self) -> Decompositions<I>

Returns an iterator over the string in Unicode Normalization Form D +(canonical decomposition).
§

fn nfkd(self) -> Decompositions<I>

Returns an iterator over the string in Unicode Normalization Form KD +(compatibility decomposition).
§

fn nfc(self) -> Recompositions<I>

An Iterator over the string in Unicode Normalization Form C +(canonical decomposition followed by canonical composition).
§

fn nfkc(self) -> Recompositions<I>

An Iterator over the string in Unicode Normalization Form KC +(compatibility decomposition followed by canonical composition).
§

fn cjk_compat_variants(self) -> Replacements<I>

A transformation which replaces CJK Compatibility Ideograph codepoints +with normal forms using Standardized Variation Sequences. This is not +part of the canonical or compatibility decomposition algorithms, but +performing it before those algorithms produces normalized output which +better preserves the intent of the original text. Read more
§

fn stream_safe(self) -> StreamSafe<I>

An Iterator over the string with Conjoining Grapheme Joiner characters +inserted according to the Stream-Safe Text Process (UAX15-D4)
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html b/compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html new file mode 100644 index 0000000000..8640746894 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html @@ -0,0 +1,217 @@ +IterMutBase in fe_mir::ir::inst - Rust

Enum IterMutBase

Source
pub enum IterMutBase<'a, T> {
+    Zero,
+    One(Option<&'a mut T>),
+    Slice(IterMut<'a, T>),
+    Chain(Box<IterMutBase<'a, T>>, Box<IterMutBase<'a, T>>),
+}

Variants§

§

Zero

§

One(Option<&'a mut T>)

§

Slice(IterMut<'a, T>)

§

Chain(Box<IterMutBase<'a, T>>, Box<IterMutBase<'a, T>>)

Trait Implementations§

Source§

impl<'a, T> Iterator for IterMutBase<'a, T>

Source§

type Item = &'a mut T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for IterMutBase<'a, T>

§

impl<'a, T> RefUnwindSafe for IterMutBase<'a, T>
where + T: RefUnwindSafe,

§

impl<'a, T> Send for IterMutBase<'a, T>
where + T: Send,

§

impl<'a, T> Sync for IterMutBase<'a, T>
where + T: Sync,

§

impl<'a, T> Unpin for IterMutBase<'a, T>

§

impl<'a, T> !UnwindSafe for IterMutBase<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.UnOp.html b/compiler-docs/fe_mir/ir/inst/enum.UnOp.html new file mode 100644 index 0000000000..b24b67c0f2 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.UnOp.html @@ -0,0 +1,30 @@ +UnOp in fe_mir::ir::inst - Rust

Enum UnOp

Source
pub enum UnOp {
+    Not,
+    Neg,
+    Inv,
+}

Variants§

§

Not

not operator for logical inversion.

+
§

Neg

- operator for negation.

+
§

Inv

~ operator for bitwise inversion.

+

Trait Implementations§

Source§

impl Clone for UnOp

Source§

fn clone(&self) -> UnOp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UnOp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for UnOp

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for UnOp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UnOp

Source§

fn eq(&self, other: &UnOp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for UnOp

Source§

impl Eq for UnOp

Source§

impl StructuralPartialEq for UnOp

Auto Trait Implementations§

§

impl Freeze for UnOp

§

impl RefUnwindSafe for UnOp

§

impl Send for UnOp

§

impl Sync for UnOp

§

impl Unpin for UnOp

§

impl UnwindSafe for UnOp

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html b/compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html new file mode 100644 index 0000000000..883b83d9dc --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html @@ -0,0 +1,100 @@ +YulIntrinsicOp in fe_mir::ir::inst - Rust

Enum YulIntrinsicOp

Source
pub enum YulIntrinsicOp {
+
Show 76 variants Stop, + Add, + Sub, + Mul, + Div, + Sdiv, + Mod, + Smod, + Exp, + Not, + Lt, + Gt, + Slt, + Sgt, + Eq, + Iszero, + And, + Or, + Xor, + Byte, + Shl, + Shr, + Sar, + Addmod, + Mulmod, + Signextend, + Keccak256, + Pc, + Pop, + Mload, + Mstore, + Mstore8, + Sload, + Sstore, + Msize, + Gas, + Address, + Balance, + Selfbalance, + Caller, + Callvalue, + Calldataload, + Calldatasize, + Calldatacopy, + Codesize, + Codecopy, + Extcodesize, + Extcodecopy, + Returndatasize, + Returndatacopy, + Extcodehash, + Create, + Create2, + Call, + Callcode, + Delegatecall, + Staticcall, + Return, + Revert, + Selfdestruct, + Invalid, + Log0, + Log1, + Log2, + Log3, + Log4, + Chainid, + Basefee, + Origin, + Gasprice, + Blockhash, + Coinbase, + Timestamp, + Number, + Prevrandao, + Gaslimit, +
}

Variants§

§

Stop

§

Add

§

Sub

§

Mul

§

Div

§

Sdiv

§

Mod

§

Smod

§

Exp

§

Not

§

Lt

§

Gt

§

Slt

§

Sgt

§

Eq

§

Iszero

§

And

§

Or

§

Xor

§

Byte

§

Shl

§

Shr

§

Sar

§

Addmod

§

Mulmod

§

Signextend

§

Keccak256

§

Pc

§

Pop

§

Mload

§

Mstore

§

Mstore8

§

Sload

§

Sstore

§

Msize

§

Gas

§

Address

§

Balance

§

Selfbalance

§

Caller

§

Callvalue

§

Calldataload

§

Calldatasize

§

Calldatacopy

§

Codesize

§

Codecopy

§

Extcodesize

§

Extcodecopy

§

Returndatasize

§

Returndatacopy

§

Extcodehash

§

Create

§

Create2

§

Call

§

Callcode

§

Delegatecall

§

Staticcall

§

Return

§

Revert

§

Selfdestruct

§

Invalid

§

Log0

§

Log1

§

Log2

§

Log3

§

Log4

§

Chainid

§

Basefee

§

Origin

§

Gasprice

§

Blockhash

§

Coinbase

§

Timestamp

§

Number

§

Prevrandao

§

Gaslimit

Implementations§

Trait Implementations§

Source§

impl Clone for YulIntrinsicOp

Source§

fn clone(&self) -> YulIntrinsicOp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for YulIntrinsicOp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for YulIntrinsicOp

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Intrinsic> for YulIntrinsicOp

Source§

fn from(val: Intrinsic) -> Self

Converts to this type from the input type.
Source§

impl Hash for YulIntrinsicOp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for YulIntrinsicOp

Source§

fn eq(&self, other: &YulIntrinsicOp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for YulIntrinsicOp

Source§

impl Eq for YulIntrinsicOp

Source§

impl StructuralPartialEq for YulIntrinsicOp

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/index.html b/compiler-docs/fe_mir/ir/inst/index.html new file mode 100644 index 0000000000..4a6cd9608e --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/index.html @@ -0,0 +1 @@ +fe_mir::ir::inst - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/sidebar-items.js b/compiler-docs/fe_mir/ir/inst/sidebar-items.js new file mode 100644 index 0000000000..f72b94ba31 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BinOp","BranchInfo","CallType","CastKind","InstKind","IterBase","IterMutBase","UnOp","YulIntrinsicOp"],"struct":["Inst","SwitchTable"],"type":["BlockIter","InstId","ValueIter","ValueIterMut"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/struct.Inst.html b/compiler-docs/fe_mir/ir/inst/struct.Inst.html new file mode 100644 index 0000000000..9b5bbf4781 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/struct.Inst.html @@ -0,0 +1,29 @@ +Inst in fe_mir::ir::inst - Rust

Struct Inst

Source
pub struct Inst {
+    pub kind: InstKind,
+    pub source: SourceInfo,
+}

Fields§

§kind: InstKind§source: SourceInfo

Implementations§

Source§

impl Inst

Source

pub fn new(kind: InstKind, source: SourceInfo) -> Self

Source

pub fn unary(op: UnOp, value: ValueId, source: SourceInfo) -> Self

Source

pub fn binary(op: BinOp, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> Self

Source

pub fn intrinsic( + op: YulIntrinsicOp, + args: Vec<ValueId>, + source: SourceInfo, +) -> Self

Source

pub fn nop() -> Self

Source

pub fn is_terminator(&self) -> bool

Source

pub fn branch_info(&self) -> BranchInfo<'_>

Source

pub fn args(&self) -> ValueIter<'_>

Source

pub fn args_mut(&mut self) -> ValueIterMut<'_>

Trait Implementations§

Source§

impl Clone for Inst

Source§

fn clone(&self) -> Inst

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Inst

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Inst

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Inst

Source§

fn eq(&self, other: &Inst) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Inst

Source§

impl StructuralPartialEq for Inst

Auto Trait Implementations§

§

impl Freeze for Inst

§

impl RefUnwindSafe for Inst

§

impl Send for Inst

§

impl Sync for Inst

§

impl Unpin for Inst

§

impl UnwindSafe for Inst

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html b/compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html new file mode 100644 index 0000000000..3071dfba42 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html @@ -0,0 +1,22 @@ +SwitchTable in fe_mir::ir::inst - Rust

Struct SwitchTable

Source
pub struct SwitchTable { /* private fields */ }

Implementations§

Source§

impl SwitchTable

Source

pub fn iter(&self) -> impl Iterator<Item = (ValueId, BasicBlockId)> + '_

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn add_arm(&mut self, value: ValueId, block: BasicBlockId)

Trait Implementations§

Source§

impl Clone for SwitchTable

Source§

fn clone(&self) -> SwitchTable

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SwitchTable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SwitchTable

Source§

fn default() -> SwitchTable

Returns the “default value” for a type. Read more
Source§

impl Hash for SwitchTable

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SwitchTable

Source§

fn eq(&self, other: &SwitchTable) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SwitchTable

Source§

impl StructuralPartialEq for SwitchTable

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.BlockIter.html b/compiler-docs/fe_mir/ir/inst/type.BlockIter.html new file mode 100644 index 0000000000..1c1ad8ce80 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.BlockIter.html @@ -0,0 +1,6 @@ +BlockIter in fe_mir::ir::inst - Rust

Type Alias BlockIter

Source
pub type BlockIter<'a> = IterBase<'a, BasicBlockId>;

Aliased Type§

pub enum BlockIter<'a> {
+    Zero,
+    One(Option<Id<BasicBlock>>),
+    Slice(Iter<'a, Id<BasicBlock>>),
+    Chain(Box<IterBase<'a, Id<BasicBlock>>>, Box<IterBase<'a, Id<BasicBlock>>>),
+}

Variants§

§

Zero

§

One(Option<Id<BasicBlock>>)

§

Slice(Iter<'a, Id<BasicBlock>>)

§

Chain(Box<IterBase<'a, Id<BasicBlock>>>, Box<IterBase<'a, Id<BasicBlock>>>)

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.InstId.html b/compiler-docs/fe_mir/ir/inst/type.InstId.html new file mode 100644 index 0000000000..7152f8541f --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.InstId.html @@ -0,0 +1,6 @@ +InstId in fe_mir::ir::inst - Rust

Type Alias InstId

Source
pub type InstId = Id<Inst>;

Aliased Type§

pub struct InstId { /* private fields */ }

Trait Implementations§

Source§

impl PrettyPrint for InstId

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.ValueIter.html b/compiler-docs/fe_mir/ir/inst/type.ValueIter.html new file mode 100644 index 0000000000..81e3541d29 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.ValueIter.html @@ -0,0 +1,6 @@ +ValueIter in fe_mir::ir::inst - Rust

Type Alias ValueIter

Source
pub type ValueIter<'a> = IterBase<'a, ValueId>;

Aliased Type§

pub enum ValueIter<'a> {
+    Zero,
+    One(Option<Id<Value>>),
+    Slice(Iter<'a, Id<Value>>),
+    Chain(Box<IterBase<'a, Id<Value>>>, Box<IterBase<'a, Id<Value>>>),
+}

Variants§

§

Zero

§

One(Option<Id<Value>>)

§

Slice(Iter<'a, Id<Value>>)

§

Chain(Box<IterBase<'a, Id<Value>>>, Box<IterBase<'a, Id<Value>>>)

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html b/compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html new file mode 100644 index 0000000000..a72b8711ec --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html @@ -0,0 +1,6 @@ +ValueIterMut in fe_mir::ir::inst - Rust

Type Alias ValueIterMut

Source
pub type ValueIterMut<'a> = IterMutBase<'a, ValueId>;

Aliased Type§

pub enum ValueIterMut<'a> {
+    Zero,
+    One(Option<&'a mut Id<Value>>),
+    Slice(IterMut<'a, Id<Value>>),
+    Chain(Box<IterMutBase<'a, Id<Value>>>, Box<IterMutBase<'a, Id<Value>>>),
+}

Variants§

§

Zero

§

One(Option<&'a mut Id<Value>>)

§

Slice(IterMut<'a, Id<Value>>)

§

Chain(Box<IterMutBase<'a, Id<Value>>>, Box<IterMutBase<'a, Id<Value>>>)

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/sidebar-items.js b/compiler-docs/fe_mir/ir/sidebar-items.js new file mode 100644 index 0000000000..5e2dfdb31f --- /dev/null +++ b/compiler-docs/fe_mir/ir/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["basic_block","body_builder","body_cursor","body_order","constant","function","inst","types","value"],"struct":["SourceInfo"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/struct.SourceInfo.html b/compiler-docs/fe_mir/ir/struct.SourceInfo.html new file mode 100644 index 0000000000..82ddf8ca66 --- /dev/null +++ b/compiler-docs/fe_mir/ir/struct.SourceInfo.html @@ -0,0 +1,27 @@ +SourceInfo in fe_mir::ir - Rust

Struct SourceInfo

Source
pub struct SourceInfo {
+    pub span: Span,
+    pub id: NodeId,
+}
Expand description

An original source information that indicates where mir entities derive +from. SourceInfo is mainly used for diagnostics.

+

Fields§

§span: Span§id: NodeId

Implementations§

Source§

impl SourceInfo

Source

pub fn dummy() -> Self

Source

pub fn is_dummy(&self) -> bool

Trait Implementations§

Source§

impl Clone for SourceInfo

Source§

fn clone(&self) -> SourceInfo

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SourceInfo

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> From<&Node<T>> for SourceInfo

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl Hash for SourceInfo

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SourceInfo

Source§

fn eq(&self, other: &SourceInfo) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SourceInfo

Source§

impl StructuralPartialEq for SourceInfo

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/enum.TypeKind.html b/compiler-docs/fe_mir/ir/types/enum.TypeKind.html new file mode 100644 index 0000000000..677e0cf1e6 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/enum.TypeKind.html @@ -0,0 +1,47 @@ +TypeKind in fe_mir::ir::types - Rust

Enum TypeKind

Source
pub enum TypeKind {
+
Show 24 variants I8, + I16, + I32, + I64, + I128, + I256, + U8, + U16, + U32, + U64, + U128, + U256, + Bool, + Address, + Unit, + Array(ArrayDef), + String(usize), + Tuple(TupleDef), + Struct(StructDef), + Enum(EnumDef), + Contract(StructDef), + Map(MapDef), + MPtr(TypeId), + SPtr(TypeId), +
}

Variants§

§

I8

§

I16

§

I32

§

I64

§

I128

§

I256

§

U8

§

U16

§

U32

§

U64

§

U128

§

U256

§

Bool

§

Address

§

Unit

§

Array(ArrayDef)

§

String(usize)

§

Tuple(TupleDef)

§

Struct(StructDef)

§

Enum(EnumDef)

§

Contract(StructDef)

§

Map(MapDef)

§

MPtr(TypeId)

§

SPtr(TypeId)

Trait Implementations§

Source§

impl Clone for TypeKind

Source§

fn clone(&self) -> TypeKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeKind

Source§

fn eq(&self, other: &TypeKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeKind

Source§

impl StructuralPartialEq for TypeKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/index.html b/compiler-docs/fe_mir/ir/types/index.html new file mode 100644 index 0000000000..8c3e161750 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/index.html @@ -0,0 +1 @@ +fe_mir::ir::types - Rust

Module types

Source

Structs§

ArrayDef
A static array type definition.
EnumDef
A user defined struct type definition.
EnumVariant
A user defined struct type definition.
EventDef
A user defined struct type definition.
MapDef
A map type definition.
StructDef
A user defined struct type definition.
TupleDef
A tuple type definition.
Type
TypeId
An interned Id for ArrayDef.

Enums§

TypeKind
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/sidebar-items.js b/compiler-docs/fe_mir/ir/types/sidebar-items.js new file mode 100644 index 0000000000..24bf659759 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["TypeKind"],"struct":["ArrayDef","EnumDef","EnumVariant","EventDef","MapDef","StructDef","TupleDef","Type","TypeId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.ArrayDef.html b/compiler-docs/fe_mir/ir/types/struct.ArrayDef.html new file mode 100644 index 0000000000..82f1d0056c --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.ArrayDef.html @@ -0,0 +1,26 @@ +ArrayDef in fe_mir::ir::types - Rust

Struct ArrayDef

Source
pub struct ArrayDef {
+    pub elem_ty: TypeId,
+    pub len: usize,
+}
Expand description

A static array type definition.

+

Fields§

§elem_ty: TypeId§len: usize

Trait Implementations§

Source§

impl Clone for ArrayDef

Source§

fn clone(&self) -> ArrayDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ArrayDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ArrayDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ArrayDef

Source§

fn eq(&self, other: &ArrayDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ArrayDef

Source§

impl StructuralPartialEq for ArrayDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.EnumDef.html b/compiler-docs/fe_mir/ir/types/struct.EnumDef.html new file mode 100644 index 0000000000..af353cb3e8 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.EnumDef.html @@ -0,0 +1,28 @@ +EnumDef in fe_mir::ir::types - Rust

Struct EnumDef

Source
pub struct EnumDef {
+    pub name: SmolStr,
+    pub variants: Vec<EnumVariant>,
+    pub span: Span,
+    pub module_id: ModuleId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§variants: Vec<EnumVariant>§span: Span§module_id: ModuleId

Implementations§

Trait Implementations§

Source§

impl Clone for EnumDef

Source§

fn clone(&self) -> EnumDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumDef

Source§

fn eq(&self, other: &EnumDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumDef

Source§

impl StructuralPartialEq for EnumDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.EnumVariant.html b/compiler-docs/fe_mir/ir/types/struct.EnumVariant.html new file mode 100644 index 0000000000..50b5790432 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.EnumVariant.html @@ -0,0 +1,27 @@ +EnumVariant in fe_mir::ir::types - Rust

Struct EnumVariant

Source
pub struct EnumVariant {
+    pub name: SmolStr,
+    pub span: Span,
+    pub ty: TypeId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§span: Span§ty: TypeId

Trait Implementations§

Source§

impl Clone for EnumVariant

Source§

fn clone(&self) -> EnumVariant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumVariant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumVariant

Source§

fn eq(&self, other: &EnumVariant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumVariant

Source§

impl StructuralPartialEq for EnumVariant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.EventDef.html b/compiler-docs/fe_mir/ir/types/struct.EventDef.html new file mode 100644 index 0000000000..3c7f5b75d2 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.EventDef.html @@ -0,0 +1,28 @@ +EventDef in fe_mir::ir::types - Rust

Struct EventDef

Source
pub struct EventDef {
+    pub name: SmolStr,
+    pub fields: Vec<(SmolStr, TypeId, bool)>,
+    pub span: Span,
+    pub module_id: ModuleId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§fields: Vec<(SmolStr, TypeId, bool)>§span: Span§module_id: ModuleId

Trait Implementations§

Source§

impl Clone for EventDef

Source§

fn clone(&self) -> EventDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EventDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EventDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EventDef

Source§

fn eq(&self, other: &EventDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EventDef

Source§

impl StructuralPartialEq for EventDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.MapDef.html b/compiler-docs/fe_mir/ir/types/struct.MapDef.html new file mode 100644 index 0000000000..fd17e2f578 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.MapDef.html @@ -0,0 +1,26 @@ +MapDef in fe_mir::ir::types - Rust

Struct MapDef

Source
pub struct MapDef {
+    pub key_ty: TypeId,
+    pub value_ty: TypeId,
+}
Expand description

A map type definition.

+

Fields§

§key_ty: TypeId§value_ty: TypeId

Trait Implementations§

Source§

impl Clone for MapDef

Source§

fn clone(&self) -> MapDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MapDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for MapDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for MapDef

Source§

fn eq(&self, other: &MapDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for MapDef

Source§

impl Eq for MapDef

Source§

impl StructuralPartialEq for MapDef

Auto Trait Implementations§

§

impl Freeze for MapDef

§

impl RefUnwindSafe for MapDef

§

impl Send for MapDef

§

impl Sync for MapDef

§

impl Unpin for MapDef

§

impl UnwindSafe for MapDef

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.StructDef.html b/compiler-docs/fe_mir/ir/types/struct.StructDef.html new file mode 100644 index 0000000000..1664da5800 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.StructDef.html @@ -0,0 +1,28 @@ +StructDef in fe_mir::ir::types - Rust

Struct StructDef

Source
pub struct StructDef {
+    pub name: SmolStr,
+    pub fields: Vec<(SmolStr, TypeId)>,
+    pub span: Span,
+    pub module_id: ModuleId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§fields: Vec<(SmolStr, TypeId)>§span: Span§module_id: ModuleId

Trait Implementations§

Source§

impl Clone for StructDef

Source§

fn clone(&self) -> StructDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for StructDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for StructDef

Source§

fn eq(&self, other: &StructDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for StructDef

Source§

impl StructuralPartialEq for StructDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.TupleDef.html b/compiler-docs/fe_mir/ir/types/struct.TupleDef.html new file mode 100644 index 0000000000..5e7d3484ad --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.TupleDef.html @@ -0,0 +1,25 @@ +TupleDef in fe_mir::ir::types - Rust

Struct TupleDef

Source
pub struct TupleDef {
+    pub items: Vec<TypeId>,
+}
Expand description

A tuple type definition.

+

Fields§

§items: Vec<TypeId>

Trait Implementations§

Source§

impl Clone for TupleDef

Source§

fn clone(&self) -> TupleDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TupleDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TupleDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TupleDef

Source§

fn eq(&self, other: &TupleDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TupleDef

Source§

impl StructuralPartialEq for TupleDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.Type.html b/compiler-docs/fe_mir/ir/types/struct.Type.html new file mode 100644 index 0000000000..59809d8347 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.Type.html @@ -0,0 +1,25 @@ +Type in fe_mir::ir::types - Rust

Struct Type

Source
pub struct Type {
+    pub kind: TypeKind,
+    pub analyzer_ty: Option<TypeId>,
+}

Fields§

§kind: TypeKind§analyzer_ty: Option<TypeId>

Implementations§

Source§

impl Type

Source

pub fn new(kind: TypeKind, analyzer_ty: Option<TypeId>) -> Self

Trait Implementations§

Source§

impl Clone for Type

Source§

fn clone(&self) -> Type

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Type

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Type

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Type

Source§

fn eq(&self, other: &Type) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Type

Source§

impl StructuralPartialEq for Type

Auto Trait Implementations§

§

impl Freeze for Type

§

impl RefUnwindSafe for Type

§

impl Send for Type

§

impl Sync for Type

§

impl Unpin for Type

§

impl UnwindSafe for Type

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.TypeId.html b/compiler-docs/fe_mir/ir/types/struct.TypeId.html new file mode 100644 index 0000000000..d2f7c80ac8 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.TypeId.html @@ -0,0 +1,40 @@ +TypeId in fe_mir::ir::types - Rust

Struct TypeId

Source
pub struct TypeId(pub u32);
Expand description

An interned Id for ArrayDef.

+

Tuple Fields§

§0: u32

Implementations§

Source§

impl TypeId

Source

pub fn data(self, db: &dyn MirDb) -> Rc<Type>

Source

pub fn analyzer_ty(self, db: &dyn MirDb) -> Option<TypeId>

Source

pub fn projection_ty(self, db: &dyn MirDb, access: &Value) -> TypeId

Source

pub fn deref(self, db: &dyn MirDb) -> TypeId

Source

pub fn make_sptr(self, db: &dyn MirDb) -> TypeId

Source

pub fn make_mptr(self, db: &dyn MirDb) -> TypeId

Source

pub fn projection_ty_imm(self, db: &dyn MirDb, index: usize) -> TypeId

Source

pub fn aggregate_field_num(self, db: &dyn MirDb) -> usize

Source

pub fn enum_disc_type(self, db: &dyn MirDb) -> TypeId

Source

pub fn enum_data_offset(self, db: &dyn MirDb, slot_size: usize) -> usize

Source

pub fn enum_variant_type( + self, + db: &dyn MirDb, + variant_id: EnumVariantId, +) -> TypeId

Source

pub fn index_from_fname(self, db: &dyn MirDb, fname: &str) -> BigInt

Source

pub fn is_primitive(self, db: &dyn MirDb) -> bool

Source

pub fn is_integral(self, db: &dyn MirDb) -> bool

Source

pub fn is_address(self, db: &dyn MirDb) -> bool

Source

pub fn is_unit(self, db: &dyn MirDb) -> bool

Source

pub fn is_enum(self, db: &dyn MirDb) -> bool

Source

pub fn is_signed(self, db: &dyn MirDb) -> bool

Source

pub fn size_of(self, db: &dyn MirDb, slot_size: usize) -> usize

Returns size of the type in bytes.

+
Source

pub fn is_zero_sized(self, db: &dyn MirDb) -> bool

Source

pub fn align_of(self, db: &dyn MirDb, slot_size: usize) -> usize

Source

pub fn aggregate_elem_offset<T>( + self, + db: &dyn MirDb, + elem_idx: T, + slot_size: usize, +) -> usize
where + T: ToPrimitive,

Returns an offset of the element of aggregate type.

+
Source

pub fn is_aggregate(self, db: &dyn MirDb) -> bool

Source

pub fn is_struct(self, db: &dyn MirDb) -> bool

Source

pub fn is_array(self, db: &dyn MirDb) -> bool

Source

pub fn is_string(self, db: &dyn MirDb) -> bool

Source

pub fn is_ptr(self, db: &dyn MirDb) -> bool

Source

pub fn is_mptr(self, db: &dyn MirDb) -> bool

Source

pub fn is_sptr(self, db: &dyn MirDb) -> bool

Source

pub fn is_map(self, db: &dyn MirDb) -> bool

Source

pub fn is_contract(self, db: &dyn MirDb) -> bool

Source

pub fn array_elem_size(self, db: &dyn MirDb, slot_size: usize) -> usize

Source

pub fn print<W: Write>(&self, db: &dyn MirDb, w: &mut W) -> Result

Source

pub fn as_string(&self, db: &dyn MirDb) -> String

Trait Implementations§

Source§

impl Clone for TypeId

Source§

fn clone(&self) -> TypeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TypeId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl PartialEq for TypeId

Source§

fn eq(&self, other: &TypeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PrettyPrint for TypeId

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + _store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

Source§

impl Copy for TypeId

Source§

impl Eq for TypeId

Source§

impl StructuralPartialEq for TypeId

Auto Trait Implementations§

§

impl Freeze for TypeId

§

impl RefUnwindSafe for TypeId

§

impl Send for TypeId

§

impl Sync for TypeId

§

impl Unpin for TypeId

§

impl UnwindSafe for TypeId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/enum.AssignableValue.html b/compiler-docs/fe_mir/ir/value/enum.AssignableValue.html new file mode 100644 index 0000000000..312457b456 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/enum.AssignableValue.html @@ -0,0 +1,37 @@ +AssignableValue in fe_mir::ir::value - Rust

Enum AssignableValue

Source
pub enum AssignableValue {
+    Value(ValueId),
+    Aggregate {
+        lhs: Box<AssignableValue>,
+        idx: ValueId,
+    },
+    Map {
+        lhs: Box<AssignableValue>,
+        key: ValueId,
+    },
+}

Variants§

§

Value(ValueId)

§

Aggregate

§

Map

Implementations§

Source§

impl AssignableValue

Source

pub fn ty(&self, db: &dyn MirDb, store: &BodyDataStore) -> TypeId

Source

pub fn value_id(&self) -> Option<ValueId>

Trait Implementations§

Source§

impl Clone for AssignableValue

Source§

fn clone(&self) -> AssignableValue

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AssignableValue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Id<Value>> for AssignableValue

Source§

fn from(value: ValueId) -> Self

Converts to this type from the input type.
Source§

impl Hash for AssignableValue

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for AssignableValue

Source§

fn eq(&self, other: &AssignableValue) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PrettyPrint for AssignableValue

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

Source§

impl Eq for AssignableValue

Source§

impl StructuralPartialEq for AssignableValue

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/enum.Value.html b/compiler-docs/fe_mir/ir/value/enum.Value.html new file mode 100644 index 0000000000..fcbe0f45d0 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/enum.Value.html @@ -0,0 +1,44 @@ +Value in fe_mir::ir::value - Rust

Enum Value

Source
pub enum Value {
+    Temporary {
+        inst: InstId,
+        ty: TypeId,
+    },
+    Local(Local),
+    Immediate {
+        imm: BigInt,
+        ty: TypeId,
+    },
+    Constant {
+        constant: ConstantId,
+        ty: TypeId,
+    },
+    Unit {
+        ty: TypeId,
+    },
+}

Variants§

§

Temporary

A value resulted from an instruction.

+

Fields

§inst: InstId
§

Local(Local)

A local variable declared in a function body.

+
§

Immediate

An immediate value.

+

Fields

§

Constant

A constant value.

+

Fields

§constant: ConstantId
§

Unit

A singleton value representing Unit type.

+

Fields

Implementations§

Source§

impl Value

Source

pub fn ty(&self) -> TypeId

Source

pub fn is_imm(&self) -> bool

Trait Implementations§

Source§

impl Clone for Value

Source§

fn clone(&self) -> Value

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Value

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Value

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Value

Source§

fn eq(&self, other: &Value) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Value

Source§

impl StructuralPartialEq for Value

Auto Trait Implementations§

§

impl Freeze for Value

§

impl RefUnwindSafe for Value

§

impl Send for Value

§

impl Sync for Value

§

impl Unpin for Value

§

impl UnwindSafe for Value

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/index.html b/compiler-docs/fe_mir/ir/value/index.html new file mode 100644 index 0000000000..9aad91eb93 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/index.html @@ -0,0 +1 @@ +fe_mir::ir::value - Rust

Module value

Source

Structs§

Local

Enums§

AssignableValue
Value

Type Aliases§

ValueId
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/sidebar-items.js b/compiler-docs/fe_mir/ir/value/sidebar-items.js new file mode 100644 index 0000000000..11357c9f58 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AssignableValue","Value"],"struct":["Local"],"type":["ValueId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/struct.Local.html b/compiler-docs/fe_mir/ir/value/struct.Local.html new file mode 100644 index 0000000000..6f9c095d4d --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/struct.Local.html @@ -0,0 +1,31 @@ +Local in fe_mir::ir::value - Rust

Struct Local

Source
pub struct Local {
+    pub name: SmolStr,
+    pub ty: TypeId,
+    pub is_arg: bool,
+    pub is_tmp: bool,
+    pub source: SourceInfo,
+}

Fields§

§name: SmolStr

An original name of a local variable.

+
§ty: TypeId§is_arg: bool

true if a local is a function argument.

+
§is_tmp: bool

true if a local is introduced in MIR.

+
§source: SourceInfo

Implementations§

Source§

impl Local

Source

pub fn user_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local

Source

pub fn arg_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local

Source

pub fn tmp_local(name: SmolStr, ty: TypeId) -> Local

Trait Implementations§

Source§

impl Clone for Local

Source§

fn clone(&self) -> Local

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Local

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Local

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Local

Source§

fn eq(&self, other: &Local) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Local

Source§

impl StructuralPartialEq for Local

Auto Trait Implementations§

§

impl Freeze for Local

§

impl RefUnwindSafe for Local

§

impl Send for Local

§

impl Sync for Local

§

impl Unpin for Local

§

impl UnwindSafe for Local

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/type.ValueId.html b/compiler-docs/fe_mir/ir/value/type.ValueId.html new file mode 100644 index 0000000000..bbffbe3238 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/type.ValueId.html @@ -0,0 +1,6 @@ +ValueId in fe_mir::ir::value - Rust

Type Alias ValueId

Source
pub type ValueId = Id<Value>;

Aliased Type§

pub struct ValueId { /* private fields */ }

Trait Implementations§

Source§

impl PrettyPrint for ValueId

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

\ No newline at end of file diff --git a/compiler-docs/fe_mir/pretty_print/index.html b/compiler-docs/fe_mir/pretty_print/index.html new file mode 100644 index 0000000000..32213716f5 --- /dev/null +++ b/compiler-docs/fe_mir/pretty_print/index.html @@ -0,0 +1 @@ +fe_mir::pretty_print - Rust

Module pretty_print

Source

Traits§

PrettyPrint
\ No newline at end of file diff --git a/compiler-docs/fe_mir/pretty_print/sidebar-items.js b/compiler-docs/fe_mir/pretty_print/sidebar-items.js new file mode 100644 index 0000000000..d2a6034954 --- /dev/null +++ b/compiler-docs/fe_mir/pretty_print/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"trait":["PrettyPrint"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html b/compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html new file mode 100644 index 0000000000..25644cb29e --- /dev/null +++ b/compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html @@ -0,0 +1,22 @@ +PrettyPrint in fe_mir::pretty_print - Rust

Trait PrettyPrint

Source
pub trait PrettyPrint {
+    // Required method
+    fn pretty_print<W: Write>(
+        &self,
+        db: &dyn MirDb,
+        store: &BodyDataStore,
+        w: &mut W,
+    ) -> Result;
+
+    // Provided method
+    fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String { ... }
+}

Required Methods§

Source

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Provided Methods§

Source

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl PrettyPrint for &[ValueId]

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_mir/sidebar-items.js b/compiler-docs/fe_mir/sidebar-items.js new file mode 100644 index 0000000000..12f0860546 --- /dev/null +++ b/compiler-docs/fe_mir/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["analysis","db","graphviz","ir","pretty_print"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/all.html b/compiler-docs/fe_parser/all.html new file mode 100644 index 0000000000..3a183ef640 --- /dev/null +++ b/compiler-docs/fe_parser/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Functions

Type Aliases

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.BinOperator.html b/compiler-docs/fe_parser/ast/enum.BinOperator.html new file mode 100644 index 0000000000..0e1d1e756f --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.BinOperator.html @@ -0,0 +1,38 @@ +BinOperator in fe_parser::ast - Rust

Enum BinOperator

Source
pub enum BinOperator {
+    Add,
+    Sub,
+    Mult,
+    Div,
+    Mod,
+    Pow,
+    LShift,
+    RShift,
+    BitOr,
+    BitXor,
+    BitAnd,
+}

Variants§

§

Add

§

Sub

§

Mult

§

Div

§

Mod

§

Pow

§

LShift

§

RShift

§

BitOr

§

BitXor

§

BitAnd

Trait Implementations§

Source§

impl Clone for BinOperator

Source§

fn clone(&self) -> BinOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BinOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for BinOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for BinOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BinOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BinOperator

Source§

fn eq(&self, other: &BinOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for BinOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for BinOperator

Source§

impl Eq for BinOperator

Source§

impl StructuralPartialEq for BinOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.BoolOperator.html b/compiler-docs/fe_parser/ast/enum.BoolOperator.html new file mode 100644 index 0000000000..9e891d8526 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.BoolOperator.html @@ -0,0 +1,29 @@ +BoolOperator in fe_parser::ast - Rust

Enum BoolOperator

Source
pub enum BoolOperator {
+    And,
+    Or,
+}

Variants§

§

And

§

Or

Trait Implementations§

Source§

impl Clone for BoolOperator

Source§

fn clone(&self) -> BoolOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BoolOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for BoolOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for BoolOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BoolOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BoolOperator

Source§

fn eq(&self, other: &BoolOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for BoolOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for BoolOperator

Source§

impl Eq for BoolOperator

Source§

impl StructuralPartialEq for BoolOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.CompOperator.html b/compiler-docs/fe_parser/ast/enum.CompOperator.html new file mode 100644 index 0000000000..141bf3be91 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.CompOperator.html @@ -0,0 +1,33 @@ +CompOperator in fe_parser::ast - Rust

Enum CompOperator

Source
pub enum CompOperator {
+    Eq,
+    NotEq,
+    Lt,
+    LtE,
+    Gt,
+    GtE,
+}

Variants§

§

Eq

§

NotEq

§

Lt

§

LtE

§

Gt

§

GtE

Trait Implementations§

Source§

impl Clone for CompOperator

Source§

fn clone(&self) -> CompOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CompOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for CompOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for CompOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CompOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CompOperator

Source§

fn eq(&self, other: &CompOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for CompOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for CompOperator

Source§

impl Eq for CompOperator

Source§

impl StructuralPartialEq for CompOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.ContractStmt.html b/compiler-docs/fe_parser/ast/enum.ContractStmt.html new file mode 100644 index 0000000000..f56783855a --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.ContractStmt.html @@ -0,0 +1,28 @@ +ContractStmt in fe_parser::ast - Rust

Enum ContractStmt

Source
pub enum ContractStmt {
+    Function(Node<Function>),
+}

Variants§

§

Function(Node<Function>)

Trait Implementations§

Source§

impl Clone for ContractStmt

Source§

fn clone(&self) -> ContractStmt

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ContractStmt

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for ContractStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractStmt

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ContractStmt

Source§

fn eq(&self, other: &ContractStmt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for ContractStmt

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for ContractStmt

Source§

fn span(&self) -> Span

Source§

impl Eq for ContractStmt

Source§

impl StructuralPartialEq for ContractStmt

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.Expr.html b/compiler-docs/fe_parser/ast/enum.Expr.html new file mode 100644 index 0000000000..f0534f3d90 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.Expr.html @@ -0,0 +1,80 @@ +Expr in fe_parser::ast - Rust

Enum Expr

Source
pub enum Expr {
+
Show 17 variants Ternary { + if_expr: Box<Node<Expr>>, + test: Box<Node<Expr>>, + else_expr: Box<Node<Expr>>, + }, + BoolOperation { + left: Box<Node<Expr>>, + op: Node<BoolOperator>, + right: Box<Node<Expr>>, + }, + BinOperation { + left: Box<Node<Expr>>, + op: Node<BinOperator>, + right: Box<Node<Expr>>, + }, + UnaryOperation { + op: Node<UnaryOperator>, + operand: Box<Node<Expr>>, + }, + CompOperation { + left: Box<Node<Expr>>, + op: Node<CompOperator>, + right: Box<Node<Expr>>, + }, + Attribute { + value: Box<Node<Expr>>, + attr: Node<SmolStr>, + }, + Subscript { + value: Box<Node<Expr>>, + index: Box<Node<Expr>>, + }, + Call { + func: Box<Node<Expr>>, + generic_args: Option<Node<Vec<GenericArg>>>, + args: Node<Vec<Node<CallArg>>>, + }, + List { + elts: Vec<Node<Expr>>, + }, + Repeat { + value: Box<Node<Expr>>, + len: Box<Node<GenericArg>>, + }, + Tuple { + elts: Vec<Node<Expr>>, + }, + Bool(bool), + Name(SmolStr), + Path(Path), + Num(SmolStr), + Str(SmolStr), + Unit, +
}

Variants§

§

Ternary

Fields

§if_expr: Box<Node<Expr>>
§test: Box<Node<Expr>>
§else_expr: Box<Node<Expr>>
§

BoolOperation

Fields

§left: Box<Node<Expr>>
§right: Box<Node<Expr>>
§

BinOperation

Fields

§left: Box<Node<Expr>>
§right: Box<Node<Expr>>
§

UnaryOperation

Fields

§operand: Box<Node<Expr>>
§

CompOperation

Fields

§left: Box<Node<Expr>>
§right: Box<Node<Expr>>
§

Attribute

Fields

§value: Box<Node<Expr>>
§

Subscript

Fields

§value: Box<Node<Expr>>
§index: Box<Node<Expr>>
§

Call

Fields

§func: Box<Node<Expr>>
§generic_args: Option<Node<Vec<GenericArg>>>
§

List

Fields

§elts: Vec<Node<Expr>>
§

Repeat

Fields

§value: Box<Node<Expr>>
§

Tuple

Fields

§elts: Vec<Node<Expr>>
§

Bool(bool)

§

Name(SmolStr)

§

Path(Path)

§

Num(SmolStr)

§

Str(SmolStr)

§

Unit

Trait Implementations§

Source§

impl Clone for Expr

Source§

fn clone(&self) -> Expr

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Expr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Expr

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Expr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Expr

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Expr

Source§

fn eq(&self, other: &Expr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Expr

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Expr

Source§

impl StructuralPartialEq for Expr

Auto Trait Implementations§

§

impl Freeze for Expr

§

impl RefUnwindSafe for Expr

§

impl Send for Expr

§

impl Sync for Expr

§

impl Unpin for Expr

§

impl UnwindSafe for Expr

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.FuncStmt.html b/compiler-docs/fe_parser/ast/enum.FuncStmt.html new file mode 100644 index 0000000000..fe60db116b --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.FuncStmt.html @@ -0,0 +1,81 @@ +FuncStmt in fe_parser::ast - Rust

Enum FuncStmt

Source
pub enum FuncStmt {
+
Show 15 variants Return { + value: Option<Node<Expr>>, + }, + VarDecl { + mut_: Option<Span>, + target: Node<VarDeclTarget>, + typ: Node<TypeDesc>, + value: Option<Node<Expr>>, + }, + ConstantDecl { + name: Node<SmolStr>, + typ: Node<TypeDesc>, + value: Node<Expr>, + }, + Assign { + target: Node<Expr>, + value: Node<Expr>, + }, + AugAssign { + target: Node<Expr>, + op: Node<BinOperator>, + value: Node<Expr>, + }, + For { + target: Node<SmolStr>, + iter: Node<Expr>, + body: Vec<Node<FuncStmt>>, + }, + While { + test: Node<Expr>, + body: Vec<Node<FuncStmt>>, + }, + If { + test: Node<Expr>, + body: Vec<Node<FuncStmt>>, + or_else: Vec<Node<FuncStmt>>, + }, + Match { + expr: Node<Expr>, + arms: Vec<Node<MatchArm>>, + }, + Assert { + test: Node<Expr>, + msg: Option<Node<Expr>>, + }, + Expr { + value: Node<Expr>, + }, + Break, + Continue, + Revert { + error: Option<Node<Expr>>, + }, + Unsafe(Vec<Node<FuncStmt>>), +
}

Variants§

§

Return

Fields

§value: Option<Node<Expr>>
§

VarDecl

Fields

§mut_: Option<Span>
§value: Option<Node<Expr>>
§

ConstantDecl

Fields

§value: Node<Expr>
§

Assign

Fields

§target: Node<Expr>
§value: Node<Expr>
§

AugAssign

Fields

§target: Node<Expr>
§value: Node<Expr>
§

For

Fields

§target: Node<SmolStr>
§iter: Node<Expr>
§

While

Fields

§test: Node<Expr>
§

If

Fields

§test: Node<Expr>
§or_else: Vec<Node<FuncStmt>>
§

Match

Fields

§expr: Node<Expr>
§

Assert

Fields

§test: Node<Expr>
§

Expr

Fields

§value: Node<Expr>
§

Break

§

Continue

§

Revert

Fields

§error: Option<Node<Expr>>
§

Unsafe(Vec<Node<FuncStmt>>)

Trait Implementations§

Source§

impl Clone for FuncStmt

Source§

fn clone(&self) -> FuncStmt

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FuncStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for FuncStmt

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for FuncStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FuncStmt

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FuncStmt

Source§

fn eq(&self, other: &FuncStmt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for FuncStmt

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for FuncStmt

Source§

impl StructuralPartialEq for FuncStmt

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.FunctionArg.html b/compiler-docs/fe_parser/ast/enum.FunctionArg.html new file mode 100644 index 0000000000..6d6a8ee1f1 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.FunctionArg.html @@ -0,0 +1,36 @@ +FunctionArg in fe_parser::ast - Rust

Enum FunctionArg

Source
pub enum FunctionArg {
+    Regular {
+        mut_: Option<Span>,
+        label: Option<Node<SmolStr>>,
+        name: Node<SmolStr>,
+        typ: Node<TypeDesc>,
+    },
+    Self_ {
+        mut_: Option<Span>,
+    },
+}

Variants§

§

Regular

Fields

§mut_: Option<Span>
§

Self_

Fields

§mut_: Option<Span>

Implementations§

Source§

impl FunctionArg

Source

pub fn label_span(&self) -> Option<Span>

Source

pub fn name_span(&self) -> Option<Span>

Source

pub fn typ_span(&self) -> Option<Span>

Trait Implementations§

Source§

impl Clone for FunctionArg

Source§

fn clone(&self) -> FunctionArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for FunctionArg

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for FunctionArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionArg

Source§

fn eq(&self, other: &FunctionArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for FunctionArg

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for FunctionArg

Source§

impl StructuralPartialEq for FunctionArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.GenericArg.html b/compiler-docs/fe_parser/ast/enum.GenericArg.html new file mode 100644 index 0000000000..b1aea72df6 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.GenericArg.html @@ -0,0 +1,30 @@ +GenericArg in fe_parser::ast - Rust

Enum GenericArg

Source
pub enum GenericArg {
+    TypeDesc(Node<TypeDesc>),
+    Int(Node<usize>),
+    ConstExpr(Node<Expr>),
+}

Variants§

§

TypeDesc(Node<TypeDesc>)

§

Int(Node<usize>)

§

ConstExpr(Node<Expr>)

Trait Implementations§

Source§

impl Clone for GenericArg

Source§

fn clone(&self) -> GenericArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for GenericArg

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for GenericArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericArg

Source§

fn eq(&self, other: &GenericArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for GenericArg

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for GenericArg

Source§

fn span(&self) -> Span

Source§

impl Eq for GenericArg

Source§

impl StructuralPartialEq for GenericArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.GenericParameter.html b/compiler-docs/fe_parser/ast/enum.GenericParameter.html new file mode 100644 index 0000000000..b84bfda90d --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.GenericParameter.html @@ -0,0 +1,32 @@ +GenericParameter in fe_parser::ast - Rust

Enum GenericParameter

Source
pub enum GenericParameter {
+    Unbounded(Node<SmolStr>),
+    Bounded {
+        name: Node<SmolStr>,
+        bound: Node<TypeDesc>,
+    },
+}

Variants§

§

Unbounded(Node<SmolStr>)

§

Bounded

Fields

Implementations§

Trait Implementations§

Source§

impl Clone for GenericParameter

Source§

fn clone(&self) -> GenericParameter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericParameter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for GenericParameter

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for GenericParameter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericParameter

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericParameter

Source§

fn eq(&self, other: &GenericParameter) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for GenericParameter

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for GenericParameter

Source§

fn span(&self) -> Span

Source§

impl Eq for GenericParameter

Source§

impl StructuralPartialEq for GenericParameter

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.LiteralPattern.html b/compiler-docs/fe_parser/ast/enum.LiteralPattern.html new file mode 100644 index 0000000000..2d2533f16f --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.LiteralPattern.html @@ -0,0 +1,28 @@ +LiteralPattern in fe_parser::ast - Rust

Enum LiteralPattern

Source
pub enum LiteralPattern {
+    Bool(bool),
+}

Variants§

§

Bool(bool)

Trait Implementations§

Source§

impl Clone for LiteralPattern

Source§

fn clone(&self) -> LiteralPattern

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LiteralPattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for LiteralPattern

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for LiteralPattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for LiteralPattern

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for LiteralPattern

Source§

fn eq(&self, other: &LiteralPattern) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for LiteralPattern

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for LiteralPattern

Source§

impl Eq for LiteralPattern

Source§

impl StructuralPartialEq for LiteralPattern

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.ModuleStmt.html b/compiler-docs/fe_parser/ast/enum.ModuleStmt.html new file mode 100644 index 0000000000..8331b16680 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.ModuleStmt.html @@ -0,0 +1,39 @@ +ModuleStmt in fe_parser::ast - Rust

Enum ModuleStmt

Source
pub enum ModuleStmt {
+    Pragma(Node<Pragma>),
+    Use(Node<Use>),
+    TypeAlias(Node<TypeAlias>),
+    Contract(Node<Contract>),
+    Constant(Node<ConstantDecl>),
+    Struct(Node<Struct>),
+    Enum(Node<Enum>),
+    Trait(Node<Trait>),
+    Impl(Node<Impl>),
+    Function(Node<Function>),
+    Attribute(Node<SmolStr>),
+    ParseError(Span),
+}

Variants§

§

Pragma(Node<Pragma>)

§

Use(Node<Use>)

§

TypeAlias(Node<TypeAlias>)

§

Contract(Node<Contract>)

§

Constant(Node<ConstantDecl>)

§

Struct(Node<Struct>)

§

Enum(Node<Enum>)

§

Trait(Node<Trait>)

§

Impl(Node<Impl>)

§

Function(Node<Function>)

§

Attribute(Node<SmolStr>)

§

ParseError(Span)

Trait Implementations§

Source§

impl Clone for ModuleStmt

Source§

fn clone(&self) -> ModuleStmt

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ModuleStmt

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for ModuleStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleStmt

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ModuleStmt

Source§

fn eq(&self, other: &ModuleStmt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for ModuleStmt

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for ModuleStmt

Source§

fn span(&self) -> Span

Source§

impl Eq for ModuleStmt

Source§

impl StructuralPartialEq for ModuleStmt

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.Pattern.html b/compiler-docs/fe_parser/ast/enum.Pattern.html new file mode 100644 index 0000000000..0ede6340e0 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.Pattern.html @@ -0,0 +1,48 @@ +Pattern in fe_parser::ast - Rust

Enum Pattern

Source
pub enum Pattern {
+    WildCard,
+    Rest,
+    Literal(Node<LiteralPattern>),
+    Tuple(Vec<Node<Pattern>>),
+    Path(Node<Path>),
+    PathTuple(Node<Path>, Vec<Node<Pattern>>),
+    PathStruct {
+        path: Node<Path>,
+        fields: Vec<(Node<SmolStr>, Node<Pattern>)>,
+        has_rest: bool,
+    },
+    Or(Vec<Node<Pattern>>),
+}

Variants§

§

WildCard

Represents a wildcard pattern _.

+
§

Rest

Rest pattern. e.g., ..

+
§

Literal(Node<LiteralPattern>)

Represents a literal pattern. e.g., true.

+
§

Tuple(Vec<Node<Pattern>>)

Represents tuple destructuring pattern. e.g., (x, y, z).

+
§

Path(Node<Path>)

Represents unit variant pattern. e.g., Enum::Unit.

+
§

PathTuple(Node<Path>, Vec<Node<Pattern>>)

Represents tuple variant pattern. e.g., Enum::Tuple(x, y, z).

+
§

PathStruct

Represents struct or struct variant destructuring pattern. e.g., +MyStruct {x: pat1, y: pat2}}.

+

Fields

§path: Node<Path>
§fields: Vec<(Node<SmolStr>, Node<Pattern>)>
§has_rest: bool
§

Or(Vec<Node<Pattern>>)

Represents or pattern. e.g., EnumUnit | EnumTuple(_, _, _)

+

Implementations§

Source§

impl Pattern

Source

pub fn is_rest(&self) -> bool

Trait Implementations§

Source§

impl Clone for Pattern

Source§

fn clone(&self) -> Pattern

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Pattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Pattern

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Pattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Pattern

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Pattern

Source§

fn eq(&self, other: &Pattern) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Pattern

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Pattern

Source§

impl StructuralPartialEq for Pattern

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.TypeDesc.html b/compiler-docs/fe_parser/ast/enum.TypeDesc.html new file mode 100644 index 0000000000..4ef672a4f4 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.TypeDesc.html @@ -0,0 +1,40 @@ +TypeDesc in fe_parser::ast - Rust

Enum TypeDesc

Source
pub enum TypeDesc {
+    Unit,
+    Base {
+        base: SmolStr,
+    },
+    Path(Path),
+    Tuple {
+        items: Vec1<Node<TypeDesc>>,
+    },
+    Generic {
+        base: Node<SmolStr>,
+        args: Node<Vec<GenericArg>>,
+    },
+    SelfType,
+}

Variants§

§

Unit

§

Base

Fields

§base: SmolStr
§

Path(Path)

§

Tuple

Fields

§items: Vec1<Node<TypeDesc>>
§

Generic

Fields

§

SelfType

Trait Implementations§

Source§

impl Clone for TypeDesc

Source§

fn clone(&self) -> TypeDesc

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeDesc

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for TypeDesc

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for TypeDesc

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeDesc

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeDesc

Source§

fn eq(&self, other: &TypeDesc) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for TypeDesc

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for TypeDesc

Source§

impl StructuralPartialEq for TypeDesc

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.UnaryOperator.html b/compiler-docs/fe_parser/ast/enum.UnaryOperator.html new file mode 100644 index 0000000000..3e5c68358d --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.UnaryOperator.html @@ -0,0 +1,30 @@ +UnaryOperator in fe_parser::ast - Rust

Enum UnaryOperator

Source
pub enum UnaryOperator {
+    Invert,
+    Not,
+    USub,
+}

Variants§

§

Invert

§

Not

§

USub

Trait Implementations§

Source§

impl Clone for UnaryOperator

Source§

fn clone(&self) -> UnaryOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UnaryOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for UnaryOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for UnaryOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for UnaryOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UnaryOperator

Source§

fn eq(&self, other: &UnaryOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for UnaryOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for UnaryOperator

Source§

impl Eq for UnaryOperator

Source§

impl StructuralPartialEq for UnaryOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.UseTree.html b/compiler-docs/fe_parser/ast/enum.UseTree.html new file mode 100644 index 0000000000..9104dae5ba --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.UseTree.html @@ -0,0 +1,38 @@ +UseTree in fe_parser::ast - Rust

Enum UseTree

Source
pub enum UseTree {
+    Glob {
+        prefix: Path,
+    },
+    Nested {
+        prefix: Path,
+        children: Vec<Node<UseTree>>,
+    },
+    Simple {
+        path: Path,
+        rename: Option<Node<SmolStr>>,
+    },
+}

Variants§

§

Glob

Fields

§prefix: Path
§

Nested

Fields

§prefix: Path
§children: Vec<Node<UseTree>>
§

Simple

Fields

§path: Path

Trait Implementations§

Source§

impl Clone for UseTree

Source§

fn clone(&self) -> UseTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UseTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for UseTree

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for UseTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for UseTree

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UseTree

Source§

fn eq(&self, other: &UseTree) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for UseTree

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for UseTree

Source§

impl StructuralPartialEq for UseTree

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.VarDeclTarget.html b/compiler-docs/fe_parser/ast/enum.VarDeclTarget.html new file mode 100644 index 0000000000..5970094721 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.VarDeclTarget.html @@ -0,0 +1,29 @@ +VarDeclTarget in fe_parser::ast - Rust

Enum VarDeclTarget

Source
pub enum VarDeclTarget {
+    Name(SmolStr),
+    Tuple(Vec<Node<VarDeclTarget>>),
+}

Variants§

Trait Implementations§

Source§

impl Clone for VarDeclTarget

Source§

fn clone(&self) -> VarDeclTarget

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VarDeclTarget

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for VarDeclTarget

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for VarDeclTarget

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for VarDeclTarget

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for VarDeclTarget

Source§

fn eq(&self, other: &VarDeclTarget) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for VarDeclTarget

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for VarDeclTarget

Source§

impl StructuralPartialEq for VarDeclTarget

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.VariantKind.html b/compiler-docs/fe_parser/ast/enum.VariantKind.html new file mode 100644 index 0000000000..8eccf73459 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.VariantKind.html @@ -0,0 +1,39 @@ +VariantKind in fe_parser::ast - Rust

Enum VariantKind

Source
pub enum VariantKind {
+    Unit,
+    Tuple(Vec<Node<TypeDesc>>),
+}
Expand description

Enum variant kind.

+

Variants§

§

Unit

Unit variant. +E.g., Bar in

+
enum Foo {
+    Bar
+    Baz(u32, i32)
+}
§

Tuple(Vec<Node<TypeDesc>>)

Tuple variant. +E.g., Baz(u32, i32) in

+
enum Foo {
+    Bar
+    Baz(u32, i32)
+}

Trait Implementations§

Source§

impl Clone for VariantKind

Source§

fn clone(&self) -> VariantKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VariantKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for VariantKind

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for VariantKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for VariantKind

Source§

fn eq(&self, other: &VariantKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for VariantKind

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for VariantKind

Source§

impl StructuralPartialEq for VariantKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/index.html b/compiler-docs/fe_parser/ast/index.html new file mode 100644 index 0000000000..6345b0cd49 --- /dev/null +++ b/compiler-docs/fe_parser/ast/index.html @@ -0,0 +1 @@ +fe_parser::ast - Rust

Module ast

Source

Structs§

CallArg
ConstantDecl
Contract
Enum
Field
struct or contract field, with optional ‘pub’ and ‘const’ qualifiers
Function
FunctionSignature
Impl
MatchArm
Module
Path
Pragma
SmolStr
A SmolStr is a string type that has the following properties:
Struct
Trait
TypeAlias
Use
Variant
Enum variant definition.

Enums§

BinOperator
BoolOperator
CompOperator
ContractStmt
Expr
FuncStmt
FunctionArg
GenericArg
GenericParameter
LiteralPattern
ModuleStmt
Pattern
TypeDesc
UnaryOperator
UseTree
VarDeclTarget
VariantKind
Enum variant kind.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/sidebar-items.js b/compiler-docs/fe_parser/ast/sidebar-items.js new file mode 100644 index 0000000000..075bdbe892 --- /dev/null +++ b/compiler-docs/fe_parser/ast/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BinOperator","BoolOperator","CompOperator","ContractStmt","Expr","FuncStmt","FunctionArg","GenericArg","GenericParameter","LiteralPattern","ModuleStmt","Pattern","TypeDesc","UnaryOperator","UseTree","VarDeclTarget","VariantKind"],"struct":["CallArg","ConstantDecl","Contract","Enum","Field","Function","FunctionSignature","Impl","MatchArm","Module","Path","Pragma","SmolStr","Struct","Trait","TypeAlias","Use","Variant"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.CallArg.html b/compiler-docs/fe_parser/ast/struct.CallArg.html new file mode 100644 index 0000000000..5cfad5c87f --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.CallArg.html @@ -0,0 +1,29 @@ +CallArg in fe_parser::ast - Rust

Struct CallArg

Source
pub struct CallArg {
+    pub label: Option<Node<SmolStr>>,
+    pub value: Node<Expr>,
+}

Fields§

§label: Option<Node<SmolStr>>§value: Node<Expr>

Trait Implementations§

Source§

impl Clone for CallArg

Source§

fn clone(&self) -> CallArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for CallArg

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for CallArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CallArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CallArg

Source§

fn eq(&self, other: &CallArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for CallArg

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for CallArg

Source§

impl StructuralPartialEq for CallArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.ConstantDecl.html b/compiler-docs/fe_parser/ast/struct.ConstantDecl.html new file mode 100644 index 0000000000..98f915a339 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.ConstantDecl.html @@ -0,0 +1,31 @@ +ConstantDecl in fe_parser::ast - Rust

Struct ConstantDecl

Source
pub struct ConstantDecl {
+    pub name: Node<SmolStr>,
+    pub typ: Node<TypeDesc>,
+    pub value: Node<Expr>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§typ: Node<TypeDesc>§value: Node<Expr>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for ConstantDecl

Source§

fn clone(&self) -> ConstantDecl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstantDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ConstantDecl

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for ConstantDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConstantDecl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstantDecl

Source§

fn eq(&self, other: &ConstantDecl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for ConstantDecl

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for ConstantDecl

Source§

impl StructuralPartialEq for ConstantDecl

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Contract.html b/compiler-docs/fe_parser/ast/struct.Contract.html new file mode 100644 index 0000000000..567afdfe23 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Contract.html @@ -0,0 +1,31 @@ +Contract in fe_parser::ast - Rust

Struct Contract

Source
pub struct Contract {
+    pub name: Node<SmolStr>,
+    pub fields: Vec<Node<Field>>,
+    pub body: Vec<ContractStmt>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§fields: Vec<Node<Field>>§body: Vec<ContractStmt>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Contract

Source§

fn clone(&self) -> Contract

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Contract

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Contract

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Contract

Source§

fn eq(&self, other: &Contract) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Contract

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Contract

Source§

impl StructuralPartialEq for Contract

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Enum.html b/compiler-docs/fe_parser/ast/struct.Enum.html new file mode 100644 index 0000000000..9c42b2e6f7 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Enum.html @@ -0,0 +1,31 @@ +Enum in fe_parser::ast - Rust

Struct Enum

Source
pub struct Enum {
+    pub name: Node<SmolStr>,
+    pub variants: Vec<Node<Variant>>,
+    pub functions: Vec<Node<Function>>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§variants: Vec<Node<Variant>>§functions: Vec<Node<Function>>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Enum

Source§

fn clone(&self) -> Enum

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Enum

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Enum

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Enum

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Enum

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Enum

Source§

fn eq(&self, other: &Enum) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Enum

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Enum

Source§

impl StructuralPartialEq for Enum

Auto Trait Implementations§

§

impl Freeze for Enum

§

impl RefUnwindSafe for Enum

§

impl Send for Enum

§

impl Sync for Enum

§

impl Unpin for Enum

§

impl UnwindSafe for Enum

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Field.html b/compiler-docs/fe_parser/ast/struct.Field.html new file mode 100644 index 0000000000..727b57c79d --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Field.html @@ -0,0 +1,34 @@ +Field in fe_parser::ast - Rust

Struct Field

Source
pub struct Field {
+    pub is_pub: bool,
+    pub is_const: bool,
+    pub attributes: Vec<Node<SmolStr>>,
+    pub name: Node<SmolStr>,
+    pub typ: Node<TypeDesc>,
+    pub value: Option<Node<Expr>>,
+}
Expand description

struct or contract field, with optional ‘pub’ and ‘const’ qualifiers

+

Fields§

§is_pub: bool§is_const: bool§attributes: Vec<Node<SmolStr>>§name: Node<SmolStr>§typ: Node<TypeDesc>§value: Option<Node<Expr>>

Trait Implementations§

Source§

impl Clone for Field

Source§

fn clone(&self) -> Field

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Field

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Field

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Field

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Field

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Field

Source§

fn eq(&self, other: &Field) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Field

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Field

Source§

impl StructuralPartialEq for Field

Auto Trait Implementations§

§

impl Freeze for Field

§

impl RefUnwindSafe for Field

§

impl Send for Field

§

impl Sync for Field

§

impl Unpin for Field

§

impl UnwindSafe for Field

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Function.html b/compiler-docs/fe_parser/ast/struct.Function.html new file mode 100644 index 0000000000..99b3bfad32 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Function.html @@ -0,0 +1,29 @@ +Function in fe_parser::ast - Rust

Struct Function

Source
pub struct Function {
+    pub sig: Node<FunctionSignature>,
+    pub body: Vec<Node<FuncStmt>>,
+}

Fields§

§sig: Node<FunctionSignature>§body: Vec<Node<FuncStmt>>

Trait Implementations§

Source§

impl Clone for Function

Source§

fn clone(&self) -> Function

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Function

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Function

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Function

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Function

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Function

Source§

fn eq(&self, other: &Function) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Function

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Function

Source§

impl StructuralPartialEq for Function

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.FunctionSignature.html b/compiler-docs/fe_parser/ast/struct.FunctionSignature.html new file mode 100644 index 0000000000..b8f17b5e75 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.FunctionSignature.html @@ -0,0 +1,32 @@ +FunctionSignature in fe_parser::ast - Rust

Struct FunctionSignature

Source
pub struct FunctionSignature {
+    pub pub_: Option<Span>,
+    pub unsafe_: Option<Span>,
+    pub name: Node<SmolStr>,
+    pub generic_params: Node<Vec<GenericParameter>>,
+    pub args: Vec<Node<FunctionArg>>,
+    pub return_type: Option<Node<TypeDesc>>,
+}

Fields§

§pub_: Option<Span>§unsafe_: Option<Span>§name: Node<SmolStr>§generic_params: Node<Vec<GenericParameter>>§args: Vec<Node<FunctionArg>>§return_type: Option<Node<TypeDesc>>

Trait Implementations§

Source§

impl Clone for FunctionSignature

Source§

fn clone(&self) -> FunctionSignature

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for FunctionSignature

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for FunctionSignature

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSignature

Source§

fn eq(&self, other: &FunctionSignature) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for FunctionSignature

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for FunctionSignature

Source§

impl StructuralPartialEq for FunctionSignature

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Impl.html b/compiler-docs/fe_parser/ast/struct.Impl.html new file mode 100644 index 0000000000..ee9d2331a7 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Impl.html @@ -0,0 +1,30 @@ +Impl in fe_parser::ast - Rust

Struct Impl

Source
pub struct Impl {
+    pub impl_trait: Node<SmolStr>,
+    pub receiver: Node<TypeDesc>,
+    pub functions: Vec<Node<Function>>,
+}

Fields§

§impl_trait: Node<SmolStr>§receiver: Node<TypeDesc>§functions: Vec<Node<Function>>

Trait Implementations§

Source§

impl Clone for Impl

Source§

fn clone(&self) -> Impl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Impl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Impl

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Impl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Impl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Impl

Source§

fn eq(&self, other: &Impl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Impl

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Impl

Source§

impl StructuralPartialEq for Impl

Auto Trait Implementations§

§

impl Freeze for Impl

§

impl RefUnwindSafe for Impl

§

impl Send for Impl

§

impl Sync for Impl

§

impl Unpin for Impl

§

impl UnwindSafe for Impl

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.MatchArm.html b/compiler-docs/fe_parser/ast/struct.MatchArm.html new file mode 100644 index 0000000000..993ba77ef2 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.MatchArm.html @@ -0,0 +1,29 @@ +MatchArm in fe_parser::ast - Rust

Struct MatchArm

Source
pub struct MatchArm {
+    pub pat: Node<Pattern>,
+    pub body: Vec<Node<FuncStmt>>,
+}

Fields§

§pat: Node<Pattern>§body: Vec<Node<FuncStmt>>

Trait Implementations§

Source§

impl Clone for MatchArm

Source§

fn clone(&self) -> MatchArm

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MatchArm

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for MatchArm

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for MatchArm

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for MatchArm

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for MatchArm

Source§

fn eq(&self, other: &MatchArm) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for MatchArm

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for MatchArm

Source§

impl StructuralPartialEq for MatchArm

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Module.html b/compiler-docs/fe_parser/ast/struct.Module.html new file mode 100644 index 0000000000..4cb8be8265 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Module.html @@ -0,0 +1,28 @@ +Module in fe_parser::ast - Rust

Struct Module

Source
pub struct Module {
+    pub body: Vec<ModuleStmt>,
+}

Fields§

§body: Vec<ModuleStmt>

Trait Implementations§

Source§

impl Clone for Module

Source§

fn clone(&self) -> Module

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Module

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Module

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Module

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Module

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Module

Source§

fn eq(&self, other: &Module) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Module

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Module

Source§

impl StructuralPartialEq for Module

Auto Trait Implementations§

§

impl Freeze for Module

§

impl RefUnwindSafe for Module

§

impl Send for Module

§

impl Sync for Module

§

impl Unpin for Module

§

impl UnwindSafe for Module

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Path.html b/compiler-docs/fe_parser/ast/struct.Path.html new file mode 100644 index 0000000000..dfac899600 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Path.html @@ -0,0 +1,28 @@ +Path in fe_parser::ast - Rust

Struct Path

Source
pub struct Path {
+    pub segments: Vec<Node<SmolStr>>,
+}

Fields§

§segments: Vec<Node<SmolStr>>

Implementations§

Source§

impl Path

Source

pub fn remove_last(&self) -> Path

Trait Implementations§

Source§

impl Clone for Path

Source§

fn clone(&self) -> Path

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Path

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Path

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Path

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Path

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Path

Source§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Path

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Path

Source§

impl StructuralPartialEq for Path

Auto Trait Implementations§

§

impl Freeze for Path

§

impl RefUnwindSafe for Path

§

impl Send for Path

§

impl Sync for Path

§

impl Unpin for Path

§

impl UnwindSafe for Path

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Pragma.html b/compiler-docs/fe_parser/ast/struct.Pragma.html new file mode 100644 index 0000000000..9932a89c49 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Pragma.html @@ -0,0 +1,28 @@ +Pragma in fe_parser::ast - Rust

Struct Pragma

Source
pub struct Pragma {
+    pub version_requirement: Node<SmolStr>,
+}

Fields§

§version_requirement: Node<SmolStr>

Trait Implementations§

Source§

impl Clone for Pragma

Source§

fn clone(&self) -> Pragma

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Pragma

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Pragma

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Pragma

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Pragma

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Pragma

Source§

fn eq(&self, other: &Pragma) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Pragma

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Pragma

Source§

impl StructuralPartialEq for Pragma

Auto Trait Implementations§

§

impl Freeze for Pragma

§

impl RefUnwindSafe for Pragma

§

impl Send for Pragma

§

impl Sync for Pragma

§

impl Unpin for Pragma

§

impl UnwindSafe for Pragma

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.SmolStr.html b/compiler-docs/fe_parser/ast/struct.SmolStr.html new file mode 100644 index 0000000000..696548b432 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.SmolStr.html @@ -0,0 +1,1368 @@ +SmolStr in fe_parser::ast - Rust

Struct SmolStr

pub struct SmolStr(/* private fields */);
Expand description

A SmolStr is a string type that has the following properties:

+
    +
  • size_of::<SmolStr>() == size_of::<String>()
  • +
  • Clone is O(1)
  • +
  • Strings are stack-allocated if they are: +
      +
    • Up to 23 bytes long
    • +
    • Longer than 23 bytes, but substrings of WS (see below). Such strings consist +solely of consecutive newlines, followed by consecutive spaces
    • +
    +
  • +
  • If a string does not satisfy the aforementioned conditions, it is heap-allocated
  • +
+

Unlike String, however, SmolStr is immutable. The primary use case for +SmolStr is a good enough default storage for tokens of typical programming +languages. Strings consisting of a series of newlines, followed by a series of +whitespace are a typical pattern in computer programs because of indentation. +Note that a specialized interner might be a better solution for some use cases.

+

WS: A string of 32 newlines followed by 128 spaces.

+

Implementations§

§

impl SmolStr

pub const fn new_inline_from_ascii(len: usize, bytes: &[u8]) -> SmolStr

👎Deprecated: Use new_inline instead

pub const fn new_inline(text: &str) -> SmolStr

Constructs inline variant of SmolStr.

+

Panics if text.len() > 23.

+

pub fn new<T>(text: T) -> SmolStr
where + T: AsRef<str>,

pub fn as_str(&self) -> &str

pub fn to_string(&self) -> String

pub fn len(&self) -> usize

pub fn is_empty(&self) -> bool

pub fn is_heap_allocated(&self) -> bool

Methods from Deref<Target = str>§

1.0.0 · Source

pub fn len(&self) -> usize

Returns the length of self.

+

This length is in bytes, not chars or graphemes. In other words, +it might not be what a human considers the length of the string.

+
§Examples
+
let len = "foo".len();
+assert_eq!(3, len);
+
+assert_eq!("ƒoo".len(), 4); // fancy f!
+assert_eq!("ƒoo".chars().count(), 3);
+
1.0.0 · Source

pub fn is_empty(&self) -> bool

Returns true if self has a length of zero bytes.

+
§Examples
+
let s = "";
+assert!(s.is_empty());
+
+let s = "not empty";
+assert!(!s.is_empty());
+
1.9.0 · Source

pub fn is_char_boundary(&self, index: usize) -> bool

Checks that index-th byte is the first byte in a UTF-8 code point +sequence or the end of the string.

+

The start and end of the string (when index == self.len()) are +considered to be boundaries.

+

Returns false if index is greater than self.len().

+
§Examples
+
let s = "Löwe 老虎 Léopard";
+assert!(s.is_char_boundary(0));
+// start of `老`
+assert!(s.is_char_boundary(6));
+assert!(s.is_char_boundary(s.len()));
+
+// second byte of `ö`
+assert!(!s.is_char_boundary(2));
+
+// third byte of `老`
+assert!(!s.is_char_boundary(8));
+
Source

pub fn floor_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not exceeding index where is_char_boundary(x) is true.

+

This method can help you truncate a string so that it’s still valid UTF-8, but doesn’t +exceed a given number of bytes. Note that this is done purely at the character level +and can still visually split graphemes, even though the underlying characters aren’t +split. For example, the emoji 🧑‍🔬 (scientist) could be split so that the string only +includes 🧑 (person) instead.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.floor_char_boundary(13);
+assert_eq!(closest, 10);
+assert_eq!(&s[..closest], "❤️🧡");
+
Source

pub fn ceil_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not below index where is_char_boundary(x) is true.

+

If index is greater than the length of the string, this returns the length of the string.

+

This method is the natural complement to floor_char_boundary. See that method +for more details.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.ceil_char_boundary(13);
+assert_eq!(closest, 14);
+assert_eq!(&s[..closest], "❤️🧡💛");
+
1.0.0 · Source

pub fn as_bytes(&self) -> &[u8]

Converts a string slice to a byte slice. To convert the byte slice back +into a string slice, use the from_utf8 function.

+
§Examples
+
let bytes = "bors".as_bytes();
+assert_eq!(b"bors", bytes);
+
1.0.0 · Source

pub fn as_ptr(&self) -> *const u8

Converts a string slice to a raw pointer.

+

As string slices are a slice of bytes, the raw pointer points to a +u8. This pointer will be pointing to the first byte of the string +slice.

+

The caller must ensure that the returned pointer is never written to. +If you need to mutate the contents of the string slice, use as_mut_ptr.

+
§Examples
+
let s = "Hello";
+let ptr = s.as_ptr();
+
1.20.0 · Source

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output>
where + I: SliceIndex<str>,

Returns a subslice of str.

+

This is the non-panicking alternative to indexing the str. Returns +None whenever equivalent indexing operation would panic.

+
§Examples
+
let v = String::from("🗻∈🌏");
+
+assert_eq!(Some("🗻"), v.get(0..4));
+
+// indices not on UTF-8 sequence boundaries
+assert!(v.get(1..).is_none());
+assert!(v.get(..8).is_none());
+
+// out of bounds
+assert!(v.get(..42).is_none());
+
1.20.0 · Source

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output
where + I: SliceIndex<str>,

Returns an unchecked subslice of str.

+

This is the unchecked alternative to indexing the str.

+
§Safety
+

Callers of this function are responsible that these preconditions are +satisfied:

+
    +
  • The starting index must not exceed the ending index;
  • +
  • Indexes must be within bounds of the original slice;
  • +
  • Indexes must lie on UTF-8 sequence boundaries.
  • +
+

Failing that, the returned string slice may reference invalid memory or +violate the invariants communicated by the str type.

+
§Examples
+
let v = "🗻∈🌏";
+unsafe {
+    assert_eq!("🗻", v.get_unchecked(0..4));
+    assert_eq!("∈", v.get_unchecked(4..7));
+    assert_eq!("🌏", v.get_unchecked(7..11));
+}
+
1.0.0 · Source

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str

👎Deprecated since 1.29.0: use get_unchecked(begin..end) instead

Creates a string slice from another string slice, bypassing safety +checks.

+

This is generally not recommended, use with caution! For a safe +alternative see str and Index.

+

This new slice goes from begin to end, including begin but +excluding end.

+

To get a mutable string slice instead, see the +slice_mut_unchecked method.

+
§Safety
+

Callers of this function are responsible that three preconditions are +satisfied:

+
    +
  • begin must not exceed end.
  • +
  • begin and end must be byte positions within the string slice.
  • +
  • begin and end must lie on UTF-8 sequence boundaries.
  • +
+
§Examples
+
let s = "Löwe 老虎 Léopard";
+
+unsafe {
+    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
+}
+
+let s = "Hello, world!";
+
+unsafe {
+    assert_eq!("world", s.slice_unchecked(7, 12));
+}
+
1.4.0 · Source

pub fn split_at(&self, mid: usize) -> (&str, &str)

Divides one string slice into two at an index.

+

The argument, mid, should be a byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut +method.

+
§Panics
+

Panics if mid is not on a UTF-8 code point boundary, or if it is past +the end of the last code point of the string slice. For a non-panicking +alternative see split_at_checked.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at(3);
+
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
1.80.0 · Source

pub fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)>

Divides one string slice into two at an index.

+

The argument, mid, should be a valid byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point. The +method returns None if that’s not the case.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut_checked +method.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at_checked(3).unwrap();
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
+assert_eq!(None, s.split_at_checked(13));  // Inside “ö”
+assert_eq!(None, s.split_at_checked(16));  // Beyond the string length
+
1.0.0 · Source

pub fn chars(&self) -> Chars<'_>

Returns an iterator over the chars of a string slice.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns such an iterator.

+

It’s important to remember that char represents a Unicode Scalar +Value, and might not match your idea of what a ‘character’ is. Iteration +over grapheme clusters may be what you actually want. This functionality +is not provided by Rust’s standard library, check crates.io instead.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.chars().count();
+assert_eq!(7, count);
+
+let mut chars = word.chars();
+
+assert_eq!(Some('g'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('d'), chars.next());
+assert_eq!(Some('b'), chars.next());
+assert_eq!(Some('y'), chars.next());
+assert_eq!(Some('e'), chars.next());
+
+assert_eq!(None, chars.next());
+

Remember, chars might not match your intuition about characters:

+ +
let y = "y̆";
+
+let mut chars = y.chars();
+
+assert_eq!(Some('y'), chars.next()); // not 'y̆'
+assert_eq!(Some('\u{0306}'), chars.next());
+
+assert_eq!(None, chars.next());
+
1.0.0 · Source

pub fn char_indices(&self) -> CharIndices<'_>

Returns an iterator over the chars of a string slice, and their +positions.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns an iterator of both +these chars, as well as their byte positions.

+

The iterator yields tuples. The position is first, the char is +second.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.char_indices().count();
+assert_eq!(7, count);
+
+let mut char_indices = word.char_indices();
+
+assert_eq!(Some((0, 'g')), char_indices.next());
+assert_eq!(Some((1, 'o')), char_indices.next());
+assert_eq!(Some((2, 'o')), char_indices.next());
+assert_eq!(Some((3, 'd')), char_indices.next());
+assert_eq!(Some((4, 'b')), char_indices.next());
+assert_eq!(Some((5, 'y')), char_indices.next());
+assert_eq!(Some((6, 'e')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+

Remember, chars might not match your intuition about characters:

+ +
let yes = "y̆es";
+
+let mut char_indices = yes.char_indices();
+
+assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
+assert_eq!(Some((1, '\u{0306}')), char_indices.next());
+
+// note the 3 here - the previous character took up two bytes
+assert_eq!(Some((3, 'e')), char_indices.next());
+assert_eq!(Some((4, 's')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+
1.0.0 · Source

pub fn bytes(&self) -> Bytes<'_>

Returns an iterator over the bytes of a string slice.

+

As a string slice consists of a sequence of bytes, we can iterate +through a string slice by byte. This method returns such an iterator.

+
§Examples
+
let mut bytes = "bors".bytes();
+
+assert_eq!(Some(b'b'), bytes.next());
+assert_eq!(Some(b'o'), bytes.next());
+assert_eq!(Some(b'r'), bytes.next());
+assert_eq!(Some(b's'), bytes.next());
+
+assert_eq!(None, bytes.next());
+
1.1.0 · Source

pub fn split_whitespace(&self) -> SplitWhitespace<'_>

Splits a string slice by whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of whitespace.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space. If you only want to split on ASCII whitespace +instead, use split_ascii_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

All kinds of whitespace are considered:

+ +
let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_whitespace().next(), None);
+assert_eq!("   ".split_whitespace().next(), None);
+
1.34.0 · Source

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>

Splits a string slice by ASCII whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of ASCII whitespace.

+

This uses the same definition as char::is_ascii_whitespace. +To split by Unicode Whitespace instead, use split_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_ascii_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

Various kinds of ASCII whitespace are considered +(see char::is_ascii_whitespace):

+ +
let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all ASCII whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_ascii_whitespace().next(), None);
+assert_eq!("   ".split_ascii_whitespace().next(), None);
+
1.0.0 · Source

pub fn lines(&self) -> Lines<'_>

Returns an iterator over the lines of a string, as string slices.

+

Lines are split at line endings that are either newlines (\n) or +sequences of a carriage return followed by a line feed (\r\n).

+

Line terminators are not included in the lines returned by the iterator.

+

Note that any carriage return (\r) not immediately followed by a +line feed (\n) does not split a line. These carriage returns are +thereby included in the produced lines.

+

The final line ending is optional. A string that ends with a final line +ending will return the same lines as an otherwise identical string +without a final line ending.

+
§Examples
+

Basic usage:

+ +
let text = "foo\r\nbar\n\nbaz\r";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+// Trailing carriage return is included in the last line
+assert_eq!(Some("baz\r"), lines.next());
+
+assert_eq!(None, lines.next());
+

The final line does not require any ending:

+ +
let text = "foo\nbar\n\r\nbaz";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+assert_eq!(Some("baz"), lines.next());
+
+assert_eq!(None, lines.next());
+
1.0.0 · Source

pub fn lines_any(&self) -> LinesAny<'_>

👎Deprecated since 1.4.0: use lines() instead now

Returns an iterator over the lines of a string.

+
1.8.0 · Source

pub fn encode_utf16(&self) -> EncodeUtf16<'_>

Returns an iterator of u16 over the string encoded +as native endian UTF-16 (without byte-order mark).

+
§Examples
+
let text = "Zażółć gęślą jaźń";
+
+let utf8_len = text.len();
+let utf16_len = text.encode_utf16().count();
+
+assert!(utf16_len <= utf8_len);
+
1.0.0 · Source

pub fn contains<P>(&self, pat: P) -> bool
where + P: Pattern,

Returns true if the given pattern matches a sub-slice of +this string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.contains("nana"));
+assert!(!bananas.contains("apples"));
+
1.0.0 · Source

pub fn starts_with<P>(&self, pat: P) -> bool
where + P: Pattern,

Returns true if the given pattern matches a prefix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, in which case this function will return true if +the &str is a prefix of this string slice.

+

The pattern can also be a char, a slice of chars, or a +function or closure that determines if a character matches. +These will only be checked against the first character of this string slice. +Look at the second example below regarding behavior for slices of chars.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.starts_with("bana"));
+assert!(!bananas.starts_with("nana"));
+ +
let bananas = "bananas";
+
+// Note that both of these assert successfully.
+assert!(bananas.starts_with(&['b', 'a', 'n', 'a']));
+assert!(bananas.starts_with(&['a', 'b', 'c', 'd']));
+
1.0.0 · Source

pub fn ends_with<P>(&self, pat: P) -> bool
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns true if the given pattern matches a suffix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.ends_with("anas"));
+assert!(!bananas.ends_with("nana"));
+
1.0.0 · Source

pub fn find<P>(&self, pat: P) -> Option<usize>
where + P: Pattern,

Returns the byte index of the first character of this string slice that +matches the pattern.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.find('L'), Some(0));
+assert_eq!(s.find('é'), Some(14));
+assert_eq!(s.find("pard"), Some(17));
+

More complex patterns using point-free style and closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.find(char::is_whitespace), Some(5));
+assert_eq!(s.find(char::is_lowercase), Some(1));
+assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
+assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.find(x), None);
+
1.0.0 · Source

pub fn rfind<P>(&self, pat: P) -> Option<usize>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns the byte index for the first character of the last match of the pattern in +this string slice.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.rfind('L'), Some(13));
+assert_eq!(s.rfind('é'), Some(14));
+assert_eq!(s.rfind("pard"), Some(24));
+

More complex patterns with closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.rfind(char::is_whitespace), Some(12));
+assert_eq!(s.rfind(char::is_lowercase), Some(20));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.rfind(x), None);
+
1.0.0 · Source

pub fn split<P>(&self, pat: P) -> Split<'_, P>
where + P: Pattern,

Returns an iterator over substrings of this string slice, separated by +characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

If there are no matches the full string slice is returned as the only +item in the iterator.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
+assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
+
+let v: Vec<&str> = "".split('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
+assert_eq!(v, ["lion", "", "tiger", "leopard"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+
+let v: Vec<&str> = "AABBCC".split("DD").collect();
+assert_eq!(v, ["AABBCC"]);
+
+let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+
+let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+

If the pattern is a slice of chars, split on each occurrence of any of the characters:

+ +
let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
+assert_eq!(v, ["2020", "11", "03", "23", "59"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+

If a string contains multiple contiguous separators, you will end up +with empty strings in the output:

+ +
let x = "||||a||b|c".to_string();
+let d: Vec<_> = x.split('|').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

Contiguous separators are separated by the empty string.

+ +
let x = "(///)".to_string();
+let d: Vec<_> = x.split('/').collect();
+
+assert_eq!(d, &["(", "", "", ")"]);
+

Separators at the start or end of a string are neighbored +by empty strings.

+ +
let d: Vec<_> = "010".split("0").collect();
+assert_eq!(d, &["", "1", ""]);
+

When the empty string is used as a separator, it separates +every character in the string, along with the beginning +and end of the string.

+ +
let f: Vec<_> = "rust".split("").collect();
+assert_eq!(f, &["", "r", "u", "s", "t", ""]);
+

Contiguous separators can lead to possibly surprising behavior +when whitespace is used as the separator. This code is correct:

+ +
let x = "    a  b c".to_string();
+let d: Vec<_> = x.split(' ').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

It does not give you:

+ +
assert_eq!(d, &["a", "b", "c"]);
+

Use split_whitespace for this behavior.

+
1.51.0 · Source

pub fn split_inclusive<P>(&self, pat: P) -> SplitInclusive<'_, P>
where + P: Pattern,

Returns an iterator over substrings of this string slice, separated by +characters matched by a pattern.

+

Differs from the iterator produced by split in that split_inclusive +leaves the matched part as the terminator of the substring.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
+

If the last element of the string is matched, +that element will be considered the terminator of the preceding substring. +That substring will be the last item returned by the iterator.

+ +
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
+
1.0.0 · Source

pub fn rsplit<P>(&self, pat: P) -> RSplit<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over substrings of the given string slice, separated +by characters matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
+assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
+
+let v: Vec<&str> = "".rsplit('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
+assert_eq!(v, ["leopard", "tiger", "", "lion"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
+assert_eq!(v, ["leopard", "tiger", "lion"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "def", "abc"]);
+
1.0.0 · Source

pub fn split_terminator<P>(&self, pat: P) -> SplitTerminator<'_, P>
where + P: Pattern,

Returns an iterator over substrings of the given string slice, separated +by characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring +is skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit_terminator method can be used.

+
§Examples
+
let v: Vec<&str> = "A.B.".split_terminator('.').collect();
+assert_eq!(v, ["A", "B"]);
+
+let v: Vec<&str> = "A..B..".split_terminator(".").collect();
+assert_eq!(v, ["A", "", "B", ""]);
+
+let v: Vec<&str> = "A.B:C.D".split_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["A", "B", "C", "D"]);
+
1.0.0 · Source

pub fn rsplit_terminator<P>(&self, pat: P) -> RSplitTerminator<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over substrings of self, separated by characters +matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring is +skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a +reverse search, and it will be double ended if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split_terminator method can be +used.

+
§Examples
+
let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
+assert_eq!(v, ["B", "A"]);
+
+let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
+assert_eq!(v, ["", "B", "", "A"]);
+
+let v: Vec<&str> = "A.B:C.D".rsplit_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["D", "C", "B", "A"]);
+
1.0.0 · Source

pub fn splitn<P>(&self, n: usize, pat: P) -> SplitN<'_, P>
where + P: Pattern,

Returns an iterator over substrings of the given string slice, separated +by a pattern, restricted to returning at most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is +not efficient to support.

+

If the pattern allows a reverse search, the rsplitn method can be +used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
+assert_eq!(v, ["Mary", "had", "a little lambda"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
+assert_eq!(v, ["lion", "", "tigerXleopard"]);
+
+let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
+assert_eq!(v, ["abcXdef"]);
+
+let v: Vec<&str> = "".splitn(1, 'X').collect();
+assert_eq!(v, [""]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "defXghi"]);
+
1.0.0 · Source

pub fn rsplitn<P>(&self, n: usize, pat: P) -> RSplitN<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over substrings of this string slice, separated by a +pattern, starting from the end of the string, restricted to returning at +most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is not +efficient to support.

+

For splitting from the front, the splitn method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
+assert_eq!(v, ["lamb", "little", "Mary had a"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
+assert_eq!(v, ["leopard", "tiger", "lionX"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
+assert_eq!(v, ["leopard", "lion::tiger"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "abc1def"]);
+
1.52.0 · Source

pub fn split_once<P>(&self, delimiter: P) -> Option<(&str, &str)>
where + P: Pattern,

Splits the string on the first occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".split_once('='), None);
+assert_eq!("cfg=".split_once('='), Some(("cfg", "")));
+assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
+
1.52.0 · Source

pub fn rsplit_once<P>(&self, delimiter: P) -> Option<(&str, &str)>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Splits the string on the last occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".rsplit_once('='), None);
+assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
+
1.2.0 · Source

pub fn matches<P>(&self, pat: P) -> Matches<'_, P>
where + P: Pattern,

Returns an iterator over the disjoint matches of a pattern within the +given string slice.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
+assert_eq!(v, ["1", "2", "3"]);
+
1.2.0 · Source

pub fn rmatches<P>(&self, pat: P) -> RMatches<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over the disjoint matches of a pattern within this +string slice, yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the matches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
+assert_eq!(v, ["3", "2", "1"]);
+
1.5.0 · Source

pub fn match_indices<P>(&self, pat: P) -> MatchIndices<'_, P>
where + P: Pattern,

Returns an iterator over the disjoint matches of a pattern within this string +slice as well as the index that the match starts at.

+

For matches of pat within self that overlap, only the indices +corresponding to the first match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatch_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
+assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
+
+let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
+assert_eq!(v, [(1, "abc"), (4, "abc")]);
+
+let v: Vec<_> = "ababa".match_indices("aba").collect();
+assert_eq!(v, [(0, "aba")]); // only the first `aba`
+
1.5.0 · Source

pub fn rmatch_indices<P>(&self, pat: P) -> RMatchIndices<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over the disjoint matches of a pattern within self, +yielded in reverse order along with the index of the match.

+

For matches of pat within self that overlap, only the indices +corresponding to the last match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the match_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
+assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
+
+let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
+assert_eq!(v, [(4, "abc"), (1, "abc")]);
+
+let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
+assert_eq!(v, [(2, "aba")]); // only the last `aba`
+
1.0.0 · Source

pub fn trim(&self) -> &str

Returns a string slice with leading and trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Examples
+
let s = "\n Hello\tworld\t\n";
+
+assert_eq!("Hello\tworld", s.trim());
+
1.30.0 · Source

pub fn trim_start(&self) -> &str

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("Hello\tworld\t\n", s.trim_start());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('E') == s.trim_start().chars().next());
+
+let s = "  עברית  ";
+assert!(Some('ע') == s.trim_start().chars().next());
+
1.30.0 · Source

pub fn trim_end(&self) -> &str

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("\n Hello\tworld", s.trim_end());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('h') == s.trim_end().chars().rev().next());
+
+let s = "  עברית  ";
+assert!(Some('ת') == s.trim_end().chars().rev().next());
+
1.0.0 · Source

pub fn trim_left(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_start

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!("Hello\tworld\t", s.trim_left());
+

Directionality:

+ +
let s = "  English";
+assert!(Some('E') == s.trim_left().chars().next());
+
+let s = "  עברית";
+assert!(Some('ע') == s.trim_left().chars().next());
+
1.0.0 · Source

pub fn trim_right(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_end

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!(" Hello\tworld", s.trim_right());
+

Directionality:

+ +
let s = "English  ";
+assert!(Some('h') == s.trim_right().chars().rev().next());
+
+let s = "עברית  ";
+assert!(Some('ת') == s.trim_right().chars().rev().next());
+
1.0.0 · Source

pub fn trim_matches<P>(&self, pat: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> DoubleEndedSearcher<'a>,

Returns a string slice with all prefixes and suffixes that match a +pattern repeatedly removed.

+

The pattern can be a char, a slice of chars, or a function +or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
+assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
+
1.30.0 · Source

pub fn trim_start_matches<P>(&self, pat: P) -> &str
where + P: Pattern,

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+
assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
+
1.45.0 · Source

pub fn strip_prefix<P>(&self, prefix: P) -> Option<&str>
where + P: Pattern,

Returns a string slice with the prefix removed.

+

If the string starts with the pattern prefix, returns the substring after the prefix, +wrapped in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

+

If the string does not start with prefix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
+assert_eq!("foo:bar".strip_prefix("bar"), None);
+assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
+
1.45.0 · Source

pub fn strip_suffix<P>(&self, suffix: P) -> Option<&str>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns a string slice with the suffix removed.

+

If the string ends with the pattern suffix, returns the substring before the suffix, +wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

+

If the string does not end with suffix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
+assert_eq!("bar:foo".strip_suffix("bar"), None);
+assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
+
Source

pub fn trim_prefix<P>(&self, prefix: P) -> &str
where + P: Pattern,

🔬This is a nightly-only experimental API. (trim_prefix_suffix)

Returns a string slice with the optional prefix removed.

+

If the string starts with the pattern prefix, returns the substring after the prefix. +Unlike strip_prefix, this method always returns &str for easy method chaining, +instead of returning Option<&str>.

+

If the string does not start with prefix, returns the original string unchanged.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
#![feature(trim_prefix_suffix)]
+
+// Prefix present - removes it
+assert_eq!("foo:bar".trim_prefix("foo:"), "bar");
+assert_eq!("foofoo".trim_prefix("foo"), "foo");
+
+// Prefix absent - returns original string
+assert_eq!("foo:bar".trim_prefix("bar"), "foo:bar");
+
+// Method chaining example
+assert_eq!("<https://example.com/>".trim_prefix('<').trim_suffix('>'), "https://example.com/");
+
Source

pub fn trim_suffix<P>(&self, suffix: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

🔬This is a nightly-only experimental API. (trim_prefix_suffix)

Returns a string slice with the optional suffix removed.

+

If the string ends with the pattern suffix, returns the substring before the suffix. +Unlike strip_suffix, this method always returns &str for easy method chaining, +instead of returning Option<&str>.

+

If the string does not end with suffix, returns the original string unchanged.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
#![feature(trim_prefix_suffix)]
+
+// Suffix present - removes it
+assert_eq!("bar:foo".trim_suffix(":foo"), "bar");
+assert_eq!("foofoo".trim_suffix("foo"), "foo");
+
+// Suffix absent - returns original string
+assert_eq!("bar:foo".trim_suffix("bar"), "bar:foo");
+
+// Method chaining example
+assert_eq!("<https://example.com/>".trim_prefix('<').trim_suffix('>'), "https://example.com/");
+
1.30.0 · Source

pub fn trim_end_matches<P>(&self, pat: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · Source

pub fn trim_left_matches<P>(&self, pat: P) -> &str
where + P: Pattern,

👎Deprecated since 1.33.0: superseded by trim_start_matches

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+
assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
+
1.0.0 · Source

pub fn trim_right_matches<P>(&self, pat: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

👎Deprecated since 1.33.0: superseded by trim_end_matches

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · Source

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where + F: FromStr,

Parses this string slice into another type.

+

Because parse is so general, it can cause problems with type +inference. As such, parse is one of the few times you’ll see +the syntax affectionately known as the ‘turbofish’: ::<>. This +helps the inference algorithm understand specifically which type +you’re trying to parse into.

+

parse can parse into any type that implements the FromStr trait.

+
§Errors
+

Will return Err if it’s not possible to parse this string slice into +the desired type.

+
§Examples
+

Basic usage:

+ +
let four: u32 = "4".parse().unwrap();
+
+assert_eq!(4, four);
+

Using the ‘turbofish’ instead of annotating four:

+ +
let four = "4".parse::<u32>();
+
+assert_eq!(Ok(4), four);
+

Failing to parse:

+ +
let nope = "j".parse::<u32>();
+
+assert!(nope.is_err());
+
1.23.0 · Source

pub fn is_ascii(&self) -> bool

Checks if all characters in this string are within the ASCII range.

+
§Examples
+
let ascii = "hello!\n";
+let non_ascii = "Grüße, Jürgen ❤";
+
+assert!(ascii.is_ascii());
+assert!(!non_ascii.is_ascii());
+
Source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this string slice is_ascii, returns it as a slice +of ASCII characters, otherwise returns None.

+
Source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this string slice into a slice of ASCII characters, +without checking whether they are valid.

+
§Safety
+

Every character in this string must be ASCII, or else this is UB.

+
1.23.0 · Source

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool

Checks that two strings are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
§Examples
+
assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
+assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
+assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
+
1.80.0 · Source

pub fn trim_ascii_start(&self) -> &str

Returns a string slice with leading ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(" \t \u{3000}hello world\n".trim_ascii_start(), "\u{3000}hello world\n");
+assert_eq!("  ".trim_ascii_start(), "");
+assert_eq!("".trim_ascii_start(), "");
+
1.80.0 · Source

pub fn trim_ascii_end(&self) -> &str

Returns a string slice with trailing ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\u{3000}\n ".trim_ascii_end(), "\r hello world\u{3000}");
+assert_eq!("  ".trim_ascii_end(), "");
+assert_eq!("".trim_ascii_end(), "");
+
1.80.0 · Source

pub fn trim_ascii(&self) -> &str

Returns a string slice with leading and trailing ASCII whitespace +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\n ".trim_ascii(), "hello world");
+assert_eq!("  ".trim_ascii(), "");
+assert_eq!("".trim_ascii(), "");
+
1.34.0 · Source

pub fn escape_debug(&self) -> EscapeDebug<'_>

Returns an iterator that escapes each char in self with char::escape_debug.

+

Note: only extended grapheme codepoints that begin the string will be +escaped.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_debug() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_debug());
+

Both are equivalent to:

+ +
println!("❤\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
+
1.34.0 · Source

pub fn escape_default(&self) -> EscapeDefault<'_>

Returns an iterator that escapes each char in self with char::escape_default.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_default() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_default());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
+
1.34.0 · Source

pub fn escape_unicode(&self) -> EscapeUnicode<'_>

Returns an iterator that escapes each char in self with char::escape_unicode.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_unicode() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_unicode());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
+
Source

pub fn substr_range(&self, substr: &str) -> Option<Range<usize>>

🔬This is a nightly-only experimental API. (substr_range)

Returns the range that a substring points to.

+

Returns None if substr does not point within self.

+

Unlike str::find, this does not search through the string. +Instead, it uses pointer arithmetic to find where in the string +substr is derived from.

+

This is useful for extending str::split and similar methods.

+

Note that this method may return false positives (typically either +Some(0..0) or Some(self.len()..self.len())) if substr is a +zero-length str that points at the beginning or end of another, +independent, str.

+
§Examples
+
#![feature(substr_range)]
+
+let data = "a, b, b, a";
+let mut iter = data.split(", ").map(|s| data.substr_range(s).unwrap());
+
+assert_eq!(iter.next(), Some(0..1));
+assert_eq!(iter.next(), Some(3..4));
+assert_eq!(iter.next(), Some(6..7));
+assert_eq!(iter.next(), Some(9..10));
+
Source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (str_as_str)

Returns the same string as a string slice &str.

+

This method is redundant when used directly on &str, but +it helps dereferencing other string-like types to string slices, +for example references to Box<str> or Arc<str>.

+
1.0.0 · Source

pub fn replace<P>(&self, from: P, to: &str) -> String
where + P: Pattern,

Replaces all matches of a pattern with another string.

+

replace creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice.

+
§Examples
+
let s = "this is old";
+
+assert_eq!("this is new", s.replace("old", "new"));
+assert_eq!("than an old", s.replace("is", "an"));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replace("cookie monster", "little lamb"));
+
1.16.0 · Source

pub fn replacen<P>(&self, pat: P, to: &str, count: usize) -> String
where + P: Pattern,

Replaces first N matches of a pattern with another string.

+

replacen creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice at most count times.

+
§Examples
+
let s = "foo foo 123 foo";
+assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
+assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
+assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
+
1.2.0 · Source

pub fn to_lowercase(&self) -> String

Returns the lowercase equivalent of this string slice, as a new String.

+

‘Lowercase’ is defined according to the terms of the Unicode Derived Core Property +Lowercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "HELLO";
+
+assert_eq!("hello", s.to_lowercase());
+

A tricky example, with sigma:

+ +
let sigma = "Σ";
+
+assert_eq!("σ", sigma.to_lowercase());
+
+// but at the end of a word, it's ς, not σ:
+let odysseus = "ὈΔΥΣΣΕΎΣ";
+
+assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
+

Languages without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_lowercase());
+
1.2.0 · Source

pub fn to_uppercase(&self) -> String

Returns the uppercase equivalent of this string slice, as a new String.

+

‘Uppercase’ is defined according to the terms of the Unicode Derived Core Property +Uppercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "hello";
+
+assert_eq!("HELLO", s.to_uppercase());
+

Scripts without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_uppercase());
+

One character can become multiple:

+ +
let s = "tschüß";
+
+assert_eq!("TSCHÜSS", s.to_uppercase());
+
1.16.0 · Source

pub fn repeat(&self, n: usize) -> String

Creates a new String by repeating a string n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
+

A panic upon overflow:

+ +
// this will panic at runtime
+let huge = "0123456789abcdef".repeat(usize::MAX);
+
1.23.0 · Source

pub fn to_ascii_uppercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+

To uppercase ASCII characters in addition to non-ASCII characters, use +to_uppercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
+
1.23.0 · Source

pub fn to_ascii_lowercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+

To lowercase ASCII characters in addition to non-ASCII characters, use +to_lowercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
+

Trait Implementations§

§

impl Borrow<str> for SmolStr

§

fn borrow(&self) -> &str

Immutably borrows from an owned value. Read more
§

impl Clone for SmolStr

§

fn clone(&self) -> SmolStr

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for SmolStr

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for SmolStr

§

fn default() -> SmolStr

Returns the “default value” for a type. Read more
§

impl Deref for SmolStr

§

type Target = str

The resulting type after dereferencing.
§

fn deref(&self) -> &str

Dereferences the value.
§

impl<'de> Deserialize<'de> for SmolStr

§

fn deserialize<D>( + deserializer: D, +) -> Result<SmolStr, <D as Deserializer<'de>>::Error>
where + D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Display for SmolStr

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<T> From<T> for SmolStr
where + T: AsRef<str>,

§

fn from(text: T) -> SmolStr

Converts to this type from the input type.
§

impl<'a> FromIterator<&'a String> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = &'a String>,

Creates a value from an iterator. Read more
§

impl<'a> FromIterator<&'a str> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = &'a str>,

Creates a value from an iterator. Read more
§

impl FromIterator<String> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = String>,

Creates a value from an iterator. Read more
§

impl FromIterator<char> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = char>,

Creates a value from an iterator. Read more
§

impl FromStr for SmolStr

§

type Err = Infallible

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<SmolStr, <SmolStr as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl Hash for SmolStr

§

fn hash<H>(&self, hasher: &mut H)
where + H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl Ord for SmolStr

§

fn cmp(&self, other: &SmolStr) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
§

impl<'a> PartialEq<&'a String> for SmolStr

§

fn eq(&self, other: &&'a String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a> PartialEq<&'a str> for SmolStr

§

fn eq(&self, other: &&'a str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a> PartialEq<SmolStr> for &'a str

§

fn eq(&self, other: &SmolStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq<SmolStr> for str

§

fn eq(&self, other: &SmolStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq<String> for SmolStr

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq<str> for SmolStr

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq for SmolStr

§

fn eq(&self, other: &SmolStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for SmolStr

§

fn partial_cmp(&self, other: &SmolStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Serialize for SmolStr

§

fn serialize<S>( + &self, + serializer: S, +) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Eq for SmolStr

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<P, T> Receiver for P
where + P: Deref<Target = T> + ?Sized, + T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Struct.html b/compiler-docs/fe_parser/ast/struct.Struct.html new file mode 100644 index 0000000000..c71404d4c4 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Struct.html @@ -0,0 +1,31 @@ +Struct in fe_parser::ast - Rust

Struct Struct

Source
pub struct Struct {
+    pub name: Node<SmolStr>,
+    pub fields: Vec<Node<Field>>,
+    pub functions: Vec<Node<Function>>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§fields: Vec<Node<Field>>§functions: Vec<Node<Function>>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Struct

Source§

fn clone(&self) -> Struct

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Struct

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Struct

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Struct

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Struct

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Struct

Source§

fn eq(&self, other: &Struct) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Struct

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Struct

Source§

impl StructuralPartialEq for Struct

Auto Trait Implementations§

§

impl Freeze for Struct

§

impl RefUnwindSafe for Struct

§

impl Send for Struct

§

impl Sync for Struct

§

impl Unpin for Struct

§

impl UnwindSafe for Struct

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Trait.html b/compiler-docs/fe_parser/ast/struct.Trait.html new file mode 100644 index 0000000000..cc4946eb76 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Trait.html @@ -0,0 +1,30 @@ +Trait in fe_parser::ast - Rust

Struct Trait

Source
pub struct Trait {
+    pub name: Node<SmolStr>,
+    pub functions: Vec<Node<FunctionSignature>>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§functions: Vec<Node<FunctionSignature>>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Trait

Source§

fn clone(&self) -> Trait

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Trait

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Trait

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Trait

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Trait

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Trait

Source§

fn eq(&self, other: &Trait) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Trait

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Trait

Source§

impl StructuralPartialEq for Trait

Auto Trait Implementations§

§

impl Freeze for Trait

§

impl RefUnwindSafe for Trait

§

impl Send for Trait

§

impl Sync for Trait

§

impl Unpin for Trait

§

impl UnwindSafe for Trait

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.TypeAlias.html b/compiler-docs/fe_parser/ast/struct.TypeAlias.html new file mode 100644 index 0000000000..2832c8ed44 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.TypeAlias.html @@ -0,0 +1,30 @@ +TypeAlias in fe_parser::ast - Rust

Struct TypeAlias

Source
pub struct TypeAlias {
+    pub name: Node<SmolStr>,
+    pub typ: Node<TypeDesc>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§typ: Node<TypeDesc>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for TypeAlias

Source§

fn clone(&self) -> TypeAlias

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeAlias

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for TypeAlias

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for TypeAlias

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeAlias

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeAlias

Source§

fn eq(&self, other: &TypeAlias) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for TypeAlias

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for TypeAlias

Source§

impl StructuralPartialEq for TypeAlias

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Use.html b/compiler-docs/fe_parser/ast/struct.Use.html new file mode 100644 index 0000000000..9a6e4b1215 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Use.html @@ -0,0 +1,28 @@ +Use in fe_parser::ast - Rust

Struct Use

Source
pub struct Use {
+    pub tree: Node<UseTree>,
+}

Fields§

§tree: Node<UseTree>

Trait Implementations§

Source§

impl Clone for Use

Source§

fn clone(&self) -> Use

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Use

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Use

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Use

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Use

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Use

Source§

fn eq(&self, other: &Use) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Use

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Use

Source§

impl StructuralPartialEq for Use

Auto Trait Implementations§

§

impl Freeze for Use

§

impl RefUnwindSafe for Use

§

impl Send for Use

§

impl Sync for Use

§

impl Unpin for Use

§

impl UnwindSafe for Use

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Variant.html b/compiler-docs/fe_parser/ast/struct.Variant.html new file mode 100644 index 0000000000..7c0009ea52 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Variant.html @@ -0,0 +1,30 @@ +Variant in fe_parser::ast - Rust

Struct Variant

Source
pub struct Variant {
+    pub name: Node<SmolStr>,
+    pub kind: VariantKind,
+}
Expand description

Enum variant definition.

+

Fields§

§name: Node<SmolStr>§kind: VariantKind

Trait Implementations§

Source§

impl Clone for Variant

Source§

fn clone(&self) -> Variant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Variant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Variant

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Variant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Variant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Variant

Source§

fn eq(&self, other: &Variant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Variant

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Variant

Source§

impl StructuralPartialEq for Variant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/fn.parse_file.html b/compiler-docs/fe_parser/fn.parse_file.html new file mode 100644 index 0000000000..41cdcfc84e --- /dev/null +++ b/compiler-docs/fe_parser/fn.parse_file.html @@ -0,0 +1,11 @@ +parse_file in fe_parser - Rust

Function parse_file

Source
pub fn parse_file(file_id: SourceFileId, src: &str) -> (Module, Vec<Diagnostic>)
Expand description

Parse a Module from the file content string.

+

Returns a Module (which may be incomplete), and a vec of Diagnostics +(which may be empty) to display to the user. If any of the returned +diagnostics are errors, the compilation of this file should ultimately fail.

+

If a fatal parse error occurred, the last element of the Module::body will +be a ModuleStmt::ParseError. The parser currently has very limited ability +to recover from syntax errors; this is just a first meager attempt at returning a +useful AST when there are syntax errors.

+

A SourceFileId is required to associate any diagnostics with the +underlying file.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html b/compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html new file mode 100644 index 0000000000..e9b4887003 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html @@ -0,0 +1,7 @@ +parse_contract_def in fe_parser::grammar::contracts - Rust

Function parse_contract_def

Source
pub fn parse_contract_def(
+    par: &mut Parser<'_>,
+    contract_pub_qual: Option<Span>,
+) -> ParseResult<Node<Contract>>
Expand description

Parse a contract definition.

+

§Panics

+

Panics if the next token isn’t contract.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/contracts/index.html b/compiler-docs/fe_parser/grammar/contracts/index.html new file mode 100644 index 0000000000..1747a2bad2 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/contracts/index.html @@ -0,0 +1 @@ +fe_parser::grammar::contracts - Rust

Module contracts

Source

Functions§

parse_contract_def
Parse a contract definition.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/contracts/sidebar-items.js b/compiler-docs/fe_parser/grammar/contracts/sidebar-items.js new file mode 100644 index 0000000000..6b31cd56ef --- /dev/null +++ b/compiler-docs/fe_parser/grammar/contracts/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_contract_def"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html b/compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html new file mode 100644 index 0000000000..69f63cfb4e --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html @@ -0,0 +1,4 @@ +parse_call_args in fe_parser::grammar::expressions - Rust

Function parse_call_args

Source
pub fn parse_call_args(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<Vec<Node<CallArg>>>>
Expand description

Parse call arguments

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html new file mode 100644 index 0000000000..239052f9da --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html @@ -0,0 +1,2 @@ +parse_expr in fe_parser::grammar::expressions - Rust

Function parse_expr

Source
pub fn parse_expr(par: &mut Parser<'_>) -> ParseResult<Node<Expr>>
Expand description

Parse an expression, starting with the next token.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html new file mode 100644 index 0000000000..a80859bfaf --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html @@ -0,0 +1,6 @@ +parse_expr_with_min_bp in fe_parser::grammar::expressions - Rust

Function parse_expr_with_min_bp

Source
pub fn parse_expr_with_min_bp(
+    par: &mut Parser<'_>,
+    min_bp: u8,
+) -> ParseResult<Node<Expr>>
Expand description

Parse an expression, stopping if/when we reach an operator that binds less +tightly than given binding power.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/index.html b/compiler-docs/fe_parser/grammar/expressions/index.html new file mode 100644 index 0000000000..357fb65efe --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/index.html @@ -0,0 +1,2 @@ +fe_parser::grammar::expressions - Rust

Module expressions

Source

Functions§

parse_call_args
Parse call arguments
parse_expr
Parse an expression, starting with the next token.
parse_expr_with_min_bp
Parse an expression, stopping if/when we reach an operator that binds less +tightly than given binding power.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/sidebar-items.js b/compiler-docs/fe_parser/grammar/expressions/sidebar-items.js new file mode 100644 index 0000000000..5a45a79b97 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_call_args","parse_expr","parse_expr_with_min_bp"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html new file mode 100644 index 0000000000..ffb86ef0f8 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html @@ -0,0 +1,4 @@ +parse_assert_stmt in fe_parser::grammar::functions - Rust

Function parse_assert_stmt

Source
pub fn parse_assert_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse an assert statement.

+

§Panics

+

Panics if the next token isn’t assert.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html new file mode 100644 index 0000000000..e6d2387e62 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html @@ -0,0 +1,6 @@ +parse_fn_def in fe_parser::grammar::functions - Rust

Function parse_fn_def

Source
pub fn parse_fn_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Function>>
Expand description

Parse a function definition. The optional pub qualifier must be parsed by +the caller, and passed in. Next token must be unsafe or fn.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html new file mode 100644 index 0000000000..ba0fb8e989 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html @@ -0,0 +1,7 @@ +parse_fn_sig in fe_parser::grammar::functions - Rust

Function parse_fn_sig

Source
pub fn parse_fn_sig(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<FunctionSignature>>
Expand description

Parse a function definition without a body. The optional pub qualifier +must be parsed by the caller, and passed in. Next token must be unsafe or +fn.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html new file mode 100644 index 0000000000..975e5cf1d1 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html @@ -0,0 +1,4 @@ +parse_for_stmt in fe_parser::grammar::functions - Rust

Function parse_for_stmt

Source
pub fn parse_for_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a for statement.

+

§Panics

+

Panics if the next token isn’t for.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html new file mode 100644 index 0000000000..985f4276d3 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html @@ -0,0 +1,5 @@ +parse_generic_param in fe_parser::grammar::functions - Rust

Function parse_generic_param

Source
pub fn parse_generic_param(
+    par: &mut Parser<'_>,
+) -> ParseResult<GenericParameter>
Expand description

Parse a single generic function parameter (eg. T:SomeTrait in fn foo<T: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t Name.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html new file mode 100644 index 0000000000..cfb2bad1f9 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html @@ -0,0 +1,5 @@ +parse_generic_params in fe_parser::grammar::functions - Rust

Function parse_generic_params

Source
pub fn parse_generic_params(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<Vec<GenericParameter>>>
Expand description

Parse an angle-bracket-wrapped list of generic arguments (eg. <T, R: SomeTrait> in fn foo<T, R: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t <.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html new file mode 100644 index 0000000000..c42825e2d2 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html @@ -0,0 +1,4 @@ +parse_if_stmt in fe_parser::grammar::functions - Rust

Function parse_if_stmt

Source
pub fn parse_if_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse an if statement.

+

§Panics

+

Panics if the next token isn’t if.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html new file mode 100644 index 0000000000..5fad691d22 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html @@ -0,0 +1,3 @@ +parse_match_arms in fe_parser::grammar::functions - Rust

Function parse_match_arms

Source
pub fn parse_match_arms(
+    par: &mut Parser<'_>,
+) -> ParseResult<Vec<Node<MatchArm>>>
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html new file mode 100644 index 0000000000..52a0c41d7d --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html @@ -0,0 +1,4 @@ +parse_match_stmt in fe_parser::grammar::functions - Rust

Function parse_match_stmt

Source
pub fn parse_match_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a match statement.

+

§Panics

+

Panics if the next token isn’t match.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html new file mode 100644 index 0000000000..919c0052f9 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html @@ -0,0 +1 @@ +parse_pattern in fe_parser::grammar::functions - Rust

Function parse_pattern

Source
pub fn parse_pattern(par: &mut Parser<'_>) -> ParseResult<Node<Pattern>>
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html new file mode 100644 index 0000000000..8e21ca248c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html @@ -0,0 +1,4 @@ +parse_return_stmt in fe_parser::grammar::functions - Rust

Function parse_return_stmt

Source
pub fn parse_return_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a return statement.

+

§Panics

+

Panics if the next token isn’t return.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html new file mode 100644 index 0000000000..064fe2f629 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html @@ -0,0 +1,4 @@ +parse_revert_stmt in fe_parser::grammar::functions - Rust

Function parse_revert_stmt

Source
pub fn parse_revert_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a revert statement.

+

§Panics

+

Panics if the next token isn’t revert.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html new file mode 100644 index 0000000000..815b1163bc --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html @@ -0,0 +1,6 @@ +parse_single_word_stmt in fe_parser::grammar::functions - Rust

Function parse_single_word_stmt

Source
pub fn parse_single_word_stmt(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a continue, break, pass, or revert statement.

+

§Panics

+

Panics if the next token isn’t one of the above.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html new file mode 100644 index 0000000000..46a60f0993 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html @@ -0,0 +1,2 @@ +parse_stmt in fe_parser::grammar::functions - Rust

Function parse_stmt

Source
pub fn parse_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a function-level statement.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html new file mode 100644 index 0000000000..2705d05ffc --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html @@ -0,0 +1,4 @@ +parse_unsafe_block in fe_parser::grammar::functions - Rust

Function parse_unsafe_block

Source
pub fn parse_unsafe_block(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse an unsafe block.

+

§Panics

+

Panics if the next token isn’t unsafe.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html new file mode 100644 index 0000000000..8c9c6e3049 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html @@ -0,0 +1,4 @@ +parse_while_stmt in fe_parser::grammar::functions - Rust

Function parse_while_stmt

Source
pub fn parse_while_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a while statement.

+

§Panics

+

Panics if the next token isn’t while.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/index.html b/compiler-docs/fe_parser/grammar/functions/index.html new file mode 100644 index 0000000000..eb10b054e6 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/index.html @@ -0,0 +1,6 @@ +fe_parser::grammar::functions - Rust

Module functions

Source

Functions§

parse_assert_stmt
Parse an assert statement.
parse_fn_def
Parse a function definition. The optional pub qualifier must be parsed by +the caller, and passed in. Next token must be unsafe or fn.
parse_fn_sig
Parse a function definition without a body. The optional pub qualifier +must be parsed by the caller, and passed in. Next token must be unsafe or +fn.
parse_for_stmt
Parse a for statement.
parse_generic_param
Parse a single generic function parameter (eg. T:SomeTrait in fn foo<T: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t Name.
parse_generic_params
Parse an angle-bracket-wrapped list of generic arguments (eg. <T, R: SomeTrait> in fn foo<T, R: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t <.
parse_if_stmt
Parse an if statement.
parse_match_arms
parse_match_stmt
Parse a match statement.
parse_pattern
parse_return_stmt
Parse a return statement.
parse_revert_stmt
Parse a revert statement.
parse_single_word_stmt
Parse a continue, break, pass, or revert statement.
parse_stmt
Parse a function-level statement.
parse_unsafe_block
Parse an unsafe block.
parse_while_stmt
Parse a while statement.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/sidebar-items.js b/compiler-docs/fe_parser/grammar/functions/sidebar-items.js new file mode 100644 index 0000000000..088b1ad187 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_assert_stmt","parse_fn_def","parse_fn_sig","parse_for_stmt","parse_generic_param","parse_generic_params","parse_if_stmt","parse_match_arms","parse_match_stmt","parse_pattern","parse_return_stmt","parse_revert_stmt","parse_single_word_stmt","parse_stmt","parse_unsafe_block","parse_while_stmt"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/index.html b/compiler-docs/fe_parser/grammar/index.html new file mode 100644 index 0000000000..5f8f310dff --- /dev/null +++ b/compiler-docs/fe_parser/grammar/index.html @@ -0,0 +1 @@ +fe_parser::grammar - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_constant.html b/compiler-docs/fe_parser/grammar/module/fn.parse_constant.html new file mode 100644 index 0000000000..ff9a6c1c3c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_constant.html @@ -0,0 +1,7 @@ +parse_constant in fe_parser::grammar::module - Rust

Function parse_constant

Source
pub fn parse_constant(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<ConstantDecl>>
Expand description

Parse a constant, e.g. const MAGIC_NUMBER: u256 = 4711.

+

§Panics

+

Panics if the next token isn’t const.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_module.html b/compiler-docs/fe_parser/grammar/module/fn.parse_module.html new file mode 100644 index 0000000000..3f23e3cf52 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_module.html @@ -0,0 +1,2 @@ +parse_module in fe_parser::grammar::module - Rust

Function parse_module

Source
pub fn parse_module(par: &mut Parser<'_>) -> Node<Module>
Expand description

Parse a Module.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html b/compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html new file mode 100644 index 0000000000..7f748b962d --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html @@ -0,0 +1,2 @@ +parse_module_stmt in fe_parser::grammar::module - Rust

Function parse_module_stmt

Source
pub fn parse_module_stmt(par: &mut Parser<'_>) -> ParseResult<ModuleStmt>
Expand description

Parse a ModuleStmt.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html b/compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html new file mode 100644 index 0000000000..07f362a8ef --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html @@ -0,0 +1,2 @@ +parse_pragma in fe_parser::grammar::module - Rust

Function parse_pragma

Source
pub fn parse_pragma(par: &mut Parser<'_>) -> ParseResult<Node<Pragma>>
Expand description

Parse a pragma <version-requirement> statement.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_use.html b/compiler-docs/fe_parser/grammar/module/fn.parse_use.html new file mode 100644 index 0000000000..c7f1569a2f --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_use.html @@ -0,0 +1,4 @@ +parse_use in fe_parser::grammar::module - Rust

Function parse_use

Source
pub fn parse_use(par: &mut Parser<'_>) -> ParseResult<Node<Use>>
Expand description

Parse a use statement.

+

§Panics

+

Panics if the next token isn’t use.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html b/compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html new file mode 100644 index 0000000000..cd318e786c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html @@ -0,0 +1,2 @@ +parse_use_tree in fe_parser::grammar::module - Rust

Function parse_use_tree

Source
pub fn parse_use_tree(par: &mut Parser<'_>) -> ParseResult<Node<UseTree>>
Expand description

Parse a use tree.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/index.html b/compiler-docs/fe_parser/grammar/module/index.html new file mode 100644 index 0000000000..c48e8c7156 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/index.html @@ -0,0 +1 @@ +fe_parser::grammar::module - Rust

Module module

Source

Functions§

parse_constant
Parse a constant, e.g. const MAGIC_NUMBER: u256 = 4711.
parse_module
Parse a Module.
parse_module_stmt
Parse a ModuleStmt.
parse_pragma
Parse a pragma <version-requirement> statement.
parse_use
Parse a use statement.
parse_use_tree
Parse a use tree.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/sidebar-items.js b/compiler-docs/fe_parser/grammar/module/sidebar-items.js new file mode 100644 index 0000000000..027949ed32 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_constant","parse_module","parse_module_stmt","parse_pragma","parse_use","parse_use_tree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/sidebar-items.js b/compiler-docs/fe_parser/grammar/sidebar-items.js new file mode 100644 index 0000000000..8551943604 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["contracts","expressions","functions","module","types"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html new file mode 100644 index 0000000000..f38bc56c27 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html @@ -0,0 +1,7 @@ +parse_enum_def in fe_parser::grammar::types - Rust

Function parse_enum_def

Source
pub fn parse_enum_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Enum>>
Expand description

Parse a [ModuleStmt::Enum].

+

§Panics

+

Panics if the next token isn’t TokenKind::Enum.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_field.html b/compiler-docs/fe_parser/grammar/types/fn.parse_field.html new file mode 100644 index 0000000000..11974decf3 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_field.html @@ -0,0 +1,8 @@ +parse_field in fe_parser::grammar::types - Rust

Function parse_field

Source
pub fn parse_field(
+    par: &mut Parser<'_>,
+    attributes: Vec<Node<SmolStr>>,
+    pub_qual: Option<Span>,
+    const_qual: Option<Span>,
+) -> ParseResult<Node<Field>>
Expand description

Parse a field for a struct or contract. The leading optional pub and +const qualifiers must be parsed by the caller, and passed in.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html b/compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html new file mode 100644 index 0000000000..ebcb693bc6 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html @@ -0,0 +1,7 @@ +parse_generic_args in fe_parser::grammar::types - Rust

Function parse_generic_args

Source
pub fn parse_generic_args(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<Vec<GenericArg>>>
Expand description

Parse an angle-bracket-wrapped list of generic arguments (eg. the tail end +of Map<address, u256>).

+

§Panics

+

Panics if the first token isn’t <.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html new file mode 100644 index 0000000000..7edb05ad9e --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html @@ -0,0 +1,4 @@ +parse_impl_def in fe_parser::grammar::types - Rust

Function parse_impl_def

Source
pub fn parse_impl_def(par: &mut Parser<'_>) -> ParseResult<Node<Impl>>
Expand description

Parse an impl block.

+

§Panics

+

Panics if the next token isn’t impl.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html b/compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html new file mode 100644 index 0000000000..c27ee7a06c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html @@ -0,0 +1,2 @@ +parse_opt_qualifier in fe_parser::grammar::types - Rust

Function parse_opt_qualifier

Source
pub fn parse_opt_qualifier(par: &mut Parser<'_>, tk: TokenKind) -> Option<Span>
Expand description

Parse an optional qualifier (pub, const, or idx).

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html b/compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html new file mode 100644 index 0000000000..73ece4ea08 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html @@ -0,0 +1,5 @@ +parse_path_tail in fe_parser::grammar::types - Rust

Function parse_path_tail

Source
pub fn parse_path_tail<'a>(
+    par: &mut Parser<'a>,
+    head: Node<SmolStr>,
+) -> (Path, Span, Option<Token<'a>>)
Expand description

Returns path and trailing :: token, if present.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html new file mode 100644 index 0000000000..ba2fc4749c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html @@ -0,0 +1,7 @@ +parse_struct_def in fe_parser::grammar::types - Rust

Function parse_struct_def

Source
pub fn parse_struct_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Struct>>
Expand description

Parse a [ModuleStmt::Struct].

+

§Panics

+

Panics if the next token isn’t struct.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html new file mode 100644 index 0000000000..8302e353e0 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html @@ -0,0 +1,7 @@ +parse_trait_def in fe_parser::grammar::types - Rust

Function parse_trait_def

Source
pub fn parse_trait_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Trait>>
Expand description

Parse a trait definition.

+

§Panics

+

Panics if the next token isn’t trait.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html b/compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html new file mode 100644 index 0000000000..057fad02c1 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html @@ -0,0 +1,7 @@ +parse_type_alias in fe_parser::grammar::types - Rust

Function parse_type_alias

Source
pub fn parse_type_alias(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<TypeAlias>>
Expand description

Parse a type alias definition, e.g. type MyMap = Map<u8, address>.

+

§Panics

+

Panics if the next token isn’t type.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html b/compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html new file mode 100644 index 0000000000..e2fd066e79 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html @@ -0,0 +1,2 @@ +parse_type_desc in fe_parser::grammar::types - Rust

Function parse_type_desc

Source
pub fn parse_type_desc(par: &mut Parser<'_>) -> ParseResult<Node<TypeDesc>>
Expand description

Parse a type description, e.g. u8 or Map<address, u256>.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_variant.html b/compiler-docs/fe_parser/grammar/types/fn.parse_variant.html new file mode 100644 index 0000000000..6caf1e5772 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_variant.html @@ -0,0 +1,4 @@ +parse_variant in fe_parser::grammar::types - Rust

Function parse_variant

Source
pub fn parse_variant(par: &mut Parser<'_>) -> ParseResult<Node<Variant>>
Expand description

Parse a variant for a enum definition.

+

§Panics

+

Panics if the next token isn’t TokenKind::Name.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/index.html b/compiler-docs/fe_parser/grammar/types/index.html new file mode 100644 index 0000000000..9adca7f0cf --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/index.html @@ -0,0 +1,3 @@ +fe_parser::grammar::types - Rust

Module types

Source

Functions§

parse_enum_def
Parse a [ModuleStmt::Enum].
parse_field
Parse a field for a struct or contract. The leading optional pub and +const qualifiers must be parsed by the caller, and passed in.
parse_generic_args
Parse an angle-bracket-wrapped list of generic arguments (eg. the tail end +of Map<address, u256>).
parse_impl_def
Parse an impl block.
parse_opt_qualifier
Parse an optional qualifier (pub, const, or idx).
parse_path_tail
Returns path and trailing :: token, if present.
parse_struct_def
Parse a [ModuleStmt::Struct].
parse_trait_def
Parse a trait definition.
parse_type_alias
Parse a type alias definition, e.g. type MyMap = Map<u8, address>.
parse_type_desc
Parse a type description, e.g. u8 or Map<address, u256>.
parse_variant
Parse a variant for a enum definition.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/sidebar-items.js b/compiler-docs/fe_parser/grammar/types/sidebar-items.js new file mode 100644 index 0000000000..f17d380f7e --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_enum_def","parse_field","parse_generic_args","parse_impl_def","parse_opt_qualifier","parse_path_tail","parse_struct_def","parse_trait_def","parse_type_alias","parse_type_desc","parse_variant"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/index.html b/compiler-docs/fe_parser/index.html new file mode 100644 index 0000000000..04370b85e7 --- /dev/null +++ b/compiler-docs/fe_parser/index.html @@ -0,0 +1,3 @@ +fe_parser - Rust

Crate fe_parser

Source

Re-exports§

pub use lexer::Token;
pub use lexer::TokenKind;

Modules§

ast
grammar
lexer
node

Structs§

Label
ParseFailed
Parser
Parser maintains the parsing state, such as the token stream, +“enclosure” (paren, brace, ..) stack, diagnostics, etc. +Syntax parsing logic is in the crate::grammar module.

Functions§

parse_file
Parse a Module from the file content string.

Type Aliases§

ParseResult
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/enum.TokenKind.html b/compiler-docs/fe_parser/lexer/enum.TokenKind.html new file mode 100644 index 0000000000..3240045eaa --- /dev/null +++ b/compiler-docs/fe_parser/lexer/enum.TokenKind.html @@ -0,0 +1,121 @@ +TokenKind in fe_parser::lexer - Rust

Enum TokenKind

Source
pub enum TokenKind {
+
Show 87 variants Error, + Newline, + Name, + Int, + Hex, + Octal, + Binary, + Text, + True, + False, + Assert, + Break, + Continue, + Contract, + Fn, + Const, + Else, + Idx, + If, + Match, + Impl, + Pragma, + For, + Pub, + Return, + Revert, + SelfType, + SelfValue, + Struct, + Enum, + Trait, + Type, + Unsafe, + While, + And, + As, + In, + Not, + Or, + Let, + Mut, + Use, + ParenOpen, + ParenClose, + BracketOpen, + BracketClose, + BraceOpen, + BraceClose, + Colon, + ColonColon, + Comma, + Hash, + Semi, + Plus, + Minus, + Star, + Slash, + Pipe, + Amper, + Lt, + LtLt, + Gt, + GtGt, + Eq, + Dot, + DotDot, + Percent, + EqEq, + NotEq, + LtEq, + GtEq, + Tilde, + Hat, + StarStar, + StarStarEq, + PlusEq, + MinusEq, + StarEq, + SlashEq, + PercentEq, + AmperEq, + PipeEq, + HatEq, + LtLtEq, + GtGtEq, + Arrow, + FatArrow, +
}

Variants§

§

Error

§

Newline

§

Name

§

Int

§

Hex

§

Octal

§

Binary

§

Text

§

True

§

False

§

Assert

§

Break

§

Continue

§

Contract

§

Fn

§

Const

§

Else

§

Idx

§

If

§

Match

§

Impl

§

Pragma

§

For

§

Pub

§

Return

§

Revert

§

SelfType

§

SelfValue

§

Struct

§

Enum

§

Trait

§

Type

§

Unsafe

§

While

§

And

§

As

§

In

§

Not

§

Or

§

Let

§

Mut

§

Use

§

ParenOpen

§

ParenClose

§

BracketOpen

§

BracketClose

§

BraceOpen

§

BraceClose

§

Colon

§

ColonColon

§

Comma

§

Hash

§

Semi

§

Plus

§

Minus

§

Star

§

Slash

§

Pipe

§

Amper

§

Lt

§

LtLt

§

Gt

§

GtGt

§

Eq

§

Dot

§

DotDot

§

Percent

§

EqEq

§

NotEq

§

LtEq

§

GtEq

§

Tilde

§

Hat

§

StarStar

§

StarStarEq

§

PlusEq

§

MinusEq

§

StarEq

§

SlashEq

§

PercentEq

§

AmperEq

§

PipeEq

§

HatEq

§

LtLtEq

§

GtGtEq

§

Arrow

§

FatArrow

Implementations§

Source§

impl TokenKind

Source

pub fn describe(&self) -> &str

Return a user-friendly description of the token kind. E.g. +TokenKind::Newline => “a newline” +TokenKind::Colon => “:

+

Trait Implementations§

Source§

impl Clone for TokenKind

Source§

fn clone(&self) -> TokenKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TokenKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'s> Logos<'s> for TokenKind

Source§

const ERROR: Self = TokenKind::Error

Helper const of the variant marked as #[error].
Source§

type Extras = ()

Associated type Extras for the particular lexer. This can be set using +#[logos(extras = MyExtras)] and accessed inside callbacks.
Source§

type Source = str

Source type this token can be lexed from. This will default to str, +unless one of the defined patterns explicitly uses non-unicode byte values +or byte slices, in which case that implementation will use [u8].
Source§

fn lex(lex: &mut Lexer<'s, Self>)

The heart of Logos. Called by the Lexer. The implementation for this function +is generated by the logos-derive crate.
§

fn lexer(source: &'source Self::Source) -> Lexer<'source, Self>
where + Self::Extras: Default,

Create a new instance of a Lexer that will produce tokens implementing +this Logos.
§

fn lexer_with_extras( + source: &'source Self::Source, + extras: Self::Extras, +) -> Lexer<'source, Self>

Create a new instance of a Lexer with the provided Extras that will +produce tokens implementing this Logos.
Source§

impl PartialEq for TokenKind

Source§

fn eq(&self, other: &TokenKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for TokenKind

Source§

impl Eq for TokenKind

Source§

impl StructuralPartialEq for TokenKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/index.html b/compiler-docs/fe_parser/lexer/index.html new file mode 100644 index 0000000000..f72e245e43 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/index.html @@ -0,0 +1 @@ +fe_parser::lexer - Rust

Module lexer

Source

Structs§

Lexer
Token

Enums§

TokenKind
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/sidebar-items.js b/compiler-docs/fe_parser/lexer/sidebar-items.js new file mode 100644 index 0000000000..bbe99d1cc8 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["TokenKind"],"struct":["Lexer","Token"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/struct.Lexer.html b/compiler-docs/fe_parser/lexer/struct.Lexer.html new file mode 100644 index 0000000000..0c0b1d9018 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/struct.Lexer.html @@ -0,0 +1,195 @@ +Lexer in fe_parser::lexer - Rust

Struct Lexer

Source
pub struct Lexer<'a> { /* private fields */ }

Implementations§

Source§

impl<'a> Lexer<'a>

Source

pub fn new(file_id: SourceFileId, src: &'a str) -> Lexer<'_>

Create a new lexer with the given source code string.

+
Source

pub fn source(&self) -> &'a str

Return the full source code string that’s being tokenized.

+

Trait Implementations§

Source§

impl<'a> Clone for Lexer<'a>

Source§

fn clone(&self) -> Lexer<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Iterator for Lexer<'a>

Source§

type Item = Token<'a>

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Lexer<'a>

§

impl<'a> RefUnwindSafe for Lexer<'a>

§

impl<'a> Send for Lexer<'a>

§

impl<'a> Sync for Lexer<'a>

§

impl<'a> Unpin for Lexer<'a>

§

impl<'a> UnwindSafe for Lexer<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/struct.Token.html b/compiler-docs/fe_parser/lexer/struct.Token.html new file mode 100644 index 0000000000..db039e33de --- /dev/null +++ b/compiler-docs/fe_parser/lexer/struct.Token.html @@ -0,0 +1,24 @@ +Token in fe_parser::lexer - Rust

Struct Token

Source
pub struct Token<'a> {
+    pub kind: TokenKind,
+    pub text: &'a str,
+    pub span: Span,
+}

Fields§

§kind: TokenKind§text: &'a str§span: Span

Trait Implementations§

Source§

impl<'a> Add<&Token<'a>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &Token<'a>) -> Self

Performs the + operation. Read more
Source§

impl<'a> Clone for Token<'a>

Source§

fn clone(&self) -> Token<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for Token<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> From<Token<'a>> for Node<SmolStr>

Source§

fn from(tok: Token<'a>) -> Node<SmolStr>

Converts to this type from the input type.
Source§

impl<'a> PartialEq for Token<'a>

Source§

fn eq(&self, other: &Token<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<'a> Eq for Token<'a>

Source§

impl<'a> StructuralPartialEq for Token<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for Token<'a>

§

impl<'a> RefUnwindSafe for Token<'a>

§

impl<'a> Send for Token<'a>

§

impl<'a> Sync for Token<'a>

§

impl<'a> Unpin for Token<'a>

§

impl<'a> UnwindSafe for Token<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/token/enum.TokenKind.html b/compiler-docs/fe_parser/lexer/token/enum.TokenKind.html new file mode 100644 index 0000000000..24f9bbe054 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/token/enum.TokenKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_parser/lexer/enum.TokenKind.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/token/struct.Token.html b/compiler-docs/fe_parser/lexer/token/struct.Token.html new file mode 100644 index 0000000000..dd6eee4eb3 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/token/struct.Token.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_parser/lexer/struct.Token.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/node/index.html b/compiler-docs/fe_parser/node/index.html new file mode 100644 index 0000000000..cd97d50516 --- /dev/null +++ b/compiler-docs/fe_parser/node/index.html @@ -0,0 +1 @@ +fe_parser::node - Rust

Module node

Source

Structs§

Node
NodeId
Span
An exclusive span of byte offsets in a source file.

Traits§

Spanned
\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/sidebar-items.js b/compiler-docs/fe_parser/node/sidebar-items.js new file mode 100644 index 0000000000..3078e3d906 --- /dev/null +++ b/compiler-docs/fe_parser/node/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Node","NodeId","Span"],"trait":["Spanned"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/node/struct.Node.html b/compiler-docs/fe_parser/node/struct.Node.html new file mode 100644 index 0000000000..c7fc1140d0 --- /dev/null +++ b/compiler-docs/fe_parser/node/struct.Node.html @@ -0,0 +1,38 @@ +Node in fe_parser::node - Rust

Struct Node

Source
pub struct Node<T> {
+    pub kind: T,
+    pub id: NodeId,
+    pub span: Span,
+}

Fields§

§kind: T§id: NodeId§span: Span

Implementations§

Source§

impl Node<Contract>

Source

pub fn name(&self) -> &str

Source§

impl Node<Struct>

Source

pub fn name(&self) -> &str

Source§

impl Node<Enum>

Source

pub fn name(&self) -> &str

Source§

impl Node<Variant>

Source

pub fn name(&self) -> &str

Source§

impl Node<Trait>

Source

pub fn name(&self) -> &str

Source§

impl Node<Field>

Source

pub fn name(&self) -> &str

Source§

impl Node<Function>

Source

pub fn name(&self) -> &str

Source§

impl Node<FunctionArg>

Source

pub fn name(&self) -> &str

Source

pub fn name_span(&self) -> Span

Source§

impl Node<TypeAlias>

Source

pub fn name(&self) -> &str

Source§

impl<T> Node<T>

Source

pub fn new(kind: T, span: Span) -> Self

Trait Implementations§

Source§

impl<T: Clone> Clone for Node<T>

Source§

fn clone(&self) -> Node<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug> Debug for Node<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de, T> Deserialize<'de> for Node<T>
where + T: Deserialize<'de>,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Node<Function>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> From<&Node<T>> for NodeId

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<&Node<T>> for Span

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl<'a> From<Token<'a>> for Node<SmolStr>

Source§

fn from(tok: Token<'a>) -> Node<SmolStr>

Converts to this type from the input type.
Source§

impl<T: Hash> Hash for Node<T>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<T: PartialEq> PartialEq for Node<T>

Source§

fn eq(&self, other: &Node<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<T> Serialize for Node<T>
where + T: Serialize,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<T> Spanned for Node<T>

Source§

fn span(&self) -> Span

Source§

impl<T: Eq> Eq for Node<T>

Source§

impl<T> StructuralPartialEq for Node<T>

Auto Trait Implementations§

§

impl<T> Freeze for Node<T>
where + T: Freeze,

§

impl<T> RefUnwindSafe for Node<T>
where + T: RefUnwindSafe,

§

impl<T> Send for Node<T>
where + T: Send,

§

impl<T> Sync for Node<T>
where + T: Sync,

§

impl<T> Unpin for Node<T>
where + T: Unpin,

§

impl<T> UnwindSafe for Node<T>
where + T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/struct.NodeId.html b/compiler-docs/fe_parser/node/struct.NodeId.html new file mode 100644 index 0000000000..f127b8d450 --- /dev/null +++ b/compiler-docs/fe_parser/node/struct.NodeId.html @@ -0,0 +1,30 @@ +NodeId in fe_parser::node - Rust

Struct NodeId

Source
pub struct NodeId(/* private fields */);

Implementations§

Source§

impl NodeId

Source

pub fn create() -> Self

Source

pub fn dummy() -> Self

Source

pub fn is_dummy(self) -> bool

Trait Implementations§

Source§

impl Clone for NodeId

Source§

fn clone(&self) -> NodeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for NodeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for NodeId

Source§

fn default() -> NodeId

Returns the “default value” for a type. Read more
Source§

impl<T> From<&Box<Node<T>>> for NodeId

Source§

fn from(node: &Box<Node<T>>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<&Node<T>> for NodeId

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl Hash for NodeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for NodeId

Source§

fn cmp(&self, other: &NodeId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for NodeId

Source§

fn eq(&self, other: &NodeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for NodeId

Source§

fn partial_cmp(&self, other: &NodeId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for NodeId

Source§

impl Eq for NodeId

Source§

impl StructuralPartialEq for NodeId

Auto Trait Implementations§

§

impl Freeze for NodeId

§

impl RefUnwindSafe for NodeId

§

impl Send for NodeId

§

impl Sync for NodeId

§

impl Unpin for NodeId

§

impl UnwindSafe for NodeId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/struct.Span.html b/compiler-docs/fe_parser/node/struct.Span.html new file mode 100644 index 0000000000..49ad91c22a --- /dev/null +++ b/compiler-docs/fe_parser/node/struct.Span.html @@ -0,0 +1,43 @@ +Span in fe_parser::node - Rust

Struct Span

Source
pub struct Span {
+    pub file_id: SourceFileId,
+    pub start: usize,
+    pub end: usize,
+}
Expand description

An exclusive span of byte offsets in a source file.

+

Fields§

§file_id: SourceFileId§start: usize

A byte offset specifying the inclusive start of a span.

+
§end: usize

A byte offset specifying the exclusive end of a span.

+

Implementations§

Source§

impl Span

Source

pub fn new(file_id: SourceFileId, start: usize, end: usize) -> Span

Source

pub fn zero(file_id: SourceFileId) -> Span

Source

pub fn dummy() -> Span

Source

pub fn is_dummy(&self) -> bool

Source

pub fn from_pair<S, E>(start_elem: S, end_elem: E) -> Span
where + S: Into<Span>, + E: Into<Span>,

Trait Implementations§

Source§

impl<'a, T> Add<&'a T> for Span
where + T: Spanned,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &'a T) -> Span

Performs the + operation. Read more
Source§

impl<'a> Add<&Token<'a>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &Token<'a>) -> Self

Performs the + operation. Read more
Source§

impl<'a, T> Add<Option<&'a T>> for Span
where + Span: Add<&'a T, Output = Span>,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<&'a T>) -> Span

Performs the + operation. Read more
Source§

impl Add<Option<Span>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<Span>) -> Span

Performs the + operation. Read more
Source§

impl Add for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Span) -> Span

Performs the + operation. Read more
Source§

impl<T> AddAssign<T> for Span
where + Span: Add<T, Output = Span>,

Source§

fn add_assign(&mut self, other: T)

Performs the += operation. Read more
Source§

impl Clone for Span

Source§

fn clone(&self) -> Span

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Span

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Span

Source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<Span, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T> From<&Box<Node<T>>> for Span

Source§

fn from(node: &Box<Node<T>>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<&Node<T>> for Span

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl Hash for Span

Source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Span

Source§

fn eq(&self, other: &Span) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Span

Source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for Span

Source§

impl Eq for Span

Source§

impl StructuralPartialEq for Span

Auto Trait Implementations§

§

impl Freeze for Span

§

impl RefUnwindSafe for Span

§

impl Send for Span

§

impl Sync for Span

§

impl Unpin for Span

§

impl UnwindSafe for Span

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/trait.Spanned.html b/compiler-docs/fe_parser/node/trait.Spanned.html new file mode 100644 index 0000000000..c3140f9734 --- /dev/null +++ b/compiler-docs/fe_parser/node/trait.Spanned.html @@ -0,0 +1,4 @@ +Spanned in fe_parser::node - Rust

Trait Spanned

Source
pub trait Spanned {
+    // Required method
+    fn span(&self) -> Span;
+}

Required Methods§

Source

fn span(&self) -> Span

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/struct.Label.html b/compiler-docs/fe_parser/parser/struct.Label.html new file mode 100644 index 0000000000..87ea1515b1 --- /dev/null +++ b/compiler-docs/fe_parser/parser/struct.Label.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/struct.Label.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/struct.ParseFailed.html b/compiler-docs/fe_parser/parser/struct.ParseFailed.html new file mode 100644 index 0000000000..b1843d8358 --- /dev/null +++ b/compiler-docs/fe_parser/parser/struct.ParseFailed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/struct.ParseFailed.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/struct.Parser.html b/compiler-docs/fe_parser/parser/struct.Parser.html new file mode 100644 index 0000000000..6f325de554 --- /dev/null +++ b/compiler-docs/fe_parser/parser/struct.Parser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/struct.Parser.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/type.ParseResult.html b/compiler-docs/fe_parser/parser/type.ParseResult.html new file mode 100644 index 0000000000..366f14864a --- /dev/null +++ b/compiler-docs/fe_parser/parser/type.ParseResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/type.ParseResult.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/sidebar-items.js b/compiler-docs/fe_parser/sidebar-items.js new file mode 100644 index 0000000000..245b322b5e --- /dev/null +++ b/compiler-docs/fe_parser/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_file"],"mod":["ast","grammar","lexer","node"],"struct":["Label","ParseFailed","Parser"],"type":["ParseResult"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/struct.Label.html b/compiler-docs/fe_parser/struct.Label.html new file mode 100644 index 0000000000..36a29f7e99 --- /dev/null +++ b/compiler-docs/fe_parser/struct.Label.html @@ -0,0 +1,34 @@ +Label in fe_parser - Rust

Struct Label

Source
pub struct Label {
+    pub style: LabelStyle,
+    pub span: Span,
+    pub message: String,
+}

Fields§

§style: LabelStyle§span: Span§message: String

Implementations§

Source§

impl Label

Source

pub fn primary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a primary label with the given message. This will underline the +given span with carets (^^^^).

+
Source

pub fn secondary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a secondary label with the given message. This will underline the +given span with hyphens (----).

+
Source

pub fn into_cs_label(self) -> Label<SourceFileId>

Convert into a [codespan_reporting::Diagnostic::Label]

+

Trait Implementations§

Source§

impl Clone for Label

Source§

fn clone(&self) -> Label

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Label

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Hash for Label

Source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Label

Source§

fn eq(&self, other: &Label) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Label

Source§

impl StructuralPartialEq for Label

Auto Trait Implementations§

§

impl Freeze for Label

§

impl RefUnwindSafe for Label

§

impl Send for Label

§

impl Sync for Label

§

impl Unpin for Label

§

impl UnwindSafe for Label

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/struct.ParseFailed.html b/compiler-docs/fe_parser/struct.ParseFailed.html new file mode 100644 index 0000000000..d33e9f02db --- /dev/null +++ b/compiler-docs/fe_parser/struct.ParseFailed.html @@ -0,0 +1,23 @@ +ParseFailed in fe_parser - Rust

Struct ParseFailed

Source
pub struct ParseFailed;

Trait Implementations§

Source§

impl Clone for ParseFailed

Source§

fn clone(&self) -> ParseFailed

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ParseFailed

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for ParseFailed

Source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Error for ParseFailed

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl Hash for ParseFailed

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ParseFailed

Source§

fn eq(&self, other: &ParseFailed) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ParseFailed

Source§

impl Eq for ParseFailed

Source§

impl StructuralPartialEq for ParseFailed

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/struct.Parser.html b/compiler-docs/fe_parser/struct.Parser.html new file mode 100644 index 0000000000..780e587fa9 --- /dev/null +++ b/compiler-docs/fe_parser/struct.Parser.html @@ -0,0 +1,81 @@ +Parser in fe_parser - Rust

Struct Parser

Source
pub struct Parser<'a> {
+    pub file_id: SourceFileId,
+    pub diagnostics: Vec<Diagnostic>,
+    /* private fields */
+}
Expand description

Parser maintains the parsing state, such as the token stream, +“enclosure” (paren, brace, ..) stack, diagnostics, etc. +Syntax parsing logic is in the crate::grammar module.

+

See [BTParser] if you need backtrackable parser.

+

Fields§

§file_id: SourceFileId§diagnostics: Vec<Diagnostic>

The diagnostics (errors and warnings) emitted during parsing.

+

Implementations§

Source§

impl<'a> Parser<'a>

Source

pub fn new(file_id: SourceFileId, content: &'a str) -> Self

Create a new parser for a source code string and associated file id.

+
Source

pub fn as_bt_parser<'b>(&'b mut self) -> BTParser<'a, 'b>

Returns back tracking parser.

+
Source

pub fn next(&mut self) -> ParseResult<Token<'a>>

Return the next token, or an error if we’ve reached the end of the file.

+
Source

pub fn peek_or_err(&mut self) -> ParseResult<TokenKind>

Take a peek at the next token kind without consuming it, or return an +error if we’ve reached the end of the file.

+
Source

pub fn peek(&mut self) -> Option<TokenKind>

Take a peek at the next token kind. Returns None if we’ve reached the +end of the file.

+
Source

pub fn split_next(&mut self) -> ParseResult<Token<'a>>

Split the next token into two tokens, returning the first. Only supports +splitting the >> token into two > tokens, specifically for +parsing the closing angle bracket of a generic type argument list +(Map<x, Map<y, z>>).

+
§Panics
+

Panics if the next token isn’t >>

+
Source

pub fn done(&mut self) -> bool

Returns true if the parser has reached the end of the file.

+
Source

pub fn eat_newlines(&mut self)

Source

pub fn assert(&mut self, tk: TokenKind) -> Token<'a>

Assert that the next token kind it matches the expected token +kind, and return it. This should be used in cases where the next token +kind is expected to have been checked already.

+
§Panics
+

Panics if the next token kind isn’t tk.

+
Source

pub fn expect<S: Into<String>>( + &mut self, + expected: TokenKind, + message: S, +) -> ParseResult<Token<'a>>

If the next token matches the expected kind, return it. Otherwise emit +an error diagnostic with the given message and return an error.

+
Source

pub fn expect_with_notes<Str, NotesFn>( + &mut self, + expected: TokenKind, + message: Str, + notes_fn: NotesFn, +) -> ParseResult<Token<'a>>
where + Str: Into<String>, + NotesFn: FnOnce(&Token<'_>) -> Vec<String>,

Like Parser::expect, but with additional notes to be appended to the +bottom of the diagnostic message. The notes are provided by a +function that returns a Vec<String>, to avoid allocations in the +case where the token is as expected.

+
Source

pub fn optional(&mut self, kind: TokenKind) -> Option<Token<'a>>

If the next token matches the expected kind, return it. Otherwise return +None.

+
Source

pub fn unexpected_token_error<S: Into<String>>( + &mut self, + tok: &Token<'_>, + message: S, + notes: Vec<String>, +)

Emit an “unexpected token” error diagnostic with the given message.

+
Source

pub fn enter_block( + &mut self, + context_span: Span, + context_name: &str, +) -> ParseResult<()>

Enter a “block”, which is a brace-enclosed list of statements, +separated by newlines and/or semicolons. +This checks for and consumes the { that precedes the block.

+
Source

pub fn expect_stmt_end(&mut self, context_name: &str) -> ParseResult<()>

Consumes newlines and semicolons. Returns Ok if one or more newlines or +semicolons are consumed, or if the next token is a }.

+
Source

pub fn error<S: Into<String>>(&mut self, span: Span, message: S)

Emit an error diagnostic, but don’t stop parsing

+
Source

pub fn fancy_error<S: Into<String>>( + &mut self, + message: S, + labels: Vec<Label>, + notes: Vec<String>, +)

Emit a “fancy” error diagnostic with any number of labels and notes, +but don’t stop parsing.

+

Auto Trait Implementations§

§

impl<'a> Freeze for Parser<'a>

§

impl<'a> RefUnwindSafe for Parser<'a>

§

impl<'a> Send for Parser<'a>

§

impl<'a> Sync for Parser<'a>

§

impl<'a> Unpin for Parser<'a>

§

impl<'a> UnwindSafe for Parser<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/type.ParseResult.html b/compiler-docs/fe_parser/type.ParseResult.html new file mode 100644 index 0000000000..4d44941c3e --- /dev/null +++ b/compiler-docs/fe_parser/type.ParseResult.html @@ -0,0 +1,6 @@ +ParseResult in fe_parser - Rust

Type Alias ParseResult

Source
pub type ParseResult<T> = Result<T, ParseFailed>;

Aliased Type§

pub enum ParseResult<T> {
+    Ok(T),
+    Err(ParseFailed),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(ParseFailed)

Contains the error value

+
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/all.html b/compiler-docs/fe_test_files/all.html new file mode 100644 index 0000000000..ab4c55477e --- /dev/null +++ b/compiler-docs/fe_test_files/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture.html b/compiler-docs/fe_test_files/fn.fixture.html new file mode 100644 index 0000000000..a5e3b82a09 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture.html @@ -0,0 +1 @@ +fixture in fe_test_files - Rust

Function fixture

Source
pub fn fixture(path: &str) -> &'static str
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture_bytes.html b/compiler-docs/fe_test_files/fn.fixture_bytes.html new file mode 100644 index 0000000000..a11bf3e988 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture_bytes.html @@ -0,0 +1 @@ +fixture_bytes in fe_test_files - Rust

Function fixture_bytes

Source
pub fn fixture_bytes(path: &str) -> &'static [u8] 
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture_dir.html b/compiler-docs/fe_test_files/fn.fixture_dir.html new file mode 100644 index 0000000000..4bf2f0cb39 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture_dir.html @@ -0,0 +1 @@ +fixture_dir in fe_test_files - Rust

Function fixture_dir

Source
pub fn fixture_dir(path: &str) -> &Dir<'static>
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture_dir_files.html b/compiler-docs/fe_test_files/fn.fixture_dir_files.html new file mode 100644 index 0000000000..4bfa1d1e3c --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture_dir_files.html @@ -0,0 +1,2 @@ +fixture_dir_files in fe_test_files - Rust

Function fixture_dir_files

Source
pub fn fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)>
Expand description

Returns (file_path, file_content)

+
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.new_fixture_dir_files.html b/compiler-docs/fe_test_files/fn.new_fixture_dir_files.html new file mode 100644 index 0000000000..b5a3f88938 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.new_fixture_dir_files.html @@ -0,0 +1,2 @@ +new_fixture_dir_files in fe_test_files - Rust

Function new_fixture_dir_files

Source
pub fn new_fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)>
Expand description

Returns (file_path, file_content)

+
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/index.html b/compiler-docs/fe_test_files/index.html new file mode 100644 index 0000000000..bd34c8f7f6 --- /dev/null +++ b/compiler-docs/fe_test_files/index.html @@ -0,0 +1 @@ +fe_test_files - Rust

Crate fe_test_files

Source

Functions§

fixture
fixture_bytes
fixture_dir
fixture_dir_files
Returns (file_path, file_content)
new_fixture_dir_files
Returns (file_path, file_content)
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/sidebar-items.js b/compiler-docs/fe_test_files/sidebar-items.js new file mode 100644 index 0000000000..58ff4389ca --- /dev/null +++ b/compiler-docs/fe_test_files/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["fixture","fixture_bytes","fixture_dir","fixture_dir_files","new_fixture_dir_files"]}; \ No newline at end of file diff --git a/compiler-docs/fe_test_runner/all.html b/compiler-docs/fe_test_runner/all.html new file mode 100644 index 0000000000..67f9159183 --- /dev/null +++ b/compiler-docs/fe_test_runner/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Functions

\ No newline at end of file diff --git a/compiler-docs/fe_test_runner/fn.execute.html b/compiler-docs/fe_test_runner/fn.execute.html new file mode 100644 index 0000000000..6251eec0a1 --- /dev/null +++ b/compiler-docs/fe_test_runner/fn.execute.html @@ -0,0 +1,6 @@ +execute in fe_test_runner - Rust

Function execute

Source
pub fn execute(
+    name: &str,
+    events: &[Event],
+    bytecode: &str,
+    sink: &mut TestSink,
+) -> bool
\ No newline at end of file diff --git a/compiler-docs/fe_test_runner/index.html b/compiler-docs/fe_test_runner/index.html new file mode 100644 index 0000000000..a219e3d028 --- /dev/null +++ b/compiler-docs/fe_test_runner/index.html @@ -0,0 +1 @@ +fe_test_runner - Rust

Crate fe_test_runner

Source

Re-exports§

pub use ethabi;

Structs§

TestSink

Functions§

execute
\ No newline at end of file diff --git a/compiler-docs/fe_test_runner/sidebar-items.js b/compiler-docs/fe_test_runner/sidebar-items.js new file mode 100644 index 0000000000..78183fd290 --- /dev/null +++ b/compiler-docs/fe_test_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["execute"],"struct":["TestSink"]}; \ No newline at end of file diff --git a/compiler-docs/fe_test_runner/struct.TestSink.html b/compiler-docs/fe_test_runner/struct.TestSink.html new file mode 100644 index 0000000000..80f7f749e6 --- /dev/null +++ b/compiler-docs/fe_test_runner/struct.TestSink.html @@ -0,0 +1,92 @@ +TestSink in fe_test_runner - Rust

Struct TestSink

Source
pub struct TestSink { /* private fields */ }

Implementations§

Source§

impl TestSink

Source

pub fn new(collect_logs: bool) -> Self

Source

pub fn test_count(&self) -> usize

Source

pub fn failure_count(&self) -> usize

Source

pub fn logs_count(&self) -> usize

Source

pub fn success_count(&self) -> usize

Source

pub fn insert_failure(&mut self, name: &str, reason: &str)

Source

pub fn insert_logs(&mut self, name: &str, logs: &str)

Source

pub fn inc_success_count(&mut self)

Source

pub fn failure_details(&self) -> String

Source

pub fn logs_details(&self) -> String

Trait Implementations§

Source§

impl Debug for TestSink

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for TestSink

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_yulc/all.html b/compiler-docs/fe_yulc/all.html new file mode 100644 index 0000000000..39c19d2d37 --- /dev/null +++ b/compiler-docs/fe_yulc/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/fn.compile.html b/compiler-docs/fe_yulc/fn.compile.html new file mode 100644 index 0000000000..a0acbefdf7 --- /dev/null +++ b/compiler-docs/fe_yulc/fn.compile.html @@ -0,0 +1,6 @@ +compile in fe_yulc - Rust

Function compile

Source
pub fn compile(
+    contracts: impl Iterator<Item = (impl AsRef<str>, impl AsRef<str>)>,
+    optimize: bool,
+) -> Result<IndexMap<String, ContractBytecode>, YulcError>
Expand description

Compile a map of Yul contracts to a map of bytecode contracts.

+

Returns a contract_name -> hex_encoded_bytecode map.

+
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/fn.compile_single_contract.html b/compiler-docs/fe_yulc/fn.compile_single_contract.html new file mode 100644 index 0000000000..3b855074f0 --- /dev/null +++ b/compiler-docs/fe_yulc/fn.compile_single_contract.html @@ -0,0 +1,7 @@ +compile_single_contract in fe_yulc - Rust

Function compile_single_contract

Source
pub fn compile_single_contract(
+    _name: &str,
+    _yul_src: &str,
+    _optimize: bool,
+    _verify_runtime_bytecode: bool,
+) -> Result<ContractBytecode, YulcError>
Expand description

Compiles a single Yul contract to bytecode.

+
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/index.html b/compiler-docs/fe_yulc/index.html new file mode 100644 index 0000000000..81b11dde23 --- /dev/null +++ b/compiler-docs/fe_yulc/index.html @@ -0,0 +1 @@ +fe_yulc - Rust

Crate fe_yulc

Source

Structs§

ContractBytecode
YulcError

Functions§

compile
Compile a map of Yul contracts to a map of bytecode contracts.
compile_single_contract
Compiles a single Yul contract to bytecode.
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/sidebar-items.js b/compiler-docs/fe_yulc/sidebar-items.js new file mode 100644 index 0000000000..b446eb2011 --- /dev/null +++ b/compiler-docs/fe_yulc/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["compile","compile_single_contract"],"struct":["ContractBytecode","YulcError"]}; \ No newline at end of file diff --git a/compiler-docs/fe_yulc/struct.ContractBytecode.html b/compiler-docs/fe_yulc/struct.ContractBytecode.html new file mode 100644 index 0000000000..ffaa2fe95f --- /dev/null +++ b/compiler-docs/fe_yulc/struct.ContractBytecode.html @@ -0,0 +1,14 @@ +ContractBytecode in fe_yulc - Rust

Struct ContractBytecode

Source
pub struct ContractBytecode {
+    pub bytecode: String,
+    pub runtime_bytecode: String,
+}

Fields§

§bytecode: String§runtime_bytecode: String

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/struct.YulcError.html b/compiler-docs/fe_yulc/struct.YulcError.html new file mode 100644 index 0000000000..48ea5f23a1 --- /dev/null +++ b/compiler-docs/fe_yulc/struct.YulcError.html @@ -0,0 +1,11 @@ +YulcError in fe_yulc - Rust

Struct YulcError

Source
pub struct YulcError(pub String);

Tuple Fields§

§0: String

Trait Implementations§

Source§

impl Debug for YulcError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/help.html b/compiler-docs/help.html new file mode 100644 index 0000000000..e7c66c6d58 --- /dev/null +++ b/compiler-docs/help.html @@ -0,0 +1 @@ +Help

Rustdoc help

Back
\ No newline at end of file diff --git a/compiler-docs/search-index.js b/compiler-docs/search-index.js new file mode 100644 index 0000000000..4a2859d5e7 --- /dev/null +++ b/compiler-docs/search-index.js @@ -0,0 +1,4 @@ +var searchIndex = new Map(JSON.parse('[["fe",{"t":"FNNNNONNNNNNHCNNNNNNPEPEGPENNNNCECEENNNNNCNNNNNNPPFPSGPPPPNNNNNNNHHHNNNNNONNNNNNNNNNONNHOHOOONNNNNNNNNNNNHNNHHFNNNNHHHNNNONNNNNNNFSNNNNHHNNNNONNNNNN","n":["FelangCli","augment_args","augment_args_for_update","borrow","borrow_mut","command","from","from_arg_matches","from_arg_matches_mut","into","into_app","into_app_for_update","main","task","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","Build","BuildArgs","Check","CheckArgs","Commands","New","NewProjectArgs","augment_subcommands","augment_subcommands_for_update","borrow","borrow_mut","build","","check","","create_new_project","from","from_arg_matches","from_arg_matches_mut","has_subcommand","into","new","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","Abi","Ast","BuildArgs","Bytecode","DEFAULT_OUTPUT_DIR_NAME","Emit","LoweredAst","RuntimeBytecode","Tokens","Yul","__clone_box","augment_args","augment_args_for_update","borrow","","borrow_mut","","build","build_ingot","build_single_file","clone","clone_into","clone_to_uninit","cmp","compare","emit","eq","equivalent","","","","fmt","from","","from_arg_matches","from_arg_matches_mut","input_path","into","","ioerr_to_string","mir","mir_dump","optimize","output_dir","overwrite","partial_cmp","to_owned","to_possible_value","try_from","","try_into","","type_id","","update_from_arg_matches","update_from_arg_matches_mut","value_variants","verify_nonexistent_or_empty","vzip","","write_compiled_module","write_output","CheckArgs","augment_args","augment_args_for_update","borrow","borrow_mut","check","check_ingot","check_single_file","from","from_arg_matches","from_arg_matches_mut","input_path","into","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","NewProjectArgs","SRC_TEMPLATE_DIR","augment_args","augment_args_for_update","borrow","borrow_mut","create_new_project","create_project","from","from_arg_matches","from_arg_matches_mut","into","name","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip"],"q":[[0,"fe"],[20,"fe::task"],[48,"fe::task::build"],[110,"fe::task::check"],[129,"fe::task::new"],[148,"clap::builder::command"],[149,"clap::parser::matches::arg_matches"],[150,"clap::error"],[151,"core::result"],[152,"core::any"],[153,"dyn_clone::sealed"],[154,"alloc::string"],[155,"fe_driver"],[156,"core::cmp"],[157,"alloc::vec"],[158,"core::fmt"],[159,"std::io::error"],[160,"core::option"],[161,"clap::builder::possible_value"],[162,"std::path"],[163,"fe_codegen::db"],[164,"fe_common::diagnostics"],[165,"include_dir::dir"]],"i":"`h0000000000``000000j`0``0`0000`````00000`000000Bd0`0``00000Al01010```1111101111111000010`0`000111101010001`10```Cj000```00000000000``Db000``00000000000","f":"`{bb}0{d{{d{c}}}{}}{{{d{f}}}{{d{fc}}}{}}{hj}{cc{}}{{{d{l}}}{{A`{hn}}}}{{{d{fl}}}{{A`{hn}}}}{{}c{}}{{}b}0{{}Ab}`{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dAd}{{{d{fh}}{d{l}}}{{A`{Abn}}}}{{{d{fh}}{d{fl}}}{{A`{Abn}}}}{{}c{}}```````??>=`````;{{{d{l}}}{{A`{jn}}}}{{{d{fl}}}{{A`{jn}}}}{{{d{Af}}}Ah};`876{{{d{fj}}{d{l}}}{{A`{Abn}}}}{{{d{fj}}{d{fl}}}{{A`{Abn}}}}5````{{}d}`````{{dAj}Ab}{bb}0{d{{d{c}}}{}}0{{{d{f}}}{{d{fc}}}{}}0{AlAb}{{{d{Al}}}{{Bb{AnB`}}}}0{{{d{Bd}}}Bd}{{d{d{fc}}}Ab{}}{{dBf}Ab}{{{d{Bd}}{d{Bd}}}Bh}{{d{d{c}}}Bh{}}{AlBj}{{{d{Bd}}{d{Bd}}}Ah}{{d{d{c}}}Ah{}}000{{{d{Bd}}{d{fBl}}}Bn}{cc{}}0{{{d{l}}}{{A`{Aln}}}}{{{d{fl}}}{{A`{Aln}}}}{AlAn}{{}c{}}0{C`An}{AlAh}{{{d{Af}}}Ab}{AlCb}52{{{d{Bd}}{d{Bd}}}{{Cb{Bh}}}}{dc{}}{{{d{Bd}}}{{Cb{Cd}}}}{c{{A`{e}}}{}{}}0{{}{{A`{c}}}{}}0{dAd}0{{{d{fAl}}{d{l}}}{{A`{Abn}}}}{{{d{fAl}}{d{fl}}}{{A`{Abn}}}}{{}{{d{{Cf{Bd}}}}}}{{{d{Ch}}}{{A`{AbAn}}}}{{}c{}}0{{B`{d{Af}}{d{{Cf{Bd}}}}{d{Af}}Ah}{{A`{AbAn}}}}{{{d{Ch}}{d{Af}}}{{A`{AbAn}}}}`{bb}0{d{{d{c}}}{}}{{{d{f}}}{{d{fc}}}{}}{CjAb}{{{d{fCl}}{d{Af}}}{{Bj{Cn}}}}0{cc{}}{{{d{l}}}{{A`{Cjn}}}}{{{d{fl}}}{{A`{Cjn}}}}{CjAn}{{}c{}}{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dAd}{{{d{fCj}}{d{l}}}{{A`{Abn}}}}{{{d{fCj}}{d{fl}}}{{A`{Abn}}}}{{}c{}}`{{}D`}{bb}0{d{{d{c}}}{}}{{{d{f}}}{{d{fc}}}{}}{DbAb}{{{d{Af}}{d{Ch}}}Ab}{cc{}}{{{d{l}}}{{A`{Dbn}}}}{{{d{fl}}}{{A`{Dbn}}}}?{DbAn}?>={{{d{fDb}}{d{l}}}{{A`{Abn}}}}{{{d{fDb}}{d{fl}}}{{A`{Abn}}}}<","D":"Ah","p":[[8,"Command",148],[1,"reference",null,null,1],[0,"mut"],[5,"FelangCli",0],[6,"Commands",20],[5,"ArgMatches",149],[5,"Error",150],[6,"Result",151,null,1],[1,"unit"],[5,"TypeId",152],[1,"str"],[1,"bool"],[5,"Private",153],[5,"BuildArgs",48],[5,"String",154],[5,"CompiledModule",155],[1,"tuple",null,null,1],[6,"Emit",48],[1,"u8"],[6,"Ordering",156],[5,"Vec",157],[5,"Formatter",158],[8,"Result",158],[5,"Error",159],[6,"Option",160,null,1],[5,"PossibleValue",161],[1,"slice"],[5,"Path",162],[5,"CheckArgs",110],[5,"Db",163],[5,"Diagnostic",164],[5,"Dir",165],[5,"NewProjectArgs",129]],"r":[[21,48],[23,110],[26,129],[32,48],[34,110],[35,129]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIgACwAAAAYACAABAAsAGQAmAAIAKgAmAFMAAgBYAB4AeAACAHwADQCLAAEAjgAGAA==","P":[[3,"T"],[5,""],[6,"T"],[7,""],[9,"U"],[10,""],[14,"U,T"],[15,"U"],[16,""],[19,"V"],[27,""],[29,"T"],[37,""],[40,"U"],[42,"U,T"],[43,"U"],[44,""],[47,"V"],[52,""],[61,"T"],[65,""],[69,"T"],[70,""],[72,"K"],[73,""],[75,"K"],[79,""],[80,"T"],[82,""],[85,"U"],[87,""],[94,"T"],[95,""],[96,"U,T"],[98,"U"],[100,""],[106,"V"],[108,""],[113,"T"],[115,""],[118,"T"],[119,""],[122,"U"],[123,"U,T"],[124,"U"],[125,""],[128,"V"],[130,""],[133,"T"],[135,""],[137,"T"],[138,""],[140,"U"],[141,""],[142,"U,T"],[143,"U"],[144,""],[147,"V"]]}],["fe_abi",{"t":"CCCCFNNNNNNNNNNNNNNNNNNNFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNOONNNNNNNNNNNNNNOONNNFFGPGPPPPPPPPPPPPPGGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNOO","n":["contract","event","function","types","AbiContract","borrow","borrow_mut","clone","clone_into","clone_to_uninit","eq","equivalent","","","","fmt","from","into","new","serialize","to_owned","try_from","try_into","type_id","AbiEvent","AbiEventField","AbiEventSignature","anonymous","borrow","","","borrow_mut","","","clone","","clone_into","","clone_to_uninit","","eq","","equivalent","","","","","","","","fmt","","from","","","hash_hex","hash_raw","indexed","inputs","into","","","name","","new","","serialize","","signature","","to_owned","","try_from","","","try_into","","","ty","","type_id","","","AbiFunction","AbiFunctionSelector","AbiFunctionType","Constructor","CtxParam","Fallback","Function","Imm","","Mut","","None","","Nonpayable","Payable","","Pure","Receive","SelfParam","StateMutability","View","borrow","","","","","","borrow_mut","","","","","","clone","","","clone_into","","","clone_to_uninit","","","eq","","","equivalent","","","","","","","","","","","","fmt","","","from","","","","","","from_self_and_ctx_params","hex","into","","","","","","new","selector","selector_raw","selector_signature","serialize","","","to_owned","","","try_from","","","","","","try_into","","","","","","type_id","","","","","","AbiTupleField","AbiType","Address","Array","Bool","Bytes","Function","Int","String","Tuple","UInt","abi_type_name","borrow","","borrow_mut","","clone","","clone_into","","clone_to_uninit","","eq","","equivalent","","","","","","","","fmt","","from","","header_size","into","","is_bytes","is_primitive","is_static","is_string","name","new","selector_type_name","serialize","","size","to_owned","","try_from","","try_into","","ty","type_id","","elem_ty","len"],"q":[[0,"fe_abi"],[4,"fe_abi::contract"],[24,"fe_abi::event"],[83,"fe_abi::function"],[185,"fe_abi::types"],[243,"fe_abi::types::AbiType"],[245,"core::fmt"],[246,"alloc::vec"],[247,"core::result"],[248,"serde::ser"],[249,"core::any"],[250,"alloc::string"],[251,"core::convert"],[252,"core::option"],[253,"alloc::boxed"]],"i":"`````f000000000000000000```AfB`1An1202020202022220000201201102120202020122012012020120```Bn`00C`Cb1010Bl0303``021Cd1Ab5431205205205205205222200005555205431205214312050011205205431205431205431205``Bf0000000000Cj10101010101111000010101101111001101101010010Cn0","f":"`````{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{f}}}f}{{b{b{dc}}}h{}}{{bj}h}{{{b{f}}{b{f}}}l}{{b{b{c}}}l{}}000{{{b{f}}{b{dn}}}A`}{cc{}}{{}c{}}{{{Ad{Ab}}{Ad{Af}}}f}{{{b{f}}c}AhAj}{bc{}}{c{{Ah{e}}}{}{}}{{}{{Ah{c}}}{}}{bAl}```{Afl}{b{{b{c}}}{}}00{{{b{d}}}{{b{dc}}}{}}00{{{b{Af}}}Af}{{{b{An}}}An}{{b{b{dc}}}h{}}0{{bj}h}0{{{b{Af}}{b{Af}}}l}{{{b{An}}{b{An}}}l}{{b{b{c}}}l{}}0000000{{{b{Af}}{b{dn}}}A`}{{{b{An}}{b{dn}}}A`}{cc{}}00{{{b{B`}}}Bb}{{{b{B`}}}{{Bd{j}}}}{Anl}{AfAd}{{}c{}}00{AfBb}{AnBb}{{Bb{Ad{An}}l}Af}{{Bbcl}An{{Bh{Bf}}}}{{{b{Af}}c}AhAj}{{{b{An}}c}AhAj}{{{b{B`}}}{{b{Bj}}}}{{{b{Af}}}B`}{bc{}}0{c{{Ah{e}}}{}{}}00{{}{{Ah{c}}}{}}00{Afb}{AnBf}{bAl}00`````````````````````{b{{b{c}}}{}}00000{{{b{d}}}{{b{dc}}}{}}00000{{{b{Bl}}}Bl}{{{b{Ab}}}Ab}{{{b{Bn}}}Bn}{{b{b{dc}}}h{}}00{{bj}h}00{{{b{Bl}}{b{Bl}}}l}{{{b{Ab}}{b{Ab}}}l}{{{b{Bn}}{b{Bn}}}l}{{b{b{c}}}l{}}00000000000{{{b{Bl}}{b{dn}}}A`}{{{b{Ab}}{b{dn}}}A`}{{{b{Bn}}{b{dn}}}A`}{cc{}}00000{{C`Cb}Bl}{{{b{Cd}}}Bb}{{}c{}}00000{{BnBb{Ad{{Cf{BbBf}}}}{Ch{Bf}}Bl}Ab}{{{b{Ab}}}Cd}{{{b{Cd}}}{{Bd{j}}}}{{{b{Cd}}}{{b{Bj}}}}{{{b{Bl}}c}AhAj}{{{b{Ab}}c}AhAj}{{{b{Bn}}c}AhAj}{bc{}}00{c{{Ah{e}}}{}{}}00000{{}{{Ah{c}}}{}}00000{bAl}00000```````````{{{b{Bf}}}Bb}{b{{b{c}}}{}}0{{{b{d}}}{{b{dc}}}{}}0{{{b{Bf}}}Bf}{{{b{Cj}}}Cj}{{b{b{dc}}}h{}}0{{bj}h}0{{{b{Bf}}{b{Bf}}}l}{{{b{Cj}}{b{Cj}}}l}{{b{b{c}}}l{}}0000000{{{b{Bf}}{b{dn}}}A`}{{{b{Cj}}{b{dn}}}A`}{cc{}}0{{{b{Bf}}}Cl}{{}c{}}0{{{b{Bf}}}l}000{CjBb}{{Bbc}Cj{{Bh{Bf}}}}{{{b{Bf}}}Bb}{{{b{Bf}}c}AhAj}{{{b{Cj}}c}AhAj}{{{b{Bf}}}{{Ch{Cl}}}}{bc{}}0{c{{Ah{e}}}{}{}}0{{}{{Ah{c}}}{}}0{CjBf}{bAl}0{CnD`}{CnCl}","D":"Cf","p":[[1,"reference",null,null,1],[0,"mut"],[5,"AbiContract",4],[1,"unit"],[1,"u8"],[1,"bool"],[5,"Formatter",245],[8,"Result",245],[5,"AbiFunction",83],[5,"Vec",246],[5,"AbiEvent",24],[6,"Result",247,null,1],[10,"Serializer",248],[5,"TypeId",249],[5,"AbiEventField",24],[5,"AbiEventSignature",24],[5,"String",250],[1,"array"],[6,"AbiType",185],[10,"Into",251,null,1],[1,"str"],[6,"StateMutability",83],[6,"AbiFunctionType",83],[6,"SelfParam",83],[6,"CtxParam",83],[5,"AbiFunctionSelector",83],[1,"tuple",null,null,1],[6,"Option",252,null,1],[5,"AbiTupleField",185],[1,"usize"],[15,"Array",243],[5,"Box",253,null,1]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAANoACgAAABAAEwAhADgAAwA/ACcAaAAnAJYAAACeAD0A3gAAAOEACADrAAoA","P":[[5,"T"],[7,""],[8,"T"],[9,""],[11,"K"],[15,""],[16,"T"],[17,"U"],[18,""],[19,"S"],[20,"T"],[21,"U,T"],[22,"U"],[23,""],[28,"T"],[34,""],[36,"T"],[38,""],[42,"K"],[50,""],[52,"T"],[55,""],[59,"U"],[62,""],[66,"__S"],[68,""],[70,"T"],[72,"U,T"],[75,"U"],[78,""],[104,"T"],[116,""],[119,"T"],[122,""],[128,"K"],[140,""],[143,"T"],[149,""],[151,"U"],[157,""],[161,"__S"],[164,"T"],[167,"U,T"],[173,"U"],[179,""],[197,"T"],[201,""],[203,"T"],[205,""],[209,"K"],[217,""],[219,"T"],[221,""],[222,"U"],[224,""],[231,"S"],[232,"__S"],[233,""],[234,"T"],[236,"U,T"],[238,"U"],[240,""]]}],["fe_analyzer",{"t":"EEHHCCCCCCCCPGPPGFGFPPGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSPFGFKPPPPPGGPFPPFPFPPPPFPGPPPPFPPPPMNMNMNMNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOMNMNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNNNNMNNNNNNNNNNNNONNMNNNOOOMNNNNNNNNMNMNNNMNMNMNNMNNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNMNOOOOOOOOOOOOOOOOOOOOOOFKFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNONNMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNOMNOMNOMNONMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNONMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNMNMNMNMNMNMNMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKKFNNNNNMNNNNNNNFGFFPFGPPPPPPGFPPPNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNHHHNNNNNNNNNNNNNNNNNNHNNNNNNNNCCCPFPFPPFPFFFIFGKPFPFFFGPPFPFFFPFPFFPFGPGPPPFPFFFGPPFPFFFFPFPPFFGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNMNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHFGPFPFPPPPNNNNNNNNNNNNNONNNNNNNNHNNNONNNNNNOOONNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNONNNNNNNOPPFPPGPPPFPFFFFPGFGGFPPPPPPPPGFFPPPPPPKPFPPPPPGFPGPKFPPPPSPPPPNNHNMNMNNMNNNMNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNOONNNNMNONNOONNNNOOONNNNNNNNONNNNNNOONNONNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNHHNNNOPPGPPGPFFFFGPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNOO","n":["AnalyzerDb","TestDb","analyze_ingot","analyze_module","builtins","constants","context","db","display","errors","namespace","pattern_analysis","AbiEncode","ContractTypeMethod","Create","Create2","GlobalFunction","GlobalFunctionIter","Intrinsic","IntrinsicIter","Keccak256","ToMem","ValueMethod","__add","__addmod","__address","__and","__balance","__basefee","__blockhash","__byte","__call","__callcode","__calldatacopy","__calldataload","__calldatasize","__caller","__callvalue","__chainid","__codecopy","__codesize","__coinbase","__create","__create2","__delegatecall","__div","__eq","__exp","__extcodecopy","__extcodehash","__extcodesize","__gas","__gaslimit","__gasprice","__gt","__invalid","__iszero","__keccak256","__log0","__log1","__log2","__log3","__log4","__lt","__mload","__mod","__msize","__mstore","__mstore8","__mul","__mulmod","__not","__number","__or","__origin","__pc","__pop","__prevrandao","__return","__returndatacopy","__returndatasize","__revert","__sar","__sdiv","__selfbalance","__selfdestruct","__sgt","__shl","__shr","__signextend","__sload","__slt","__smod","__sstore","__staticcall","__stop","__sub","__timestamp","__xor","arg_count","","as_ref","","","","borrow","","","","","","borrow_mut","","","","","","clone","","","","","","clone_into","","","","","","clone_to_uninit","","","","","","cmp","","compare","","eq","","","","equivalent","","","","","","","","","","","","","","","","fmt","","","","from","","","","","","from_str","","","","hash","","","into","","","","","","into_iter","","iter","","len","","next","","next_back","","nth","","partial_cmp","","return_type","size_hint","","to_owned","","","","","","try_from","","","","","","","","","","try_into","","","","","","type_id","","","","","","EMITTABLE_TRAIT_NAME","EMIT_FN_NAME","INDEXED","MAX_INDEXED_EVENT_FIELDS","Address","Adjustment","AdjustmentKind","Analysis","AnalyzerContext","AssociatedFunction","Bool","BuiltinAssociatedFunction","BuiltinFunction","BuiltinValueMethod","CallType","Constant","Copy","DiagnosticVoucher","EnumConstructor","EnumVariant","ExpressionAttributes","External","FunctionBody","Int","IntSizeIncrease","Intrinsic","Item","Label","Load","NamedThing","Pure","SelfValue","Str","StringSizeIncrease","TempContext","TraitValueMethod","TypeConstructor","ValueMethod","Variable","add_call","","add_constant","","add_diagnostic","","add_expression","","adjusted_type","assume_the_parser_handled_it","borrow","","","","","","","","","","","borrow_mut","","","","","","","","","","","calls","clone","","","","","","","","","","clone_into","","","","","","","","","","clone_to_uninit","","","","","","","","","","const_value","constant_value_by_name","","db","","default","","diagnostics","","duplicate_name_error","eq","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","error","expr_typ","","expressions","fancy_error","fmt","","","","","","","","","","","format","from","","","","","","","","","","","from_num_str","function","function_name","get_call","","get_context_type","","has_diag","hash","","","inherits_type","","into","","","","","","","","","","","","into_cs_label","is_builtin","is_in_function","","is_unsafe","item_kind_display_name","kind","matches","message","module","","name","name_conflict_error","name_span","new","","not_yet_implemented","original_type","parent","","parent_function","","primary","register_diag","resolve_any_path","","resolve_name","","resolve_path","","resolve_path_segment","resolve_visible_path","","root_item","secondary","sink_diagnostics","span","spans","style","to_owned","","","","","","","","","","to_string","try_from","","","","","","","","","","","try_into","","","","","","","","","","","typ","type_adjustments","type_error","type_id","","","","","","","","","","","update_expression","","value","var_types","contract","","function","","","generic_type","method","","","trait_id","typ","","","decl","is_const","name","parent","span","","typ","AllImplsQuery","AnalyzerDb","AnalyzerDbGroupStorage__","AnalyzerDbStorage","ContractAllFieldsQuery","ContractAllFunctionsQuery","ContractCallFunctionQuery","ContractDependencyGraphQuery","ContractFieldMapQuery","ContractFieldTypeQuery","ContractFunctionMapQuery","ContractInitFunctionQuery","ContractPublicFunctionMapQuery","ContractRuntimeDependencyGraphQuery","EnumAllFunctionsQuery","EnumAllVariantsQuery","EnumDependencyGraphQuery","EnumFunctionMapQuery","EnumVariantKindQuery","EnumVariantMapQuery","FunctionBodyQuery","FunctionDependencyGraphQuery","FunctionSignatureQuery","FunctionSigsQuery","ImplAllFunctionsQuery","ImplForQuery","ImplFunctionMapQuery","IngotExternalIngotsQuery","IngotFilesQuery","IngotModulesQuery","IngotRootModuleQuery","InternAttributeLookupQuery","InternAttributeQuery","InternContractFieldLookupQuery","InternContractFieldQuery","InternContractLookupQuery","InternContractQuery","InternEnumLookupQuery","InternEnumQuery","InternEnumVariantLookupQuery","InternEnumVariantQuery","InternFunctionLookupQuery","InternFunctionQuery","InternFunctionSigLookupQuery","InternFunctionSigQuery","InternImplLookupQuery","InternImplQuery","InternIngotLookupQuery","InternIngotQuery","InternModuleConstLookupQuery","InternModuleConstQuery","InternModuleLookupQuery","InternModuleQuery","InternStructFieldLookupQuery","InternStructFieldQuery","InternStructLookupQuery","InternStructQuery","InternTraitLookupQuery","InternTraitQuery","InternTypeAliasLookupQuery","InternTypeAliasQuery","InternTypeLookupQuery","InternTypeQuery","ModuleAllImplsQuery","ModuleAllItemsQuery","ModuleConstantTypeQuery","ModuleConstantValueQuery","ModuleConstantsQuery","ModuleContractsQuery","ModuleFilePathQuery","ModuleImplMapQuery","ModuleIsIncompleteQuery","ModuleItemMapQuery","ModuleParentModuleQuery","ModuleParseQuery","ModuleStructsQuery","ModuleSubmodulesQuery","ModuleTestsQuery","ModuleUsedItemMapQuery","RootIngotQuery","StructAllFieldsQuery","StructAllFunctionsQuery","StructDependencyGraphQuery","StructFieldMapQuery","StructFieldTypeQuery","StructFunctionMapQuery","TestDb","TraitAllFunctionsQuery","TraitFunctionMapQuery","TraitIsImplementedForQuery","TypeAliasTypeQuery","all_impls","","","borrow","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","contract_all_fields","","","contract_all_functions","","","contract_call_function","","","contract_dependency_graph","","","contract_field_map","","","contract_field_type","","","contract_function_map","","","contract_init_function","","","contract_public_function_map","","","contract_runtime_dependency_graph","","","default","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","enum_all_functions","","","enum_all_variants","","","enum_dependency_graph","","","enum_function_map","","","enum_variant_kind","","","enum_variant_map","","","execute","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","file_content","file_line_starts","file_name","fmt","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fmt_index","","for_each_query","","from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","function_body","","","function_dependency_graph","","","function_signature","","","function_sigs","","","group_storage","","impl_all_functions","","","impl_for","","","impl_function_map","","","in_db","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","in_db_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","ingot_external_ingots","","","ingot_files","","","ingot_modules","","","ingot_root_module","","","intern_attribute","","","intern_contract","","","intern_contract_field","","","intern_enum","","","intern_enum_variant","","","intern_file","intern_function","","","intern_function_sig","","","intern_impl","","","intern_ingot","","","intern_module","","","intern_module_const","","","intern_struct","","","intern_struct_field","","","intern_trait","","","intern_type","","","intern_type_alias","","","into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","lookup_intern_attribute","","","lookup_intern_contract","","","lookup_intern_contract_field","","","lookup_intern_enum","","","lookup_intern_enum_variant","","","lookup_intern_file","lookup_intern_function","","","lookup_intern_function_sig","","","lookup_intern_impl","","","lookup_intern_ingot","","","lookup_intern_module","","","lookup_intern_module_const","","","lookup_intern_struct","","","lookup_intern_struct_field","","","lookup_intern_trait","","","lookup_intern_type","","","lookup_intern_type_alias","","","maybe_changed_since","","module_all_impls","","","module_all_items","","","module_constant_type","","","module_constant_value","","","module_constants","","","module_contracts","","","module_file_path","","","module_impl_map","","","module_is_incomplete","","","module_item_map","","","module_parent_module","","","module_parse","","","module_structs","","","module_submodules","","","module_tests","","","module_used_item_map","","","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","recover","","","","","","","","root_ingot","","","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","","set_ingot_external_ingots_with_durability","","set_ingot_files","","set_ingot_files_with_durability","","set_root_ingot","","set_root_ingot_with_durability","","struct_all_fields","","","struct_all_functions","","","struct_dependency_graph","","","struct_field_map","","","struct_field_type","","","struct_function_map","","","trait_all_functions","","","trait_function_map","","","trait_is_implemented_for","","","try_from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","type_alias_type","","","type_id","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","upcast","upcast_mut","DisplayWithDb","Displayable","DisplayableWrapper","borrow","borrow_mut","child","display","fmt","format","from","into","new","to_string","try_from","try_into","type_id","AlreadyDefined","BinaryOperationError","ConstEvalError","FatalError","Incompatible","IncompleteItem","IndexingError","NotEqualAndUnsigned","NotSubscriptable","RequiresToMem","RightIsSigned","RightTooLarge","SelfContractType","TypeCoercionError","TypeError","TypesNotCompatible","TypesNotNumeric","WrongIndexType","borrow","","","","","","","","borrow_mut","","","","","","","","clone","","clone_into","","clone_to_uninit","","duplicate_name_error","eq","","","","","equivalent","","","","","","","","","","","","","","","","","","","","error","fancy_error","fmt","","","","","","","","from","","","","","","","","","","","","","","","","","","hash","","into","","","","","","","","name_conflict_error","new","","","","","not_yet_implemented","self_contract_type_error","to_mem_error","to_owned","","try_from","","","","","","","","try_into","","","","","","","","type_error","type_id","","","","","","","","items","scopes","types","Alias","Attribute","","AttributeId","BuiltinFunction","Constant","Contract","","ContractField","ContractFieldId","ContractId","DepGraph","DepGraphWrapper","DepLocality","DiagnosticSink","Dir","Enum","","EnumId","EnumVariant","EnumVariantId","EnumVariantKind","External","File","Function","","FunctionId","FunctionSig","FunctionSigId","GenericType","Impl","","ImplId","Ingot","","IngotId","IngotMode","Intrinsic","Item","Lib","Local","Main","Module","","ModuleConstant","ModuleConstantId","ModuleId","ModuleSource","Primitive","StandaloneModule","Struct","","StructField","StructFieldId","StructId","Trait","","TraitId","Tuple","Type","TypeAlias","TypeAliasId","TypeDef","Unit","all_constants","all_contracts","all_functions","","","","","","all_impls","all_items","all_modules","as_intern_id","","","","","","","","","","","","","","","as_trait_or_type","as_type","","","ast","","","","","","","","","","","","","","","attributes","","body","borrow","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","builtin_items","call_function","can_stand_in_for","clone","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_to_uninit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","cmp","","","","","","","","","","","","","","","","","compare","","","","","","","","","","","","","","","","","constant_value","data","","","","","","","","","","","","","","","default","","","","","dependency_graph","","","","","diagnostics","","disc","display_name","eq","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","external_ingots","field","field_len","field_type","fields","","file_path_relative_to_src_dir","fmt","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","format","from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","from_build_files","from_files","from_intern_id","","","","","","","","","","","","","","","function","","","","","","function_sig","functions","","","","","generic_param","generic_params","global_items","has_private_field","hash","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","impls","ingot","","init_function","internal_items","into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","is_builtin","is_constructor","","is_contract","is_contract_func","","is_generic","","is_impl_fn","is_implemented_for","is_in_scope","is_in_std","","is_incomplete","is_indexed","is_module_fn","is_public","","","","","","","","","","","is_receiver_type","is_std_trait","is_struct","is_test","is_trait_fn","is_unit","is_unsafe","item_kind_display_name","items","","","","kind","mode","module","","","","","","","","","","","","","","","","","","","name","","","","","","","","","","","","","","","","","","","","name_span","","","","","","","","","","name_with_parent","new","","new_standalone","node_id","non_used_internal_items","parent","","","","","","","","","","","","","","","","","","parent_module","partial_cmp","","","","","","","","","","","","","","","","","path","pub_span","public_functions","push","push_all","receiver","","resolve_constant","resolve_name","","resolve_path","resolve_path_internal","resolve_path_non_used_internal","resolve_path_segments","root_module","runtime_dependency_graph","self_item","self_span","","self_type","","sig","","signature","","sink_diagnostics","","","","","","","","","","","","","","","","sink_external_ingot_diagnostics","source","span","","","","","","","","","","","src_dir","std_lib","submodules","tag","takes_self","","tests","to_owned","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","trait_id","","try_from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","typ","","","","type_id","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","unsafe_span","","used_items","value","variant","variants","walk_local_dependencies","BlockScope","BlockScopeType","Function","FunctionScope","IfElse","ItemScope","Loop","Match","MatchArm","Unsafe","add_call","","","add_constant","","","add_diagnostic","","","add_expression","","","add_var","body","borrow","","","","borrow_mut","","","","check_visibility","clone","clone_into","clone_to_uninit","constant_defs","constant_value_by_name","","","db","","","","diagnostics","","eq","equivalent","","","","expr_typ","","","fmt","from","","","","function","function_return_type","get_call","","","get_context_type","","","inherits_type","","","into","","","","is_in_function","","","map_pattern_matrix","map_variable_type","module","","","new","","","new_child","parent","","","","parent_function","","","resolve_any_path","","","resolve_name","","","resolve_path","","","resolve_visible_path","","","root","to_owned","try_from","","","","try_into","","","","typ","type_id","","","","update_expression","","","variable_defs","Address","AnyType","Array","","","Base","","Bool","Contract","CtxDecl","Enum","FeString","FunctionParam","FunctionSignature","Generic","","GenericArg","GenericParam","GenericParamKind","GenericType","GenericTypeIter","I128","I16","I256","I32","I64","I8","Int","","Integer","IntegerIter","Map","","","Mut","Numeric","PrimitiveType","SPtr","SafeNames","SelfContract","SelfDecl","SelfType","String","","Struct","TraitId","TraitOrType","Tuple","","Type","","TypeDowncast","TypeId","","U128","U16","U256","","U32","U64","U8","Unit","address","","address_max","apply","as_array","","as_int","","as_intern_id","as_map","","as_ref","","as_string","","as_struct","as_trait_or_type","as_tuple","","base","bits","bool","","borrow","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","bounds","can_hold","clone","","","","","","","","","","","","","","","","","","","clone_into","","","","","","","","","","","","","","","","","","","clone_to_uninit","","","","","","","","","","","","","","","","","","","cmp","","","","","","compare","","","","","","ctx_decl","def_span","default","deref","deref_typ","eq","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fits","fmt","","","","","","","","","","","","","","","","","","","","","format","","","from","","","","","","","","","","","","","","","","","","","","","from_intern_id","from_str","","","function_sig","function_sigs","get_impl_for","has_fixed_size","","hash","","","","","","","","","","","","","","","","","i256_max","i256_min","id","inner","int","","into","","","","","","","","","","","","","","","","","","","","into_iter","","is_bool","is_contract","is_emittable","is_encodable","is_generic","is_integer","is_map","is_mut","","is_primitive","is_self_ty","is_signed","is_sptr","is_string","is_struct","is_unit","items","iter","","key","kind","kind_display_name","label","len","","lower_snake","make_sptr","max_size","max_value","min_value","mut_","","name","","","","","","","new","next","","next_back","","nth","","params","","partial_cmp","","","","","","return_type","self_decl","self_function","size","","size_hint","","span","","to_owned","","","","","","","","","","","","","","","","","","","to_string","","","","trait_function_candidates","try_from","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","tuple","typ","","type_id","","","","","","","","","","","","","","","","","","","","u256","","u256_max","u256_min","u8","unit","","value","Bool","Constructor","ConstructorKind","Enum","Literal","LiteralConstructor","Or","PatternMatrix","PatternRowVec","SigmaSet","SimplifiedPattern","SimplifiedPatternKind","Struct","Tuple","WildCard","arity","borrow","","","","","","","borrow_mut","","","","","","","clone","","","","","","","clone_into","","","","","","","clone_to_uninit","","","","","","","collect_column_ctors","collect_ctors","complete_sigma","ctor_with_wild_card_fields","d_specialize","","difference","eq","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","field_types","find_non_exhaustiveness","fmt","","","","","","","format","from","","","","","","","from_arms","from_rows","hash","","head","inner","into","","","","","","","into_iter","into_rows","is_complete","is_empty","","is_row_useful","is_wildcard","iter","kind","len","","ncols","new","","","nrows","pats","phi_specialize","","rows","sigma_set","swap","swap_col","to_owned","","","","","","","try_from","","","","","","","try_into","","","","","","","ty","","type_id","","","","","","","wildcard","fields","kind"],"q":[[0,"fe_analyzer"],[12,"fe_analyzer::builtins"],[227,"fe_analyzer::constants"],[231,"fe_analyzer::context"],[532,"fe_analyzer::context::CallType"],[545,"fe_analyzer::context::NamedThing"],[552,"fe_analyzer::db"],[2063,"fe_analyzer::display"],[2079,"fe_analyzer::errors"],[2219,"fe_analyzer::namespace"],[2222,"fe_analyzer::namespace::items"],[3319,"fe_analyzer::namespace::scopes"],[3443,"fe_analyzer::namespace::types"],[3989,"fe_analyzer::pattern_analysis"],[4166,"fe_analyzer::pattern_analysis::SimplifiedPatternKind"],[4168,"fe_common::diagnostics"],[4169,"alloc::vec"],[4170,"core::result"],[4171,"core::cmp"],[4172,"core::fmt"],[4173,"core::hash"],[4174,"core::option"],[4175,"core::any"],[4176,"fe_parser::ast"],[4177,"fe_parser::node"],[4178,"smol_str"],[4179,"indexmap::map"],[4180,"core::clone"],[4181,"fe_common::span"],[4182,"alloc::rc"],[4183,"core::cell"],[4184,"alloc::string"],[4185,"fe_common::files"],[4186,"codespan_reporting::diagnostic"],[4187,"core::convert"],[4188,"std::collections::hash::map"],[4189,"core::ops::function"],[4190,"alloc::sync"],[4191,"salsa"],[4192,"salsa::runtime"],[4193,"salsa::revision"],[4194,"salsa::durability"],[4195,"fe_common::db"],[4196,"salsa::intern_id"],[4197,"fe_common::utils::files"],[4198,"core::iter::traits::iterator"],[4199,"fe_analyzer::traversal::pattern_analysis"],[4200,"alloc::collections::btree::map"],[4201,"num_bigint::bigint"],[4202,"fe_analyzer::traversal"]],"i":"````````````Ah`Ab0````Al2`Af0000000000000000000000000000000000000000000000000000000000000000000000000002031203B`231Bb51342051342051342051342032325342555533334444222253425134205342532513420103210101010322105134205513344220513420513420````Dd````Cn1000``Ej`1Ef`2`3120`1`2031`2220ChD`101010DfDjE`Eb624Dl4Eh9:;328461509:;132841509:;32841509:;32841509:;576766126732841509:;33332222888844441111555500009999::::;;;;7761732841509::;5328461509:;;::7676232476328461509:;03876:801376878257576763776767687673231332841509:;:328461509:;328461509:;557328461509:;7621HlI`1Ib1IdIhIj22130J`Jb01100```````````````````````````````````````````````````````````````````````````````````````````bAEnJfBAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnBAfJfK`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf120120120120120120120120120K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf120120120120120OfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEn00K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElJfAEn10BAf2K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf12012012022120120120K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElK`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElbAEnJf2102102102102102102102101210210210210210210210210210210210BAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf1201201201202120120120120120120120120120120120021201201201201201201201201201201201201201201201200222K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAAfAAhABjABlACbACnADh7bAEnJf11212121212121210210210210210210210210210BAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnBAfJfK`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1JfBAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEn00```AJh00AJj1AJl2222222````AKb``AK`AJn2112``110JnHbFnEnAKd56743210567424242`4256744442222555566667777``432105674444333332222105674243210567`43210```424321056743210567`43210567```ALb`Gl`00`1```````AL``2````ALd1`2```2`2``2``2`AKn10`3````40`4````3`AFd4```0A`00HnAI`AF`JdIn55f06AHlAIj7JjIlG`9AIdAGd:AFb:99=<;>:AHjAIhAGfAGhAHbAH`AHnAIbAGbAGjAGlAHdAIfGlAIdG`2AKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALd`Hn5GlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGf=AGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlfA`AHlALbAIjHnJjIlG`AI`AIdAGdAF`AFbJdInGlfA`AHlALbAIjHnJjIlG`AI`AIdAGdAF`AFbJdIn=?>=;:987654321064310Gl;874fA`5AFd3AKnAHf4AL`AHh5AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGl000AKn000AHf000f000AL`000AHh000A`000AHj000AHl000ALb000AIh000AIj000AGf000Hn000AGh000Jj000AHb000Il000AH`000G`000AHn000AI`000AIb000AId000AGb000AGd000AGj000AF`000AGl000AFb000AFd000AHd000Jd000AIf000In000Jl000ALd000fAI`8Hn01A`GlAKnAHf6AL`AHh5AHjAHlALbAIhAIjAGf70AKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInA`0AHhHn2GlAKnAHffAL`67AHjAHlALbAIhAIjAGf;AGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlIlG`2101015A`060AId34AHlALbAIjHn76AI`5AF`=?=:89AFd9;;f96AFbAHf>96=<5AGd5JdInAHjAIhAGfAHbAHnAGbAGjAHdAIfGl?A`AHlALbAIjHnJjIlG`AI`AIdAGdAF`AFbJdInAHfAHhAGfGlAHlALbAIjHnIlG`AI`>;=A`AH`181918765432AGdAF`AFbJdInAGhAHbAIbAGl:Glf=213AHlALbAIjHnJjIlG`AI`AIdAF`AFbJdIn>AHh=;:765AGd5432AHffA`AGl=<1GlAKn54AL`84AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALd45GlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdAHlALbJjAIdGlAKnAHffAL`AHhA`AHj;::AIhAIj0AGfHnAGh>AHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdIlG`A`AHl==```Gd`0`0000AMhAMjAMl2102102100121032103`3330210210121333332103210311210210210210321011210210021002102102102102100321032103021032100CbB@``FfANf`131`1````1`````ANn000003ANh```323543`3`3323AKj``4`1``0222`22264Dh`4ANj101101450111011461B@b7329AOf6ANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANh>FfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANh:=FfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhFfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhFfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhDhCb?<:510?<:59Ff2220AKj32ANnANlAO`IfAOdAObAFlAOhAOjAOlANfB@`ANh>>>>====Dh000Cb000>>>>====<<<<;;;;::::99998888777766665555444433332222>FfAKj322ANn0ANlAO`If0AOdAOb0AFlAOhAOjAOlANfB@`ANh>Dh7B@bFf0AKj3CbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhDhCb?5111Ff20AKj32ANnANlAO`IfAOdAObAFlAOhAOjAOlANfB@`ANh``>;>DhB@bFfAKj3CbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANh>2Dh0000000700>000Ff;?5=B@b27AOf6B@d4=ANn0<;45Cb:4If<<4:4:4:;?7120AOb?=AKjDh?>==``>>DhAO`B@lB@j`B@f0`1`````0010AN`B@h324B@nBA`3254610325461032546103254610051530132546103333222255554444666611110000433254610232546103146003254610131103212103320303033033254610325461032546104232546102BAd0","f":"``{{{d{b}}f}{{n{h{l{j}}}}}}{{{d{b}}A`}{{n{h{l{j}}}}}}```````````````````````````````````````````````````````````````````````````````````````````````{{{d{Ab}}}Ad}{{{d{Af}}}Ad}{{{d{Ah}}}{{d{Aj}}}}{{{d{Al}}}{{d{Aj}}}}{{{d{Ab}}}{{d{Aj}}}}{{{d{Af}}}{{d{Aj}}}}{d{{d{c}}}{}}00000{{{d{An}}}{{d{Anc}}}{}}00000{{{d{Ah}}}Ah}{{{d{B`}}}B`}{{{d{Al}}}Al}{{{d{Ab}}}Ab}{{{d{Af}}}Af}{{{d{Bb}}}Bb}{{d{d{Anc}}}h{}}00000{{dBd}h}00000{{{d{Al}}{d{Al}}}Bf}{{{d{Af}}{d{Af}}}Bf}{{d{d{c}}}Bf{}}0{{{d{Ah}}{d{Ah}}}Bh}{{{d{Al}}{d{Al}}}Bh}{{{d{Ab}}{d{Ab}}}Bh}{{{d{Af}}{d{Af}}}Bh}{{d{d{c}}}Bh{}}000000000000000{{{d{Ah}}{d{AnBj}}}Bl}{{{d{Al}}{d{AnBj}}}Bl}{{{d{Ab}}{d{AnBj}}}Bl}{{{d{Af}}{d{AnBj}}}Bl}{cc{}}00000{{{d{Aj}}}{{n{Ahc}}}{}}{{{d{Aj}}}{{n{Alc}}}{}}{{{d{Aj}}}{{n{Abc}}}{}}{{{d{Aj}}}{{n{Afc}}}{}}{{{d{Ah}}{d{Anc}}}hBn}{{{d{Al}}{d{Anc}}}hBn}{{{d{Af}}{d{Anc}}}hBn}{{}c{}}00000{{}c{}}0{{}B`}{{}Bb}{{{d{B`}}}Ad}{{{d{Bb}}}Ad}{{{d{AnB`}}}{{C`{c}}}{}}{{{d{AnBb}}}{{C`{c}}}{}}10{{{d{AnB`}}Ad}{{C`{c}}}{}}{{{d{AnBb}}Ad}{{C`{c}}}{}}{{{d{Al}}{d{Al}}}{{C`{Bf}}}}{{{d{Af}}{d{Af}}}{{C`{Bf}}}}{{{d{Af}}}Cb}{{{d{B`}}}{{Cd{Ad{C`{Ad}}}}}}{{{d{Bb}}}{{Cd{Ad{C`{Ad}}}}}}{dc{}}00000{c{{n{e}}}{}{}}{{{d{Aj}}}{{n{Ahc}}}{}}11{{{d{Aj}}}{{n{Alc}}}{}}{{{d{Aj}}}{{n{Abc}}}{}}3{{{d{Aj}}}{{n{Afc}}}{}}44{{}{{n{c}}}{}}00000{dCf}00000{{}d}00{{}Ad}```````````````````````````````````{{{d{Ch}}{d{{Cl{Cj}}}}Cn}h}{{{d{D`}}{d{{Cl{Cj}}}}Cn}h}{{{d{Ch}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{D`}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{Ch}}j}h}{{{d{D`}}j}h}{{{d{Ch}}{d{{Cl{Cj}}}}Df}h}{{{d{D`}}{d{{Cl{Cj}}}}Df}h}{{{d{Df}}}Dh}{{}Dj}{d{{d{c}}}{}}0000000000{{{d{An}}}{{d{Anc}}}{}}0000000000{DlDn}{{{d{E`}}}E`}{{{d{{Eb{c}}}}}{{Eb{c}}}Ed}{{{d{Ef}}}Ef}{{{d{Dj}}}Dj}{{{d{Dl}}}Dl}{{{d{Df}}}Df}{{{d{Eh}}}Eh}{{{d{Ej}}}Ej}{{{d{Cn}}}Cn}{{{d{Dd}}}Dd}{{d{d{Anc}}}h{}}000000000{{dBd}h}000000000{DfC`}{{{d{Ch}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{D`}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{Ch}}}{{d{b}}}}{{{d{D`}}}{{d{b}}}}{{}D`}{{}Dl}{EbF`}{D`Fb}{{{d{Ch}}{d{Aj}}{d{Aj}}ElEl}Dj}{{{d{E`}}{d{E`}}}Bh}{{{d{{Eb{c}}}}{d{{Eb{c}}}}}BhFd}{{{d{Ef}}{d{Ef}}}Bh}{{{d{Dj}}{d{Dj}}}Bh}{{{d{Dl}}{d{Dl}}}Bh}{{{d{Df}}{d{Df}}}Bh}{{{d{Eh}}{d{Eh}}}Bh}{{{d{Ej}}{d{Ej}}}Bh}{{{d{Cn}}{d{Cn}}}Bh}{{{d{Dd}}{d{Dd}}}Bh}{{d{d{c}}}Bh{}}000000000000000000000000000000000000000{{{d{Ch}}{d{Aj}}El{d{Aj}}}Dj}{{{d{Ch}}{d{{Cl{Cj}}}}}Ff}{{{d{D`}}{d{{Cl{Cj}}}}}Ff}{DlDn}{{{d{Ch}}{d{Aj}}{l{E`}}{l{Fh}}}Dj}{{{d{E`}}{d{AnBj}}}{{n{hFj}}}}{{{d{{Eb{c}}}}{d{AnBj}}}BlFl}{{{d{Ef}}{d{AnBj}}}Bl}{{{d{Dj}}{d{AnBj}}}Bl}{{{d{Dl}}{d{AnBj}}}Bl}{{{d{Df}}{d{AnBj}}}Bl}{{{d{Eh}}{d{AnBj}}}Bl}{{{d{Ej}}{d{AnBj}}}Bl}{{{d{Cn}}{d{AnBj}}}Bl}{{{d{Cn}}{d{AnBj}}}{{n{hFj}}}}{{{d{Dd}}{d{AnBj}}}Bl}{{{d{Df}}{d{b}}{d{AnBj}}}{{n{hFj}}}}{cc{}}0000000000{{{d{AnCh}}{d{Aj}}{d{Ff}}El}{{n{DdFn}}}}{{{d{Cn}}}{{C`{G`}}}}{{{d{Cn}}{d{b}}}Db}{{{d{Ch}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{D`}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{Ch}}}{{C`{Dh}}}}{{{d{D`}}}{{C`{Dh}}}}{{{d{{Eb{c}}}}}Bh{}}{{{d{E`}}{d{Anc}}}hBn}{{{d{{Eb{c}}}}{d{Ane}}}hGbBn}{{{d{Dj}}{d{Anc}}}hBn}{{{d{Ch}}Gd}Bh}{{{d{D`}}Gd}Bh}{{}c{}}0000000000{EhDh}{E`{{Gh{Gf}}}}{{{d{Ef}}}Bh}{{{d{Ch}}}Bh}{{{d{D`}}}Bh}{{{d{Cn}}{d{b}}}Bh}{{{d{Ef}}}{{d{Aj}}}}{EhEj}{DlDn}{E`Fh}{{{d{Ch}}}A`}{{{d{D`}}}A`}{{{d{Ef}}{d{b}}}Db}{{{d{Ch}}{d{Aj}}{d{Aj}}{d{Ef}}{C`{El}}El}Dj}{{{d{Ef}}{d{b}}}{{C`{El}}}}{{c{F`{{Gj{j}}}}}{{Eb{c}}}{}}{DhDf}{{{d{Ch}}{d{Aj}}El}Dj}{{{d{Df}}}Dh}{{{d{Ch}}}Gl}{{{d{D`}}}Gl}{{{d{Ch}}}G`}{{{d{D`}}}G`}{{Elc}E`{{Gn{Fh}}}}{{{d{Ch}}j}Dj}{{{d{Ch}}{d{H`}}}{{C`{Ef}}}}{{{d{D`}}{d{H`}}}{{C`{Ef}}}}{{{d{Ch}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{D`}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{Ch}}{d{H`}}El}{{n{EfHb}}}}{{{d{D`}}{d{H`}}El}{{n{EfHb}}}}{{{d{Ef}}{d{b}}{d{Db}}}{{C`{Ef}}}}65<8{{{d{{Eb{c}}}}{d{Ane}}}h{}Hd}{E`El}{DlHf}{E`Hh}{dc{}}000000000{dFh}{c{{n{e}}}{}{}}0000000000{{}{{n{c}}}{}}0000000000{DfDh}{Dfl}{{{d{Ch}}{d{Aj}}ElDhDh}Dj}{dCf}0000000000{{{d{Ch}}{d{{Cl{Cj}}}}{d{Hj}}}h}{{{d{D`}}{d{{Cl{Cj}}}}{d{Hj}}}h}{Eb}{DlDn}{HlHn}{I`Hn}{HlAb}{IbG`}{I`G`}{IdIf}{IhAh}{IjG`}{IdIl}{IdIn}{IhDh}{IbDh}{IjDh}{J`C`}{JbBh}{JbDb}22{JbEl}{Jbn}```````````````````````````````````````````````````````````````````````````````````````````{{{d{b}}Dh}{{F`{{Gj{Jd}}}}}}{{dDh}{{F`{{Gj{Jd}}}}}}{JfJh}{d{{d{c}}}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{An}}}{{d{Anc}}}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}Hn}{{F`{{Gj{Jj}}}}}}{{dHn}{{F`{{Gj{Jj}}}}}}4{{{d{b}}Hn}{{F`{{Gj{G`}}}}}}{{dHn}{{F`{{Gj{G`}}}}}}6{{{d{b}}Hn}{{Eb{{C`{G`}}}}}}{{dHn}{{Eb{{C`{G`}}}}}}8{{{d{b}}Hn}Jl}{{dHn}Jl}:{{{d{b}}Hn}{{Eb{{F`{{Dn{DbJj}}}}}}}}{{dHn}{{Eb{{F`{{Dn{DbJj}}}}}}}}<{{{d{b}}Jj}{{Eb{{n{DhJn}}}}}}{{dJj}{{Eb{{n{DhJn}}}}}}>{{{d{b}}Hn}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dHn}{{Eb{{F`{{Dn{DbG`}}}}}}}}{JfJh}:90{{{d{b}}Hn}{{F`{{Dn{DbG`}}}}}}{{dHn}{{F`{{Dn{DbG`}}}}}}2:92{{}K`}{{}Kb}{{}Kd}{{}Kf}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{}Md}{{}Mf}{{}Mh}{{}Mj}{{}Ml}{{}Mn}{{}N`}{{}Nb}{{}Nd}{{}Nf}{{}Nh}{{}Nj}{{}Nl}{{}Nn}{{}O`}{{}Ob}{{}Od}{{}Of}{{}Oh}{{}Oj}{{}Ol}{{}On}{{}A@`}{{}A@b}{{}A@d}{{}A@f}{{}A@h}{{}A@j}{{}A@l}{{}A@n}{{}AA`}{{}AAb}{{}AAd}{{}AAf}{{}AAh}{{}AAj}{{}AAl}{{}AAn}{{}AB`}{{}ABb}{{}ABd}{{}ABf}{{}ABh}{{}ABj}{{}ABl}{{}ABn}{{}AC`}{{}ACb}{{}ACd}{{}ACf}{{}ACh}{{}ACj}{{}ACl}{{}ACn}{{}AD`}{{}ADb}{{}ADd}{{}ADf}{{}ADh}{{}ADj}{{}ADl}{{}ADn}{{}AE`}{{}AEb}{{}AEd}{{}AEf}{{}AEh}{{}AEj}{{}AEl}{{}AEn}{{{d{b}}AF`}{{F`{{Gj{G`}}}}}}{{dAF`}{{F`{{Gj{G`}}}}}}{JfJh}{{{d{b}}AF`}{{F`{{Gj{AFb}}}}}}{{dAF`}{{F`{{Gj{AFb}}}}}}2{{{d{b}}AF`}{{Eb{Jl}}}}{{dAF`}{{Eb{Jl}}}}4{{{d{b}}AF`}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dAF`}{{Eb{{F`{{Dn{DbG`}}}}}}}}6{{{d{b}}AFb}{{Eb{{n{AFdJn}}}}}}{{dAFb}{{Eb{{n{AFdJn}}}}}}8{{{d{b}}AF`}{{Eb{{F`{{Dn{DbAFb}}}}}}}}{{dAF`}{{Eb{{F`{{Dn{DbAFb}}}}}}}}:{{{d{c}}e}g{}{}{}}000000000000000000000000000000000000000000000000000{{dGf}{{F`{Aj}}}}{{dGf}{{F`{{Gj{Ad}}}}}}{{dGf}Db}{{{d{K`}}{d{AnBj}}}Bl}{{{d{Kb}}{d{AnBj}}}Bl}{{{d{Kd}}{d{AnBj}}}Bl}{{{d{Kf}}{d{AnBj}}}Bl}{{{d{Kh}}{d{AnBj}}}Bl}{{{d{Kj}}{d{AnBj}}}Bl}{{{d{Kl}}{d{AnBj}}}Bl}{{{d{Kn}}{d{AnBj}}}Bl}{{{d{L`}}{d{AnBj}}}Bl}{{{d{Lb}}{d{AnBj}}}Bl}{{{d{Ld}}{d{AnBj}}}Bl}{{{d{Lf}}{d{AnBj}}}Bl}{{{d{Lh}}{d{AnBj}}}Bl}{{{d{Lj}}{d{AnBj}}}Bl}{{{d{Ll}}{d{AnBj}}}Bl}{{{d{Ln}}{d{AnBj}}}Bl}{{{d{M`}}{d{AnBj}}}Bl}{{{d{Mb}}{d{AnBj}}}Bl}{{{d{Md}}{d{AnBj}}}Bl}{{{d{Mf}}{d{AnBj}}}Bl}{{{d{Mh}}{d{AnBj}}}Bl}{{{d{Mj}}{d{AnBj}}}Bl}{{{d{Ml}}{d{AnBj}}}Bl}{{{d{Mn}}{d{AnBj}}}Bl}{{{d{N`}}{d{AnBj}}}Bl}{{{d{Nb}}{d{AnBj}}}Bl}{{{d{Nd}}{d{AnBj}}}Bl}{{{d{Nf}}{d{AnBj}}}Bl}{{{d{Nh}}{d{AnBj}}}Bl}{{{d{Nj}}{d{AnBj}}}Bl}{{{d{Nl}}{d{AnBj}}}Bl}{{{d{Nn}}{d{AnBj}}}Bl}{{{d{O`}}{d{AnBj}}}Bl}{{{d{Ob}}{d{AnBj}}}Bl}{{{d{Od}}{d{AnBj}}}Bl}{{{d{Of}}{d{AnBj}}}Bl}{{{d{Oh}}{d{AnBj}}}Bl}{{{d{Oj}}{d{AnBj}}}Bl}{{{d{Ol}}{d{AnBj}}}Bl}{{{d{On}}{d{AnBj}}}Bl}{{{d{A@`}}{d{AnBj}}}Bl}{{{d{A@b}}{d{AnBj}}}Bl}{{{d{A@d}}{d{AnBj}}}Bl}{{{d{A@f}}{d{AnBj}}}Bl}{{{d{A@h}}{d{AnBj}}}Bl}{{{d{A@j}}{d{AnBj}}}Bl}{{{d{A@l}}{d{AnBj}}}Bl}{{{d{A@n}}{d{AnBj}}}Bl}{{{d{AA`}}{d{AnBj}}}Bl}{{{d{AAb}}{d{AnBj}}}Bl}{{{d{AAd}}{d{AnBj}}}Bl}{{{d{AAf}}{d{AnBj}}}Bl}{{{d{AAh}}{d{AnBj}}}Bl}{{{d{AAj}}{d{AnBj}}}Bl}{{{d{AAl}}{d{AnBj}}}Bl}{{{d{AAn}}{d{AnBj}}}Bl}{{{d{AB`}}{d{AnBj}}}Bl}{{{d{ABb}}{d{AnBj}}}Bl}{{{d{ABd}}{d{AnBj}}}Bl}{{{d{ABf}}{d{AnBj}}}Bl}{{{d{ABh}}{d{AnBj}}}Bl}{{{d{ABj}}{d{AnBj}}}Bl}{{{d{ABl}}{d{AnBj}}}Bl}{{{d{ABn}}{d{AnBj}}}Bl}{{{d{AC`}}{d{AnBj}}}Bl}{{{d{ACb}}{d{AnBj}}}Bl}{{{d{ACd}}{d{AnBj}}}Bl}{{{d{ACf}}{d{AnBj}}}Bl}{{{d{ACh}}{d{AnBj}}}Bl}{{{d{ACj}}{d{AnBj}}}Bl}{{{d{ACl}}{d{AnBj}}}Bl}{{{d{ACn}}{d{AnBj}}}Bl}{{{d{AD`}}{d{AnBj}}}Bl}{{{d{ADb}}{d{AnBj}}}Bl}{{{d{ADd}}{d{AnBj}}}Bl}{{{d{ADf}}{d{AnBj}}}Bl}{{{d{ADh}}{d{AnBj}}}Bl}{{{d{ADj}}{d{AnBj}}}Bl}{{{d{ADl}}{d{AnBj}}}Bl}{{{d{ADn}}{d{AnBj}}}Bl}{{{d{AE`}}{d{AnBj}}}Bl}{{{d{AEb}}{d{AnBj}}}Bl}{{{d{AEd}}{d{AnBj}}}Bl}{{{d{AEf}}{d{AnBj}}}Bl}{{{d{AEh}}{d{AnBj}}}Bl}{{{d{AEj}}{d{AnBj}}}Bl}{{{d{AEl}}{d{AnBj}}}Bl}{{{d{Jf}}{d{b}}AFf{d{AnBj}}}Bl}{{{d{AEn}}AFf{d{AnBj}}}Bl}{{{d{Jf}}{d{AFh}}{d{AnAFj}}}h}{{{d{AEn}}{d{AnAFj}}}h}{cc{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}G`}{{Eb{{F`{Dl}}}}}}{{dG`}{{Eb{{F`{Dl}}}}}}{JfJh}{{{d{b}}G`}Jl}{{dG`}Jl}2{{{d{b}}Il}{{Eb{{F`{AFl}}}}}}{{dIl}{{Eb{{F`{AFl}}}}}}4{{{d{b}}DhDb}{{F`{{Gj{Il}}}}}}{{dDhDb}{{F`{{Gj{Il}}}}}}6{{{d{AEn}}}d}0{{{d{b}}Jd}{{F`{{Gj{G`}}}}}}{{dJd}{{F`{{Gj{G`}}}}}}9{{{d{b}}DhIn}{{C`{Jd}}}}{{dDhIn}{{C`{Jd}}}};{{{d{b}}Jd}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dJd}{{Eb{{F`{{Dn{DbG`}}}}}}}}={{K`{d{b}}}{{AFn{K`}}}}{{Kb{d{b}}}{{AFn{Kb}}}}{{Kd{d{b}}}{{AFn{Kd}}}}{{Kf{d{b}}}{{AFn{Kf}}}}{{Kh{d{b}}}{{AFn{Kh}}}}{{Kj{d{b}}}{{AFn{Kj}}}}{{Kl{d{b}}}{{AFn{Kl}}}}{{Kn{d{b}}}{{AFn{Kn}}}}{{L`{d{b}}}{{AFn{L`}}}}{{Lb{d{b}}}{{AFn{Lb}}}}{{Ld{d{b}}}{{AFn{Ld}}}}{{Lf{d{b}}}{{AFn{Lf}}}}{{Lh{d{b}}}{{AFn{Lh}}}}{{Lj{d{b}}}{{AFn{Lj}}}}{{Ll{d{b}}}{{AFn{Ll}}}}{{Ln{d{b}}}{{AFn{Ln}}}}{{M`{d{b}}}{{AFn{M`}}}}{{Mb{d{b}}}{{AFn{Mb}}}}{{Md{d{b}}}{{AFn{Md}}}}{{Mf{d{b}}}{{AFn{Mf}}}}{{Mh{d{b}}}{{AFn{Mh}}}}{{Mj{d{b}}}{{AFn{Mj}}}}{{Ml{d{b}}}{{AFn{Ml}}}}{{Mn{d{b}}}{{AFn{Mn}}}}{{N`{d{b}}}{{AFn{N`}}}}{{Nb{d{b}}}{{AFn{Nb}}}}{{Nd{d{b}}}{{AFn{Nd}}}}{{Nf{d{b}}}{{AFn{Nf}}}}{{Nh{d{b}}}{{AFn{Nh}}}}{{Nj{d{b}}}{{AFn{Nj}}}}{{Nl{d{b}}}{{AFn{Nl}}}}{{Nn{d{b}}}{{AFn{Nn}}}}{{O`{d{b}}}{{AFn{O`}}}}{{Ob{d{b}}}{{AFn{Ob}}}}{{Od{d{b}}}{{AFn{Od}}}}{{Of{d{b}}}{{AFn{Of}}}}{{Oh{d{b}}}{{AFn{Oh}}}}{{Oj{d{b}}}{{AFn{Oj}}}}{{Ol{d{b}}}{{AFn{Ol}}}}{{On{d{b}}}{{AFn{On}}}}{{A@`{d{b}}}{{AFn{A@`}}}}{{A@b{d{b}}}{{AFn{A@b}}}}{{A@d{d{b}}}{{AFn{A@d}}}}{{A@f{d{b}}}{{AFn{A@f}}}}{{A@h{d{b}}}{{AFn{A@h}}}}{{A@j{d{b}}}{{AFn{A@j}}}}{{A@l{d{b}}}{{AFn{A@l}}}}{{A@n{d{b}}}{{AFn{A@n}}}}{{AA`{d{b}}}{{AFn{AA`}}}}{{AAb{d{b}}}{{AFn{AAb}}}}{{AAd{d{b}}}{{AFn{AAd}}}}{{AAf{d{b}}}{{AFn{AAf}}}}{{AAh{d{b}}}{{AFn{AAh}}}}{{AAj{d{b}}}{{AFn{AAj}}}}{{AAl{d{b}}}{{AFn{AAl}}}}{{AAn{d{b}}}{{AFn{AAn}}}}{{AB`{d{b}}}{{AFn{AB`}}}}{{ABb{d{b}}}{{AFn{ABb}}}}{{ABd{d{b}}}{{AFn{ABd}}}}{{ABf{d{b}}}{{AFn{ABf}}}}{{ABh{d{b}}}{{AFn{ABh}}}}{{ABj{d{b}}}{{AFn{ABj}}}}{{ABl{d{b}}}{{AFn{ABl}}}}{{ABn{d{b}}}{{AFn{ABn}}}}{{AC`{d{b}}}{{AFn{AC`}}}}{{ACb{d{b}}}{{AFn{ACb}}}}{{ACd{d{b}}}{{AFn{ACd}}}}{{ACf{d{b}}}{{AFn{ACf}}}}{{ACh{d{b}}}{{AFn{ACh}}}}{{ACj{d{b}}}{{AFn{ACj}}}}{{ACl{d{b}}}{{AFn{ACl}}}}{{ACn{d{b}}}{{AFn{ACn}}}}{{AD`{d{b}}}{{AFn{AD`}}}}{{ADb{d{b}}}{{AFn{ADb}}}}{{ADd{d{b}}}{{AFn{ADd}}}}{{ADf{d{b}}}{{AFn{ADf}}}}{{ADh{d{b}}}{{AFn{ADh}}}}{{ADj{d{b}}}{{AFn{ADj}}}}{{ADl{d{b}}}{{AFn{ADl}}}}{{ADn{d{b}}}{{AFn{ADn}}}}{{AE`{d{b}}}{{AFn{AE`}}}}{{AEb{d{b}}}{{AFn{AEb}}}}{{AEd{d{b}}}{{AFn{AEd}}}}{{AEf{d{b}}}{{AFn{AEf}}}}{{AEh{d{b}}}{{AFn{AEh}}}}{{AEj{d{b}}}{{AFn{AEj}}}}{{AEl{d{b}}}{{AFn{AEl}}}}{{K`{d{Anb}}}{{AG`{K`}}}}{{Kb{d{Anb}}}{{AG`{Kb}}}}{{Kd{d{Anb}}}{{AG`{Kd}}}}{{Kf{d{Anb}}}{{AG`{Kf}}}}{{Kh{d{Anb}}}{{AG`{Kh}}}}{{Kj{d{Anb}}}{{AG`{Kj}}}}{{Kl{d{Anb}}}{{AG`{Kl}}}}{{Kn{d{Anb}}}{{AG`{Kn}}}}{{L`{d{Anb}}}{{AG`{L`}}}}{{Lb{d{Anb}}}{{AG`{Lb}}}}{{Ld{d{Anb}}}{{AG`{Ld}}}}{{Lf{d{Anb}}}{{AG`{Lf}}}}{{Lh{d{Anb}}}{{AG`{Lh}}}}{{Lj{d{Anb}}}{{AG`{Lj}}}}{{Ll{d{Anb}}}{{AG`{Ll}}}}{{Ln{d{Anb}}}{{AG`{Ln}}}}{{M`{d{Anb}}}{{AG`{M`}}}}{{Mb{d{Anb}}}{{AG`{Mb}}}}{{Md{d{Anb}}}{{AG`{Md}}}}{{Mf{d{Anb}}}{{AG`{Mf}}}}{{Mh{d{Anb}}}{{AG`{Mh}}}}{{Mj{d{Anb}}}{{AG`{Mj}}}}{{Ml{d{Anb}}}{{AG`{Ml}}}}{{Mn{d{Anb}}}{{AG`{Mn}}}}{{N`{d{Anb}}}{{AG`{N`}}}}{{Nb{d{Anb}}}{{AG`{Nb}}}}{{Nd{d{Anb}}}{{AG`{Nd}}}}{{Nf{d{Anb}}}{{AG`{Nf}}}}{{Nh{d{Anb}}}{{AG`{Nh}}}}{{Nj{d{Anb}}}{{AG`{Nj}}}}{{Nl{d{Anb}}}{{AG`{Nl}}}}{{Nn{d{Anb}}}{{AG`{Nn}}}}{{O`{d{Anb}}}{{AG`{O`}}}}{{Ob{d{Anb}}}{{AG`{Ob}}}}{{Od{d{Anb}}}{{AG`{Od}}}}{{Of{d{Anb}}}{{AG`{Of}}}}{{Oh{d{Anb}}}{{AG`{Oh}}}}{{Oj{d{Anb}}}{{AG`{Oj}}}}{{Ol{d{Anb}}}{{AG`{Ol}}}}{{On{d{Anb}}}{{AG`{On}}}}{{A@`{d{Anb}}}{{AG`{A@`}}}}{{A@b{d{Anb}}}{{AG`{A@b}}}}{{A@d{d{Anb}}}{{AG`{A@d}}}}{{A@f{d{Anb}}}{{AG`{A@f}}}}{{A@h{d{Anb}}}{{AG`{A@h}}}}{{A@j{d{Anb}}}{{AG`{A@j}}}}{{A@l{d{Anb}}}{{AG`{A@l}}}}{{A@n{d{Anb}}}{{AG`{A@n}}}}{{AA`{d{Anb}}}{{AG`{AA`}}}}{{AAb{d{Anb}}}{{AG`{AAb}}}}{{AAd{d{Anb}}}{{AG`{AAd}}}}{{AAf{d{Anb}}}{{AG`{AAf}}}}{{AAh{d{Anb}}}{{AG`{AAh}}}}{{AAj{d{Anb}}}{{AG`{AAj}}}}{{AAl{d{Anb}}}{{AG`{AAl}}}}{{AAn{d{Anb}}}{{AG`{AAn}}}}{{AB`{d{Anb}}}{{AG`{AB`}}}}{{ABb{d{Anb}}}{{AG`{ABb}}}}{{ABd{d{Anb}}}{{AG`{ABd}}}}{{ABf{d{Anb}}}{{AG`{ABf}}}}{{ABh{d{Anb}}}{{AG`{ABh}}}}{{ABj{d{Anb}}}{{AG`{ABj}}}}{{ABl{d{Anb}}}{{AG`{ABl}}}}{{ABn{d{Anb}}}{{AG`{ABn}}}}{{AC`{d{Anb}}}{{AG`{AC`}}}}{{ACb{d{Anb}}}{{AG`{ACb}}}}{{ACd{d{Anb}}}{{AG`{ACd}}}}{{ACf{d{Anb}}}{{AG`{ACf}}}}{{ACh{d{Anb}}}{{AG`{ACh}}}}{{ACj{d{Anb}}}{{AG`{ACj}}}}{{ACl{d{Anb}}}{{AG`{ACl}}}}{{ACn{d{Anb}}}{{AG`{ACn}}}}{{AD`{d{Anb}}}{{AG`{AD`}}}}{{ADb{d{Anb}}}{{AG`{ADb}}}}{{ADd{d{Anb}}}{{AG`{ADd}}}}{{ADf{d{Anb}}}{{AG`{ADf}}}}{{ADh{d{Anb}}}{{AG`{ADh}}}}{{ADj{d{Anb}}}{{AG`{ADj}}}}{{ADl{d{Anb}}}{{AG`{ADl}}}}{{ADn{d{Anb}}}{{AG`{ADn}}}}{{AE`{d{Anb}}}{{AG`{AE`}}}}{{AEb{d{Anb}}}{{AG`{AEb}}}}{{AEd{d{Anb}}}{{AG`{AEd}}}}{{AEf{d{Anb}}}{{AG`{AEf}}}}{{AEh{d{Anb}}}{{AG`{AEh}}}}{{AEj{d{Anb}}}{{AG`{AEj}}}}{{AEl{d{Anb}}}{{AG`{AEl}}}}{{{d{b}}f}{{F`{{Dn{Dbf}}}}}}{{df}{{F`{{Dn{Dbf}}}}}}{JfJh}{{{d{b}}f}{{F`{{Gj{Gf}}}}}}{{df}{{F`{{Gj{Gf}}}}}}2{{{d{b}}f}{{F`{{Gj{A`}}}}}}{{df}{{F`{{Gj{A`}}}}}}4{{{d{b}}f}{{C`{A`}}}}{{df}{{C`{A`}}}}6{{{d{b}}{F`{AGb}}}AGd}{{d{F`{AGb}}}AGd}8{{{d{b}}{F`{AGf}}}Hn}{{d{F`{AGf}}}Hn}:{{{d{b}}{F`{AGh}}}Jj}{{d{F`{AGh}}}Jj}<{{{d{b}}{F`{AGj}}}AF`}{{d{F`{AGj}}}AF`}>{{{d{b}}{F`{AGl}}}AFb}{{d{F`{AGl}}}AFb}{JfJh}{{dAGn}Gf}{{{d{b}}{F`{AH`}}}G`}{{d{F`{AH`}}}G`}3{{{d{b}}{F`{AHb}}}Il}{{d{F`{AHb}}}Il}5{{{d{b}}{F`{AHd}}}Jd}{{d{F`{AHd}}}Jd}7{{{d{b}}{F`{AHf}}}f}{{d{F`{AHf}}}f}9{{{d{b}}{F`{AHh}}}A`}{{d{F`{AHh}}}A`};{{{d{b}}{F`{AHj}}}AHl}{{d{F`{AHj}}}AHl}={{{d{b}}{F`{AHn}}}AI`}{{d{F`{AHn}}}AI`}?{{{d{b}}{F`{AIb}}}AId}{{d{F`{AIb}}}AId}{JfJh}{{{d{b}}{F`{AIf}}}In}{{d{F`{AIf}}}In}2{{{d{b}}Ff}Dh}{{dFf}Dh}4{{{d{b}}{F`{AIh}}}AIj}{{d{F`{AIh}}}AIj}6{{}c{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}AGd}{{F`{AGb}}}}{{dAGd}{{F`{AGb}}}}9{{{d{b}}Hn}{{F`{AGf}}}}{{dHn}{{F`{AGf}}}};{{{d{b}}Jj}{{F`{AGh}}}}{{dJj}{{F`{AGh}}}}={{{d{b}}AF`}{{F`{AGj}}}}{{dAF`}{{F`{AGj}}}}?{{{d{b}}AFb}{{F`{AGl}}}}{{dAFb}{{F`{AGl}}}}{JfJh}{{dGf}AGn}{{{d{b}}G`}{{F`{AH`}}}}{{dG`}{{F`{AH`}}}}3{{{d{b}}Il}{{F`{AHb}}}}{{dIl}{{F`{AHb}}}}5{{{d{b}}Jd}{{F`{AHd}}}}{{dJd}{{F`{AHd}}}}7{{{d{b}}f}{{F`{AHf}}}}{{df}{{F`{AHf}}}}9{{{d{b}}A`}{{F`{AHh}}}}{{dA`}{{F`{AHh}}}};{{{d{b}}AHl}{{F`{AHj}}}}{{dAHl}{{F`{AHj}}}}={{{d{b}}AI`}{{F`{AHn}}}}{{dAI`}{{F`{AHn}}}}?{{{d{b}}AId}{{F`{AIb}}}}{{dAId}{{F`{AIb}}}}{JfJh}{{{d{b}}In}{{F`{AIf}}}}{{dIn}{{F`{AIf}}}}2{{{d{b}}Dh}Ff}{{dDh}Ff}4{{{d{b}}AIj}{{F`{AIh}}}}{{dAIj}{{F`{AIh}}}}6{{{d{Jf}}{d{b}}AFfAIl}Bh}{{{d{AEn}}AFfAIl}Bh}{{{d{b}}A`}{{Eb{{F`{{Gj{Jd}}}}}}}}{{dA`}{{Eb{{F`{{Gj{Jd}}}}}}}}:{{{d{b}}A`}{{F`{{Gj{Gl}}}}}}{{dA`}{{F`{{Gj{Gl}}}}}}<{{{d{b}}AHl}{{Eb{{n{DhJn}}}}}}{{dAHl}{{Eb{{n{DhJn}}}}}}>{{{d{b}}AHl}{{Eb{{n{DdFn}}}}}}{{dAHl}{{Eb{{n{DdFn}}}}}}{JfJh}{{{d{b}}A`}{{F`{{l{AHl}}}}}}{{dA`}{{F`{{l{AHl}}}}}}2{{{d{b}}A`}{{F`{{Gj{Hn}}}}}}{{dA`}{{F`{{Gj{Hn}}}}}}4{{{d{b}}A`}Db}{{dA`}Db}6{{{d{b}}A`}{{Eb{{F`{{Dn{{Cd{InDh}}Jd}}}}}}}}{{dA`}{{Eb{{F`{{Dn{{Cd{InDh}}Jd}}}}}}}}8{{{d{b}}A`}Bh}{{dA`}Bh}:{{{d{b}}A`}{{Eb{{F`{{Dn{DbGl}}}}}}}}{{dA`}{{Eb{{F`{{Dn{DbGl}}}}}}}}<{{{d{b}}A`}{{C`{A`}}}}{{dA`}{{C`{A`}}}}>{{{d{b}}A`}{{Eb{{F`{AIn}}}}}}{{dA`}{{Eb{{F`{AIn}}}}}}{JfJh}{{{d{b}}A`}{{F`{{Gj{AI`}}}}}}{{dA`}{{F`{{Gj{AI`}}}}}}2{{{d{b}}A`}{{F`{{Gj{A`}}}}}}{{dA`}{{F`{{Gj{A`}}}}}}4{{{d{b}}A`}{{l{G`}}}}{{dA`}{{l{G`}}}}6{{{d{b}}A`}{{Eb{{F`{{Dn{Db{Cd{ElGl}}}}}}}}}}{{dA`}{{Eb{{F`{{Dn{Db{Cd{ElGl}}}}}}}}}}8{AJ`Jf}{{{d{AEn}}}{{d{AJb}}}}{{{d{AEn}}}{{d{AFh}}}}{{{d{AnAEn}}}{{d{AnAFh}}}}{{{d{c}}}{{d{{Jh{e}}}}}{}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{c}}{d{{Gj{AFf}}}}{d{e}}}{{C`{g}}}{}{}{}}0000000{{{d{b}}}f}{df}{JfJh}{{{d{An}}Gf{F`{Aj}}}h}{{{d{An}}Gf{F`{Aj}}AJd}h}{{{d{Anb}}f{F`{{Dn{Dbf}}}}}h}{{{d{An}}f{F`{{Dn{Dbf}}}}}h}{{{d{Anb}}f{F`{{Dn{Dbf}}}}AJd}h}{{{d{An}}f{F`{{Dn{Dbf}}}}AJd}h}{{{d{Anb}}f{F`{{Gj{Gf}}}}}h}{{{d{An}}f{F`{{Gj{Gf}}}}}h}{{{d{Anb}}f{F`{{Gj{Gf}}}}AJd}h}{{{d{An}}f{F`{{Gj{Gf}}}}AJd}h}{{{d{Anb}}f}h}{{{d{An}}f}h}{{{d{Anb}}fAJd}h}{{{d{An}}fAJd}h}{{{d{b}}AI`}{{F`{{Gj{AId}}}}}}{{dAI`}{{F`{{Gj{AId}}}}}}{JfJh}{{{d{b}}AI`}{{F`{{Gj{G`}}}}}}{{dAI`}{{F`{{Gj{G`}}}}}}2{{{d{b}}AI`}{{Eb{Jl}}}}{{dAI`}{{Eb{Jl}}}}4{{{d{b}}AI`}{{Eb{{F`{{Dn{DbAId}}}}}}}}{{dAI`}{{Eb{{F`{{Dn{DbAId}}}}}}}}6{{{d{b}}AId}{{Eb{{n{DhJn}}}}}}{{dAId}{{Eb{{n{DhJn}}}}}}8{{{d{b}}AI`}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dAI`}{{Eb{{F`{{Dn{DbG`}}}}}}}}:{{{d{b}}In}{{F`{{Gj{Il}}}}}}{{dIn}{{F`{{Gj{Il}}}}}}<{{{d{b}}In}{{Eb{{F`{{Dn{DbIl}}}}}}}}{{dIn}{{Eb{{F`{{Dn{DbIl}}}}}}}}>{{{d{b}}InDh}Bh}{{dInDh}Bh}{JfJh}{c{{n{e}}}{}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{}{{n{c}}}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}AIj}{{Eb{{n{DhJn}}}}}}{{dAIj}{{Eb{{n{DhJn}}}}}}4{dCf}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{AEn}}}{{d{AJf}}}}{{{d{AnAEn}}}{{d{AnAJf}}}}```{d{{d{c}}}{}}{{{d{An}}}{{d{Anc}}}{}}{{{d{{AJh{c}}}}c}{{AJh{c}}}{}}{{{d{AJj}}{d{b}}}{{AJh{{d{AJj}}}}}}{{{d{{AJh{c}}}}{d{AnBj}}}BlAJl}{{{d{AJl}}{d{b}}{d{AnBj}}}Bl}{cc{}}{{}c{}}{{{d{b}}c}{{AJh{c}}}{}}{dFh}{c{{n{e}}}{}{}}{{}{{n{c}}}{}}>``````````````````;;;;;;;;::::::::{{{d{Jn}}}Jn}{{{d{Fn}}}Fn}{{d{d{Anc}}}h{}}0{{dBd}h}0{{{d{Aj}}{d{Aj}}ElEl}j}{{{d{Jn}}{d{Jn}}}Bh}{{{d{Fn}}{d{Fn}}}Bh}{{{d{AJn}}{d{AJn}}}Bh}{{{d{AK`}}{d{AK`}}}Bh}{{{d{AKb}}{d{AKb}}}Bh}{{d{d{c}}}Bh{}}0000000000000000000{{cEle}j{{Gn{Fh}}}{{Gn{Fh}}}}{{c{l{E`}}{l{Fh}}}j{{Gn{Fh}}}}{{{d{Jn}}{d{AnBj}}}Bl}{{{d{Hb}}{d{AnBj}}}Bl}{{{d{Fn}}{d{AnBj}}}Bl}{{{d{En}}{d{AnBj}}}Bl}{{{d{AKd}}{d{AnBj}}}Bl}{{{d{AJn}}{d{AnBj}}}Bl}{{{d{AK`}}{d{AnBj}}}Bl}{{{d{AKb}}{d{AnBj}}}Bl}{EnJn}{cc{}}{FnJn}{HbJn}{FnHb}3{AKdHb}{EnHb}{JnHb}{JnFn}{HbFn}{EnFn}999999{{{d{Jn}}{d{Anc}}}hBn}{{{d{Fn}}{d{Anc}}}hBn}{{}c{}}0000000{{{d{Aj}}{d{Aj}}{d{Ef}}{C`{El}}El}j}{DjJn}{DjHb}{DjFn}{{}En}{DjAKd}{{cEl}jAKf}{{El{d{AKf}}}j}{Elj}{dc{}}0{c{{n{e}}}{}{}}0000000{{}{{n{c}}}{}}0000000{{cEleg}j{{Gn{Fh}}}AKfAKf}{dCf}0000000```````````````````````````````````````````````````````````````````{{{d{A`}}{d{b}}}{{F`{{l{AHl}}}}}}{{{d{A`}}{d{b}}}{{l{Hn}}}}{{{d{A`}}{d{b}}}{{l{G`}}}}{{{d{Hn}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{AI`}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{AF`}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{Jd}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{In}}{d{b}}}{{F`{{Gj{Il}}}}}}{{{d{A`}}{d{b}}}{{F`{{Gj{Jd}}}}}}{{{d{A`}}{d{b}}}{{F`{{Gj{Gl}}}}}}{{{d{f}}{d{b}}}{{F`{{Gj{A`}}}}}}{{{d{f}}}AKh}{{{d{A`}}}AKh}{{{d{AHl}}}AKh}{{{d{AIj}}}AKh}{{{d{Hn}}}AKh}{{{d{Jj}}}AKh}{{{d{Il}}}AKh}{{{d{G`}}}AKh}{{{d{AI`}}}AKh}{{{d{AId}}}AKh}{{{d{AGd}}}AKh}{{{d{AF`}}}AKh}{{{d{AFb}}}AKh}{{{d{Jd}}}AKh}{{{d{In}}}AKh}{{{d{In}}}AKj}{{{d{Hn}}{d{b}}}Dh}{{{d{AI`}}{d{b}}}Dh}{{AF`{d{b}}}Dh}{{{d{A`}}{d{b}}}{{F`{AIn}}}}{{{d{Jd}}{d{b}}}{{Cl{AKl}}}}{AHjCl}{AIhCl}{AGfCl}{AGhCl}{AHbCl}{AH`Cl}{AHnCl}{AIbCl}{AGbCl}{AGjCl}{AGlCl}{AHdCl}{AIfCl}{{{d{Gl}}{d{b}}}{{l{AGd}}}}{{{d{AId}}{d{b}}}{{l{Db}}}}{{{d{G`}}{d{b}}}{{F`{Dl}}}}{d{{d{c}}}{}}000000000000000000000000000000000000{{{d{An}}}{{d{Anc}}}{}}000000000000000000000000000000000000{{}{{Dn{DbGl}}}}{{{d{Hn}}{d{b}}}{{C`{G`}}}}{{{d{Jd}}{d{b}}DhDh}Bh}{{{d{Gl}}}Gl}{{{d{AKn}}}AKn}{{{d{AHf}}}AHf}{{{d{f}}}f}{{{d{AL`}}}AL`}{{{d{AHh}}}AHh}{{{d{A`}}}A`}{{{d{AHj}}}AHj}{{{d{AHl}}}AHl}{{{d{ALb}}}ALb}{{{d{AIh}}}AIh}{{{d{AIj}}}AIj}{{{d{AGf}}}AGf}{{{d{Hn}}}Hn}{{{d{AGh}}}AGh}{{{d{Jj}}}Jj}{{{d{AHb}}}AHb}{{{d{Il}}}Il}{{{d{AH`}}}AH`}{{{d{G`}}}G`}{{{d{AHn}}}AHn}{{{d{AI`}}}AI`}{{{d{AIb}}}AIb}{{{d{AId}}}AId}{{{d{AGb}}}AGb}{{{d{AGd}}}AGd}{{{d{AGj}}}AGj}{{{d{AF`}}}AF`}{{{d{AGl}}}AGl}{{{d{AFb}}}AFb}{{{d{AFd}}}AFd}{{{d{AHd}}}AHd}{{{d{Jd}}}Jd}{{{d{AIf}}}AIf}{{{d{In}}}In}{{{d{Jl}}}Jl}{{{d{ALd}}}ALd}{{d{d{Anc}}}h{}}000000000000000000000000000000000000{{dBd}h}000000000000000000000000000000000000{{{d{Gl}}{d{Gl}}}Bf}{{{d{f}}{d{f}}}Bf}{{{d{A`}}{d{A`}}}Bf}{{{d{AHl}}{d{AHl}}}Bf}{{{d{ALb}}{d{ALb}}}Bf}{{{d{AIj}}{d{AIj}}}Bf}{{{d{Hn}}{d{Hn}}}Bf}{{{d{Jj}}{d{Jj}}}Bf}{{{d{Il}}{d{Il}}}Bf}{{{d{G`}}{d{G`}}}Bf}{{{d{AI`}}{d{AI`}}}Bf}{{{d{AId}}{d{AId}}}Bf}{{{d{AGd}}{d{AGd}}}Bf}{{{d{AF`}}{d{AF`}}}Bf}{{{d{AFb}}{d{AFb}}}Bf}{{{d{Jd}}{d{Jd}}}Bf}{{{d{In}}{d{In}}}Bf}{{d{d{c}}}Bf{}}0000000000000000{{{d{AHl}}{d{b}}}{{n{DdFn}}}}{{{d{f}}{d{b}}}{{F`{AHf}}}}{{{d{A`}}{d{b}}}{{F`{AHh}}}}{{{d{AHl}}{d{b}}}{{F`{AHj}}}}{{{d{AIj}}{d{b}}}{{F`{AIh}}}}{{{d{Hn}}{d{b}}}{{F`{AGf}}}}{{{d{Jj}}{d{b}}}{{F`{AGh}}}}{{{d{Il}}{d{b}}}{{F`{AHb}}}}{{{d{G`}}{d{b}}}{{F`{AH`}}}}{{{d{AI`}}{d{b}}}{{F`{AHn}}}}{{{d{AId}}{d{b}}}{{F`{AIb}}}}{{AGd{d{b}}}{{F`{AGb}}}}{{AF`{d{b}}}{{F`{AGj}}}}{{AFb{d{b}}}{{F`{AGl}}}}{{{d{Jd}}{d{b}}}{{F`{AHd}}}}{{{d{In}}{d{b}}}{{F`{AIf}}}}{{}AI`}{{}AGd}{{}AF`}{{}Jd}{{}In}{{{d{Gl}}{d{b}}}{{C`{{F`{ALf}}}}}}{{{d{Hn}}{d{b}}}{{F`{ALf}}}}{{{d{G`}}{d{b}}}{{F`{ALf}}}}{{{d{AI`}}{d{b}}}{{F`{ALf}}}}{{AF`{d{b}}}{{F`{ALf}}}}{{{d{f}}{d{b}}}{{l{j}}}}{{{d{A`}}{d{b}}}{{l{j}}}}{{AFb{d{b}}}Ad}{{{d{AFd}}}{{d{Aj}}}}{{{d{Gl}}{d{Gl}}}Bh}{{{d{AKn}}{d{AKn}}}Bh}{{{d{AHf}}{d{AHf}}}Bh}{{{d{f}}{d{f}}}Bh}{{{d{AL`}}{d{AL`}}}Bh}{{{d{AHh}}{d{AHh}}}Bh}{{{d{A`}}{d{A`}}}Bh}{{{d{AHj}}{d{AHj}}}Bh}{{{d{AHl}}{d{AHl}}}Bh}{{{d{ALb}}{d{ALb}}}Bh}{{{d{AIh}}{d{AIh}}}Bh}{{{d{AIj}}{d{AIj}}}Bh}{{{d{AGf}}{d{AGf}}}Bh}{{{d{Hn}}{d{Hn}}}Bh}{{{d{AGh}}{d{AGh}}}Bh}{{{d{Jj}}{d{Jj}}}Bh}{{{d{AHb}}{d{AHb}}}Bh}{{{d{Il}}{d{Il}}}Bh}{{{d{AH`}}{d{AH`}}}Bh}{{{d{G`}}{d{G`}}}Bh}{{{d{AHn}}{d{AHn}}}Bh}{{{d{AI`}}{d{AI`}}}Bh}{{{d{AIb}}{d{AIb}}}Bh}{{{d{AId}}{d{AId}}}Bh}{{{d{AGb}}{d{AGb}}}Bh}{{{d{AGd}}{d{AGd}}}Bh}{{{d{AGj}}{d{AGj}}}Bh}{{{d{AF`}}{d{AF`}}}Bh}{{{d{AGl}}{d{AGl}}}Bh}{{{d{AFb}}{d{AFb}}}Bh}{{{d{AFd}}{d{AFd}}}Bh}{{{d{AHd}}{d{AHd}}}Bh}{{{d{Jd}}{d{Jd}}}Bh}{{{d{AIf}}{d{AIf}}}Bh}{{{d{In}}{d{In}}}Bh}{{{d{Jl}}{d{Jl}}}Bh}{{{d{ALd}}{d{ALd}}}Bh}{{d{d{c}}}Bh{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{f}}{d{b}}}{{F`{{Dn{Dbf}}}}}}{{{d{AI`}}{d{b}}{d{Aj}}}{{C`{AId}}}}{{{d{AFd}}}Ad}{{{d{Hn}}{d{b}}{d{Aj}}}{{C`{{n{DhJn}}}}}}{{{d{Hn}}{d{b}}}{{F`{{Dn{DbJj}}}}}}{{{d{AI`}}{d{b}}}{{F`{{Dn{DbAId}}}}}}{{{d{A`}}{d{b}}}Db}{{{d{Gl}}{d{AnBj}}}Bl}{{{d{AKn}}{d{AnBj}}}Bl}{{{d{AHf}}{d{AnBj}}}Bl}{{{d{f}}{d{AnBj}}}Bl}{{{d{AL`}}{d{AnBj}}}Bl}{{{d{AHh}}{d{AnBj}}}Bl}{{{d{A`}}{d{AnBj}}}Bl}{{{d{AHj}}{d{AnBj}}}Bl}{{{d{AHl}}{d{AnBj}}}Bl}{{{d{ALb}}{d{AnBj}}}Bl}{{{d{AIh}}{d{AnBj}}}Bl}{{{d{AIj}}{d{AnBj}}}Bl}{{{d{AGf}}{d{AnBj}}}Bl}{{{d{Hn}}{d{AnBj}}}Bl}{{{d{AGh}}{d{AnBj}}}Bl}{{{d{Jj}}{d{AnBj}}}Bl}{{{d{AHb}}{d{AnBj}}}Bl}{{{d{Il}}{d{AnBj}}}Bl}{{{d{AH`}}{d{AnBj}}}Bl}{{{d{G`}}{d{AnBj}}}Bl}{{{d{AHn}}{d{AnBj}}}Bl}{{{d{AI`}}{d{AnBj}}}Bl}{{{d{AIb}}{d{AnBj}}}Bl}{{{d{AId}}{d{AnBj}}}Bl}{{{d{AGb}}{d{AnBj}}}Bl}{{{d{AGd}}{d{AnBj}}}Bl}{{{d{AGj}}{d{AnBj}}}Bl}{{{d{AF`}}{d{AnBj}}}Bl}{{{d{AGl}}{d{AnBj}}}Bl}{{{d{AFb}}{d{AnBj}}}Bl}{{{d{AFd}}{d{AnBj}}}Bl}{{{d{AHd}}{d{AnBj}}}Bl}{{{d{Jd}}{d{AnBj}}}Bl}{{{d{AIf}}{d{AnBj}}}Bl}{{{d{In}}{d{AnBj}}}Bl}{{{d{Jl}}{d{AnBj}}}Bl}{{{d{ALd}}{d{AnBj}}}Bl}{{{d{AFd}}{d{b}}{d{AnBj}}}Bl}{cc{}}000000000000000000000000000000000000{{{d{Anb}}{d{ALh}}}f}{{{d{Anb}}{d{Aj}}AKnALj{d{{Gj{{Cd{ce}}}}}}}f{{ALl{Aj}}}{{ALl{Aj}}}}{AKhf}{AKhA`}{AKhAHl}{AKhAIj}{AKhHn}{AKhJj}{AKhIl}{AKhG`}{AKhAI`}{AKhAId}{AKhAGd}{AKhAF`}{AKhAFb}{AKhJd}{AKhIn}{{{d{Hn}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{Il}}{d{b}}}{{C`{G`}}}}{{{d{AI`}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{AF`}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{Jd}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{In}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{Gl}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{Hn}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{AI`}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{AF`}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{Jd}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{In}}{d{b}}}{{F`{{Dn{DbIl}}}}}}{{{d{Il}}{d{b}}{d{Aj}}}{{C`{ALn}}}}{{{d{Il}}{d{b}}}{{l{ALn}}}}{{{d{A`}}{d{b}}}{{Dn{DbGl}}}}{{{d{AI`}}{d{b}}}Bh}{{{d{Gl}}{d{Anc}}}hBn}{{{d{AKn}}{d{Anc}}}hBn}{{{d{AHf}}{d{Anc}}}hBn}{{{d{f}}{d{Anc}}}hBn}{{{d{AL`}}{d{Anc}}}hBn}{{{d{AHh}}{d{Anc}}}hBn}{{{d{A`}}{d{Anc}}}hBn}{{{d{AHj}}{d{Anc}}}hBn}{{{d{AHl}}{d{Anc}}}hBn}{{{d{ALb}}{d{Anc}}}hBn}{{{d{AIh}}{d{Anc}}}hBn}{{{d{AIj}}{d{Anc}}}hBn}{{{d{AGf}}{d{Anc}}}hBn}{{{d{Hn}}{d{Anc}}}hBn}{{{d{AGh}}{d{Anc}}}hBn}{{{d{Jj}}{d{Anc}}}hBn}{{{d{AHb}}{d{Anc}}}hBn}{{{d{Il}}{d{Anc}}}hBn}{{{d{AH`}}{d{Anc}}}hBn}{{{d{G`}}{d{Anc}}}hBn}{{{d{AHn}}{d{Anc}}}hBn}{{{d{AI`}}{d{Anc}}}hBn}{{{d{AIb}}{d{Anc}}}hBn}{{{d{AId}}{d{Anc}}}hBn}{{{d{AGb}}{d{Anc}}}hBn}{{{d{AGd}}{d{Anc}}}hBn}{{{d{AGj}}{d{Anc}}}hBn}{{{d{AF`}}{d{Anc}}}hBn}{{{d{AGl}}{d{Anc}}}hBn}{{{d{AFb}}{d{Anc}}}hBn}{{{d{AFd}}{d{Anc}}}hBn}{{{d{AHd}}{d{Anc}}}hBn}{{{d{Jd}}{d{Anc}}}hBn}{{{d{AIf}}{d{Anc}}}hBn}{{{d{In}}{d{Anc}}}hBn}{{{d{A`}}{d{b}}}{{F`{{Dn{{Cd{InDh}}Jd}}}}}}{{{d{A`}}{d{b}}}f}{AHhf}{{{d{Hn}}{d{b}}}{{C`{G`}}}}{{{d{A`}}{d{b}}}{{Dn{DbGl}}}}{{}c{}}000000000000000000000000000000000000{{{d{Gl}}}Bh}{{{d{Il}}{d{b}}}Bh}{{{d{G`}}{d{b}}}Bh}2{{Il{d{b}}}Bh}{{G`{d{b}}}Bh}323{{{d{In}}{d{b}}Dh}Bh}{{{d{A`}}{d{b}}Gl}Bh}{{{d{A`}}{d{b}}}Bh}{{{d{In}}{d{b}}}Bh}1{{{d{AId}}{d{b}}}Bh}8{{{d{Gl}}{d{b}}}Bh}{{{d{AHl}}{d{b}}}Bh}{{{d{ALb}}{d{b}}}Bh}{{{d{AIj}}{d{b}}}Bh}{{{d{Hn}}{d{b}}}Bh}=<{{{d{AI`}}{d{b}}}Bh}6{{AF`{d{b}}}Bh}8{{{d{Jd}}Dh{d{b}}}Bh}{{{d{In}}{d{b}}{d{Aj}}}Bh}{{{d{Gl}}{d{AI`}}}Bh}{{{d{G`}}{d{b}}}Bh}{{{d{Il}}{d{b}}}Bh}{{{d{AFd}}}Bh}2{{{d{Gl}}}{{d{Aj}}}}{{{d{Gl}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{{d{f}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{{d{A`}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{{d{ALb}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{AFb{d{b}}}{{n{AFdJn}}}}{AHfAKn}{{{d{Gl}}{d{b}}}{{C`{A`}}}}{{{d{AHl}}{d{b}}}A`}{{{d{Hn}}{d{b}}}A`}{{{d{Il}}{d{b}}}A`}{{{d{G`}}{d{b}}}A`}{{{d{AI`}}{d{b}}}A`}{{AGd{d{b}}}A`}{{AF`{d{b}}}A`}{{{d{Jd}}{d{b}}}A`}{{{d{In}}{d{b}}}A`}{AHjA`}{AIhA`}{AGfA`}{AHbA`}{AHnA`}{AGbA`}{AGjA`}{AHdA`}{AIfA`}{{{d{Gl}}{d{b}}}Db}{{{d{f}}{d{b}}}Db}{{{d{A`}}{d{b}}}Db}{{{d{AHl}}{d{b}}}Db}{{{d{ALb}}{d{b}}}Db}{{{d{AIj}}{d{b}}}Db}{{{d{Hn}}{d{b}}}Db}{{{d{Jj}}{d{b}}}Db}{{{d{Il}}{d{b}}}Db}{{{d{G`}}{d{b}}}Db}{{{d{AI`}}{d{b}}}Db}{{{d{AId}}{d{b}}}Db}{{AGd{d{b}}}Db}{{AF`{d{b}}}Db}{{AFb{d{b}}}Db}{{{d{Jd}}{d{b}}}Db}{{{d{In}}{d{b}}}Db}{AHfDb}{AHhDb}{AGfDb}{{{d{Gl}}{d{b}}}{{C`{El}}}}{{{d{AHl}}{d{b}}}El}{{{d{ALb}}{d{b}}}{{C`{El}}}}{{{d{AIj}}{d{b}}}El}{{{d{Hn}}{d{b}}}El}{{{d{Il}}{d{b}}}El}{{{d{G`}}{d{b}}}El}{{{d{AI`}}{d{b}}}El}{{AF`{d{b}}}El}{{{d{In}}{d{b}}}El}?{{{d{b}}{d{Aj}}AL`f}A`}{{{d{b}}{d{{Cl{AM`}}}}{C`{Gl}}A`}AH`}{{{d{Anb}}{d{Aj}}{d{Aj}}}A`}{{{d{AHl}}{d{b}}}AMb}{{{d{A`}}{d{b}}}{{Dn{DbGl}}}}{{{d{Gl}}{d{b}}}{{C`{Gl}}}}{{{d{A`}}{d{b}}}Gl}{{{d{AHl}}{d{b}}}Gl}{{{d{ALb}}{d{b}}}{{C`{Gl}}}}{{{d{AIj}}{d{b}}}Gl}{{{d{Hn}}{d{b}}}Gl}{{{d{Il}}{d{b}}}Gl}{{{d{G`}}{d{b}}}Gl}{{{d{AI`}}{d{b}}}Gl}{{AGd{d{b}}}Gl}{{AF`{d{b}}}Gl}{{AFb{d{b}}}AF`}{{{d{Jd}}{d{b}}}Gl}{{{d{In}}{d{b}}}Gl}{AGhHn}{AHbC`}{AIbAI`}{AGlAF`}{{{d{A`}}{d{b}}}{{C`{A`}}}}{{{d{Gl}}{d{Gl}}}{{C`{Bf}}}}{{{d{f}}{d{f}}}{{C`{Bf}}}}{{{d{A`}}{d{A`}}}{{C`{Bf}}}}{{{d{AHl}}{d{AHl}}}{{C`{Bf}}}}{{{d{ALb}}{d{ALb}}}{{C`{Bf}}}}{{{d{AIj}}{d{AIj}}}{{C`{Bf}}}}{{{d{Hn}}{d{Hn}}}{{C`{Bf}}}}{{{d{Jj}}{d{Jj}}}{{C`{Bf}}}}{{{d{Il}}{d{Il}}}{{C`{Bf}}}}{{{d{G`}}{d{G`}}}{{C`{Bf}}}}{{{d{AI`}}{d{AI`}}}{{C`{Bf}}}}{{{d{AId}}{d{AId}}}{{C`{Bf}}}}{{{d{AGd}}{d{AGd}}}{{C`{Bf}}}}{{{d{AF`}}{d{AF`}}}{{C`{Bf}}}}{{{d{AFb}}{d{AFb}}}{{C`{Bf}}}}{{{d{Jd}}{d{Jd}}}{{C`{Bf}}}}{{{d{In}}{d{In}}}{{C`{Bf}}}}{{{d{Gl}}{d{b}}}{{F`{{Gj{Db}}}}}}{{{d{Il}}{d{b}}}{{C`{El}}}}{{{d{Hn}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{AnHd}}{d{j}}}h}{{{d{AnHd}}c}h{{AMf{}{{AMd{{d{j}}}}}}}}{{{d{Jd}}{d{b}}}Dh}{AHdDh}{{{d{A`}}{d{b}}{d{Aj}}}{{n{{C`{AHl}}En}}}}{{{d{A`}}{d{b}}{d{Aj}}}{{n{{C`{Ef}}En}}}}{{{d{Hn}}{d{b}}{d{Aj}}}{{n{{C`{Ef}}En}}}}{{{d{A`}}{d{b}}{d{H`}}}{{Eb{{C`{Ef}}}}}}00{{{d{Gl}}{d{b}}{d{{Gj{{Cl{Db}}}}}}}{{Eb{{C`{Ef}}}}}}{{{d{f}}{d{b}}}{{C`{A`}}}}{{{d{Hn}}{d{b}}}{{F`{ALf}}}}{{{d{Il}}{d{b}}}{{C`{Gl}}}}={{{d{G`}}{d{b}}}{{C`{El}}}}{{{d{Il}}{d{b}}}{{C`{Dh}}}}{{{d{G`}}{d{b}}}{{C`{Dh}}}}{{{d{G`}}{d{b}}}Il}{AH`Il}{{{d{Il}}{d{b}}}{{F`{AFl}}}}{{{d{G`}}{d{b}}}{{F`{AFl}}}}{{{d{Gl}}{d{b}}{d{Anc}}}hHd}{{{d{f}}{d{b}}{d{Anc}}}hHd}{{{d{A`}}{d{b}}{d{Anc}}}hHd}{{{d{AHl}}{d{b}}{d{Anc}}}hHd}{{{d{ALb}}{d{b}}{d{Anc}}}hHd}{{{d{AIj}}{d{b}}{d{Anc}}}hHd}{{{d{Hn}}{d{b}}{d{Anc}}}hHd}{{{d{Jj}}{d{b}}{d{Anc}}}hHd}{{{d{Il}}{d{b}}{d{Anc}}}hHd}{{{d{G`}}{d{b}}{d{Anc}}}hHd}{{{d{AI`}}{d{b}}{d{Anc}}}hHd}{{{d{AId}}{d{b}}{d{Anc}}}hHd}{{AF`{d{b}}{d{Anc}}}hHd}{{AFb{d{b}}{d{Anc}}}hHd}{{{d{Jd}}{d{b}}{d{Anc}}}hHd}{{{d{In}}{d{b}}{d{Anc}}}hHd}>{AHhAL`}{{{d{AHl}}{d{b}}}El}{{{d{AIj}}{d{b}}}El}{{{d{Hn}}{d{b}}}El}{{{d{G`}}{d{b}}}El}{{{d{AI`}}{d{b}}}El}{{{d{AId}}{d{b}}}El}{{AGd{d{b}}}El}{{AF`{d{b}}}El}{{AFb{d{b}}}El}{{{d{Jd}}{d{b}}}El}{{{d{In}}{d{b}}}El}{AHfDb}{{{d{Anb}}}f}{{{d{A`}}{d{b}}}{{F`{{Gj{A`}}}}}}{AGlAd}{{{d{Il}}{d{b}}}Bh}{{{d{G`}}{d{b}}}Bh}{{{d{A`}}{d{b}}}{{l{G`}}}}{dc{}}000000000000000000000000000000000000{{{d{Jd}}{d{b}}}In}{AHdIn}{c{{n{e}}}{}{}}000000000000000000000000000000000000{{}{{n{c}}}{}}000000000000000000000000000000000000{{{d{AHl}}{d{b}}}{{n{DhJn}}}}{{{d{ALb}}{d{b}}}{{n{FfJn}}}}{{{d{Jj}}{d{b}}}{{n{DhJn}}}}{{{d{AId}}{d{b}}}{{n{DhJn}}}}{dCf}00000000{{{d{ALb}}{d{b}}}{{n{DhJn}}}}111{{{d{AIj}}{d{b}}}{{n{DhJn}}}}2222222222222222222222222{{{d{Il}}{d{b}}}{{C`{El}}}}{{{d{G`}}{d{b}}}{{C`{El}}}}{{{d{A`}}{d{b}}}{{F`{{Dn{Db{Cd{ElGl}}}}}}}}{{{d{AHl}}{d{b}}}Cj}{{AF`{d{b}}{d{Aj}}}{{C`{AFb}}}}{{AF`{d{b}}}{{F`{{Dn{DbAFb}}}}}}{{{d{ALf}}Glc}h{{AFj{Gl}}}}``````````{{{d{AMh}}{d{{Cl{Cj}}}}Cn}h}{{{d{AMj}}{d{{Cl{Cj}}}}Cn}h}{{{d{AMl}}{d{{Cl{Cj}}}}Cn}h}{{{d{AMh}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{AMj}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{AMl}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{AMh}}j}h}{{{d{AMj}}j}h}{{{d{AMl}}j}h}{{{d{AMh}}{d{{Cl{Cj}}}}Df}h}{{{d{AMj}}{d{{Cl{Cj}}}}Df}h}{{{d{AMl}}{d{{Cl{Cj}}}}Df}h}{{{d{AnAMl}}{d{Aj}}DhBhEl}{{n{hAKd}}}}{AMjFb}{d{{d{c}}}{}}000{{{d{An}}}{{d{Anc}}}{}}000{{{d{Ch}}{d{Ef}}El}h}{{{d{Gd}}}Gd}{{d{d{Anc}}}h{}}{{dBd}h}{AMlFb}{{{d{AMh}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{AMj}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{AMl}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{AMh}}}{{d{b}}}}{{{d{AMj}}}{{d{b}}}}{{{d{AMl}}}{{d{b}}}}{AMjd}{AMhFb}?{{{d{Gd}}{d{Gd}}}Bh}{{d{d{c}}}Bh{}}000{{{d{AMh}}{d{{Cl{Cj}}}}}Ff}{{{d{AMj}}{d{{Cl{Cj}}}}}Ff}{{{d{AMl}}{d{{Cl{Cj}}}}}Ff}{{{d{Gd}}{d{AnBj}}}Bl}{cc{}}000{AMjG`}{{{d{AMj}}}{{n{DhJn}}}}{{{d{AMh}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{AMj}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{AMl}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{AMh}}}{{C`{Dh}}}}{{{d{AMj}}}{{C`{Dh}}}}{{{d{AMl}}}{{C`{Dh}}}}{{{d{AMh}}Gd}Bh}{{{d{AMj}}Gd}Bh}{{{d{AMl}}Gd}Bh}{{}c{}}000{{{d{AMh}}}Bh}{{{d{AMj}}}Bh}{{{d{AMl}}}Bh}{{{d{AMj}}{d{{Cl{AMn}}}}AN`}h}{{{d{AMj}}{d{{Cl{c}}}}Dh}h{}}{{{d{AMh}}}A`}{{{d{AMj}}}A`}{{{d{AMl}}}A`}{{{d{b}}A`}AMh}{{{d{b}}G`}AMj}{{{d{AMj}}Gd}AMl}{{{d{AMl}}Gd}AMl}{{{d{AMh}}}Gl}{{{d{AMj}}}Gl}{{{d{AMl}}}Gl}{AMlC`}{{{d{AMh}}}G`}{{{d{AMj}}}G`}{{{d{AMl}}}G`}{{{d{AMh}}{d{H`}}}{{C`{Ef}}}}{{{d{AMj}}{d{H`}}}{{C`{Ef}}}}{{{d{AMl}}{d{H`}}}{{C`{Ef}}}}{{{d{AMh}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{AMj}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{AMl}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{AMh}}{d{H`}}El}{{n{EfHb}}}}{{{d{AMj}}{d{H`}}El}{{n{EfHb}}}}{{{d{AMl}}{d{H`}}El}{{n{EfHb}}}}876{AMld}{dc{}}{c{{n{e}}}{}{}}000{{}{{n{c}}}{}}000{AMlGd}{dCf}000{{{d{AMh}}{d{{Cl{Cj}}}}{d{Hj}}}h}{{{d{AMj}}{d{{Cl{Cj}}}}{d{Hj}}}h}{{{d{AMl}}{d{{Cl{Cj}}}}{d{Hj}}}h}{AMlANb}`````````````````````````````````````````````````````````{{}Cb}````{{}Ff}{{{d{b}}}Dh}{{}ANd}{{{d{ANf}}{d{b}}{d{{Gj{ANh}}}}}{{C`{Dh}}}}{{{d{ANj}}{d{b}}}{{C`{ANl}}}}{{{d{Dh}}{d{b}}}{{C`{ANl}}}}{{{d{ANj}}{d{b}}}{{C`{ANn}}}}{{{d{Dh}}{d{b}}}{{C`{ANn}}}}{{{d{Dh}}}AKh}{{{d{ANj}}{d{b}}}{{C`{AO`}}}}{{{d{Dh}}{d{b}}}{{C`{AO`}}}}{{{d{ANn}}}{{d{Aj}}}}{{{d{ANf}}}{{d{Aj}}}}{{{d{ANj}}{d{b}}}{{C`{AOb}}}}{{{d{Dh}}{d{b}}}{{C`{AOb}}}}{{{d{Dh}}{d{b}}}{{C`{AI`}}}}{{{d{Dh}}}AKj}{{{d{ANj}}{d{b}}}{{C`{AOd}}}}{{{d{Dh}}{d{b}}}{{C`{AOd}}}}{{{d{b}}Cb}Dh}{{{d{ANn}}}Ad}{{}Ff}{{{d{b}}}Dh}{d{{d{c}}}{}}0000000000000000000{{{d{An}}}{{d{Anc}}}{}}0000000000000000000{IfF`}{{{d{ANn}}ANn}Bh}{{{d{Ff}}}Ff}{{{d{AKj}}}AKj}{{{d{Dh}}}Dh}{{{d{Cb}}}Cb}{{{d{AOf}}}AOf}{{{d{ANn}}}ANn}{{{d{ANl}}}ANl}{{{d{AO`}}}AO`}{{{d{If}}}If}{{{d{AOd}}}AOd}{{{d{AOb}}}AOb}{{{d{AFl}}}AFl}{{{d{AOh}}}AOh}{{{d{AOj}}}AOj}{{{d{AOl}}}AOl}{{{d{ANf}}}ANf}{{{d{AOn}}}AOn}{{{d{B@`}}}B@`}{{{d{ANh}}}ANh}{{d{d{Anc}}}h{}}000000000000000000{{dBd}h}000000000000000000{{{d{Dh}}{d{Dh}}}Bf}{{{d{Cb}}{d{Cb}}}Bf}{{{d{ANn}}{d{ANn}}}Bf}{{{d{If}}{d{If}}}Bf}{{{d{AOb}}{d{AOb}}}Bf}{{{d{ANf}}{d{ANf}}}Bf}{{d{d{c}}}Bf{}}00000{AFlC`}{{{d{Ff}}{d{Ch}}}{{C`{El}}}}{{}Dh}{{Dh{d{b}}}Dh}{{{d{Dh}}{d{b}}}Ff}{{{d{Ff}}{d{Ff}}}Bh}{{{d{AKj}}{d{AKj}}}Bh}{{{d{Dh}}{d{Dh}}}Bh}{{{d{Cb}}{d{Cb}}}Bh}{{{d{ANn}}{d{ANn}}}Bh}{{{d{ANl}}{d{ANl}}}Bh}{{{d{AO`}}{d{AO`}}}Bh}{{{d{If}}{d{If}}}Bh}{{{d{AOd}}{d{AOd}}}Bh}{{{d{AOb}}{d{AOb}}}Bh}{{{d{AFl}}{d{AFl}}}Bh}{{{d{AOh}}{d{AOh}}}Bh}{{{d{AOj}}{d{AOj}}}Bh}{{{d{AOl}}{d{AOl}}}Bh}{{{d{ANf}}{d{ANf}}}Bh}{{{d{B@`}}{d{B@`}}}Bh}{{{d{ANh}}{d{ANh}}}Bh}{{d{d{c}}}Bh{}}0000000000000000000000000000000000000000000000000000000000000000000{{{d{ANn}}ANd}Bh}{{{d{Ff}}{d{AnBj}}}Bl}{{{d{AKj}}{d{AnBj}}}Bl}{{{d{Dh}}{d{AnBj}}}Bl}{{{d{Cb}}{d{AnBj}}}Bl}0{{{d{ANn}}{d{AnBj}}}Bl}0{{{d{ANl}}{d{AnBj}}}Bl}{{{d{AO`}}{d{AnBj}}}Bl}{{{d{If}}{d{AnBj}}}Bl}0{{{d{AOd}}{d{AnBj}}}Bl}{{{d{AOb}}{d{AnBj}}}Bl}0{{{d{AFl}}{d{AnBj}}}Bl}{{{d{AOh}}{d{AnBj}}}Bl}{{{d{AOj}}{d{AnBj}}}Bl}{{{d{AOl}}{d{AnBj}}}Bl}{{{d{ANf}}{d{AnBj}}}Bl}{{{d{B@`}}{d{AnBj}}}Bl}{{{d{ANh}}{d{AnBj}}}Bl}{{{d{Ff}}{d{b}}{d{AnBj}}}Bl}{{{d{Dh}}{d{b}}{d{AnBj}}}Bl}{{{d{AFl}}{d{b}}{d{AnBj}}}Bl}{cc{}}{CbFf}1111111111111111111{AKhDh}{{{d{Aj}}}{{n{Cbc}}}{}}{{{d{Aj}}}{{n{ANnc}}}{}}{{{d{Aj}}}{{n{ANfc}}}{}}{{{d{Dh}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{Dh}}{d{b}}{d{Aj}}}{{F`{{Gj{Il}}}}}}{{{d{Dh}}{d{b}}In}{{C`{Jd}}}}{{{d{Ff}}{d{b}}}Bh}{{{d{Dh}}{d{b}}}Bh}{{{d{Ff}}{d{Anc}}}hBn}{{{d{AKj}}{d{Anc}}}hBn}{{{d{Dh}}{d{Anc}}}hBn}{{{d{Cb}}{d{Anc}}}hBn}{{{d{ANn}}{d{Anc}}}hBn}{{{d{ANl}}{d{Anc}}}hBn}{{{d{AO`}}{d{Anc}}}hBn}{{{d{If}}{d{Anc}}}hBn}{{{d{AOd}}{d{Anc}}}hBn}{{{d{AOb}}{d{Anc}}}hBn}{{{d{AFl}}{d{Anc}}}hBn}{{{d{AOh}}{d{Anc}}}hBn}{{{d{AOj}}{d{Anc}}}hBn}{{{d{AOl}}{d{Anc}}}hBn}{{{d{ANf}}{d{Anc}}}hBn}{{{d{B@`}}{d{Anc}}}hBn}{{{d{ANh}}{d{Anc}}}hBn}{{}ANd}0{{{d{Ff}}{d{b}}}Dh}{ANlDh}{ANnFf}{{{d{b}}ANn}Dh}{{}c{}}0000000000000000000{{}c{}}0{{{d{Dh}}{d{b}}}Bh}0{{Dh{d{b}}}Bh}{{Dh{d{b}}}{{n{BhJn}}}}2222{{{d{AOh}}}Bh}33{{{d{ANn}}}Bh}444{{{d{Ff}}}Bh}{AOdF`}{{}AOf}{{}AOn}{AO`Dh}{B@bB@`}{{{d{Dh}}{d{b}}}{{d{Aj}}}}{{{d{AOl}}}{{C`{{d{Aj}}}}}}{{{d{AOf}}}Ad}{{{d{AOn}}}Ad}{{{d{B@d}}}Fh}{{Dh{d{b}}}Dh}{AObAd}{{{d{ANn}}}ANd}0{AOhC`}{AOjC`}{{{d{Ff}}{d{b}}}Db}{{{d{Dh}}{d{b}}}Db}{{{d{Cb}}}Db}{{{d{ANf}}}Db}{B@bDb}{IfDb}{AOlDb}{{{C`{{d{Aj}}}}{d{Aj}}{n{DhJn}}}AOl}{{{d{AnAOf}}}{{C`{c}}}{}}{{{d{AnAOn}}}{{C`{c}}}{}}10{{{d{AnAOf}}Ad}{{C`{c}}}{}}{{{d{AnAOn}}Ad}{{C`{c}}}{}}{{{d{ANf}}}{{l{B@b}}}}{AFll}{{{d{Dh}}{d{Dh}}}{{C`{Bf}}}}{{{d{Cb}}{d{Cb}}}{{C`{Bf}}}}{{{d{ANn}}{d{ANn}}}{{C`{Bf}}}}{{{d{If}}{d{If}}}{{C`{Bf}}}}{{{d{AOb}}{d{AOb}}}{{C`{Bf}}}}{{{d{ANf}}{d{ANf}}}{{C`{Bf}}}}{AFln}{AFlC`}{{{d{Dh}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{ANn}}}Ad}{ANlAd}{{{d{AOf}}}{{Cd{Ad{C`{Ad}}}}}}{{{d{AOn}}}{{Cd{Ad{C`{Ad}}}}}}{AOhEl}{AOjEl}{dc{}}000000000000000000{dFh}000{{{d{Dh}}{d{AnCh}}{d{Aj}}}{{Cd{{l{{Cd{G`Jd}}}}{l{{Cd{G`Jd}}}}}}}}{c{{n{e}}}{}{}}00000{{{d{Aj}}}{{n{ANnc}}}{}}11111111111{{{d{Aj}}}{{n{ANfc}}}{}}222{{}{{n{c}}}{}}0000000000000000000{{{d{b}}{d{{Gj{Dh}}}}}Dh}{{{d{Dh}}{d{b}}}Ff}{AOln}{dCf}0000000000000000000{{}Ff}{{}Cb}{{}ANd}022{{{d{b}}}Dh}{AO`Dh}```````````````{{{d{B@f}}{d{b}}}Ad}{d{{d{c}}}{}}000000{{{d{An}}}{{d{Anc}}}{}}000000{{{d{AN`}}}AN`}{{{d{B@h}}}B@h}{{{d{B@j}}}B@j}{{{d{B@f}}}B@f}{{{d{B@l}}}B@l}{{{d{B@n}}}B@n}{{{d{BA`}}}BA`}{{d{d{Anc}}}h{}}000000{{dBd}h}000000{{{d{BA`}}Ad}{{l{B@f}}}}{{{d{B@j}}}{{l{B@f}}}}{{{d{b}}Dh}B@n}{{{d{b}}B@f}B@j}{{{d{AN`}}{d{b}}}AN`}{{{d{BA`}}{d{b}}}{{l{BA`}}}}{{{d{B@n}}{d{B@n}}}B@n}{{{d{AN`}}{d{AN`}}}Bh}{{{d{B@h}}{d{B@h}}}Bh}{{{d{B@j}}{d{B@j}}}Bh}{{{d{B@f}}{d{B@f}}}Bh}{{{d{B@l}}{d{B@l}}}Bh}{{{d{B@n}}{d{B@n}}}Bh}{{{d{BA`}}{d{BA`}}}Bh}{{d{d{c}}}Bh{}}000000000000000000000000000{{{d{B@f}}{d{b}}}{{l{Dh}}}}{{{d{AN`}}{d{b}}}{{C`{{l{B@h}}}}}}{{{d{AN`}}{d{AnBj}}}Bl}{{{d{B@h}}{d{AnBj}}}Bl}{{{d{B@j}}{d{AnBj}}}Bl}{{{d{B@f}}{d{AnBj}}}Bl}{{{d{B@l}}{d{AnBj}}}Bl}{{{d{B@n}}{d{AnBj}}}Bl}{{{d{BA`}}{d{AnBj}}}Bl}{{{d{B@h}}{d{b}}{d{AnBj}}}Bl}{cc{}}000000{{{d{AMl}}{d{{Gj{{Cl{BAb}}}}}}Dh}AN`}{{cAd}B@n{{AMf{}{{AMd{{d{BA`}}}}}}}}{{{d{B@f}}{d{Anc}}}hBn}{{{d{B@l}}{d{Anc}}}hBn}{{{d{BA`}}}{{C`{{d{B@h}}}}}}{BA`l}{{}c{}}000000{B@nc{}}{AN`{{l{BA`}}}}{{{d{B@n}}{d{b}}}Bh}{{{d{B@n}}}Bh}{{{d{BA`}}}Bh}{{{d{AN`}}{d{b}}Ad}Bh}{{{d{B@h}}}Bh}{{{d{B@n}}}{{`{{AMf{}{{AMd{{d{B@f}}}}}}}}}}{B@hB@j}{{{d{B@n}}}Ad}{{{d{BA`}}}Ad}{{{d{AN`}}}Ad}{{{l{BA`}}}AN`}{{B@jDh}B@h}{{{l{B@h}}}BA`}3{{{d{BA`}}}{{d{{Gj{B@h}}}}}}{{{d{AN`}}{d{b}}B@f}AN`}{{{d{BA`}}{d{b}}B@f}{{l{BA`}}}}{{{d{AN`}}}{{d{{Gj{BA`}}}}}}{{{d{AN`}}}B@n}{{{d{AnBA`}}AdAd}h}{{{d{AnAN`}}AdAd}h}{dc{}}000000{c{{n{e}}}{}{}}000000{{}{{n{c}}}{}}000000{{{d{B@f}}{d{b}}}Dh}{B@hDh}{dCf}000000{{{C`{{Cd{DbAd}}}}Dh}B@h}{BAdl}{BAdB@f}","D":"EAd","p":[[10,"AnalyzerDb",552],[1,"reference",null,null,1],[5,"IngotId",2222],[1,"unit"],[5,"Diagnostic",4168],[5,"Vec",4169],[6,"Result",4170,null,1],[5,"ModuleId",2222],[6,"ContractTypeMethod",12],[1,"usize"],[6,"Intrinsic",12],[6,"ValueMethod",12],[1,"str"],[6,"GlobalFunction",12],[0,"mut"],[5,"GlobalFunctionIter",12],[5,"IntrinsicIter",12],[1,"u8"],[6,"Ordering",4171],[1,"bool"],[5,"Formatter",4172],[8,"Result",4172],[10,"Hasher",4173],[6,"Option",4174,null,1],[6,"Base",3443],[1,"tuple",null,null,1],[5,"TypeId",4175],[10,"AnalyzerContext",231],[6,"Expr",4176],[5,"Node",4177],[6,"CallType",231],[5,"TempContext",231],[5,"SmolStr",4178],[6,"Constant",231],[5,"ExpressionAttributes",231],[5,"TypeId",3443],[5,"DiagnosticVoucher",231],[5,"FunctionBody",231],[5,"IndexMap",4179],[5,"Label",231,4168],[5,"Analysis",231],[10,"Clone",4180],[6,"NamedThing",231],[5,"Adjustment",231],[6,"AdjustmentKind",231],[5,"Span",4181],[5,"IncompleteItem",2079],[5,"Rc",4182,null,1],[5,"RefCell",4183],[10,"PartialEq",4171],[6,"Type",3443],[5,"String",4184],[5,"Error",4172],[10,"Debug",4172],[5,"ConstEvalError",2079],[5,"FunctionId",2222],[10,"Hash",4173],[6,"BlockScopeType",3319],[5,"SourceFileId",4185],[5,"Label",4186],[1,"slice"],[6,"Item",2222],[10,"Into",4187,null,1],[5,"Path",4176],[5,"FatalError",2079],[10,"DiagnosticSink",2222],[5,"HashMap",4188],[6,"LabelStyle",4168],[10,"Fn",4189],[15,"BuiltinAssociatedFunction",532],[5,"ContractId",2222],[15,"External",532],[15,"AssociatedFunction",532],[15,"TraitValueMethod",532],[5,"Generic",3443],[15,"BuiltinValueMethod",532],[15,"ValueMethod",532],[5,"FunctionSigId",2222],[5,"TraitId",2222],[15,"SelfValue",545],[15,"Variable",545],[5,"ImplId",2222],[5,"AnalyzerDbGroupStorage__",552],[5,"Arc",4190,null,1],[5,"ContractFieldId",2222],[5,"DepGraphWrapper",2222],[5,"TypeError",2079],[5,"InternIngotQuery",552],[5,"InternIngotLookupQuery",552],[5,"InternModuleQuery",552],[5,"InternModuleLookupQuery",552],[5,"InternModuleConstQuery",552],[5,"InternModuleConstLookupQuery",552],[5,"InternStructQuery",552],[5,"InternStructLookupQuery",552],[5,"InternStructFieldQuery",552],[5,"InternStructFieldLookupQuery",552],[5,"InternEnumQuery",552],[5,"InternEnumLookupQuery",552],[5,"InternAttributeQuery",552],[5,"InternAttributeLookupQuery",552],[5,"InternEnumVariantQuery",552],[5,"InternEnumVariantLookupQuery",552],[5,"InternTraitQuery",552],[5,"InternTraitLookupQuery",552],[5,"InternImplQuery",552],[5,"InternImplLookupQuery",552],[5,"InternTypeAliasQuery",552],[5,"InternTypeAliasLookupQuery",552],[5,"InternContractQuery",552],[5,"InternContractLookupQuery",552],[5,"InternContractFieldQuery",552],[5,"InternContractFieldLookupQuery",552],[5,"InternFunctionSigQuery",552],[5,"InternFunctionSigLookupQuery",552],[5,"InternFunctionQuery",552],[5,"InternFunctionLookupQuery",552],[5,"InternTypeQuery",552],[5,"InternTypeLookupQuery",552],[5,"IngotFilesQuery",552],[5,"IngotExternalIngotsQuery",552],[5,"RootIngotQuery",552],[5,"IngotModulesQuery",552],[5,"IngotRootModuleQuery",552],[5,"ModuleFilePathQuery",552],[5,"ModuleParseQuery",552],[5,"ModuleIsIncompleteQuery",552],[5,"ModuleAllItemsQuery",552],[5,"ModuleAllImplsQuery",552],[5,"ModuleItemMapQuery",552],[5,"ModuleImplMapQuery",552],[5,"ModuleContractsQuery",552],[5,"ModuleStructsQuery",552],[5,"ModuleConstantsQuery",552],[5,"ModuleUsedItemMapQuery",552],[5,"ModuleParentModuleQuery",552],[5,"ModuleSubmodulesQuery",552],[5,"ModuleTestsQuery",552],[5,"ModuleConstantTypeQuery",552],[5,"ModuleConstantValueQuery",552],[5,"ContractAllFunctionsQuery",552],[5,"ContractFunctionMapQuery",552],[5,"ContractPublicFunctionMapQuery",552],[5,"ContractInitFunctionQuery",552],[5,"ContractCallFunctionQuery",552],[5,"ContractAllFieldsQuery",552],[5,"ContractFieldMapQuery",552],[5,"ContractFieldTypeQuery",552],[5,"ContractDependencyGraphQuery",552],[5,"ContractRuntimeDependencyGraphQuery",552],[5,"FunctionSignatureQuery",552],[5,"FunctionBodyQuery",552],[5,"FunctionDependencyGraphQuery",552],[5,"StructAllFieldsQuery",552],[5,"StructFieldMapQuery",552],[5,"StructFieldTypeQuery",552],[5,"StructAllFunctionsQuery",552],[5,"StructFunctionMapQuery",552],[5,"StructDependencyGraphQuery",552],[5,"EnumAllVariantsQuery",552],[5,"EnumVariantMapQuery",552],[5,"EnumAllFunctionsQuery",552],[5,"EnumFunctionMapQuery",552],[5,"EnumDependencyGraphQuery",552],[5,"EnumVariantKindQuery",552],[5,"TraitAllFunctionsQuery",552],[5,"TraitFunctionMapQuery",552],[5,"TraitIsImplementedForQuery",552],[5,"ImplAllFunctionsQuery",552],[5,"ImplFunctionMapQuery",552],[5,"AllImplsQuery",552],[5,"ImplForQuery",552],[5,"FunctionSigsQuery",552],[5,"TypeAliasTypeQuery",552],[5,"TestDb",552],[5,"EnumId",2222],[5,"EnumVariantId",2222],[6,"EnumVariantKind",2222],[5,"DatabaseKeyIndex",4191],[5,"Runtime",4192],[10,"FnMut",4189],[5,"FunctionSignature",3443],[5,"QueryTable",4191],[5,"QueryTableMut",4191],[5,"Attribute",2222],[5,"AttributeId",2222],[5,"Contract",2222],[5,"ContractField",2222],[5,"Enum",2222],[5,"EnumVariant",2222],[5,"File",4185],[5,"Function",2222],[5,"FunctionSig",2222],[5,"Impl",2222],[5,"Ingot",2222],[5,"Module",2222],[5,"ModuleConstant",2222],[5,"ModuleConstantId",2222],[5,"Struct",2222],[5,"StructId",2222],[5,"StructField",2222],[5,"StructFieldId",2222],[5,"Trait",2222],[5,"TypeAlias",2222],[5,"TypeAliasId",2222],[5,"Revision",4193],[5,"Module",4176],[1,"u16"],[10,"Database",4191],[5,"Durability",4194],[10,"SourceDb",4195],[5,"DisplayableWrapper",2063],[10,"Displayable",2063],[10,"DisplayWithDb",2063],[6,"IndexingError",2079],[6,"BinaryOperationError",2079],[6,"TypeCoercionError",2079],[5,"AlreadyDefined",2079],[10,"Display",4172],[5,"InternId",4196],[6,"TraitOrType",3443],[5,"Impl",4176],[6,"IngotMode",2222],[6,"ModuleSource",2222],[6,"TypeDef",2222],[6,"DepLocality",2222],[8,"DepGraph",2222],[5,"BuildFiles",4197],[6,"FileKind",4185],[10,"AsRef",4187],[6,"GenericParameter",4176],[5,"Function",4176],[5,"NodeId",4177],[17,"Item"],[10,"Iterator",4198],[5,"ItemScope",3319],[5,"FunctionScope",3319],[5,"BlockScope",3319],[6,"FuncStmt",4176],[5,"PatternMatrix",3989,4199],[5,"BTreeMap",4200],[5,"BigInt",4201],[6,"GenericType",3443],[6,"GenericArg",3443],[10,"TypeDowncast",3443],[5,"Array",3443],[6,"Integer",3443],[5,"Map",3443],[5,"FeString",3443],[5,"Tuple",3443],[5,"IntegerIter",3443],[5,"SelfDecl",3443],[5,"CtxDecl",3443],[5,"FunctionParam",3443],[5,"GenericTypeIter",3443],[6,"GenericParamKind",3443],[5,"GenericParam",3443],[10,"SafeNames",3443],[6,"ConstructorKind",3989,4199],[5,"SimplifiedPattern",3989,4199],[6,"SimplifiedPatternKind",3989,4199],[6,"LiteralConstructor",3989,4199],[5,"SigmaSet",3989,4199],[5,"PatternRowVec",3989,4199],[5,"MatchArm",4176],[15,"Constructor",4166],[5,"AnalyzerDbStorage",552]],"r":[[0,552],[1,552],[11,4202],[254,4168],[276,4168],[287,4168],[299,4168],[309,4168],[319,4168],[339,4168],[349,4168],[350,4168],[351,4168],[352,4168],[394,4168],[406,4168],[425,4168],[430,4168],[442,4168],[450,4168],[464,4168],[476,4168],[478,4168],[480,4168],[481,4168],[492,4168],[503,4168],[517,4168],[3989,4199],[3990,4199],[3991,4199],[3992,4199],[3993,4199],[3994,4199],[3995,4199],[3996,4199],[3997,4199],[3998,4199],[3999,4199],[4000,4199],[4001,4199],[4002,4199],[4003,4199],[4004,4199],[4005,4199],[4006,4199],[4007,4199],[4008,4199],[4009,4199],[4010,4199],[4011,4199],[4012,4199],[4013,4199],[4014,4199],[4015,4199],[4016,4199],[4017,4199],[4018,4199],[4019,4199],[4020,4199],[4021,4199],[4022,4199],[4023,4199],[4024,4199],[4025,4199],[4026,4199],[4027,4199],[4028,4199],[4029,4199],[4030,4199],[4031,4199],[4032,4199],[4033,4199],[4034,4199],[4035,4199],[4036,4199],[4037,4199],[4038,4199],[4039,4199],[4040,4199],[4041,4199],[4042,4199],[4043,4199],[4044,4199],[4045,4199],[4046,4199],[4047,4199],[4048,4199],[4049,4199],[4050,4199],[4051,4199],[4052,4199],[4053,4199],[4054,4199],[4055,4199],[4056,4199],[4057,4199],[4058,4199],[4059,4199],[4060,4199],[4061,4199],[4062,4199],[4063,4199],[4064,4199],[4065,4199],[4066,4199],[4067,4199],[4068,4199],[4069,4199],[4070,4199],[4071,4199],[4072,4199],[4073,4199],[4074,4199],[4075,4199],[4076,4199],[4077,4199],[4078,4199],[4079,4199],[4080,4199],[4081,4199],[4082,4199],[4083,4199],[4084,4199],[4085,4199],[4086,4199],[4087,4199],[4088,4199],[4089,4199],[4090,4199],[4091,4199],[4092,4199],[4093,4199],[4094,4199],[4095,4199],[4096,4199],[4097,4199],[4098,4199],[4099,4199],[4100,4199],[4101,4199],[4102,4199],[4103,4199],[4104,4199],[4105,4199],[4106,4199],[4107,4199],[4108,4199],[4109,4199],[4110,4199],[4111,4199],[4112,4199],[4113,4199],[4114,4199],[4115,4199],[4116,4199],[4117,4199],[4118,4199],[4119,4199],[4120,4199],[4121,4199],[4122,4199],[4123,4199],[4124,4199],[4125,4199],[4126,4199],[4127,4199],[4128,4199],[4129,4199],[4130,4199],[4131,4199],[4132,4199],[4133,4199],[4134,4199],[4135,4199],[4136,4199],[4137,4199],[4138,4199],[4139,4199],[4140,4199],[4141,4199],[4142,4199],[4143,4199],[4144,4199],[4145,4199],[4146,4199],[4147,4199],[4148,4199],[4149,4199],[4150,4199],[4151,4199],[4152,4199],[4153,4199],[4154,4199],[4155,4199],[4156,4199],[4157,4199],[4158,4199],[4159,4199],[4160,4199],[4161,4199],[4162,4199],[4163,4199],[4164,4199],[4165,4199]],"b":[[402,"impl-Debug-for-CallType"],[403,"impl-Display-for-CallType"],[1210,"impl-HasQueryGroup%3CSourceDbStorage%3E-for-TestDb"],[1211,"impl-HasQueryGroup%3CAnalyzerDbStorage%3E-for-TestDb"],[2155,"impl-From%3CIncompleteItem%3E-for-TypeError"],[2157,"impl-From%3CConstEvalError%3E-for-TypeError"],[2158,"impl-From%3CFatalError%3E-for-TypeError"],[2159,"impl-From%3CConstEvalError%3E-for-FatalError"],[2161,"impl-From%3CAlreadyDefined%3E-for-FatalError"],[2162,"impl-From%3CIncompleteItem%3E-for-FatalError"],[2163,"impl-From%3CTypeError%3E-for-FatalError"],[2164,"impl-From%3CTypeError%3E-for-ConstEvalError"],[2165,"impl-From%3CFatalError%3E-for-ConstEvalError"],[2166,"impl-From%3CIncompleteItem%3E-for-ConstEvalError"],[3733,"impl-Display-for-Base"],[3734,"impl-Debug-for-Base"],[3735,"impl-Display-for-Integer"],[3736,"impl-Debug-for-Integer"],[3739,"impl-Debug-for-Generic"],[3740,"impl-Display-for-Generic"],[3742,"impl-Display-for-FeString"],[3743,"impl-Debug-for-FeString"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAL4NZgABAAgACwAAAA0ABQAUAI8AqgAGALcAOgD0AAAA9gABAPkABgABAQkADAEAAA4BAgASATgATAE6AIgBDgCjAQMAqAEEAK4BAAC6AQAAvAEAAL4BBQDFAQcAzgEAANABAADSAQAA1AECANgBAQDbAQAA3gEyABICDwAjAgEAJgIFAC0CJwKvBBYAdAU8AAsGygDXBgAA2QYAANsGAADdBgAA3wYAAOEGNwEbCAQAJwgBACoIAQAvCD0AbggCAHIIBQB+CAEAiAgBAIsIMAC9CAAAvwgQANEIAwDXCAAA2QgDAN4IAQDhCA0A8ggEAPkIcQBsCaYAFArsACYLEAA5CwQAPwsFAEYLJwCUCwkAnwsPALALCAC6CzgA9AslABsMBAAhDAAAJQwAACgMygD0DBkADw0IABkNFQAzDQQAOQ0EAEINMAB0DQcAfQ0cAJwNFQCzDRIAyA0pAPMNngCTDhcArA4AAMAOAwDHDhgA9A4DAPoOBAAADwAAAg8MABAPAQAUDzcATQ9AAI8PAgCUD2gABBAFABEQNwA=","P":[[105,"T"],[117,""],[123,"T"],[129,""],[137,"K"],[139,""],[143,"K"],[159,""],[163,"T"],[169,"FromStr::Err"],[173,"__H"],[176,"U"],[182,"I"],[184,""],[188,"Iterator::Item"],[194,""],[199,"T"],[205,"U,T"],[206,"TryFrom::Error"],[207,"U,T"],[209,"TryFrom::Error"],[211,"U,T"],[212,"TryFrom::Error"],[213,"U,T"],[215,"U"],[221,""],[276,"T"],[298,""],[300,"T"],[301,""],[309,"T"],[319,""],[340,"T"],[341,""],[349,"K"],[389,""],[395,"T"],[396,""],[406,"T"],[417,""],[424,"T"],[425,"__H"],[426,"T,__H"],[427,"__H"],[428,""],[430,"U"],[441,""],[456,"T"],[457,""],[464,"S"],[465,""],[476,"S"],[477,"T"],[478,""],[481,"T"],[491,""],[492,"U,T"],[503,"U"],[514,""],[646,"T"],[826,""],[962,"QueryDb::DynDb,Query::Key,Query::Value"],[1014,""],[1108,"T"],[1198,""],[1456,"U"],[1546,""],[1649,"QueryDb::GroupStorage,Query::Storage"],[1736,"QueryDb::DynDb,Query::Key,Query::Value"],[1744,""],[1788,"U,T"],[1878,"U"],[1968,""],[2066,"T"],[2069,""],[2070,"T"],[2071,""],[2072,"T"],[2073,"U"],[2074,"T"],[2075,""],[2076,"U,T"],[2077,"U"],[2078,""],[2097,"T"],[2113,""],[2115,"T"],[2117,""],[2125,"K"],[2145,""],[2156,"T"],[2157,""],[2160,"T"],[2161,""],[2167,"T"],[2173,"__H"],[2175,"U"],[2183,""],[2192,"T"],[2194,"U,T"],[2202,"U"],[2210,""],[2334,"T"],[2408,""],[2448,"T"],[2485,""],[2539,"K"],[2556,""],[2623,"K"],[2771,""],[2816,"T"],[2853,""],[2886,"__H"],[2921,""],[2926,"U"],[2963,""],[3156,"T"],[3193,""],[3195,"U,T"],[3232,"U"],[3269,""],[3318,"F"],[3329,""],[3343,"T"],[3351,""],[3353,"T"],[3354,""],[3366,"K"],[3370,""],[3374,"T"],[3378,""],[3389,"U"],[3393,""],[3397,"T"],[3398,""],[3425,"T"],[3426,"U,T"],[3430,"U"],[3434,""],[3528,"T"],[3568,""],[3589,"T"],[3608,""],[3633,"K"],[3639,""],[3661,"K"],[3729,""],[3754,"T"],[3755,""],[3756,"T"],[3775,""],[3776,"FromStr::Err"],[3779,""],[3784,"__H"],[3801,""],[3807,"U"],[3827,"I"],[3829,""],[3869,"Iterator::Item"],[3875,""],[3892,"T"],[3911,""],[3916,"U,T"],[3922,"TryFrom::Error"],[3923,"U,T"],[3934,"TryFrom::Error"],[3935,"U,T"],[3938,"U"],[3958,""],[4005,"T"],[4019,""],[4026,"T"],[4033,""],[4054,"K"],[4082,""],[4092,"T"],[4099,""],[4101,"__H"],[4103,""],[4105,"U"],[4112,"IntoIterator::IntoIter"],[4113,""],[4135,"T"],[4142,"U,T"],[4149,"U"],[4156,""]]}],["fe_codegen",{"t":"CCFFFFFFFFFFFFKFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCCHHHHFNNNNNONNNHHGPFPKMNMNMNMNMNMNNNNNNNNMNMNMNNMNMNNNNNNNMNNMNMNMNMNMNMNMNMNMNMNMNMNNNNNNNN","n":["db","yul","CodegenAbiContractQuery","CodegenAbiEventQuery","CodegenAbiFunctionArgumentMaximumSizeQuery","CodegenAbiFunctionQuery","CodegenAbiFunctionReturnMaximumSizeQuery","CodegenAbiModuleEventsQuery","CodegenAbiTypeMaximumSizeQuery","CodegenAbiTypeMinimumSizeQuery","CodegenAbiTypeQuery","CodegenConstantStringSymbolNameQuery","CodegenContractDeployerSymbolNameQuery","CodegenContractSymbolNameQuery","CodegenDb","CodegenDbGroupStorage__","CodegenDbStorage","CodegenFunctionSymbolNameQuery","CodegenLegalizedBodyQuery","CodegenLegalizedSignatureQuery","CodegenLegalizedTypeQuery","Db","all_impls","borrow","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","codegen_abi_contract","","","codegen_abi_event","","","codegen_abi_function","","","codegen_abi_function_argument_maximum_size","","","codegen_abi_function_return_maximum_size","","","codegen_abi_module_events","","","codegen_abi_type","","","codegen_abi_type_maximum_size","","","codegen_abi_type_minimum_size","","","codegen_constant_string_symbol_name","","","codegen_contract_deployer_symbol_name","","","codegen_contract_symbol_name","","","codegen_function_symbol_name","","","codegen_legalized_body","","","codegen_legalized_signature","","","codegen_legalized_type","","","contract_all_fields","contract_all_functions","contract_call_function","contract_dependency_graph","contract_field_map","contract_field_type","contract_function_map","contract_init_function","contract_public_function_map","contract_runtime_dependency_graph","default","","","","","","","","","","","","","","","","","enum_all_functions","enum_all_variants","enum_dependency_graph","enum_function_map","enum_variant_kind","enum_variant_map","execute","","","","","","","","","","","","","","","","file_content","file_line_starts","file_name","fmt","","","","","","","","","","","","","","","","fmt_index","","for_each_query","","from","","","","","","","","","","","","","","","","","","","function_body","function_dependency_graph","function_signature","function_sigs","group_storage","","","","impl_all_functions","impl_for","impl_function_map","in_db","","","","","","","","","","","","","","","","in_db_mut","","","","","","","","","","","","","","","","ingot_external_ingots","ingot_files","ingot_modules","ingot_root_module","intern_attribute","intern_contract","intern_contract_field","intern_enum","intern_enum_variant","intern_file","intern_function","intern_function_sig","intern_impl","intern_ingot","intern_module","intern_module_const","intern_struct","intern_struct_field","intern_trait","intern_type","intern_type_alias","into","","","","","","","","","","","","","","","","","","","lookup_intern_attribute","lookup_intern_contract","lookup_intern_contract_field","lookup_intern_enum","lookup_intern_enum_variant","lookup_intern_file","lookup_intern_function","lookup_intern_function_sig","lookup_intern_impl","lookup_intern_ingot","lookup_intern_module","lookup_intern_module_const","lookup_intern_struct","lookup_intern_struct_field","lookup_intern_trait","lookup_intern_type","lookup_intern_type_alias","lookup_mir_intern_const","lookup_mir_intern_function","lookup_mir_intern_type","maybe_changed_since","","mir_intern_const","mir_intern_function","mir_intern_type","mir_lower_contract_all_functions","mir_lower_enum_all_functions","mir_lower_module_all_functions","mir_lower_struct_all_functions","mir_lowered_constant","mir_lowered_func_body","mir_lowered_func_signature","mir_lowered_monomorphized_func_signature","mir_lowered_pseudo_monomorphized_func_signature","mir_lowered_type","module_all_impls","module_all_items","module_constant_type","module_constant_value","module_constants","module_contracts","module_file_path","module_impl_map","module_is_incomplete","module_item_map","module_parent_module","module_parse","module_structs","module_submodules","module_tests","module_used_item_map","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","","","","","","","","","","","","root_ingot","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","set_ingot_external_ingots_with_durability","set_ingot_files","set_ingot_files_with_durability","set_root_ingot","set_root_ingot_with_durability","struct_all_fields","struct_all_functions","struct_dependency_graph","struct_field_map","struct_field_type","struct_function_map","trait_all_functions","trait_function_map","trait_is_implemented_for","try_from","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","type_alias_type","type_id","","","","","","","","","","","","","","","","","","","upcast","","","upcast_mut","","","isel","legalize","runtime","context","lower_contract","lower_contract_deployable","lower_function","lower_test","Context","borrow","borrow_mut","default","from","into","runtime","try_from","try_into","type_id","legalize_func_body","legalize_func_signature","AbiSrcLocation","CallData","DefaultRuntimeProvider","Memory","RuntimeProvider","abi_decode","","abi_encode","","abi_encode_seq","","aggregate_init","","alloc","","avail","","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","collect_definitions","","create","","create2","","default","emit","","external_call","","fmt","","from","","into","","map_value_ptr","","primitive_cast","ptr_copy","","ptr_load","","ptr_store","","revert","","safe_add","","safe_div","","safe_mod","","safe_mul","","safe_pow","","safe_sub","","string_construct","","string_copy","","to_owned","try_from","","try_into","","type_id",""],"q":[[0,"fe_codegen"],[2,"fe_codegen::db"],[436,"fe_codegen::yul"],[439,"fe_codegen::yul::isel"],[444,"fe_codegen::yul::isel::context"],[454,"fe_codegen::yul::legalize"],[456,"fe_codegen::yul::runtime"],[531,"fe_analyzer::namespace::types"],[532,"fe_analyzer::namespace::items"],[533,"alloc::rc"],[534,"fe_abi::contract"],[535,"alloc::sync"],[536,"fe_mir::ir::types"],[537,"fe_abi::event"],[538,"fe_mir::ir::function"],[539,"fe_abi::function"],[540,"alloc::vec"],[541,"fe_abi::types"],[542,"alloc::string"],[543,"core::option"],[544,"fe_analyzer::context"],[545,"smol_str"],[546,"indexmap::map"],[547,"fe_analyzer::errors"],[548,"core::result"],[549,"fe_common::files"],[550,"core::fmt"],[551,"salsa"],[552,"salsa::runtime"],[553,"core::ops::function"],[554,"fe_mir::ir::constant"],[555,"salsa::revision"],[556,"alloc::collections::btree::map"],[557,"fe_parser::ast"],[558,"fe_common::span"],[559,"salsa::durability"],[560,"core::any"],[561,"fe_analyzer::db"],[562,"fe_common::db"],[563,"fe_mir::db"],[564,"yultsur::yul"],[565,"alloc::boxed"],[566,"fe_codegen::yul::isel::contract"],[567,"fe_codegen::yul::isel::function"],[568,"fe_codegen::yul::isel::test"],[569,"fe_codegen::yul::legalize::body"],[570,"fe_codegen::yul::legalize::signature"]],"i":"``````````````````````F`NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`n1Ad1201201201201201201201201201201201201201201202222222222D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`000000D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnAdF`10Nj2D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00000000000D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEn?>=<;:9876543210F`00000000000000000000NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00000000000000000000Ad1111111111111111111111111111110111D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00000000000000000NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`0NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`000000`````````Mj00000000```Nd`0`N`Nf10101010102020222101010010102020201011010101010101010101010102202020","f":"``````````````````````{{bd}{{j{{h{f}}}}}}{b{{b{c}}}{}}000000000000000000{{{b{l}}}{{b{lc}}}{}}000000000000000000{{{b{n}}A`}Ab}{{bA`}Ab}{AdAf}{{{b{n}}Ah}Aj}{{bAh}Aj}2{{{b{n}}Al}An}{{bAl}An}4{{{b{n}}Al}B`}{{bAl}B`}6106{{{b{n}}Bb}{{Bd{Aj}}}}{{bBb}{{Bd{Aj}}}}8{{{b{n}}Ah}Bf}{{bAh}Bf}:{{{b{n}}Ah}B`}{{bAh}B`}<10<{{{b{n}}Bh}{{j{Bh}}}}{{bBh}{{j{Bh}}}}>{{{b{n}}A`}{{j{Bh}}}}{{bA`}{{j{Bh}}}}{AdAf}210{{{b{n}}Al}{{j{Bh}}}}{{bAl}{{j{Bh}}}}2{{{b{n}}Al}{{j{Bj}}}}{{bAl}{{j{Bj}}}}4{{{b{n}}Al}{{j{Bl}}}}{{bAl}{{j{Bl}}}}6{{{b{n}}Ah}Ah}{{bAh}Ah}8{{bA`}{{j{{h{Bn}}}}}}{{bA`}{{j{{h{C`}}}}}}{{bA`}{{Cd{{Cb{C`}}}}}}{{bA`}Cf}{{bA`}{{Cd{{j{{Cj{ChBn}}}}}}}}{{bBn}{{Cd{{Cn{dCl}}}}}}{{bA`}{{Cd{{j{{Cj{ChC`}}}}}}}}4{{bA`}{{j{{Cj{ChC`}}}}}}4{{}D`}{{}Db}{{}Dd}{{}Df}{{}Dh}{{}Dj}{{}Dl}{{}Dn}{{}E`}{{}Eb}{{}Ed}{{}Ef}{{}Eh}{{}Ej}{{}El}{{}En}{{}F`}{{bFb}{{j{{h{C`}}}}}}{{bFb}{{j{{h{Fd}}}}}}{{bFb}{{Cd{Cf}}}}{{bFb}{{Cd{{j{{Cj{ChC`}}}}}}}}{{bFd}{{Cd{{Cn{FfCl}}}}}}{{bFb}{{Cd{{j{{Cj{ChFd}}}}}}}}{{{b{c}}e}g{}{}{}}000000000000000{{bFh}{{j{Fj}}}}{{bFh}{{j{{h{B`}}}}}}{{bFh}Ch}{{{b{D`}}{b{lFl}}}Fn}{{{b{Db}}{b{lFl}}}Fn}{{{b{Dd}}{b{lFl}}}Fn}{{{b{Df}}{b{lFl}}}Fn}{{{b{Dh}}{b{lFl}}}Fn}{{{b{Dj}}{b{lFl}}}Fn}{{{b{Dl}}{b{lFl}}}Fn}{{{b{Dn}}{b{lFl}}}Fn}{{{b{E`}}{b{lFl}}}Fn}{{{b{Eb}}{b{lFl}}}Fn}{{{b{Ed}}{b{lFl}}}Fn}{{{b{Ef}}{b{lFl}}}Fn}{{{b{Eh}}{b{lFl}}}Fn}{{{b{Ej}}{b{lFl}}}Fn}{{{b{El}}{b{lFl}}}Fn}{{{b{En}}{b{lFl}}}Fn}{{{b{Ad}}{b{n}}G`{b{lFl}}}Fn}{{{b{F`}}G`{b{lFl}}}Fn}{{{b{Ad}}{b{Gb}}{b{lGd}}}Gf}{{{b{F`}}{b{lGd}}}Gf}{cc{}}000000000000000000{{bC`}{{Cd{{j{Gh}}}}}}{{bC`}Cf}{{bGj}{{Cd{{j{Gl}}}}}}{{bdCh}{{j{{h{Gj}}}}}}{{{b{F`}}}b}000{{bf}{{j{{h{C`}}}}}}{{bdGn}{{Cb{f}}}}{{bf}{{Cd{{j{{Cj{ChC`}}}}}}}}{{D`{b{n}}}{{H`{D`}}}}{{Db{b{n}}}{{H`{Db}}}}{{Dd{b{n}}}{{H`{Dd}}}}{{Df{b{n}}}{{H`{Df}}}}{{Dh{b{n}}}{{H`{Dh}}}}{{Dj{b{n}}}{{H`{Dj}}}}{{Dl{b{n}}}{{H`{Dl}}}}{{Dn{b{n}}}{{H`{Dn}}}}{{E`{b{n}}}{{H`{E`}}}}{{Eb{b{n}}}{{H`{Eb}}}}{{Ed{b{n}}}{{H`{Ed}}}}{{Ef{b{n}}}{{H`{Ef}}}}{{Eh{b{n}}}{{H`{Eh}}}}{{Ej{b{n}}}{{H`{Ej}}}}{{El{b{n}}}{{H`{El}}}}{{En{b{n}}}{{H`{En}}}}{{D`{b{ln}}}{{Hb{D`}}}}{{Db{b{ln}}}{{Hb{Db}}}}{{Dd{b{ln}}}{{Hb{Dd}}}}{{Df{b{ln}}}{{Hb{Df}}}}{{Dh{b{ln}}}{{Hb{Dh}}}}{{Dj{b{ln}}}{{Hb{Dj}}}}{{Dl{b{ln}}}{{Hb{Dl}}}}{{Dn{b{ln}}}{{Hb{Dn}}}}{{E`{b{ln}}}{{Hb{E`}}}}{{Eb{b{ln}}}{{Hb{Eb}}}}{{Ed{b{ln}}}{{Hb{Ed}}}}{{Ef{b{ln}}}{{Hb{Ef}}}}{{Eh{b{ln}}}{{Hb{Eh}}}}{{Ej{b{ln}}}{{Hb{Ej}}}}{{El{b{ln}}}{{Hb{El}}}}{{En{b{ln}}}{{Hb{En}}}}{{bHd}{{j{{Cj{ChHd}}}}}}{{bHd}{{j{{h{Fh}}}}}}{{bHd}{{j{{h{Bb}}}}}}{{bHd}{{Cb{Bb}}}}{{b{j{Hf}}}Hh}{{b{j{Hj}}}A`}{{b{j{Hl}}}Bn}{{b{j{Hn}}}Fb}{{b{j{I`}}}Fd}{{bIb}Fh}{{b{j{Id}}}C`}{{b{j{If}}}Gj}{{b{j{Ih}}}f}{{b{j{Ij}}}Hd}{{b{j{Il}}}Bb}{{b{j{In}}}J`}{{b{j{Jb}}}Jd}{{b{j{Jf}}}Jh}{{b{j{Jj}}}Gn}{{bJl}d}{{b{j{Jn}}}K`}{{}c{}}000000000000000000{{bHh}{{j{Hf}}}}{{bA`}{{j{Hj}}}}{{bBn}{{j{Hl}}}}{{bFb}{{j{Hn}}}}{{bFd}{{j{I`}}}}{{bFh}Ib}{{bC`}{{j{Id}}}}{{bGj}{{j{If}}}}{{bf}{{j{Ih}}}}{{bHd}{{j{Ij}}}}{{bBb}{{j{Il}}}}{{bJ`}{{j{In}}}}{{bJd}{{j{Jb}}}}{{bJh}{{j{Jf}}}}{{bGn}{{j{Jj}}}}{{bd}Jl}{{bK`}{{j{Jn}}}}{{bKb}{{j{Kd}}}}{{bAl}{{j{Bl}}}}{{bAh}{{j{Kf}}}}{{{b{Ad}}{b{n}}G`Kh}Kj}{{{b{F`}}G`Kh}Kj}{{b{j{Kd}}}Kb}{{b{j{Bl}}}Al}{{b{j{Kf}}}Ah}{{bA`}{{j{{Bd{Al}}}}}}{{bFb}{{j{{Bd{Al}}}}}}{{bBb}{{j{{Bd{Al}}}}}}{{bJd}{{j{{Bd{Al}}}}}}{{bJ`}Kb}{{bAl}{{j{Bj}}}}{{bC`}Al}{{bC`{Kl{Chd}}}Al}1{{bd}Ah}{{bBb}{{Cd{{j{{h{f}}}}}}}}{{bBb}{{j{{h{Kn}}}}}}{{bJ`}{{Cd{{Cn{dCl}}}}}}{{bJ`}{{Cd{{Cn{L`Lb}}}}}}{{bBb}{{j{{Bd{J`}}}}}}{{bBb}{{j{{h{A`}}}}}}{{bBb}Ch}{{bBb}{{Cd{{j{{Cj{{Ld{Gnd}}f}}}}}}}}{{bBb}Kj}{{bBb}{{Cd{{j{{Cj{ChKn}}}}}}}}{{bBb}{{Cb{Bb}}}}{{bBb}{{Cd{{j{Lf}}}}}}{{bBb}{{j{{h{Jd}}}}}}{{bBb}{{j{{h{Bb}}}}}}{{bBb}{{Bd{C`}}}}{{bBb}{{Cd{{j{{Cj{Ch{Ld{LhKn}}}}}}}}}}{LjAd}{{{b{F`}}}{{b{Ll}}}}{{{b{F`}}}{{b{Gb}}}}{{{b{lF`}}}{{b{lGb}}}}{{{b{c}}}{{b{{Af{e}}}}}{}{}}000000000000000{bHd}{{{b{l}}Fh{j{Fj}}}Gf}{{{b{l}}Fh{j{Fj}}Ln}Gf}{{{b{l}}Hd{j{{Cj{ChHd}}}}}Gf}{{{b{l}}Hd{j{{Cj{ChHd}}}}Ln}Gf}{{{b{l}}Hd{j{{h{Fh}}}}}Gf}{{{b{l}}Hd{j{{h{Fh}}}}Ln}Gf}{{{b{l}}Hd}Gf}{{{b{l}}HdLn}Gf}{{bJd}{{j{{h{Jh}}}}}}{{bJd}{{j{{h{C`}}}}}}{{bJd}{{Cd{Cf}}}}{{bJd}{{Cd{{j{{Cj{ChJh}}}}}}}}{{bJh}{{Cd{{Cn{dCl}}}}}}{{bJd}{{Cd{{j{{Cj{ChC`}}}}}}}}{{bGn}{{j{{h{Gj}}}}}}{{bGn}{{Cd{{j{{Cj{ChGj}}}}}}}}{{bGnd}Kj}{c{{Cn{e}}}{}{}}000000000000000000{{}{{Cn{c}}}{}}000000000000000000{{bK`}{{Cd{{Cn{dCl}}}}}}{bM`}000000000000000000{{{b{F`}}}{{b{Mb}}}}{{{b{F`}}}{{b{Md}}}}{{{b{F`}}}{{b{Mf}}}}{{{b{lF`}}}{{b{lMd}}}}{{{b{lF`}}}{{b{lMf}}}}{{{b{lF`}}}{{b{lMb}}}}````{{{b{n}}A`}Mh}0{{{b{n}}{b{lMj}}Al}Ml}{{{b{n}}C`}Mh}`{b{{b{c}}}{}}{{{b{l}}}{{b{lc}}}{}}{{}Mj}{cc{}}{{}c{}}{MjMn}{c{{Cn{e}}}{}{}}{{}{{Cn{c}}}{}}{bM`}{{{b{n}}{b{lBj}}}Gf}{{{b{n}}{b{lBl}}}Gf}`````{{{b{lN`}}{b{n}}NbNb{b{{h{Ah}}}}Nd}Nb}{{{b{lNf}}{b{n}}NbNb{b{{h{Ah}}}}Nd}Nb}{{{b{lN`}}{b{n}}NbNbAhKj}Nb}{{{b{lNf}}{b{n}}NbNbAhKj}Nb}{{{b{lN`}}{b{n}}{b{{h{Nb}}}}Nb{b{{h{Ah}}}}Kj}Nb}{{{b{lNf}}{b{n}}{b{{h{Nb}}}}Nb{b{{h{Ah}}}}Kj}Nb}{{{b{lN`}}{b{n}}Nb{Bd{Nb}}Ah{Bd{Ah}}}Nb}{{{b{lNf}}{b{n}}Nb{Bd{Nb}}Ah{Bd{Ah}}}Nb}{{{b{lN`}}{b{n}}Nb}Nb}{{{b{lNf}}{b{n}}Nb}Nb}{{{b{lN`}}{b{n}}}Nb}{{{b{lNf}}{b{n}}}Nb}{b{{b{c}}}{}}0{{{b{l}}}{{b{lc}}}{}}0{{{b{Nd}}}Nd}{{b{b{lc}}}Gf{}}{{bNh}Gf}{{{b{N`}}}{{Bd{Ml}}}}{{{b{Nf}}}{{Bd{Ml}}}}{{{b{lN`}}{b{n}}A`Nb}Nb}{{{b{lNf}}{b{n}}A`Nb}Nb}{{{b{lN`}}{b{n}}A`NbNb}Nb}{{{b{lNf}}{b{n}}A`NbNb}Nb}{{}Nf}{{{b{lN`}}{b{n}}NbAh}Nb}{{{b{lNf}}{b{n}}NbAh}Nb}{{{b{lN`}}{b{n}}Al{Bd{Nb}}}Nb}{{{b{lNf}}{b{n}}Al{Bd{Nb}}}Nb}{{{b{Nd}}{b{lFl}}}Fn}{{{b{Nf}}{b{lFl}}}Fn}{cc{}}0{{}c{}}0{{{b{lN`}}{b{n}}NbNbAh}Nb}{{{b{lNf}}{b{n}}NbNbAh}Nb}9{{{b{lN`}}{b{n}}NbNbNbKjKj}Nb}{{{b{lNf}}{b{n}}NbNbNbKjKj}Nb};:32{{{b{lN`}}{b{n}}{Cb{Nb}}{b{Fj}}Ah}Nb}{{{b{lNf}}{b{n}}{Cb{Nb}}{b{Fj}}Ah}Nb}545454545454{{{b{lN`}}{b{n}}{b{Fj}}B`}Nb}{{{b{lNf}}{b{n}}{b{Fj}}B`}Nb}{{{b{lN`}}{b{n}}Nb{b{Fj}}Kj}Nb}{{{b{lNf}}{b{n}}Nb{b{Fj}}Kj}Nb}{bc{}}{c{{Cn{e}}}{}{}}0{{}{{Cn{c}}}{}}0{bM`}0","D":"Il","p":[[1,"reference",null,null,1],[5,"TypeId",531],[5,"ImplId",532],[1,"slice"],[5,"Rc",533,null,1],[0,"mut"],[10,"CodegenDb",2],[5,"ContractId",532],[5,"AbiContract",534],[5,"CodegenDbGroupStorage__",2],[5,"Arc",535,null,1],[5,"TypeId",536],[5,"AbiEvent",537],[5,"FunctionId",538],[5,"AbiFunction",539],[1,"usize"],[5,"ModuleId",532],[5,"Vec",540],[6,"AbiType",541],[5,"String",542],[5,"FunctionBody",538],[5,"FunctionSignature",538],[5,"ContractFieldId",532],[5,"FunctionId",532],[6,"Option",543,null,1],[5,"Analysis",544],[5,"DepGraphWrapper",532],[5,"SmolStr",545],[5,"IndexMap",546],[5,"TypeError",547],[6,"Result",548,null,1],[5,"CodegenLegalizedSignatureQuery",2],[5,"CodegenLegalizedBodyQuery",2],[5,"CodegenFunctionSymbolNameQuery",2],[5,"CodegenLegalizedTypeQuery",2],[5,"CodegenAbiTypeQuery",2],[5,"CodegenAbiFunctionQuery",2],[5,"CodegenAbiEventQuery",2],[5,"CodegenAbiContractQuery",2],[5,"CodegenAbiModuleEventsQuery",2],[5,"CodegenAbiTypeMaximumSizeQuery",2],[5,"CodegenAbiTypeMinimumSizeQuery",2],[5,"CodegenAbiFunctionArgumentMaximumSizeQuery",2],[5,"CodegenAbiFunctionReturnMaximumSizeQuery",2],[5,"CodegenContractSymbolNameQuery",2],[5,"CodegenContractDeployerSymbolNameQuery",2],[5,"CodegenConstantStringSymbolNameQuery",2],[5,"Db",2],[5,"EnumId",532],[5,"EnumVariantId",532],[6,"EnumVariantKind",532],[5,"SourceFileId",549],[1,"str"],[5,"Formatter",550],[8,"Result",550],[5,"DatabaseKeyIndex",551],[5,"Runtime",552],[10,"FnMut",553],[1,"unit"],[5,"FunctionBody",544],[5,"FunctionSigId",532],[5,"FunctionSignature",531],[5,"TraitId",532],[5,"QueryTable",551],[5,"QueryTableMut",551],[5,"IngotId",532],[5,"Attribute",532],[5,"AttributeId",532],[5,"Contract",532],[5,"ContractField",532],[5,"Enum",532],[5,"EnumVariant",532],[5,"File",549],[5,"Function",532],[5,"FunctionSig",532],[5,"Impl",532],[5,"Ingot",532],[5,"Module",532],[5,"ModuleConstant",532],[5,"ModuleConstantId",532],[5,"Struct",532],[5,"StructId",532],[5,"StructField",532],[5,"StructFieldId",532],[5,"Trait",532],[6,"Type",531],[5,"TypeAlias",532],[5,"TypeAliasId",532],[5,"ConstantId",554],[5,"Constant",554],[5,"Type",536],[5,"Revision",555],[1,"bool"],[5,"BTreeMap",556],[6,"Item",532],[6,"Constant",544],[5,"ConstEvalError",547],[1,"tuple",null,null,1],[5,"Module",557],[5,"Span",558],[1,"u16"],[10,"Database",551],[5,"Durability",559],[5,"TypeId",560],[10,"AnalyzerDb",561],[10,"SourceDb",562],[10,"MirDb",563],[5,"Object",564],[5,"Context",444],[5,"FunctionDefinition",564],[5,"Box",565,null,1],[10,"RuntimeProvider",456],[6,"Expression",564],[6,"AbiSrcLocation",456],[5,"DefaultRuntimeProvider",456],[1,"u8"],[5,"CodegenDbStorage",2]],"r":[[440,566],[441,566],[442,567],[443,568],[454,569],[455,570]],"b":[[204,"impl-HasQueryGroup%3CAnalyzerDbStorage%3E-for-Db"],[205,"impl-HasQueryGroup%3CCodegenDbStorage%3E-for-Db"],[206,"impl-HasQueryGroup%3CMirDbStorage%3E-for-Db"],[207,"impl-HasQueryGroup%3CSourceDbStorage%3E-for-Db"],[430,"impl-Upcast%3Cdyn+AnalyzerDb%3E-for-Db"],[431,"impl-Upcast%3Cdyn+SourceDb%3E-for-Db"],[432,"impl-Upcast%3Cdyn+MirDb%3E-for-Db"],[433,"impl-UpcastMut%3Cdyn+SourceDb%3E-for-Db"],[434,"impl-UpcastMut%3Cdyn+MirDb%3E-for-Db"],[435,"impl-UpcastMut%3Cdyn+AnalyzerDb%3E-for-Db"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAMUBCAAAABAAEgCjAMkACgD0ABQAHAGkAMMBKgDyAQIA9gEdAA==","P":[[23,"T"],[61,""],[142,"QueryDb::DynDb,Query::Key,Query::Value"],[158,""],[181,"T"],[200,""],[264,"U"],[283,""],[338,"QueryDb::GroupStorage,Query::Storage"],[354,""],[372,"U,T"],[391,"U"],[410,""],[445,"T"],[447,""],[448,"T"],[449,"U"],[450,""],[451,"U,T"],[452,"U"],[453,""],[473,"T"],[477,""],[478,"T"],[479,""],[493,"T"],[495,"U"],[497,""],[524,"T"],[525,"U,T"],[527,"U"],[529,""]]}],["fe_common",{"t":"EEEFKNNNNNQQNNNNNCNCNONNNNNOCNNNNQNNNCCNMONNNNCNFFFFFKFFFKKNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNNNNNNNMNONNNNNNNNNNNMNMNNNNNNNNNNNNNNNNNNNNNNNNNMMPFPPFGPPPGPNNNNNNNNNNNNNNNNNNNNCHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNHNOOONNNNNNNNNNNNNNNNPFPPFGPPPGPNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNONNNNNNNNNNNOOONNNONNONOONNNNNNNNNNNNNNNNNNPFGPPPPPFPGFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPFPGNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNHCCCCCCHHFFGKGPPFPPFPFGPNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNHNNNNNNNNONNOOOOMNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOHKHMMHHHHFNNNNNNHNNNN","n":["File","FileKind","SourceFileId","Span","Spanned","add","","","","add_assign","assert_snapshot_wasm","assert_strings_eq","borrow","borrow_mut","clone","clone_into","clone_to_uninit","db","deserialize","diagnostics","dummy","end","eq","equivalent","","","","file_id","files","fmt","from","from_pair","hash","impl_intern_key","into","is_dummy","new","numeric","panic","serialize","span","start","to_owned","try_from","try_into","type_id","utils","zero","FileContentQuery","FileLineStartsQuery","FileNameQuery","InternFileLookupQuery","InternFileQuery","SourceDb","SourceDbGroupStorage__","SourceDbStorage","TestDb","Upcast","UpcastMut","borrow","","","","","","","","borrow_mut","","","","","","","","default","","","","","","execute","","file_content","","","file_line_starts","","","file_name","","","fmt","","","","","fmt_index","","for_each_query","","from","","","","","","","","group_storage","in_db","","","","","in_db_mut","","","","","intern_file","","","into","","","","","","","","lookup_intern_file","","","maybe_changed_since","","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","set_file_content","","set_file_content_with_durability","","try_from","","","","","","","","try_into","","","","","","","","type_id","","","","","","","","upcast","upcast_mut","Bug","Diagnostic","Error","Help","Label","LabelStyle","Note","Primary","Secondary","Severity","Warning","borrow","","","","borrow_mut","","","","clone","","","","clone_into","","","","clone_to_uninit","","","","cs","diagnostics_string","eq","","","","equivalent","","","","","","","","","","","","","","","","error","fmt","","","","from","","","","hash","","","","into","","","","into_cs","into_cs_label","labels","message","","notes","partial_cmp","primary","print_diagnostics","secondary","severity","span","style","to_owned","","","","try_from","","","","try_into","","","","type_id","","","","Bug","Diagnostic","Error","Help","Label","LabelStyle","Note","Primary","Secondary","Severity","Warning","borrow","","","borrow_mut","","","bug","clone","","","clone_into","","","clone_to_uninit","","","code","eq","","","equivalent","","","","","","","","","","","","error","file_id","fmt","","","from","","","","help","into","","","labels","message","","new","","note","notes","partial_cmp","primary","range","secondary","severity","style","to_owned","","","try_from","","","try_into","","","type_id","","","warning","with_code","with_labels","with_message","","with_notes","CurDir","File","FileKind","Local","Normal","ParentDir","Prefix","RootDir","SourceFileId","Std","Utf8Component","Utf8Path","Utf8PathBuf","ancestors","as_intern_id","as_os_str","","as_path","as_ref","","","","","","","","","","","","as_std_path","as_str","","borrow","","","","","","","borrow_mut","","","","","","canonicalize","canonicalize_utf8","capacity","clear","clone","","","","","clone_into","","","","","clone_to_uninit","","","","","cmp","","","common_prefix","compare","","","components","content","default","deref","deserialize","dummy_file","ends_with","eq","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","exists","extend","extension","file_name","file_stem","fmt","","","","","","","","","from","","","","","","","","","","from_intern_id","from_iter","from_path","from_path_buf","from_str","has_root","hash","","","","","","include_dir","into","","","","","into_boxed_path","into_iter","","into_os_string","into_path_buf","into_std_path_buf","into_string","is_absolute","is_dir","is_dummy","is_file","is_relative","is_symlink","iter","join","join_os","kind","line_index","line_range","metadata","new","","","new_local","new_std","parent","partial_cmp","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","path","","pop","push","read_dir","read_dir_utf8","read_link","read_link_utf8","reserve","reserve_exact","set_extension","set_file_name","shrink_to","shrink_to_fit","starts_with","strip_prefix","symlink_metadata","to_owned","","","","","","to_path_buf","to_string","","","try_exists","try_from","","","","","","","try_into","","","","","try_reserve","try_reserve_exact","type_id","","","","","","with_capacity","with_extension","with_file_name","Binary","Decimal","Hexadecimal","Literal","Octal","Radix","as_num","borrow","","borrow_mut","","clone","","clone_into","","clone_to_uninit","","eq","equivalent","","","","fmt","","from","","into","","new","parse","radix","to_hex_str","to_owned","","try_from","","try_into","","type_id","","install_panic_hook","dirs","files","git","humanize","keccak","ron","get_fe_deps","get_fe_home","BuildFiles","Dependency","DependencyKind","DependencyResolver","FileLoader","Fs","Git","GitDependency","Lib","Local","LocalDependency","Main","ProjectFiles","ProjectMode","Static","borrow","","","","","","","","borrow_mut","","","","","","","","canonicalize_path","canonicalized_path","clone","","","","","clone_into","","","","","clone_to_uninit","","","","","dependencies","eq","equivalent","","","","fe_files","file_content","from","","","","","","","","get_project_root","into","","","","","","","","kind","load_fs","load_static","mode","name","","project_files","resolve","","","root_project_mode","root_project_path","src","to_owned","","","","","try_from","","","","","","","","try_into","","","","","","","","type_id","","","","","","","","version","","fetch_and_checkout","Pluralizable","pluralize_conditionally","to_plural","to_singular","full","full_as_bytes","partial","partial_right_padded","Diff","borrow","borrow_mut","fmt","from","into","new","to_ron_string_pretty","to_string","try_from","try_into","type_id"],"q":[[0,"fe_common"],[48,"fe_common::db"],[175,"fe_common::diagnostics"],[275,"fe_common::diagnostics::cs"],[276,"fe_common::diagnostics"],[278,"fe_common::diagnostics::cs"],[280,"fe_common::diagnostics"],[281,"fe_common::diagnostics::cs"],[284,"fe_common::diagnostics"],[285,"fe_common::diagnostics::cs"],[361,"fe_common::files"],[672,"fe_common::numeric"],[712,"fe_common::panic"],[713,"fe_common::utils"],[719,"fe_common::utils::dirs"],[721,"fe_common::utils::files"],[838,"fe_common::utils::git"],[839,"fe_common::utils::humanize"],[843,"fe_common::utils::keccak"],[847,"fe_common::utils::ron"],[859,"fe_common::span"],[860,"core::option"],[861,"core::result"],[862,"serde::de"],[863,"core::fmt"],[864,"core::convert"],[865,"core::hash"],[866,"serde::ser"],[867,"core::any"],[868,"alloc::rc"],[869,"alloc::sync"],[870,"smol_str"],[871,"salsa"],[872,"salsa::runtime"],[873,"core::ops::function"],[874,"salsa::revision"],[875,"salsa::durability"],[876,"core::marker"],[877,"codespan_reporting::diagnostic"],[878,"alloc::string"],[879,"alloc::vec"],[880,"core::cmp"],[881,"core::clone"],[882,"core::ops::range"],[883,"camino"],[884,"salsa::intern_id"],[885,"std::ffi::os_str"],[886,"std::path"],[887,"std::io::error"],[888,"alloc::borrow"],[889,"core::iter::traits::collect"],[890,"alloc::boxed"],[891,"std::fs"],[892,"alloc::collections"],[893,"num_traits"],[894,"num_bigint::bigint"],[895,"indexmap::map"],[896,"core::error"],[897,"ron::ser"]],"i":"`````b0000``00000`0`00000000`0000`000``0f11111`1```````````M`ChBfBhBjBlBnC`7654321054321021Cb17017017654327171876543211654326543201787654321017717111654320101876543218765432187654321EdEhEj`00``0En0`11El1F`3120312031203120``312033331111222200001312031203120312010110130`010031203120312031203`33``3Fn0`40FhFf2100210210210021022221111000001210221002100101000211101210210210210000100H```Hj1111`0```GhAh13Hb2222000044442242004Dj423150423311150421504215042315`31532112233333333333333333333333333311111111111111115042333311115555000044442222313333311550423111115042213113315042`15042131131133233333302233122233333333333333333333333333311111111111111115201133331111113333150423315331150421504211315042133Jf00`0`00Jj1010101011111101010000`10101010``````````````K`Kj`Kd1`0``22L`Kl2KbKfKh674352106725210652106521063555557774352106`743521062443324Mb215546321785463217854632178546321743```Lf0`````Lj00000`0000","f":"`````{{b{d{c}}}bf}{{bb}b}{{b{h{b}}}b}{{b{h{{d{c}}}}}b{}}{{{d{jb}}c}l{}}``{d{{d{c}}}{}}{{{d{j}}}{{d{jc}}}{}}{{{d{b}}}b}{{d{d{jc}}}l{}}{{dn}l}`{c{{A`{b}}}Ab}`{{}b}{bAd}{{{d{b}}{d{b}}}Af}{{d{d{c}}}Af{}}000{bAh}`{{{d{b}}{d{jAj}}}Al}{cc{}}{{ce}b{{An{b}}}{{An{b}}}}{{{d{b}}{d{jc}}}lB`}`{{}c{}}{{{d{b}}}Af}{{AhAdAd}b}``{{{d{b}}c}A`Bb}{{{d{f}}}b}<{dc{}}{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dBd}`{Ahb}```````````{d{{d{c}}}{}}0000000{{{d{j}}}{{d{jc}}}{}}0000000{{}Bf}{{}Bh}{{}Bj}{{}Bl}{{}Bn}{{}C`}{{{d{c}}e}g{}{}{}}0{{{d{Cb}}Ah}{{Cf{Cd}}}}{{dAh}{{Cf{Cd}}}}{ChCj}{{{d{Cb}}Ah}{{Cf{{Cl{Ad}}}}}}{{dAh}{{Cf{{Cl{Ad}}}}}}2{{{d{Cb}}Ah}Cn}{{dAh}Cn}4{{{d{Bf}}{d{jAj}}}Al}{{{d{Bh}}{d{jAj}}}Al}{{{d{Bj}}{d{jAj}}}Al}{{{d{Bl}}{d{jAj}}}Al}{{{d{Bn}}{d{jAj}}}Al}{{{d{Ch}}{d{Cb}}D`{d{jAj}}}Al}{{{d{C`}}D`{d{jAj}}}Al}{{{d{Ch}}{d{Db}}{d{jDd}}}l}{{{d{C`}}{d{jDd}}}l}{cc{}}0000000{{{d{C`}}}d}{{Bf{d{Cb}}}{{Df{Bf}}}}{{Bh{d{Cb}}}{{Df{Bh}}}}{{Bj{d{Cb}}}{{Df{Bj}}}}{{Bl{d{Cb}}}{{Df{Bl}}}}{{Bn{d{Cb}}}{{Df{Bn}}}}{{Bf{d{jCb}}}{{Dh{Bf}}}}{{Bh{d{jCb}}}{{Dh{Bh}}}}{{Bj{d{jCb}}}{{Dh{Bj}}}}{{Bl{d{jCb}}}{{Dh{Bl}}}}{{Bn{d{jCb}}}{{Dh{Bn}}}}{{{d{Cb}}Dj}Ah}{{dDj}Ah}{ChCj}{{}c{}}0000000{{{d{Cb}}Ah}Dj}{{dAh}Dj}3{{{d{Ch}}{d{Cb}}D`Dl}Af}{{{d{C`}}D`Dl}Af}{DnCh}{{{d{C`}}}{{d{E`}}}}{{{d{C`}}}{{d{Db}}}}{{{d{jC`}}}{{d{jDb}}}}{{{d{c}}}{{d{{Cj{e}}}}}{}{}}0000{{{d{jCb}}Ah{Cf{Cd}}}l}{{{d{j}}Ah{Cf{Cd}}}l}{{{d{jCb}}Ah{Cf{Cd}}Eb}l}{{{d{j}}Ah{Cf{Cd}}Eb}l}{c{{A`{e}}}{}{}}0000000{{}{{A`{c}}}{}}0000000{dBd}0000000{{{d{Ed}}}{{d{c}}}Ef}{{{d{jEh}}}{{d{jc}}}Ef}```````````{d{{d{c}}}{}}000{{{d{j}}}{{d{jc}}}{}}000{{{d{Ej}}}Ej}{{{d{El}}}El}{{{d{En}}}En}{{{d{F`}}}F`}{{d{d{jc}}}l{}}000{{dn}l}000`{{{d{Cb}}{d{{Cl{El}}}}}Fb}{{{d{Ej}}{d{Ej}}}Af}{{{d{El}}{d{El}}}Af}{{{d{En}}{d{En}}}Af}{{{d{F`}}{d{F`}}}Af}{{d{d{c}}}Af{}}000000000000000{FbEl}{{{d{Ej}}{d{jAj}}}{{A`{lFd}}}}{{{d{El}}{d{jAj}}}Al}{{{d{En}}{d{jAj}}}Al}{{{d{F`}}{d{jAj}}}Al}{cc{}}000{{{d{Ej}}{d{jc}}}lB`}{{{d{El}}{d{jc}}}lB`}{{{d{En}}{d{jc}}}lB`}{{{d{F`}}{d{jc}}}lB`}{{}c{}}000{El{{Ff{Ah}}}}{F`{{Fh{Ah}}}}{ElFj}{ElFb}{F`Fb}2{{{d{Ej}}{d{Ej}}}{{h{Fl}}}}{{bc}F`{{An{Fb}}}}{{{d{Cb}}{d{{Cl{El}}}}}l}1{ElEj}{F`b}{F`En}{dc{}}000{c{{A`{e}}}{}{}}000{{}{{A`{c}}}{}}000{dBd}000```````````{d{{d{c}}}{}}00{{{d{j}}}{{d{jc}}}{}}00{{}{{Ff{c}}}{}}{{{d{Fn}}}Fn}{{{d{{Fh{c}}}}}{{Fh{c}}}G`}{{{d{{Ff{c}}}}}{{Ff{c}}}G`}{{d{d{jc}}}l{}}00{{dn}l}00{Ffh}{{{d{Fn}}{d{Fn}}}Af}{{{d{{Fh{c}}}}{d{{Fh{c}}}}}AfGb}{{{d{{Ff{c}}}}{d{{Ff{c}}}}}AfGb}{{d{d{c}}}Af{}}00000000000:{Fh}{{{d{Fn}}{d{jAj}}}{{A`{lFd}}}}{{{d{{Fh{c}}}}{d{jAj}}}{{A`{lFd}}}Gd}{{{d{{Ff{c}}}}{d{jAj}}}{{A`{lFd}}}Gd}{EnFn}{cc{}}00{{}{{Ff{c}}}{}}{{}c{}}00{FfFj}{FhFb}{FfFb}{{Fnce}{{Fh{c}}}{}{{An{{Gf{Ad}}}}}}{Ej{{Ff{c}}}{}}64{{{d{Fn}}{d{Fn}}}{{h{Fl}}}}{{ce}{{Fh{c}}}{}{{An{{Gf{Ad}}}}}}{FhGf}1{FfEj}{FhFn}{dc{}}00{c{{A`{e}}}{}{}}00{{}{{A`{c}}}{}}00{dBd}00?{{{Ff{c}}e}{{Ff{c}}}{}{{An{Fb}}}}{{{Ff{c}}{Fj{{Fh{c}}}}}{{Ff{c}}}{}}{{{Fh{c}}e}{{Fh{c}}}{}{{An{Fb}}}}2{{{Ff{c}}{Fj{Fb}}}{{Ff{c}}}{}}`````````````{{{d{Gh}}}Gj}{{{d{Ah}}}Gl}{{{d{Gh}}}{{d{Gn}}}}{{{d{H`}}}{{d{Gn}}}}{{{d{Hb}}}{{d{Gh}}}}{{{d{Gh}}}{{d{Cd}}}}{{{d{Gh}}}{{d{Gh}}}}4{{{d{Gh}}}{{d{Hd}}}}3{{{d{Hb}}}{{d{Gn}}}}{{{d{Hb}}}{{d{Hd}}}}{{{d{Hb}}}{{d{Cd}}}}{{{d{H`}}}{{d{Cd}}}}8{{{d{H`}}}{{d{Hd}}}}{{{d{H`}}}{{d{Gh}}}}682{d{{d{c}}}{}}0:0000{{{d{j}}}{{d{jc}}}{}}00000{{{d{Gh}}}{{A`{HfHh}}}}{{{d{Gh}}}{{A`{HbHh}}}}{{{d{Hb}}}Ad}{{{d{jHb}}}l}{{{d{Hb}}}Hb}{{{d{H`}}}H`}{{{d{Dj}}}Dj}{{{d{Hj}}}Hj}{{{d{Ah}}}Ah}{{d{d{jc}}}l{}}0000{{dn}l}0000{{{d{Gh}}{d{Gh}}}Fl}{{{d{Hb}}{d{Hb}}}Fl}{{{d{H`}}{d{H`}}}Fl}{{{d{Gh}}{d{Gh}}}Hb}{{d{d{c}}}Fl{}}00{{{d{Gh}}}Hl}{{{d{Ah}}{d{Cb}}}{{Cf{Cd}}}}{{}Hb}{{{d{Hb}}}{{d{Gh}}}}{c{{A`{Ah}}}Ab}{{}Ah}{{{d{Gh}}c}Af{{Hn{Hd}}}}{{{d{{d{Gh}}}}{d{{I`{Gn}}}}}Af}{{{d{Gh}}{d{Hf}}}Af}{{{d{Gh}}{d{{I`{Gn}}}}}Af}{{{d{Gh}}{d{{d{Gn}}}}}Af}{{{d{Gh}}{d{Gn}}}Af}{{{d{{d{Gh}}}}{d{Gn}}}Af}{{{d{Gh}}{d{Gh}}}Af}{{{d{Gh}}{d{Hb}}}Af}{{{d{Gh}}{d{Ib}}}Af}{{{d{{d{Gh}}}}{d{Fb}}}Af}{{{d{{d{Gh}}}}{d{{I`{Cd}}}}}Af}{{{d{{d{Gh}}}}{d{Cd}}}Af}{{{d{Gh}}{d{Fb}}}Af}{{{d{{d{Gh}}}}{d{Ib}}}Af}{{{d{Gh}}{d{{d{Cd}}}}}Af}{{{d{Gh}}{d{Cd}}}Af}{{{d{{d{Gh}}}}{d{Hb}}}Af}{{{d{Gh}}{d{{I`{Gh}}}}}Af}{{{d{{d{Gh}}}}{d{{I`{Gh}}}}}Af}{{{d{Gh}}{d{Hd}}}Af}{{{d{{d{Gh}}}}{d{Hf}}}Af}{{{d{{d{Gh}}}}{d{{I`{Hd}}}}}Af}{{{d{{d{Gh}}}}{d{Hd}}}Af}{{{d{Gh}}{d{{d{Hd}}}}}Af}{{{d{Gh}}{d{{I`{Hd}}}}}Af}{{{d{Gh}}{d{{I`{Cd}}}}}Af}{{{d{Hb}}{d{Gn}}}Af}{{{d{Hb}}{d{Hf}}}Af}{{{d{Hb}}{d{{d{Gh}}}}}Af}{{{d{Hb}}{d{Ib}}}Af}{{{d{Hb}}{d{{I`{Cd}}}}}Af}{{{d{Hb}}{d{{d{Cd}}}}}Af}{{{d{Hb}}{d{Cd}}}Af}{{{d{Hb}}{d{{I`{Gh}}}}}Af}{{{d{Hb}}{d{Hd}}}Af}{{{d{Hb}}{d{{d{Hd}}}}}Af}{{{d{Hb}}{d{{I`{Gn}}}}}Af}{{{d{Hb}}{d{{I`{Hd}}}}}Af}{{{d{Hb}}{d{Hb}}}Af}{{{d{Hb}}{d{{d{Gn}}}}}Af}{{{d{Hb}}{d{Gh}}}Af}{{{d{Hb}}{d{Fb}}}Af}{{{d{H`}}{d{H`}}}Af}{{{d{Dj}}{d{Dj}}}Af}{{{d{Hj}}{d{Hj}}}Af}{{{d{Ah}}{d{Ah}}}Af}{{d{d{c}}}Af{}}00000000000000000000000{{{d{Gh}}}Af}{{{d{jHb}}e}l{{Hn{Gh}}}{{If{}{{Id{c}}}}}}{{{d{Gh}}}{{h{{d{Cd}}}}}}00{{{d{Gh}}{d{jAj}}}{{A`{lFd}}}}0{{{d{Hb}}{d{jAj}}}{{A`{lFd}}}}0{{{d{H`}}{d{jAj}}}{{A`{lFd}}}}0{{{d{Dj}}{d{jAj}}}Al}{{{d{Hj}}{d{jAj}}}Al}{{{d{Ah}}{d{jAj}}}Al}{{{d{Cd}}}{{d{Gh}}}}{cc{}}{FbHb}{{{d{c}}}Hb{{Hn{Cd}}Ef}}{{{Ih{Gh}}}Hb}{{{I`{Gh}}}Hb}4444{GlAh}{eHb{{Hn{Gh}}}{{If{}{{Id{c}}}}}}{{{d{Hd}}}{{h{{d{Gh}}}}}}{Hf{{A`{HbHf}}}}{{{d{Cd}}}{{A`{Hb}}}}{{{d{Gh}}}Af}{{{d{Gh}}{d{jc}}}lB`}{{{d{Hb}}{d{jc}}}lB`}{{{d{H`}}{d{jc}}}lB`}{{{d{Dj}}{d{jc}}}lB`}{{{d{Hj}}{d{jc}}}lB`}{{{d{Ah}}{d{jc}}}lB`}`{{}c{}}0000{Hb{{Ih{Gh}}}}{{{d{Gh}}}Ij}{{{d{Hb}}}Ij}{HbIb}{{{Ih{Gh}}}Hb}{HbHf}{HbFb}>>{AhAf}???6{{{d{Gh}}c}Hb{{Hn{Gh}}}}{{{d{Gh}}c}Hf{{Hn{Hd}}}}{DjHj}{{{d{Ah}}{d{Cb}}Ad}Ad}{{{d{Ah}}{d{Cb}}Ad}{{h{{Gf{Ad}}}}}}{{{d{Gh}}}{{A`{IlHh}}}}{{{d{c}}}{{d{Gh}}}{{Hn{Cd}}Ef}}{{}Hb}{{{d{jCb}}Hj{d{Cd}}{Cf{Cd}}}Ah}{{{d{jCb}}{d{Cd}}{Cf{Cd}}}Ah}0{{{d{Gh}}}{{h{{d{Gh}}}}}}{{{d{{d{Gh}}}}{d{Gn}}}{{h{Fl}}}}{{{d{Gh}}{d{{d{Gn}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Gh}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Hd}}}{{h{Fl}}}}{{{d{Gh}}{d{Hb}}}{{h{Fl}}}}{{{d{Gh}}{d{{d{Hd}}}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Hd}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Hf}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Hd}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Hd}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Hf}}}{{h{Fl}}}}{{{d{Gh}}{d{Cd}}}{{h{Fl}}}}{{{d{Gh}}{d{{d{Cd}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Gh}}}{{h{Fl}}}}{{{d{Gh}}{d{Fb}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Ib}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Hb}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Gn}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Cd}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Cd}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Fb}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Gh}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Ib}}}{{h{Fl}}}}{{{d{Gh}}{d{Gn}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Gn}}}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Cd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Gn}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Cd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Gh}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Ib}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Gn}}}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Gn}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Hd}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Gh}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Gh}}}{{h{Fl}}}}{{{d{Hb}}{d{Hb}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Hd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Hd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Hf}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Cd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Fb}}}{{h{Fl}}}}{{{d{Hb}}{d{Cd}}}{{h{Fl}}}}{{{d{H`}}{d{H`}}}{{h{Fl}}}}{{{d{Ah}}{d{Cb}}}{{Cf{Hb}}}}{DjCf}{{{d{jHb}}}Af}{{{d{jHb}}c}l{{Hn{Gh}}}}{{{d{Gh}}}{{A`{InHh}}}}{{{d{Gh}}}{{A`{J`Hh}}}}{{{d{Gh}}}{{A`{HfHh}}}}{{{d{Gh}}}{{A`{HbHh}}}}{{{d{jHb}}Ad}l}0{{{d{jHb}}c}Af{{Hn{Cd}}}}{{{d{jHb}}c}l{{Hn{Cd}}}}2{{{d{jHb}}}l}{{{d{Gh}}c}Af{{Hn{Hd}}}}{{{d{Gh}}c}{{A`{{d{Gh}}Jb}}}{{Hn{Hd}}}}{{{d{Gh}}}{{A`{IlHh}}}}{{{d{Gh}}}Hb}{dc{}}00001{dFb}00{{{d{Gh}}}{{A`{AfHh}}}}{{{d{Hd}}}{{A`{{d{Gh}}}}}}{c{{A`{e}}}{}{}}{Hf{{A`{Hb}}}}1111{{}{{A`{c}}}{}}0000{{{d{jHb}}Ad}{{A`{lJd}}}}0{dBd}00000{AdHb}{{{d{Gh}}c}Hb{{Hn{Cd}}}}0``````{JfJh}{d{{d{c}}}{}}0{{{d{j}}}{{d{jc}}}{}}0{{{d{Jf}}}Jf}{{{d{Jj}}}Jj}{{d{d{jc}}}l{}}0{{dn}l}0{{{d{Jf}}{d{Jf}}}Af}{{d{d{c}}}Af{}}000{{{d{Jf}}{d{jAj}}}Al}{{{d{Jj}}{d{jAj}}}Al}{cc{}}0{{}c{}}0{{{d{Cd}}}Jj}{{{d{Jj}}}{{A`{c}}}Jl}{{{d{Jj}}}Jf}{{{d{Jn}}}Fb}{dc{}}0{c{{A`{e}}}{}{}}0{{}{{A`{c}}}{}}0{dBd}0{{}l}``````{{}Hf}0```````````````{d{{d{c}}}{}}0000000{{{d{j}}}{{d{jc}}}{}}0000000{{{d{K`}}{d{Cd}}}{{A`{CnFb}}}}{KbCn}{{{d{Kd}}}Kd}{{{d{Kb}}}Kb}{{{d{Kf}}}Kf}{{{d{Kh}}}Kh}{{{d{Kj}}}Kj}{{d{d{jc}}}l{}}0000{{dn}l}0000{KlFj}{{{d{Kd}}{d{Kd}}}Af}{{d{d{c}}}Af{}}000{{{d{K`}}{d{Cd}}}{{A`{{Fj{{Kn{FbFb}}}}Fb}}}}{{{d{K`}}{d{Cd}}}{{A`{FbFb}}}}{cc{}}0000000{{}{{h{Fb}}}}{{}c{}}0000000{KbKj}{{{d{Cd}}}{{A`{L`Fb}}}}{{{Fj{{Kn{{d{Cd}}{d{Cd}}}}}}{d{Cd}}}{{A`{L`Fb}}}}{KlKd}{KlCn}{KbCn}{L`Lb}{{{d{Kb}}{d{K`}}}{{A`{KlFb}}}}00{{{d{L`}}}Kd}{L`Cn}{KlFj}{dc{}}0000{c{{A`{e}}}{}{}}0000000{{}{{A`{c}}}{}}0000000{dBd}0000000:{Kbh}{{{d{Cd}}c{d{Cd}}}{{A`{l{Ih{Ld}}}}}{{Hn{Hd}}}}`{{cAd}FbLf}{{{d{Lf}}}Fb}0{{{d{{Cl{n}}}}}Fb}{{{d{{Cl{n}}}}}{{Lh{n}}}}{{{d{{Cl{n}}}}Ad}Fb}0`{d{{d{c}}}{}}{{{d{j}}}{{d{jc}}}{}}{{{d{Lj}}{d{jAj}}}Al}{cc{}}{{}c{}}{{{d{Cd}}{d{Cd}}}Lj}{{{d{c}}}{{Ll{Fb}}}Ln}{dFb}{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dBd}","D":"AJn","p":[[5,"Span",0,859],[1,"reference",null,null,1],[10,"Spanned",0,859],[6,"Option",860,null,1],[0,"mut"],[1,"unit"],[1,"u8"],[6,"Result",861,null,1],[10,"Deserializer",862],[1,"usize"],[1,"bool"],[5,"SourceFileId",361],[5,"Formatter",863],[8,"Result",863],[10,"Into",864,null,1],[10,"Hasher",865],[10,"Serializer",866],[5,"TypeId",867],[5,"InternFileQuery",48],[5,"InternFileLookupQuery",48],[5,"FileContentQuery",48],[5,"FileLineStartsQuery",48],[5,"FileNameQuery",48],[5,"TestDb",48],[10,"SourceDb",48],[1,"str"],[5,"Rc",868,null,1],[5,"SourceDbGroupStorage__",48],[5,"Arc",869,null,1],[1,"slice"],[5,"SmolStr",870],[5,"DatabaseKeyIndex",871],[5,"Runtime",872],[10,"FnMut",873],[5,"QueryTable",871],[5,"QueryTableMut",871],[5,"File",361],[5,"Revision",874],[1,"u16"],[10,"Database",871],[5,"Durability",875],[10,"Upcast",48],[10,"Sized",876],[10,"UpcastMut",48],[6,"Severity",284,877],[5,"Diagnostic",284],[6,"LabelStyle",284],[5,"Label",284],[5,"String",878],[5,"Error",863],[5,"Diagnostic",285,877],[5,"Label",285,877],[5,"Vec",879],[6,"Ordering",880],[6,"LabelStyle",285,877],[10,"Clone",881],[10,"PartialEq",880],[10,"Debug",863],[5,"Range",882],[5,"Utf8Path",361,883],[5,"Utf8Ancestors",883],[5,"InternId",884],[5,"OsStr",885],[6,"Utf8Component",361,883],[5,"Utf8PathBuf",361,883],[5,"Path",886],[5,"PathBuf",886],[5,"Error",887],[6,"FileKind",361],[5,"Utf8Components",883],[10,"AsRef",864],[6,"Cow",888],[5,"OsString",885],[17,"Item"],[10,"IntoIterator",889],[5,"Box",890,null,1],[5,"Iter",883],[5,"Metadata",891],[5,"ReadDir",891],[5,"ReadDirUtf8",883],[5,"StripPrefixError",886],[5,"TryReserveError",892],[6,"Radix",672],[1,"u32"],[5,"Literal",672],[10,"Num",893],[5,"BigInt",894],[6,"FileLoader",721],[5,"Dependency",721],[6,"ProjectMode",721],[5,"LocalDependency",721],[5,"GitDependency",721],[6,"DependencyKind",721],[5,"ProjectFiles",721],[1,"tuple",null,null,1],[5,"BuildFiles",721],[5,"IndexMap",895],[10,"Error",896],[10,"Pluralizable",839],[1,"array"],[5,"Diff",847],[8,"Result",897],[10,"Serialize",866],[5,"SourceDbStorage",48],[10,"DependencyResolver",721]],"r":[[0,361],[1,361],[2,361],[3,859],[4,859],[5,859],[6,859],[7,859],[8,859],[9,859],[12,859],[13,859],[14,859],[15,859],[16,859],[18,859],[20,859],[21,859],[22,859],[23,859],[24,859],[25,859],[26,859],[27,859],[29,859],[30,859],[31,859],[32,859],[34,859],[35,859],[36,859],[39,859],[40,859],[41,859],[42,859],[43,859],[44,859],[45,859],[47,859],[175,877],[177,877],[178,877],[181,877],[184,877],[185,877],[186,877],[190,877],[194,877],[198,877],[202,877],[208,877],[212,877],[213,877],[214,877],[215,877],[229,877],[233,877],[237,877],[241,877],[251,877],[258,877],[262,877],[266,877],[270,877],[274,877],[275,877],[276,877],[277,877],[278,877],[279,877],[280,877],[281,877],[282,877],[283,877],[284,877],[285,877],[286,877],[287,877],[288,877],[289,877],[290,877],[291,877],[292,877],[293,877],[294,877],[295,877],[296,877],[297,877],[298,877],[299,877],[300,877],[301,877],[302,877],[303,877],[304,877],[305,877],[306,877],[307,877],[308,877],[309,877],[310,877],[311,877],[312,877],[313,877],[314,877],[315,877],[316,877],[317,877],[318,877],[319,877],[320,877],[321,877],[322,877],[323,877],[324,877],[325,877],[326,877],[327,877],[328,877],[329,877],[330,877],[331,877],[332,877],[333,877],[334,877],[335,877],[336,877],[337,877],[338,877],[339,877],[340,877],[341,877],[342,877],[343,877],[344,877],[345,877],[346,877],[347,877],[348,877],[349,877],[350,877],[351,877],[352,877],[353,877],[354,877],[355,877],[356,877],[357,877],[358,877],[359,877],[360,877],[361,883],[365,883],[366,883],[367,883],[368,883],[371,883],[372,883],[373,883],[374,883],[376,883],[377,883],[378,883],[379,883],[380,883],[381,883],[382,883],[383,883],[384,883],[385,883],[386,883],[387,883],[388,883],[389,883],[390,883],[391,883],[392,883],[393,883],[394,883],[395,883],[396,883],[397,883],[401,883],[402,883],[403,883],[407,883],[408,883],[409,883],[410,883],[411,883],[412,883],[416,883],[417,883],[421,883],[422,883],[426,883],[427,883],[428,883],[430,883],[431,883],[432,883],[433,883],[435,883],[436,883],[439,883],[440,883],[441,883],[442,883],[443,883],[444,883],[445,883],[446,883],[447,883],[448,883],[449,883],[450,883],[451,883],[452,883],[453,883],[454,883],[455,883],[456,883],[457,883],[458,883],[459,883],[460,883],[461,883],[462,883],[463,883],[464,883],[465,883],[466,883],[467,883],[468,883],[469,883],[470,883],[471,883],[472,883],[473,883],[474,883],[475,883],[476,883],[477,883],[478,883],[479,883],[480,883],[481,883],[482,883],[486,883],[487,883],[488,883],[489,883],[490,883],[491,883],[492,883],[493,883],[494,883],[495,883],[496,883],[497,883],[510,883],[511,883],[512,883],[513,883],[514,883],[515,883],[516,883],[517,883],[518,883],[519,883],[520,883],[524,883],[525,883],[526,883],[527,883],[528,883],[529,883],[530,883],[535,883],[536,883],[537,883],[538,883],[539,883],[540,883],[541,883],[542,883],[547,883],[548,883],[552,883],[553,883],[554,883],[555,883],[556,883],[557,883],[558,883],[559,883],[560,883],[562,883],[563,883],[564,883],[565,883],[566,883],[567,883],[571,883],[572,883],[573,883],[577,883],[578,883],[579,883],[580,883],[581,883],[582,883],[583,883],[584,883],[585,883],[586,883],[587,883],[588,883],[589,883],[590,883],[591,883],[592,883],[593,883],[594,883],[595,883],[596,883],[597,883],[598,883],[599,883],[600,883],[601,883],[602,883],[603,883],[604,883],[605,883],[606,883],[607,883],[608,883],[609,883],[610,883],[611,883],[612,883],[613,883],[614,883],[615,883],[616,883],[617,883],[618,883],[619,883],[620,883],[623,883],[624,883],[625,883],[626,883],[627,883],[628,883],[629,883],[630,883],[631,883],[632,883],[633,883],[634,883],[635,883],[636,883],[637,883],[638,883],[639,883],[640,883],[644,883],[645,883],[646,883],[647,883],[648,883],[649,883],[650,883],[651,883],[652,883],[656,883],[657,883],[661,883],[662,883],[663,883],[664,883],[665,883],[669,883],[670,883],[671,883]],"b":[[5,"impl-Add%3C%26T%3E-for-Span"],[6,"impl-Add-for-Span"],[7,"impl-Add%3COption%3CSpan%3E%3E-for-Span"],[8,"impl-Add%3COption%3C%26T%3E%3E-for-Span"],[379,"impl-AsRef%3Cstr%3E-for-Utf8Path"],[380,"impl-AsRef%3CUtf8Path%3E-for-Utf8Path"],[381,"impl-AsRef%3COsStr%3E-for-Utf8Path"],[382,"impl-AsRef%3CPath%3E-for-Utf8Path"],[383,"impl-AsRef%3CUtf8Path%3E-for-Utf8PathBuf"],[384,"impl-AsRef%3COsStr%3E-for-Utf8PathBuf"],[385,"impl-AsRef%3CPath%3E-for-Utf8PathBuf"],[386,"impl-AsRef%3Cstr%3E-for-Utf8PathBuf"],[387,"impl-AsRef%3Cstr%3E-for-Utf8Component%3C\'_%3E"],[388,"impl-AsRef%3COsStr%3E-for-Utf8Component%3C\'_%3E"],[389,"impl-AsRef%3CPath%3E-for-Utf8Component%3C\'_%3E"],[390,"impl-AsRef%3CUtf8Path%3E-for-Utf8Component%3C\'_%3E"],[440,"impl-PartialEq%3CCow%3C\'b,+OsStr%3E%3E-for-%26Utf8Path"],[441,"impl-PartialEq%3CPathBuf%3E-for-Utf8Path"],[442,"impl-PartialEq%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8Path"],[443,"impl-PartialEq%3C%26OsStr%3E-for-Utf8Path"],[444,"impl-PartialEq%3COsStr%3E-for-Utf8Path"],[445,"impl-PartialEq%3COsStr%3E-for-%26Utf8Path"],[446,"impl-PartialEq-for-Utf8Path"],[447,"impl-PartialEq%3CUtf8PathBuf%3E-for-Utf8Path"],[448,"impl-PartialEq%3COsString%3E-for-Utf8Path"],[449,"impl-PartialEq%3CString%3E-for-%26Utf8Path"],[450,"impl-PartialEq%3CCow%3C\'b,+str%3E%3E-for-%26Utf8Path"],[451,"impl-PartialEq%3Cstr%3E-for-%26Utf8Path"],[452,"impl-PartialEq%3CString%3E-for-Utf8Path"],[453,"impl-PartialEq%3COsString%3E-for-%26Utf8Path"],[454,"impl-PartialEq%3C%26str%3E-for-Utf8Path"],[455,"impl-PartialEq%3Cstr%3E-for-Utf8Path"],[456,"impl-PartialEq%3CUtf8PathBuf%3E-for-%26Utf8Path"],[457,"impl-PartialEq%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8Path"],[458,"impl-PartialEq%3CCow%3C\'a,+Utf8Path%3E%3E-for-%26Utf8Path"],[459,"impl-PartialEq%3CPath%3E-for-Utf8Path"],[460,"impl-PartialEq%3CPathBuf%3E-for-%26Utf8Path"],[461,"impl-PartialEq%3CCow%3C\'b,+Path%3E%3E-for-%26Utf8Path"],[462,"impl-PartialEq%3CPath%3E-for-%26Utf8Path"],[463,"impl-PartialEq%3C%26Path%3E-for-Utf8Path"],[464,"impl-PartialEq%3CCow%3C\'a,+Path%3E%3E-for-Utf8Path"],[465,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-Utf8Path"],[466,"impl-PartialEq%3COsStr%3E-for-Utf8PathBuf"],[467,"impl-PartialEq%3CPathBuf%3E-for-Utf8PathBuf"],[468,"impl-PartialEq%3C%26Utf8Path%3E-for-Utf8PathBuf"],[469,"impl-PartialEq%3COsString%3E-for-Utf8PathBuf"],[470,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-Utf8PathBuf"],[471,"impl-PartialEq%3C%26str%3E-for-Utf8PathBuf"],[472,"impl-PartialEq%3Cstr%3E-for-Utf8PathBuf"],[473,"impl-PartialEq%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8PathBuf"],[474,"impl-PartialEq%3CPath%3E-for-Utf8PathBuf"],[475,"impl-PartialEq%3C%26Path%3E-for-Utf8PathBuf"],[476,"impl-PartialEq%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8PathBuf"],[477,"impl-PartialEq%3CCow%3C\'a,+Path%3E%3E-for-Utf8PathBuf"],[478,"impl-PartialEq-for-Utf8PathBuf"],[479,"impl-PartialEq%3C%26OsStr%3E-for-Utf8PathBuf"],[480,"impl-PartialEq%3CUtf8Path%3E-for-Utf8PathBuf"],[481,"impl-PartialEq%3CString%3E-for-Utf8PathBuf"],[515,"impl-Debug-for-Utf8Path"],[516,"impl-Display-for-Utf8Path"],[517,"impl-Debug-for-Utf8PathBuf"],[518,"impl-Display-for-Utf8PathBuf"],[519,"impl-Display-for-Utf8Component%3C\'a%3E"],[520,"impl-Debug-for-Utf8Component%3C\'a%3E"],[526,"impl-From%3CString%3E-for-Utf8PathBuf"],[527,"impl-From%3C%26T%3E-for-Utf8PathBuf"],[528,"impl-From%3CBox%3CUtf8Path%3E%3E-for-Utf8PathBuf"],[529,"impl-From%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8PathBuf"],[578,"impl-PartialOrd%3COsStr%3E-for-%26Utf8Path"],[579,"impl-PartialOrd%3C%26OsStr%3E-for-Utf8Path"],[580,"impl-PartialOrd%3CCow%3C\'a,+Utf8Path%3E%3E-for-%26Utf8Path"],[581,"impl-PartialOrd%3CPath%3E-for-Utf8Path"],[582,"impl-PartialOrd%3CUtf8PathBuf%3E-for-Utf8Path"],[583,"impl-PartialOrd%3C%26Path%3E-for-Utf8Path"],[584,"impl-PartialOrd%3CCow%3C\'a,+Path%3E%3E-for-Utf8Path"],[585,"impl-PartialOrd%3CPathBuf%3E-for-Utf8Path"],[586,"impl-PartialOrd%3CPath%3E-for-%26Utf8Path"],[587,"impl-PartialOrd%3CCow%3C\'b,+Path%3E%3E-for-%26Utf8Path"],[588,"impl-PartialOrd%3CPathBuf%3E-for-%26Utf8Path"],[589,"impl-PartialOrd%3Cstr%3E-for-Utf8Path"],[590,"impl-PartialOrd%3C%26str%3E-for-Utf8Path"],[591,"impl-PartialOrd-for-Utf8Path"],[592,"impl-PartialOrd%3CString%3E-for-Utf8Path"],[593,"impl-PartialOrd%3COsString%3E-for-%26Utf8Path"],[594,"impl-PartialOrd%3CUtf8PathBuf%3E-for-%26Utf8Path"],[595,"impl-PartialOrd%3CCow%3C\'b,+OsStr%3E%3E-for-%26Utf8Path"],[596,"impl-PartialOrd%3Cstr%3E-for-%26Utf8Path"],[597,"impl-PartialOrd%3CCow%3C\'b,+str%3E%3E-for-%26Utf8Path"],[598,"impl-PartialOrd%3CString%3E-for-%26Utf8Path"],[599,"impl-PartialOrd%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8Path"],[600,"impl-PartialOrd%3COsString%3E-for-Utf8Path"],[601,"impl-PartialOrd%3COsStr%3E-for-Utf8Path"],[602,"impl-PartialOrd%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8Path"],[603,"impl-PartialOrd%3CCow%3C\'a,+str%3E%3E-for-Utf8Path"],[604,"impl-PartialOrd%3COsStr%3E-for-Utf8PathBuf"],[605,"impl-PartialOrd%3CCow%3C\'a,+str%3E%3E-for-Utf8PathBuf"],[606,"impl-PartialOrd%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8PathBuf"],[607,"impl-PartialOrd%3COsString%3E-for-Utf8PathBuf"],[608,"impl-PartialOrd%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8PathBuf"],[609,"impl-PartialOrd%3C%26OsStr%3E-for-Utf8PathBuf"],[610,"impl-PartialOrd%3CPath%3E-for-Utf8PathBuf"],[611,"impl-PartialOrd%3C%26Utf8Path%3E-for-Utf8PathBuf"],[612,"impl-PartialOrd%3CUtf8Path%3E-for-Utf8PathBuf"],[613,"impl-PartialOrd-for-Utf8PathBuf"],[614,"impl-PartialOrd%3C%26Path%3E-for-Utf8PathBuf"],[615,"impl-PartialOrd%3CCow%3C\'a,+Path%3E%3E-for-Utf8PathBuf"],[616,"impl-PartialOrd%3CPathBuf%3E-for-Utf8PathBuf"],[617,"impl-PartialOrd%3C%26str%3E-for-Utf8PathBuf"],[618,"impl-PartialOrd%3CString%3E-for-Utf8PathBuf"],[619,"impl-PartialOrd%3Cstr%3E-for-Utf8PathBuf"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIQCQQAAAAMABQAGAA0ACAAXAAcAIAACACQABQArAAwAOQAaAFUAEABuAAAAeQACAIQADQCTAAAAlQAaALEAAAC0AAEAtwABALsAEwDRABgA7gADAPYAAAD4AAQAAAESABgBAAAeAQUAJQEIAC8BDgBAAQMAUgEAAFgBCwBrAQEAcgEAAHgBAAB8AQsAiwEMAJwBEQCvAQIAswEEALkBRQAAAgAABAIJAA8CAwAXAgEAGwIAAB0CBgAqAgEAMgIAADoCAQA/AgIAQwIrAH8CBQCGAgIAigILAJgCBQChAgIApQIAAKgCEAC9AgAAwAJJABsDAAAeAygASQMCAFEDAgBWAwAAWAMDAA==","P":[[5,"T"],[6,""],[8,"T"],[14,""],[15,"T"],[16,""],[18,"__D"],[20,""],[23,"K"],[27,""],[30,"T"],[31,"S,E"],[32,"__H"],[34,"U"],[35,""],[39,"__S"],[40,""],[42,"T"],[43,"U,T"],[44,"U"],[45,""],[59,"T"],[75,""],[81,"QueryDb::DynDb,Query::Key,Query::Value"],[83,""],[101,"T"],[109,""],[123,"U"],[131,""],[140,"QueryDb::GroupStorage,Query::Storage"],[145,""],[149,"U,T"],[157,"U"],[165,""],[173,"T"],[194,""],[198,"T"],[202,""],[212,"K"],[228,""],[233,"T"],[237,"__H"],[241,"U"],[245,""],[252,"S"],[253,""],[254,"S"],[255,""],[258,"T"],[262,"U,T"],[266,"U"],[270,""],[285,"T"],[291,"FileId"],[292,""],[293,"FileId"],[295,"T"],[298,""],[303,"FileId"],[305,"K"],[317,"FileId"],[318,""],[320,"FileId"],[322,""],[323,"T"],[326,"FileId"],[327,"U"],[330,""],[333,"FileId"],[336,""],[338,"FileId"],[339,""],[340,"FileId"],[341,""],[343,"T"],[346,"U,T"],[349,"U"],[352,""],[355,"FileId"],[374,""],[394,"T"],[396,""],[397,"T"],[407,""],[416,"T"],[421,""],[430,"K"],[433,""],[437,"__D"],[438,""],[486,"K"],[510,""],[511,"P,I"],[512,""],[525,"T"],[526,""],[527,"T"],[528,""],[530,"T"],[534,""],[535,"P,I"],[536,""],[540,"H"],[542,"__H"],[547,"U"],[552,""],[639,"T"],[644,""],[650,"U,T"],[651,""],[652,"U,T"],[656,"U"],[661,""],[679,"T"],[683,""],[685,"T"],[687,""],[690,"K"],[694,""],[696,"T"],[698,"U"],[700,""],[701,"T"],[702,""],[704,"T"],[706,"U,T"],[708,"U"],[710,""],[736,"T"],[752,""],[759,"T"],[764,""],[771,"K"],[775,""],[777,"T"],[785,""],[786,"U"],[794,""],[807,"T"],[812,"U,T"],[820,"U"],[828,""],[838,"P"],[840,""],[848,"T"],[850,""],[851,"T"],[852,"U"],[853,""],[854,"T"],[855,""],[856,"U,T"],[857,"U"],[858,""]]}],["fe_compiler_test_utils",{"t":"IFSFIFFFFFIKONNHOHHQHNNNNNNNNNNNNNNNHNONNNNOHHHHHHHNNNNNNNNNNNNNNNNOOHNOOHHNNNNNNNHNNNOHNNNNNHMNNNNNNNNNNNNNNNNNHNNNNNNNOOHHHHHONNNNNNNNHHNN","n":["Backend","ContractHarness","DEFAULT_CALLER","ExecutionOutput","Executor","GasRecord","GasReporter","NumericAbiTokenBounds","Runtime","SolidityCompileError","StackState","ToBeBytes","abi","add_func_call_record","add_record","address","","address_array_token","address_token","assert_harness_gas_report","bool_token","borrow","","","","","","","borrow_mut","","","","","","","build_calldata","bytes_token","call_function","caller","capture_call","capture_call_raw_bytes","default","","description","encode_error_reason","encode_revert","encoded_div_or_mod_by_zero","encoded_invalid_abi_data","encoded_over_or_underflow","encoded_panic_assert","encoded_panic_out_of_bounds","events_emitted","expect_revert","expect_revert_reason","expect_success","fmt","","","","","from","","","","","","","gas_reporter","gas_used","get_2s_complement_for_negative","get_all","i_max","i_min","int_array_token","int_token","into","","","","","","","load_contract","new","","set_caller","size","string_token","test_call_returns","test_call_reverts","test_function","test_function_returns","test_function_reverts","to_2s_complement","to_be_bytes","to_string","","to_yul","try_from","","","","","","","try_into","","","","","","","tuple_token","type_id","","","","","","","u_max","u_min","uint_array_token","uint_token","uint_token_from_dec_str","validate_return","validate_revert","value","vzip","","","","","","","with_data","with_executor","with_executor_backend","with_functions","with_test_statements"],"q":[[0,"fe_compiler_test_utils"],[140,"ethabi::contract"],[141,"ethabi::token::token"],[142,"primitive_types"],[143,"alloc::vec"],[144,"core::option"],[145,"evm_core::error"],[146,"core::convert"],[147,"alloc::string"],[148,"core::fmt"],[149,"yultsur::yul"],[150,"core::result"],[151,"core::any"],[152,"core::ops::function"]],"i":"````````````dh0`1````1BjC`Cj3BlCf64325106`6666451```````633355100643251061`222``6432510`4362`66666`D`61575436217543621`754362133`````775436215``55","f":"``{{}b}`````````{df}{{{b{h}}{b{j}}{b{{n{l}}}}A`}Ab}{{{b{h}}{b{j}}A`}Ab}{{{b{j}}}Ad}{dAd}{{{b{{n{{b{j}}}}}}}l}{{{b{j}}}l}`{Afl}{b{{b{c}}}{}}000000{{{b{Ah}}}{{b{Ahc}}}{}}000000{{{b{d}}{b{j}}{b{{n{l}}}}}{{Al{Aj}}}}4{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}}{{B`{l}}}}7{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}}{{Bh{{Bd{Bb{Al{Aj}}}}Bf}}}}{{{b{d}}{b{AhAn}}{Al{Aj}}}{{Bh{{Bd{Bb{Al{Aj}}}}Bf}}}}{{}Bj}{{}h}{BlBn}{{{b{j}}}{{Al{Aj}}}}{{{b{j}}{b{{n{l}}}}}{{Al{Aj}}}}{{}{{Al{Aj}}}}0000{{{b{d}}An{b{{n{{Bd{{b{j}}{b{{n{l}}}}}}}}}}}Ab}{C`C`}{{C`{b{j}}}C`}1{{{b{h}}{b{AhCb}}}Cd}0{{{b{Bl}}{b{AhCb}}}Cd}{{{b{Cf}}{b{AhCb}}}Cd}0{cc{}}000000{dh}{BlA`}{ChCh}{{}{{Cl{Cj}}}}{Cjl}0{{{b{{n{Cn}}}}}l}{Cnl}{{}c{}}000000{{Ad{b{j}}{b{j}}}d}{{}Bj}{{Bb{Al{Aj}}}C`}{{{b{Ahd}}Ad}Ab}{CjA`}{{{b{j}}}l}{{{b{d}}{b{AhAn}}{Al{Aj}}{b{{n{Aj}}}}}Ab}0{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}{B`{{b{l}}}}}Ab}{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}{b{{n{Aj}}}}}Ab}0{CnCh}{{{b{D`}}}{{Cl{Aj}}}}{bBn}0{{{b{Bj}}}Db}{c{{Dd{e}}}{}{}}000000{{}{{Dd{c}}}{}}000000{{{b{{n{l}}}}}l}{bDf}000000{Cjl}0{{{b{{n{A`}}}}}l}{A`l}>{{{Bh{{Bd{Bb{Al{Aj}}}}Bf}}{b{{n{Aj}}}}}Ab}0{dCh}{{}c{}}000000{{Bj{Al{Dh}}}Bj}{{{b{Dj}}}Ab}{{Dl{b{Dj}}}Ab}{{Bj{Al{Dn}}}Bj}0","D":"Bn","p":[[1,"reference",null,null,1],[5,"ContractHarness",0],[5,"Contract",140],[5,"GasReporter",0],[1,"str"],[6,"Token",141],[1,"slice"],[1,"u64"],[1,"unit"],[5,"H160",142],[1,"bool"],[0,"mut"],[1,"u8"],[5,"Vec",143],[8,"Executor",0],[6,"Option",144,null,1],[6,"ExitReason",145],[1,"tuple",null,null,1],[6,"Infallible",146],[6,"Capture",145],[5,"Runtime",0],[5,"GasRecord",0],[5,"String",147],[5,"ExecutionOutput",0],[5,"Formatter",148],[8,"Result",148],[5,"SolidityCompileError",0],[5,"U256",142],[5,"NumericAbiTokenBounds",0],[1,"array"],[1,"i64"],[10,"ToBeBytes",0],[5,"Object",149],[6,"Result",150,null,1],[5,"TypeId",151],[5,"Data",149],[10,"Fn",152],[8,"Backend",0],[6,"Statement",149]],"r":[],"b":[[55,"impl-Debug-for-GasReporter"],[56,"impl-Display-for-GasReporter"],[58,"impl-Display-for-SolidityCompileError"],[59,"impl-Debug-for-SolidityCompileError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAHUABwAAADQAOAAEAEQAAQBHAAQAUwAAAFYACwBjACcA","P":[[21,"T"],[35,""],[60,"T"],[67,""],[75,"U"],[82,""],[98,"U,T"],[105,"U"],[112,""],[128,"V"],[135,""]]}],["fe_compiler_tests",{"t":"","n":[],"q":[],"i":"","f":"","D":"`","p":[],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAAA","P":[]}],["fe_compiler_tests_legacy",{"t":"","n":[],"q":[],"i":"","f":"","D":"`","p":[],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAAA","P":[]}],["fe_driver",{"t":"KFFFFNNNNNNNNNHHMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNHHNNNNNNNNNNONHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNO","n":["CodegenDb","CompileError","CompiledContract","CompiledModule","Db","all_impls","borrow","","","","borrow_mut","","","","check_ingot","check_single_file","codegen_abi_contract","","codegen_abi_event","","codegen_abi_function","","codegen_abi_function_argument_maximum_size","","codegen_abi_function_return_maximum_size","","codegen_abi_module_events","","codegen_abi_type","","codegen_abi_type_maximum_size","","codegen_abi_type_minimum_size","","codegen_constant_string_symbol_name","","codegen_contract_deployer_symbol_name","","codegen_contract_symbol_name","","codegen_function_symbol_name","","codegen_legalized_body","","codegen_legalized_signature","","codegen_legalized_type","","compile_ingot","compile_single_file","contract_all_fields","contract_all_functions","contract_call_function","contract_dependency_graph","contract_field_map","contract_field_type","contract_function_map","contract_init_function","contract_public_function_map","contract_runtime_dependency_graph","contracts","default","dump_mir_single_file","enum_all_functions","enum_all_variants","enum_dependency_graph","enum_function_map","enum_variant_kind","enum_variant_map","file_content","file_line_starts","file_name","fmt","from","","","","function_body","function_dependency_graph","function_signature","function_sigs","impl_all_functions","impl_for","impl_function_map","ingot_external_ingots","ingot_files","ingot_modules","ingot_root_module","intern_attribute","intern_contract","intern_contract_field","intern_enum","intern_enum_variant","intern_file","intern_function","intern_function_sig","intern_impl","intern_ingot","intern_module","intern_module_const","intern_struct","intern_struct_field","intern_trait","intern_type","intern_type_alias","into","","","","json_abi","lookup_intern_attribute","lookup_intern_contract","lookup_intern_contract_field","lookup_intern_enum","lookup_intern_enum_variant","lookup_intern_file","lookup_intern_function","lookup_intern_function_sig","lookup_intern_impl","lookup_intern_ingot","lookup_intern_module","lookup_intern_module_const","lookup_intern_struct","lookup_intern_struct_field","lookup_intern_trait","lookup_intern_type","lookup_intern_type_alias","lookup_mir_intern_const","lookup_mir_intern_function","lookup_mir_intern_type","lowered_ast","mir_intern_const","mir_intern_function","mir_intern_type","mir_lower_contract_all_functions","mir_lower_enum_all_functions","mir_lower_module_all_functions","mir_lower_struct_all_functions","mir_lowered_constant","mir_lowered_func_body","mir_lowered_func_signature","mir_lowered_monomorphized_func_signature","mir_lowered_pseudo_monomorphized_func_signature","mir_lowered_type","module_all_impls","module_all_items","module_constant_type","module_constant_value","module_constants","module_contracts","module_file_path","module_impl_map","module_is_incomplete","module_item_map","module_parent_module","module_parse","module_structs","module_submodules","module_tests","module_used_item_map","origin","root_ingot","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","set_ingot_external_ingots_with_durability","set_ingot_files","set_ingot_files_with_durability","set_root_ingot","set_root_ingot_with_durability","src_ast","struct_all_fields","struct_all_functions","struct_dependency_graph","struct_field_map","struct_field_type","struct_function_map","trait_all_functions","trait_function_map","trait_is_implemented_for","try_from","","","","try_into","","","","type_alias_type","type_id","","","","upcast","","","upcast_mut","","","vzip","","","","yul"],"q":[[0,"fe_driver"],[204,"fe_analyzer::namespace::types"],[205,"fe_analyzer::namespace::items"],[206,"alloc::rc"],[207,"fe_codegen::db"],[208,"fe_common::utils::files"],[209,"fe_common::diagnostics"],[210,"alloc::vec"],[211,"fe_abi::contract"],[212,"fe_mir::ir::types"],[213,"fe_abi::event"],[214,"fe_mir::ir::function"],[215,"fe_abi::function"],[216,"fe_abi::types"],[217,"alloc::string"],[218,"core::result"],[219,"core::option"],[220,"fe_analyzer::context"],[221,"smol_str"],[222,"indexmap::map"],[223,"fe_analyzer::errors"],[224,"fe_common::files"],[225,"core::fmt"],[226,"fe_mir::ir::constant"],[227,"alloc::collections::btree::map"],[228,"fe_parser::ast"],[229,"fe_common::span"],[230,"salsa::durability"],[231,"core::any"],[232,"fe_mir::db"],[233,"fe_common::db"],[234,"fe_analyzer::db"]],"i":"`````nCdHlCf32103``Ah4040404040404040404040404040404``444444444434`444444444132144444444444444444444444444444321424444444444444444444434444444444444444444444444444424444444443444444444321432144321444444432142","f":"`````{{bd}{{j{{h{f}}}}}}{b{{b{c}}}{}}000{{{b{l}}}{{b{lc}}}{}}000{{{b{ln}}{b{A`}}}{{Ad{Ab}}}}{{{b{ln}}{b{Af}}{b{Af}}}{{Ad{Ab}}}}{{{b{Ah}}Aj}Al}{{bAj}Al}{{{b{Ah}}An}B`}{{bAn}B`}{{{b{Ah}}Bb}Bd}{{bBb}Bd}{{{b{Ah}}Bb}Bf}{{bBb}Bf}10{{{b{Ah}}Bh}{{Ad{B`}}}}{{bBh}{{Ad{B`}}}}{{{b{Ah}}An}Bj}{{bAn}Bj}{{{b{Ah}}An}Bf}{{bAn}Bf}10{{{b{Ah}}Bl}{{j{Bl}}}}{{bBl}{{j{Bl}}}}{{{b{Ah}}Aj}{{j{Bl}}}}{{bAj}{{j{Bl}}}}10{{{b{Ah}}Bb}{{j{Bl}}}}{{bBb}{{j{Bl}}}}{{{b{Ah}}Bb}{{j{Bn}}}}{{bBb}{{j{Bn}}}}{{{b{Ah}}Bb}{{j{C`}}}}{{bBb}{{j{C`}}}}{{{b{Ah}}An}An}{{bAn}An}{{{b{ln}}{b{A`}}CbCbCb}{{Ch{CdCf}}}}{{{b{ln}}{b{Af}}{b{Af}}CbCbCb}{{Ch{CdCf}}}}{{bAj}{{j{{h{Cj}}}}}}{{bAj}{{j{{h{Cl}}}}}}{{bAj}{{D`{{Cn{Cl}}}}}}{{bAj}Db}{{bAj}{{D`{{j{{Df{DdCj}}}}}}}}{{bCj}{{D`{{Ch{dDh}}}}}}{{bAj}{{D`{{j{{Df{DdCl}}}}}}}}4{{bAj}{{j{{Df{DdCl}}}}}}4{CdDf}{{}n}{{{b{ln}}{b{Af}}{b{Af}}}{{Ch{BlCf}}}}{{bDj}{{j{{h{Cl}}}}}}{{bDj}{{j{{h{Dl}}}}}}{{bDj}{{D`{Db}}}}{{bDj}{{D`{{j{{Df{DdCl}}}}}}}}{{bDl}{{D`{{Ch{DnDh}}}}}}{{bDj}{{D`{{j{{Df{DdDl}}}}}}}}{{bE`}{{j{Af}}}}{{bE`}{{j{{h{Bf}}}}}}{{bE`}Dd}{{{b{Cf}}{b{lEb}}}Ed}{cc{}}000{{bCl}{{D`{{j{Ef}}}}}}{{bCl}Db}{{bEh}{{D`{{j{Ej}}}}}}{{bdDd}{{j{{h{Eh}}}}}}{{bf}{{j{{h{Cl}}}}}}{{bdEl}{{Cn{f}}}}{{bf}{{D`{{j{{Df{DdCl}}}}}}}}{{bEn}{{j{{Df{DdEn}}}}}}{{bEn}{{j{{h{E`}}}}}}{{bEn}{{j{{h{Bh}}}}}}{{bEn}{{Cn{Bh}}}}{{b{j{F`}}}Fb}{{b{j{Fd}}}Aj}{{b{j{Ff}}}Cj}{{b{j{Fh}}}Dj}{{b{j{Fj}}}Dl}{{bFl}E`}{{b{j{Fn}}}Cl}{{b{j{G`}}}Eh}{{b{j{Gb}}}f}{{b{j{Gd}}}En}{{b{j{Gf}}}Bh}{{b{j{Gh}}}Gj}{{b{j{Gl}}}Gn}{{b{j{H`}}}Hb}{{b{j{Hd}}}El}{{bHf}d}{{b{j{Hh}}}Hj}{{}c{}}000{HlBl}{{bFb}{{j{F`}}}}{{bAj}{{j{Fd}}}}{{bCj}{{j{Ff}}}}{{bDj}{{j{Fh}}}}{{bDl}{{j{Fj}}}}{{bE`}Fl}{{bCl}{{j{Fn}}}}{{bEh}{{j{G`}}}}{{bf}{{j{Gb}}}}{{bEn}{{j{Gd}}}}{{bBh}{{j{Gf}}}}{{bGj}{{j{Gh}}}}{{bGn}{{j{Gl}}}}{{bHb}{{j{H`}}}}{{bEl}{{j{Hd}}}}{{bd}Hf}{{bHj}{{j{Hh}}}}{{bHn}{{j{I`}}}}{{bBb}{{j{C`}}}}{{bAn}{{j{Ib}}}}{CdBl}{{b{j{I`}}}Hn}{{b{j{C`}}}Bb}{{b{j{Ib}}}An}{{bAj}{{j{{Ad{Bb}}}}}}{{bDj}{{j{{Ad{Bb}}}}}}{{bBh}{{j{{Ad{Bb}}}}}}{{bGn}{{j{{Ad{Bb}}}}}}{{bGj}Hn}{{bBb}{{j{Bn}}}}{{bCl}Bb}{{bCl{Id{Ddd}}}Bb}1{{bd}An}{{bBh}{{D`{{j{{h{f}}}}}}}}{{bBh}{{j{{h{If}}}}}}{{bGj}{{D`{{Ch{dDh}}}}}}{{bGj}{{D`{{Ch{IhIj}}}}}}{{bBh}{{j{{Ad{Gj}}}}}}{{bBh}{{j{{h{Aj}}}}}}{{bBh}Dd}{{bBh}{{D`{{j{{Df{{Il{Eld}}f}}}}}}}}{{bBh}Cb}{{bBh}{{D`{{j{{Df{DdIf}}}}}}}}{{bBh}{{Cn{Bh}}}}{{bBh}{{D`{{j{In}}}}}}{{bBh}{{j{{h{Gn}}}}}}{{bBh}{{j{{h{Bh}}}}}}{{bBh}{{Ad{Cl}}}}{{bBh}{{D`{{j{{Df{Dd{Il{J`If}}}}}}}}}}{HlAj}{bEn}{{{b{l}}E`{j{Af}}}Jb}{{{b{l}}E`{j{Af}}Jd}Jb}{{{b{l}}En{j{{Df{DdEn}}}}}Jb}{{{b{l}}En{j{{Df{DdEn}}}}Jd}Jb}{{{b{l}}En{j{{h{E`}}}}}Jb}{{{b{l}}En{j{{h{E`}}}}Jd}Jb}{{{b{l}}En}Jb}{{{b{l}}EnJd}Jb}{CdBl}{{bGn}{{j{{h{Hb}}}}}}{{bGn}{{j{{h{Cl}}}}}}{{bGn}{{D`{Db}}}}{{bGn}{{D`{{j{{Df{DdHb}}}}}}}}{{bHb}{{D`{{Ch{dDh}}}}}}{{bGn}{{D`{{j{{Df{DdCl}}}}}}}}{{bEl}{{j{{h{Eh}}}}}}{{bEl}{{D`{{j{{Df{DdEh}}}}}}}}{{bEld}Cb}{c{{Ch{e}}}{}{}}000{{}{{Ch{c}}}{}}000{{bHj}{{D`{{Ch{dDh}}}}}}{bJf}000{{{b{n}}}{{b{Jh}}}}{{{b{n}}}{{b{Jj}}}}{{{b{n}}}{{b{Jl}}}}{{{b{ln}}}{{b{lJh}}}}{{{b{ln}}}{{b{lJj}}}}{{{b{ln}}}{{b{lJl}}}}{{}c{}}000{HlBl}","D":"Ah","p":[[1,"reference",null,null,1],[5,"TypeId",204],[5,"ImplId",205],[1,"slice"],[5,"Rc",206,null,1],[0,"mut"],[5,"Db",0,207],[5,"BuildFiles",208],[5,"Diagnostic",209],[5,"Vec",210],[1,"str"],[10,"CodegenDb",0,207],[5,"ContractId",205],[5,"AbiContract",211],[5,"TypeId",212],[5,"AbiEvent",213],[5,"FunctionId",214],[5,"AbiFunction",215],[1,"usize"],[5,"ModuleId",205],[6,"AbiType",216],[5,"String",217],[5,"FunctionBody",214],[5,"FunctionSignature",214],[1,"bool"],[5,"CompiledModule",0],[5,"CompileError",0],[6,"Result",218,null,1],[5,"ContractFieldId",205],[5,"FunctionId",205],[6,"Option",219,null,1],[5,"Analysis",220],[5,"DepGraphWrapper",205],[5,"SmolStr",221],[5,"IndexMap",222],[5,"TypeError",223],[5,"EnumId",205],[5,"EnumVariantId",205],[6,"EnumVariantKind",205],[5,"SourceFileId",224],[5,"Formatter",225],[8,"Result",225],[5,"FunctionBody",220],[5,"FunctionSigId",205],[5,"FunctionSignature",204],[5,"TraitId",205],[5,"IngotId",205],[5,"Attribute",205],[5,"AttributeId",205],[5,"Contract",205],[5,"ContractField",205],[5,"Enum",205],[5,"EnumVariant",205],[5,"File",224],[5,"Function",205],[5,"FunctionSig",205],[5,"Impl",205],[5,"Ingot",205],[5,"Module",205],[5,"ModuleConstant",205],[5,"ModuleConstantId",205],[5,"Struct",205],[5,"StructId",205],[5,"StructField",205],[5,"StructFieldId",205],[5,"Trait",205],[6,"Type",204],[5,"TypeAlias",205],[5,"TypeAliasId",205],[5,"CompiledContract",0],[5,"ConstantId",226],[5,"Constant",226],[5,"Type",212],[5,"BTreeMap",227],[6,"Item",205],[6,"Constant",220],[5,"ConstEvalError",223],[1,"tuple",null,null,1],[5,"Module",228],[5,"Span",229],[1,"unit"],[5,"Durability",230],[5,"TypeId",231],[10,"MirDb",232],[10,"SourceDb",233],[10,"AnalyzerDb",234]],"r":[[0,207],[4,207],[5,207],[9,207],[13,207],[16,207],[17,207],[18,207],[19,207],[20,207],[21,207],[22,207],[23,207],[24,207],[25,207],[26,207],[27,207],[28,207],[29,207],[30,207],[31,207],[32,207],[33,207],[34,207],[35,207],[36,207],[37,207],[38,207],[39,207],[40,207],[41,207],[42,207],[43,207],[44,207],[45,207],[46,207],[47,207],[50,207],[51,207],[52,207],[53,207],[54,207],[55,207],[56,207],[57,207],[58,207],[59,207],[61,207],[63,207],[64,207],[65,207],[66,207],[67,207],[68,207],[69,207],[70,207],[71,207],[76,207],[77,207],[78,207],[79,207],[80,207],[81,207],[82,207],[83,207],[84,207],[85,207],[86,207],[87,207],[88,207],[89,207],[90,207],[91,207],[92,207],[93,207],[94,207],[95,207],[96,207],[97,207],[98,207],[99,207],[100,207],[101,207],[102,207],[103,207],[104,207],[108,207],[110,207],[111,207],[112,207],[113,207],[114,207],[115,207],[116,207],[117,207],[118,207],[119,207],[120,207],[121,207],[122,207],[123,207],[124,207],[125,207],[126,207],[127,207],[128,207],[129,207],[131,207],[132,207],[133,207],[134,207],[135,207],[136,207],[137,207],[138,207],[139,207],[140,207],[141,207],[142,207],[143,207],[144,207],[145,207],[146,207],[147,207],[148,207],[149,207],[150,207],[151,207],[152,207],[153,207],[154,207],[155,207],[156,207],[157,207],[158,207],[159,207],[161,207],[162,207],[163,207],[164,207],[165,207],[166,207],[167,207],[168,207],[169,207],[171,207],[172,207],[173,207],[174,207],[175,207],[176,207],[177,207],[178,207],[179,207],[183,207],[187,207],[188,207],[192,207],[193,207],[194,207],[195,207],[196,207],[197,207],[198,207],[202,207]],"b":[[193,"impl-Upcast%3Cdyn+MirDb%3E-for-Db"],[194,"impl-Upcast%3Cdyn+SourceDb%3E-for-Db"],[195,"impl-Upcast%3Cdyn+AnalyzerDb%3E-for-Db"],[196,"impl-UpcastMut%3Cdyn+MirDb%3E-for-Db"],[197,"impl-UpcastMut%3Cdyn+SourceDb%3E-for-Db"],[198,"impl-UpcastMut%3Cdyn+AnalyzerDb%3E-for-Db"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAMAABgAAAAIABQArADIADABAAAkATgAbAG4AXgA=","P":[[6,"T"],[14,""],[73,"T"],[77,""],[105,"U"],[109,""],[180,"U,T"],[184,"U"],[188,""],[199,"V"],[203,""]]}],["fe_library",{"t":"SEHH","n":["STD","include_dir","static_dir_files","std_src_files"],"q":[[0,"fe_library"],[4,"include_dir::dir"],[5,"alloc::vec"]],"i":"````","f":"{{}b}`{{{d{b}}}{{j{{h{{d{f}}{d{f}}}}}}}}{{}{{j{{h{{d{f}}{d{f}}}}}}}}","D":"`","p":[[5,"Dir",4],[1,"reference",null,null,1],[1,"str"],[1,"tuple",null,null,1],[5,"Vec",5]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAQAEAAAAAAAAQACAAMABAA=","P":[]}],["fe_mir",{"t":"CCCCCEEEECCCCFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFIFNNNNNNONNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNNNNNNNNNPPPFGNNNNNNNNNNNNNNNNNNNNNNNNNNNNKFFFFFFFFFFFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNONNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHEEEEEEEEEEFEEEEECCCCNNNNNCNNNNNNNNNCNOCNNONNNNCCFINNNNNNNNNNNNNNNNNNFNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNNNNNNNNNONNNOFPFFFFGPPNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNONONOONNNNONONNNOOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNPPPPPPPPPPGPPPPPIPPPGPPPGPPPPPPPGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFIGPPPPGGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFPGPPIIPPGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPFPPPFFFPPPPPPPPFPPPFPFFFGPPPPPPPNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNOOOOOOONNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOOPGPPFPPPPGPINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONNONNNNNNNNNNNNONNNNNOOOOOOOOOOOKMN","n":["analysis","db","graphviz","ir","pretty_print","ControlFlowGraph","DomTree","LoopTree","PostDomTree","cfg","domtree","loop_tree","post_domtree","CfgPostOrder","ControlFlowGraph","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","compute","entry","eq","equivalent","","","","fmt","from","","into","","into_iter","next","post_order","preds","succs","to_owned","try_from","","try_into","","type_id","","DFSet","DomTree","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","compute","compute_df","default","dominates","fmt","","from","","frontier_num","frontiers","idom","into","","is_reachable","rpo","strictly_dominates","to_owned","try_from","","try_into","","type_id","","BlocksInLoopPostOrder","Loop","LoopId","LoopTree","borrow","","","borrow_mut","","","children","clone","","clone_into","","clone_to_uninit","","compute","default","eq","equivalent","","","","fmt","","from","","","header","into","","","into_iter","is_block_in_loop","iter_blocks_post_order","loop_header","loop_num","loop_of_block","loops","next","parent","parent_loop","to_owned","","try_from","","","try_into","","","type_id","","","Block","DummyEntry","DummyExit","PostDomTree","PostIDom","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","compute","eq","equivalent","","","","fmt","","from","","into","","is_reachable","post_idom","to_owned","try_from","","try_into","","type_id","","MirDb","MirDbGroupStorage__","MirDbStorage","MirInternConstLookupQuery","MirInternConstQuery","MirInternFunctionLookupQuery","MirInternFunctionQuery","MirInternTypeLookupQuery","MirInternTypeQuery","MirLowerContractAllFunctionsQuery","MirLowerEnumAllFunctionsQuery","MirLowerModuleAllFunctionsQuery","MirLowerStructAllFunctionsQuery","MirLoweredConstantQuery","MirLoweredFuncBodyQuery","MirLoweredFuncSignatureQuery","MirLoweredMonomorphizedFuncSignatureQuery","MirLoweredPseudoMonomorphizedFuncSignatureQuery","MirLoweredTypeQuery","NewDb","all_impls","borrow","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","contract_all_fields","contract_all_functions","contract_call_function","contract_dependency_graph","contract_field_map","contract_field_type","contract_function_map","contract_init_function","contract_public_function_map","contract_runtime_dependency_graph","default","","","","","","","","","","","","","","","","","enum_all_functions","enum_all_variants","enum_dependency_graph","enum_function_map","enum_variant_kind","enum_variant_map","execute","","","","","","","","","","file_content","file_line_starts","file_name","fmt","","","","","","","","","","","","","","","","fmt_index","","for_each_query","","from","","","","","","","","","","","","","","","","","","","function_body","function_dependency_graph","function_signature","function_sigs","group_storage","","","impl_all_functions","impl_for","impl_function_map","in_db","","","","","","","","","","","","","","","","in_db_mut","","","","","","","","","","","","","","","","ingot_external_ingots","ingot_files","ingot_modules","ingot_root_module","intern_attribute","intern_contract","intern_contract_field","intern_enum","intern_enum_variant","intern_file","intern_function","intern_function_sig","intern_impl","intern_ingot","intern_module","intern_module_const","intern_struct","intern_struct_field","intern_trait","intern_type","intern_type_alias","into","","","","","","","","","","","","","","","","","","","lookup_intern_attribute","lookup_intern_contract","lookup_intern_contract_field","lookup_intern_enum","lookup_intern_enum_variant","lookup_intern_file","lookup_intern_function","lookup_intern_function_sig","lookup_intern_impl","lookup_intern_ingot","lookup_intern_module","lookup_intern_module_const","lookup_intern_struct","lookup_intern_struct_field","lookup_intern_trait","lookup_intern_type","lookup_intern_type_alias","lookup_mir_intern_const","","","lookup_mir_intern_function","","","lookup_mir_intern_type","","","maybe_changed_since","","mir_intern_const","","","mir_intern_function","","","mir_intern_type","","","mir_lower_contract_all_functions","","","mir_lower_enum_all_functions","","","mir_lower_module_all_functions","","","mir_lower_struct_all_functions","","","mir_lowered_constant","","","mir_lowered_func_body","","","mir_lowered_func_signature","","","mir_lowered_monomorphized_func_signature","","","mir_lowered_pseudo_monomorphized_func_signature","","","mir_lowered_type","","","module_all_impls","module_all_items","module_constant_type","module_constant_value","module_constants","module_contracts","module_file_path","module_impl_map","module_is_incomplete","module_item_map","module_parent_module","module_parse","module_structs","module_submodules","module_tests","module_used_item_map","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","","","","","","","","","","","","root_ingot","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","set_ingot_external_ingots_with_durability","set_ingot_files","set_ingot_files_with_durability","set_root_ingot","set_root_ingot_with_durability","struct_all_fields","struct_all_functions","struct_dependency_graph","struct_field_map","struct_field_type","struct_function_map","trait_all_functions","trait_function_map","trait_is_implemented_for","try_from","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","type_alias_type","type_id","","","","","","","","","","","","","","","","","","","upcast","","upcast_mut","","write_mir_graphs","BasicBlock","BasicBlockId","Constant","ConstantId","FunctionBody","FunctionId","FunctionParam","FunctionSignature","Inst","InstId","SourceInfo","Type","TypeId","TypeKind","Value","ValueId","basic_block","body_builder","body_cursor","body_order","borrow","borrow_mut","clone","clone_into","clone_to_uninit","constant","dummy","eq","equivalent","","","","fmt","from","","function","hash","id","inst","into","is_dummy","span","to_owned","try_from","try_into","type_id","types","value","BasicBlock","BasicBlockId","borrow","borrow_mut","clone","clone_into","clone_to_uninit","eq","equivalent","","","","fmt","from","hash","into","to_owned","try_from","try_into","type_id","BodyBuilder","abi_encode","add","aggregate_access","aggregate_construct","bind","bit_and","bit_or","bit_xor","body","borrow","borrow_mut","branch","build","call","create","create2","current_block","declare","div","emit","eq","fmt","from","func_id","ge","gt","inst_data","inst_result","into","inv","is_block_terminated","is_current_block_terminated","jump","keccak256","le","load","logical_and","logical_or","lt","make_block","make_constant","make_imm","make_imm_from_bool","make_unit","make_value","map_access","map_result","mem_copy","modulo","move_to_block","move_to_block_top","mul","ne","neg","new","nop","not","pow","primitive_cast","remove_inst","ret","revert","shl","shr","store_func_arg","sub","switch","try_from","try_into","type_id","untag_cast","value_data","value_ty","yul_intrinsic","BlockBottom","BlockTop","BodyCursor","CursorLocation","Inst","NoWhere","back","body","body_mut","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","eq","equivalent","","","","expect_block","expect_inst","fmt","from","","insert_block","insert_inst","into","","loc","map_result","new","new_at_entry","next_block","next_loc","prev_block","prev_loc","proceed","remove_block","remove_inst","set_loc","set_to_entry","store_and_insert_block","store_and_insert_inst","to_owned","try_from","","try_into","","type_id","","BodyOrder","append_block","append_inst","block_num","borrow","borrow_mut","clone","clone_into","clone_to_uninit","entry","eq","equivalent","","","","first_inst","fmt","from","insert_block_after_block","insert_block_before_block","insert_inst_after","insert_inst_before_inst","inst_block","into","is_block_empty","is_block_inserted","is_inst_inserted","is_terminated","iter_block","iter_inst","last_block","last_inst","new","next_block","next_inst","prepend_inst","prev_block","prev_inst","remove_block","remove_inst","terminator","to_owned","try_from","try_into","type_id","Bool","Constant","ConstantId","ConstantValue","Immediate","Str","as_intern_id","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","data","eq","","","equivalent","","","","","","","","","","","","fmt","","","from","","","","from_intern_id","hash","","","into","","","module_id","name","source","to_owned","","","try_from","","","try_into","","","ty","","type_id","","","value","BodyDataStore","Export","FunctionBody","FunctionId","FunctionParam","FunctionSignature","Linkage","Private","Public","analyzer_func","analyzer_func_id","as_intern_id","body","borrow","","","","","","borrow_mut","","","","","","branch_info","clone","","","","","","clone_into","","","","","","clone_to_uninit","","","","","","cmp","compare","debug_name","default","eq","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","fid","fmt","","","","","","from","","","","","","from_intern_id","func_args","func_args_mut","hash","","","","inst_data","inst_data_mut","inst_result","into","","","","","","is_contract_init","is_exported","is_nop","is_terminator","linkage","","local_name","locals","locals_mut","map_result","module","module_id","name","","new","order","params","partial_cmp","remove_inst_result","replace_inst","replace_value","resolved_generics","return_type","","returns_aggregate","rewrite_branch_dest","signature","source","","store","store_block","store_inst","store_value","to_owned","","","","","","try_from","","","","","","try_into","","","","","","ty","type_id","","","","","","type_suffix","value_data","value_data_mut","value_ty","values","values_mut","AbiEncode","Add","","Addmod","Address","AggregateAccess","AggregateConstruct","And","Balance","Basefee","BinOp","Binary","Bind","BitAnd","BitOr","BitXor","BlockIter","Blockhash","Branch","","BranchInfo","Byte","Call","","CallType","Callcode","Calldatacopy","Calldataload","Calldatasize","Caller","Callvalue","Cast","CastKind","Chain","","","","","Chainid","Codecopy","Codesize","Coinbase","Create","","Create2","","Declare","Delegatecall","Div","","Emit","Eq","","Exp","Extcodecopy","Extcodehash","Extcodesize","External","Gas","Gaslimit","Gasprice","Ge","Gt","","Inst","InstId","InstKind","Internal","Inv","Invalid","Iszero","IterBase","IterMutBase","Jump","","Keccak256","","Le","Load","Log0","Log1","Log2","Log3","Log4","LogicalAnd","LogicalOr","Lt","","MapAccess","MemCopy","Mload","Mod","","Msize","Mstore","Mstore8","Mul","","Mulmod","Ne","Neg","Nop","Not","","NotBranch","Number","One","","","","","Or","Origin","Pc","Pop","Pow","Prevrandao","Primitive","Return","","Returndatacopy","Returndatasize","Revert","","Sar","Sdiv","Selfbalance","Selfdestruct","Sgt","Shl","","Shr","","Signextend","Slice","","","","","Sload","Slt","Smod","Sstore","Staticcall","Stop","Sub","","Switch","","SwitchTable","Timestamp","UnOp","Unary","Untag","ValueIter","ValueIterMut","Xor","YulIntrinsic","YulIntrinsicOp","Zero","","","","","add_arm","args","args_mut","binary","block_iter","borrow","","","","","","","","","","","borrow_mut","","","","","","","","","","","branch_info","cjk_compat_variants","clone","","","","","","","","clone_into","","","","","","","","clone_to_uninit","","","","","","","","default","eq","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fmt","","","","","","","","","","","","from","","","","","","","","","","","","hash","","","","","","","","into","","","","","","","","","","","into_iter","","intrinsic","is_empty","is_not_a_branch","is_terminator","","iter","kind","len","new","next","","nfc","nfd","nfkc","nfkd","nop","pretty_print","source","stream_safe","to_owned","","","","","","","","to_string","","","","try_from","","","","","","","","","","","try_into","","","","","","","","","","","type_id","","","","","","","","","","","unary","arg","","","","","args","","","call_type","cond","contract","","default","dest","disc","else_","func","indices","key","kind","lhs","local","op","","","rhs","salt","src","","","table","then","to","ty","value","","","","","","Address","Array","ArrayDef","Bool","Contract","Enum","EnumDef","EnumVariant","EventDef","I128","I16","I256","I32","I64","I8","MPtr","Map","MapDef","SPtr","String","Struct","StructDef","Tuple","TupleDef","Type","TypeId","TypeKind","U128","U16","U256","U32","U64","U8","Unit","aggregate_elem_offset","aggregate_field_num","align_of","analyzer_ty","","array_elem_size","as_intern_id","as_string","borrow","","","","","","","","","","borrow_mut","","","","","","","","","","clone","","","","","","","","","","clone_into","","","","","","","","","","clone_to_uninit","","","","","","","","","","data","deref","elem_ty","enum_data_offset","enum_disc_type","enum_variant_type","eq","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fields","","fmt","","","","","","","","","","from","","","","","","","","","","from_intern_id","hash","","","","","","","","","","index_from_fname","into","","","","","","","","","","is_address","is_aggregate","is_array","is_contract","is_enum","is_integral","is_map","is_mptr","is_primitive","is_ptr","is_signed","is_sptr","is_string","is_struct","is_unit","is_zero_sized","items","key_ty","kind","len","make_mptr","make_sptr","module_id","","","name","","","","new","pretty_print","print","projection_ty","projection_ty_imm","size_of","span","","","","tag_type","to_owned","","","","","","","","","","try_from","","","","","","","","","","try_into","","","","","","","","","","ty","type_id","","","","","","","","","","value_ty","variants","Aggregate","AssignableValue","Constant","Immediate","Local","","Map","Temporary","Unit","Value","","ValueId","arg_local","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","eq","","","equivalent","","","","","","","","","","","","fmt","","","from","","","","hash","","","into","","","is_arg","is_imm","is_tmp","name","pretty_print","","source","tmp_local","to_owned","","","try_from","","","try_into","","","ty","","","type_id","","","user_local","value_id","idx","key","lhs","","constant","imm","inst","ty","","","","PrettyPrint","pretty_print","pretty_string"],"q":[[0,"fe_mir"],[5,"fe_mir::analysis"],[13,"fe_mir::analysis::cfg"],[46,"fe_mir::analysis::domtree"],[78,"fe_mir::analysis::loop_tree"],[132,"fe_mir::analysis::post_domtree"],[165,"fe_mir::db"],[574,"fe_mir::graphviz"],[575,"fe_mir::ir"],[623,"fe_mir::ir::basic_block"],[643,"fe_mir::ir::body_builder"],[718,"fe_mir::ir::body_cursor"],[770,"fe_mir::ir::body_order"],[815,"fe_mir::ir::constant"],[885,"fe_mir::ir::function"],[1056,"fe_mir::ir::inst"],[1424,"fe_mir::ir::inst::InstKind"],[1464,"fe_mir::ir::types"],[1739,"fe_mir::ir::value"],[1820,"fe_mir::ir::value::AssignableValue"],[1824,"fe_mir::ir::value::Value"],[1831,"fe_mir::pretty_print"],[1834,"core::fmt"],[1835,"core::option"],[1836,"core::result"],[1837,"core::any"],[1838,"core::iter::traits::iterator"],[1839,"alloc::vec"],[1840,"fe_analyzer::namespace::types"],[1841,"fe_analyzer::namespace::items"],[1842,"alloc::rc"],[1843,"fe_analyzer::context"],[1844,"smol_str"],[1845,"indexmap::map"],[1846,"fe_analyzer::errors"],[1847,"fe_common::files"],[1848,"salsa"],[1849,"salsa::runtime"],[1850,"core::ops::function"],[1851,"alloc::sync"],[1852,"salsa::revision"],[1853,"alloc::collections::btree::map"],[1854,"fe_parser::ast"],[1855,"fe_common::span"],[1856,"salsa::durability"],[1857,"fe_common::db"],[1858,"fe_analyzer::db"],[1859,"std::io::error"],[1860,"std::io"],[1861,"fe_parser::node"],[1862,"core::hash"],[1863,"num_bigint::bigint"],[1864,"core::convert"],[1865,"salsa::intern_id"],[1866,"core::cmp"],[1867,"unicode_normalization::replace"],[1868,"fe_analyzer::builtins"],[1869,"core::marker"],[1870,"unicode_normalization::recompose"],[1871,"unicode_normalization::decompose"],[1872,"unicode_normalization::stream_safe"],[1873,"alloc::string"],[1874,"num_traits::cast"],[1875,"alloc::boxed"]],"i":"```````````````Aff10000000000001010110000101010``B`Bb1011111011010001101111101010````CbBnBj21001010101100000102100210211111120110210210210Cd00``Cf101111011111010101001010101````````````````````FnAIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFnAIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0000000000DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn000000:987654321000DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlGjFn10AIb2DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0000000000DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFl?>=<;:9876543210Fn00000000000000000000AIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn00000000000000000Gl1Gj1201200212012012012012012012012012012012012012022222222222222220222DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn00000000000000000AIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFnAIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0AIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0000`````````````````````Nl0000`000000000`00`0000000````Od00000000000000000`Of0000000000000000000000000000000000000000000000000000000000000000000000000AA`0``00A@n000101111111110010100010000000000000001010101`AAb0000000000000000000000000000000000000000000AAh```00L`Lb12012012012012101200001111222201201221012012000012012012100120`AAn`````00LfLh110AAl23lAAd32451003245103245103245104440324510333322224444555511110000132451032451040032450003245104500430000434211340003434042110003245103245103245102324510400000ABlABfA@l0022000`22111`0AAj3`131`1111113`ABhABbABdACdACh6666868686768766666Ol777887```0ABn88``7::89:888889998::89888898890:087865432888898AC`;999;999999:9:9976543999999:98;`9`;0``9;`76543A@jA@`00::650=13<42;:650=13<42;060=13<42;0=13<42;0=13<42;10=13<42;0000====11113333<<<<44442222;;;;0=133<<442;;:650=13<42;;0=13<42;:650=13<42;6501:0;10106566660Oj171>24=53<4=5<;761>24=53<;761>24=53<;761>24=53<1ADdADfADhADjADlADnAE`AEb1AEdAEfAEhAEjAEl146AEnAF`AFbAFdAFfAFh2;28AFjAFlAFn:=6ADn4798={{{b{Gl}}G`}{{Cl{{Bl{Lf}}}}}}{{bG`}{{Cl{{Bl{Lf}}}}}}{GjLd}{{{b{Gl}}Ib}{{Cl{{Bl{Lf}}}}}}{{bIb}{{Cl{{Bl{Lf}}}}}}2{{{b{Gl}}Kb}{{Cl{{Bl{Lf}}}}}}{{bKb}{{Cl{{Bl{Lf}}}}}}4{{{b{Gl}}Jn}L`}{{bJn}L`}6{{{b{Gl}}Lf}{{Cl{l}}}}{{bLf}{{Cl{l}}}}8{{{b{Gl}}Db}Lf}{{bDb}Lf}:{{{b{Gl}}Db{M`{DhCh}}}Lf}{{bDb{M`{DhCh}}}Lf}<32<{{{b{Gl}}Ch}Lj}{{bCh}Lj}>{{bIb}{{Dd{{Cl{{Aj{Cj}}}}}}}}{{bIb}{{Cl{{Aj{Mb}}}}}}{{bJn}{{Dd{{Al{ChDl}}}}}}{{bJn}{{Dd{{Al{MdMf}}}}}}{{bIb}{{Cl{{Bl{Jn}}}}}}{{bIb}{{Cl{{Aj{Cn}}}}}}{{bIb}Dh}{{bIb}{{Dd{{Cl{{Dj{{Mh{HjCh}}Cj}}}}}}}}{{bIb}A`}{{bIb}{{Dd{{Cl{{Dj{DhMb}}}}}}}}{{bIb}{{Ah{Ib}}}}{{bIb}{{Dd{{Cl{Mj}}}}}}{{bIb}{{Cl{{Aj{Kb}}}}}}{{bIb}{{Cl{{Aj{Ib}}}}}}{{bIb}{{Bl{Db}}}}{{bIb}{{Dd{{Cl{{Dj{Dh{Mh{MlMb}}}}}}}}}}{MnGj}{{{b{Fn}}}{{b{N`}}}}{{{b{Fn}}}{{b{H`}}}}{{{b{dFn}}}{{b{dH`}}}}{{{b{c}}}{{b{{Ld{e}}}}}{}{}}000000000000000{bI`}{{{b{d}}Gf{Cl{Gh}}}h}{{{b{d}}Gf{Cl{Gh}}Nb}h}{{{b{d}}I`{Cl{{Dj{DhI`}}}}}h}{{{b{d}}I`{Cl{{Dj{DhI`}}}}Nb}h}{{{b{d}}I`{Cl{{Aj{Gf}}}}}h}{{{b{d}}I`{Cl{{Aj{Gf}}}}Nb}h}{{{b{d}}I`}h}{{{b{d}}I`Nb}h}{{bKb}{{Cl{{Aj{Kf}}}}}}{{bKb}{{Cl{{Aj{Db}}}}}}{{bKb}{{Dd{Df}}}}{{bKb}{{Dd{{Cl{{Dj{DhKf}}}}}}}}{{bKf}{{Dd{{Al{ChDl}}}}}}{{bKb}{{Dd{{Cl{{Dj{DhDb}}}}}}}}{{bHj}{{Cl{{Aj{Hf}}}}}}{{bHj}{{Dd{{Cl{{Dj{DhHf}}}}}}}}{{bHjCh}A`}{c{{Al{e}}}{}{}}000000000000000000{{}{{Al{c}}}{}}000000000000000000{{bKn}{{Dd{{Al{ChDl}}}}}}{bAn}000000000000000000{{{b{Fn}}}{{b{Nd}}}}{{{b{Fn}}}{{b{Nf}}}}{{{b{dFn}}}{{b{dNd}}}}{{{b{dFn}}}{{b{dNf}}}}{{{b{Gl}}Ib{b{dc}}}{{Nh{h}}}Nj}````````````````````{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{Nl}}}Nl}{{b{b{dc}}}h{}}{{bj}h}`{{}Nl}{{{b{Nl}}{b{Nl}}}A`}{{b{b{c}}}A`{}}000{{{b{Nl}}{b{dAb}}}Ad}{cc{}}{{{b{{Nn{c}}}}}Nl{}}`{{{b{Nl}}{b{dc}}}hO`}{NlOb}`{{}c{}}{{{b{Nl}}}A`}{NlMl}{bc{}}{c{{Al{e}}}{}{}}{{}{{Al{c}}}{}}{bAn}````{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{Od}}}Od}{{b{b{dc}}}h{}}{{bj}h}{{{b{Od}}{b{Od}}}A`}{{b{b{c}}}A`{}}000{{{b{Od}}{b{dAb}}}Ad}{cc{}}{{{b{Od}}{b{dc}}}hO`}{{}c{}}>=<;`{{{b{dOf}}OhNl}Oj}{{{b{dOf}}OhOhNl}Oj}{{{b{dOf}}Oh{Bl{Oh}}Nl}Oj}{{{b{dOf}}Lj{Bl{Oh}}Nl}Oj}3222{Ofl}?>{{{b{dOf}}OhnnNl}Oj}1{{{b{dOf}}Lf{Bl{Oh}}OlNl}Oj}{{{b{dOf}}OhCnNl}Oj}{{{b{dOf}}OhOhCnNl}Oj}{{{b{dOf}}}n}{{{b{dOf}}On}Oh}9:9{{{b{Of}}{b{dAb}}}Ad}>{{{b{Of}}}Lf};;{{{b{Of}}Oj}{{b{A@`}}}}{{{b{dOf}}Oj}{{Ah{{b{A@b}}}}}}?>{{{b{dOf}}n}A`}{{{b{dOf}}}A`}{{{b{dOf}}nNl}Oj}{{{b{dOf}}OhNl}Oj}{{{b{dOf}}OhOhNl}Oj}1000:{{{b{dOf}}L`Lj}Oh}{{{b{dOf}}A@dLj}Oh}{{{b{dOf}}A`Lj}Oh}{{{b{dOf}}Lj}Oh}{{{b{dOf}}c}Oh{{A@h{A@f}}}}5{{{b{dOf}}OjA@b}h}76{{{b{dOf}}n}h}0778{{LfNl}Of}{{{b{dOf}}Nl}Oj}:9{{{b{dOf}}OhLjNl}Oj}{{{b{dOf}}Oj}h}<{{{b{dOf}}{Ah{Oh}}Nl}Oj}<<{{{b{dOf}}On}Oh}={{{b{dOf}}OhA@j{Ah{n}}Nl}Oj}{c{{Al{e}}}{}{}}{{}{{Al{c}}}{}}{bAn}7{{{b{dOf}}Oh}{{b{A@f}}}}{{{b{dOf}}Oh}Lj}{{{b{dOf}}A@l{Bl{Oh}}Nl}Oj}``````{{{b{dA@n}}}h}{{{b{A@n}}}{{b{l}}}}{{{b{dA@n}}}{{b{dl}}}}{b{{b{c}}}{}}0{{{b{d}}}{{b{dc}}}{}}0{{{b{AA`}}}AA`}{{b{b{dc}}}h{}}{{bj}h}{{{b{AA`}}{b{AA`}}}A`}{{b{b{c}}}A`{}}000{{{b{A@n}}}n}{{{b{A@n}}}Oj}{{{b{AA`}}{b{dAb}}}Ad}{cc{}}0{{{b{dA@n}}n}h}{{{b{dA@n}}Oj}h}{{}c{}}0{{{b{A@n}}}AA`}{{{b{dA@n}}A@b}{{Ah{Oh}}}}{{{b{dl}}AA`}A@n}{{{b{dl}}}A@n}{{{b{A@n}}}{{Ah{n}}}}404{{{b{dA@n}}}h}00{{{b{dA@n}}AA`}h}1{{{b{dA@n}}Od}n}{{{b{dA@n}}A@`}Oj}{bc{}}{c{{Al{e}}}{}{}}0{{}{{Al{c}}}{}}0{bAn}0`{{{b{dAAb}}n}h}{{{b{dAAb}}Ojn}h}{{{b{AAb}}}Bd}{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{AAb}}}AAb}{{b{b{dc}}}h{}}{{bj}h}{{{b{AAb}}}n}{{{b{AAb}}{b{AAb}}}A`}{{b{b{c}}}A`{}}000{{{b{AAb}}n}{{Ah{Oj}}}}{{{b{AAb}}{b{dAb}}}Ad}{cc{}}{{{b{dAAb}}nn}h}0{{{b{dAAb}}OjOj}h}0{{{b{AAb}}Oj}n}{{}c{}}{{{b{AAb}}n}A`}0{{{b{AAb}}Oj}A`}{{{b{AAb}}{b{AAd}}n}A`}{{{b{AAb}}}{{`{{Bh{}{{Bf{n}}}}}}}}{{{b{AAb}}n}{{`{{Bh{}{{Bf{Oj}}}}}}}}>;{nAAb}{{{b{AAb}}n}{{Ah{n}}}}{{{b{AAb}}Oj}{{Ah{Oj}}}}{{{b{dAAb}}Ojn}h}21{{{b{dAAb}}n}h}{{{b{dAAb}}Oj}h}{{{b{AAb}}{b{AAd}}n}{{Ah{Oj}}}}{bc{}}{c{{Al{e}}}{}{}}{{}{{Al{c}}}{}}{bAn}``````{{{b{L`}}}AAf}{b{{b{c}}}{}}00{{{b{d}}}{{b{dc}}}{}}00{{{b{Lb}}}Lb}{{{b{L`}}}L`}{{{b{AAh}}}AAh}{{b{b{dc}}}h{}}00{{bj}h}00{{L`{b{Gl}}}{{Cl{Lb}}}}{{{b{Lb}}{b{Lb}}}A`}{{{b{L`}}{b{L`}}}A`}{{{b{AAh}}{b{AAh}}}A`}{{b{b{c}}}A`{}}00000000000{{{b{Lb}}{b{dAb}}}Ad}{{{b{L`}}{b{dAb}}}Ad}{{{b{AAh}}{b{dAb}}}Ad}{cc{}}00{MdAAh}{AAfL`}{{{b{Lb}}{b{dc}}}hO`}{{{b{L`}}{b{dc}}}hO`}{{{b{AAh}}{b{dc}}}hO`}{{}c{}}00{LbIb}{LbDh}{LbNl}{bc{}}00{c{{Al{e}}}{}{}}00{{}{{Al{c}}}{}}00{{L`{b{Gl}}}Lj}{LbLj}{bAn}00{LbAAh}`````````{{Lf{b{Gl}}}Db}{LhDb}{{{b{Lf}}}AAf}{{Lf{b{Gl}}}{{Cl{l}}}}{b{{b{c}}}{}}00000{{{b{d}}}{{b{dc}}}{}}00000{{{b{AAd}}Oj}AAj}{{{b{Lh}}}Lh}{{{b{AAl}}}AAl}{{{b{Lf}}}Lf}{{{b{AAn}}}AAn}{{{b{l}}}l}{{{b{AAd}}}AAd}{{b{b{dc}}}h{}}00000{{bj}h}00000{{{b{Lf}}{b{Lf}}}AB`}{{b{b{c}}}AB`{}}{{Lf{b{Gl}}}Dh}{{}AAd}{{{b{Lh}}{b{Lh}}}A`}{{{b{AAl}}{b{AAl}}}A`}{{{b{Lf}}{b{Lf}}}A`}{{{b{AAn}}{b{AAn}}}A`}{{{b{l}}{b{l}}}A`}{{{b{AAd}}{b{AAd}}}A`}{{b{b{c}}}A`{}}00000000000000000000000{lLf}{{{b{Lh}}{b{dAb}}}Ad}{{{b{AAl}}{b{dAb}}}Ad}{{{b{Lf}}{b{dAb}}}Ad}{{{b{AAn}}{b{dAb}}}Ad}{{{b{l}}{b{dAb}}}Ad}{{{b{AAd}}{b{dAb}}}Ad}{cc{}}00000{AAfLf}{{{b{AAd}}}{{`{{Bh{}{{Bf{Oh}}}}}}}}{{{b{dAAd}}}{{`{{Bh{}{{Bf{{b{dA@f}}}}}}}}}}{{{b{Lh}}{b{dc}}}hO`}{{{b{AAl}}{b{dc}}}hO`}{{{b{Lf}}{b{dc}}}hO`}{{{b{AAn}}{b{dc}}}hO`}{{{b{AAd}}Oj}{{b{A@`}}}}{{{b{dAAd}}Oj}{{b{dA@`}}}}{{{b{AAd}}Oj}{{Ah{{b{A@b}}}}}}{{}c{}}00000{{Lf{b{Gl}}}A`}{AAnA`}{{{b{AAd}}Oj}A`}0{{Lf{b{Gl}}}AAn}{LhAAn}{{{b{AAd}}Oh}{{Ah{{b{Gh}}}}}}{{{b{AAd}}}{{b{{Aj{Oh}}}}}}{{{b{dAAd}}}{{b{{Aj{Oh}}}}}}{{{b{dAAd}}OjA@b}h}{{Lf{b{Gl}}}Ib}{LhIb}{{{b{Lf}}{b{Gl}}}Dh}{AAlDh}{{LfNl}l}{lAAb}{LhBl}{{{b{Lf}}{b{Lf}}}{{Ah{AB`}}}}{{{b{dAAd}}Oj}{{Ah{A@b}}}}{{{b{dAAd}}OjA@`}A@`}{{{b{dAAd}}OhA@f}A@f}{LhM`}{{Lf{b{Gl}}}{{Ah{Lj}}}}{LhAh}{{Lf{b{Gl}}}A`}{{{b{dAAd}}Ojnn}h}{{Lf{b{Gl}}}{{Cl{Lh}}}}{AAlNl}{lNl}{lAAd}{{{b{dAAd}}Od}n}{{{b{dAAd}}A@`}Oj}{{{b{dAAd}}A@f}Oh}{bc{}}00000{c{{Al{e}}}{}{}}00000{{}{{Al{c}}}{}}00000{AAlLj}{bAn}00000{{{b{Lf}}{b{Gl}}}Dh}{{{b{AAd}}Oh}{{b{A@f}}}}{{{b{dAAd}}Oh}{{b{dA@f}}}}{{{b{AAd}}Oh}Lj}{{{b{AAd}}}{{`{{Bh{}{{Bf{{b{A@f}}}}}}}}}}{{{b{dAAd}}}{{`{{Bh{}{{Bf{{b{dA@f}}}}}}}}}}````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{{b{dA@j}}Ohn}h}{{{b{A@`}}}ABb}{{{b{dA@`}}}ABd}{{ABfOhOhNl}A@`}{{{b{AAj}}}ABh}{b{{b{c}}}{}}0000000000{{{b{d}}}{{b{dc}}}{}}0000000000{{{b{A@`}}}AAj}{{}{{ABj{c}}}{}}{{{b{A@`}}}A@`}{{{b{ABl}}}ABl}{{{b{A@j}}}A@j}{{{b{ABn}}}ABn}{{{b{ABf}}}ABf}{{{b{Ol}}}Ol}{{{b{AC`}}}AC`}{{{b{A@l}}}A@l}{{b{b{dc}}}h{}}0000000{{bj}h}0000000{{}A@j}{{{b{A@`}}{b{A@`}}}A`}{{{b{ABl}}{b{ABl}}}A`}{{{b{A@j}}{b{A@j}}}A`}{{{b{ABn}}{b{ABn}}}A`}{{{b{ABf}}{b{ABf}}}A`}{{{b{Ol}}{b{Ol}}}A`}{{{b{AC`}}{b{AC`}}}A`}{{{b{A@l}}{b{A@l}}}A`}{{b{b{c}}}A`{}}0000000000000000000000000000000{{{b{A@`}}{b{dAb}}}Ad}{{{b{ABl}}{b{dAb}}}Ad}{{{b{A@j}}{b{dAb}}}Ad}{{{b{ABn}}{b{dAb}}}Ad}0{{{b{ABf}}{b{dAb}}}Ad}0{{{b{Ol}}{b{dAb}}}Ad}0{{{b{AC`}}{b{dAb}}}Ad}{{{b{A@l}}{b{dAb}}}Ad}0{cc{}}0000000000{ACbA@l}{{{b{A@`}}{b{dc}}}hO`}{{{b{ABl}}{b{dc}}}hO`}{{{b{A@j}}{b{dc}}}hO`}{{{b{ABn}}{b{dc}}}hO`}{{{b{ABf}}{b{dc}}}hO`}{{{b{Ol}}{b{dc}}}hO`}{{{b{AC`}}{b{dc}}}hO`}{{{b{A@l}}{b{dc}}}hO`}{{}c{}}0000000000{{}c{}}0{{A@l{Bl{Oh}}Nl}A@`}{{{b{A@j}}}A`}{{{b{AAj}}}A`}{{{b{A@`}}}A`}{A@lA`}{{{b{A@j}}}{{`{{Bh{}{{Bf{{Mh{Ohn}}}}}}}}}}{A@`ABl}{{{b{A@j}}}Bd}{{ABlNl}A@`}{{{b{d{ACd{c}}}}}{{Ah{e}}}ACf{}}{{{b{d{ACh{c}}}}}{{Ah{e}}}{}{}}{{}{{ACj{c}}}{}}{{}{{ACl{c}}}{}}10{{}A@`}{{{b{Oj}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{A@`Nl}{{}{{AD`{c}}}{}}{bc{}}0000000{bADb}000{c{{Al{e}}}{}{}}0000000000{{}{{Al{c}}}{}}0000000000{bAn}0000000000{{ABnOhNl}A@`}{ADdAh}{ADfOh}{ADhAh}{ADjOh}{ADlOh}{ADnBl}{AE`Bl}{AEbBl}{AE`Ol}{AEdOh}{AEfCn}{AEhCn}{AEjAh}{AEln}{AEjOh}{AEdn}{AE`Lf}{AEnBl}{AF`Oh}{AFbAC`}{AFdOh}{AFfOh}{AFhABn}{AFdABf}{AEbA@l}4{AEhOh}{AFjOh}{AFlOh}{AFnOh}{AEjA@j}>{AFbLj}{ADnLj}{AFhOh}{AFbOh}{AEnOh}{AF`Oh}{AEfOh};``````````````````````````````````{{Lj{b{Gl}}cBd}BdAG`}{{Lj{b{Gl}}}Bd}{{Lj{b{Gl}}Bd}Bd}{{Lj{b{Gl}}}{{Ah{Ch}}}}{LlAh}2{{{b{Lj}}}AAf}{{{b{Lj}}{b{Gl}}}ADb}{b{{b{c}}}{}}000000000{{{b{d}}}{{b{dc}}}{}}000000000{{{b{Ll}}}Ll}{{{b{AGb}}}AGb}{{{b{Lj}}}Lj}{{{b{AGd}}}AGd}{{{b{AGf}}}AGf}{{{b{AGh}}}AGh}{{{b{AGj}}}AGj}{{{b{AGl}}}AGl}{{{b{AGn}}}AGn}{{{b{AH`}}}AH`}{{b{b{dc}}}h{}}000000000{{bj}h}000000000{{Lj{b{Gl}}}{{Cl{Ll}}}}{{Lj{b{Gl}}}Lj}{AGdLj}{{Lj{b{Gl}}Bd}Bd}2{{Lj{b{Gl}}Gb}Lj}{{{b{Ll}}{b{Ll}}}A`}{{{b{AGb}}{b{AGb}}}A`}{{{b{Lj}}{b{Lj}}}A`}{{{b{AGd}}{b{AGd}}}A`}{{{b{AGf}}{b{AGf}}}A`}{{{b{AGh}}{b{AGh}}}A`}{{{b{AGj}}{b{AGj}}}A`}{{{b{AGl}}{b{AGl}}}A`}{{{b{AGn}}{b{AGn}}}A`}{{{b{AH`}}{b{AH`}}}A`}{{b{b{c}}}A`{}}000000000000000000000000000000000000000{AGhBl}{AGnBl}{{{b{Ll}}{b{dAb}}}Ad}{{{b{AGb}}{b{dAb}}}Ad}{{{b{Lj}}{b{dAb}}}Ad}{{{b{AGd}}{b{dAb}}}Ad}{{{b{AGf}}{b{dAb}}}Ad}{{{b{AGh}}{b{dAb}}}Ad}{{{b{AGj}}{b{dAb}}}Ad}{{{b{AGl}}{b{dAb}}}Ad}{{{b{AGn}}{b{dAb}}}Ad}{{{b{AH`}}{b{dAb}}}Ad}{cc{}}000000000{AAfLj}{{{b{Ll}}{b{dc}}}hO`}{{{b{AGb}}{b{dc}}}hO`}{{{b{Lj}}{b{dc}}}hO`}{{{b{AGd}}{b{dc}}}hO`}{{{b{AGf}}{b{dc}}}hO`}{{{b{AGh}}{b{dc}}}hO`}{{{b{AGj}}{b{dc}}}hO`}{{{b{AGl}}{b{dc}}}hO`}{{{b{AGn}}{b{dc}}}hO`}{{{b{AH`}}{b{dc}}}hO`}{{Lj{b{Gl}}{b{Gh}}}A@d}{{}c{}}000000000{{Lj{b{Gl}}}A`}000000000000000{AGfBl}{AH`Lj}{LlAGb}{AGdBd}{{Lj{b{Gl}}}Lj}0{AGhIb}{AGjIb}{AGnIb}{AGhDh}{AGjDh}{AGlDh}{AGnDh}{{AGb{Ah{Ch}}}Ll}{{{b{Lj}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{{{b{Lj}}{b{Gl}}{b{dc}}}AdACn}{{Lj{b{Gl}}{b{A@f}}}Lj}{{Lj{b{Gl}}Bd}Lj}{{Lj{b{Gl}}Bd}Bd}{AGhMl}{AGjMl}{AGlMl}{AGnMl}{{{b{AGj}}}AGb}{bc{}}000000000{c{{Al{e}}}{}{}}000000000{{}{{Al{c}}}{}}000000000{AGlLj}{bAn}000000000{AH`Lj}{AGjBl}````````````{{DhLjNl}On}{b{{b{c}}}{}}00{{{b{d}}}{{b{dc}}}{}}00{{{b{A@f}}}A@f}{{{b{A@b}}}A@b}{{{b{On}}}On}{{b{b{dc}}}h{}}00{{bj}h}00{{{b{A@f}}{b{A@f}}}A`}{{{b{A@b}}{b{A@b}}}A`}{{{b{On}}{b{On}}}A`}{{b{b{c}}}A`{}}00000000000{{{b{A@f}}{b{dAb}}}Ad}{{{b{A@b}}{b{dAb}}}Ad}{{{b{On}}{b{dAb}}}Ad}{cc{}}{OhA@b}11{{{b{A@f}}{b{dc}}}hO`}{{{b{A@b}}{b{dc}}}hO`}{{{b{On}}{b{dc}}}hO`}{{}c{}}00{OnA`}{{{b{A@f}}}A`}1{OnDh}{{{b{Oh}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{{{b{A@b}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{OnNl}{{DhLj}On}{bc{}}00{c{{Al{e}}}{}{}}00{{}{{Al{c}}}{}}00{{{b{A@f}}}Lj}{{{b{A@b}}{b{Gl}}{b{AAd}}}Lj}{OnLj}{bAn}00{{DhLjNl}On}{{{b{A@b}}}{{Ah{Oh}}}}{AHbOh}{AHdOh}{AHbAHf}{AHdAHf}{AHhL`}{AHjA@d}{AHlOj}{AHlLj}{AHjLj}{AHhLj}{AHnLj}`{{{b{AI`}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{{{b{AI`}}{b{Gl}}{b{AAd}}}ADb}","D":"BBh","p":[[1,"reference",null,null,1],[0,"mut"],[5,"ControlFlowGraph",13],[1,"unit"],[1,"u8"],[5,"FunctionBody",885],[8,"BasicBlockId",623],[1,"bool"],[5,"Formatter",1834],[8,"Result",1834],[5,"CfgPostOrder",13],[6,"Option",1835,null,1],[1,"slice"],[6,"Result",1836,null,1],[5,"TypeId",1837],[5,"DomTree",46],[5,"DFSet",46],[1,"usize"],[17,"Item"],[10,"Iterator",1838],[5,"Loop",78],[5,"Vec",1839],[5,"LoopTree",78],[8,"LoopId",78],[5,"BlocksInLoopPostOrder",78],[6,"PostIDom",132],[5,"PostDomTree",132],[5,"TypeId",1840],[5,"ImplId",1841],[5,"Rc",1842,null,1],[5,"ContractId",1841],[5,"ContractFieldId",1841],[5,"FunctionId",1841],[5,"Analysis",1843],[5,"DepGraphWrapper",1841],[5,"SmolStr",1844],[5,"IndexMap",1845],[5,"TypeError",1846],[5,"MirInternConstQuery",165],[5,"MirInternConstLookupQuery",165],[5,"MirInternTypeQuery",165],[5,"MirInternTypeLookupQuery",165],[5,"MirInternFunctionQuery",165],[5,"MirInternFunctionLookupQuery",165],[5,"MirLowerModuleAllFunctionsQuery",165],[5,"MirLowerContractAllFunctionsQuery",165],[5,"MirLowerStructAllFunctionsQuery",165],[5,"MirLowerEnumAllFunctionsQuery",165],[5,"MirLoweredTypeQuery",165],[5,"MirLoweredConstantQuery",165],[5,"MirLoweredFuncSignatureQuery",165],[5,"MirLoweredMonomorphizedFuncSignatureQuery",165],[5,"MirLoweredPseudoMonomorphizedFuncSignatureQuery",165],[5,"MirLoweredFuncBodyQuery",165],[5,"NewDb",165],[5,"EnumId",1841],[5,"EnumVariantId",1841],[6,"EnumVariantKind",1841],[5,"SourceFileId",1847],[1,"str"],[5,"MirDbGroupStorage__",165],[10,"MirDb",165],[5,"DatabaseKeyIndex",1848],[5,"Runtime",1849],[10,"FnMut",1850],[5,"FunctionBody",1843],[5,"FunctionSigId",1841],[5,"FunctionSignature",1840],[5,"TraitId",1841],[5,"QueryTable",1848],[5,"QueryTableMut",1848],[5,"IngotId",1841],[5,"ModuleId",1841],[5,"Attribute",1841],[5,"AttributeId",1841],[5,"Contract",1841],[5,"ContractField",1841],[5,"Enum",1841],[5,"EnumVariant",1841],[5,"File",1847],[5,"Function",1841],[5,"FunctionSig",1841],[5,"Impl",1841],[5,"Ingot",1841],[5,"Module",1841],[5,"ModuleConstant",1841],[5,"ModuleConstantId",1841],[5,"Struct",1841],[5,"StructId",1841],[5,"StructField",1841],[5,"StructFieldId",1841],[5,"Trait",1841],[6,"Type",1840],[5,"TypeAlias",1841],[5,"TypeAliasId",1841],[5,"ConstantId",815],[5,"Constant",815],[5,"Arc",1851,null,1],[5,"FunctionId",885],[5,"FunctionSignature",885],[5,"TypeId",1464],[5,"Type",1464],[5,"Revision",1852],[5,"BTreeMap",1853],[6,"Item",1841],[6,"Constant",1843],[5,"ConstEvalError",1846],[1,"tuple",null,null,1],[5,"Module",1854],[5,"Span",1855],[1,"u16"],[10,"Database",1848],[5,"Durability",1856],[10,"SourceDb",1857],[10,"AnalyzerDb",1858],[8,"Result",1859,null,1],[10,"Write",1860],[5,"SourceInfo",575],[5,"Node",1861],[10,"Hasher",1862],[5,"NodeId",1861],[5,"BasicBlock",623],[5,"BodyBuilder",643],[8,"ValueId",1739],[8,"InstId",1056],[6,"CallType",1056],[5,"Local",1739],[5,"Inst",1056],[6,"AssignableValue",1739],[5,"BigInt",1863],[6,"Value",1739],[10,"Into",1864,null,1],[5,"SwitchTable",1056],[6,"YulIntrinsicOp",1056],[5,"BodyCursor",718],[6,"CursorLocation",718],[5,"BodyOrder",770],[5,"BodyDataStore",885],[5,"InternId",1865],[6,"ConstantValue",815],[6,"BranchInfo",1056],[5,"FunctionParam",885],[6,"Linkage",885],[6,"Ordering",1866],[8,"ValueIter",1056],[8,"ValueIterMut",1056],[6,"BinOp",1056],[8,"BlockIter",1056],[5,"Replacements",1867],[6,"InstKind",1056],[6,"UnOp",1056],[6,"CastKind",1056],[6,"Intrinsic",1868],[6,"IterBase",1056],[10,"Copy",1869],[6,"IterMutBase",1056],[5,"Recompositions",1870],[5,"Decompositions",1871],[10,"Write",1834],[5,"StreamSafe",1872],[5,"String",1873],[15,"Revert",1424],[15,"Emit",1424],[15,"Return",1424],[15,"Keccak256",1424],[15,"AbiEncode",1424],[15,"AggregateConstruct",1424],[15,"Call",1424],[15,"YulIntrinsic",1424],[15,"Branch",1424],[15,"Create",1424],[15,"Create2",1424],[15,"Switch",1424],[15,"Jump",1424],[15,"AggregateAccess",1424],[15,"MapAccess",1424],[15,"Cast",1424],[15,"Binary",1424],[15,"Declare",1424],[15,"Unary",1424],[15,"Bind",1424],[15,"MemCopy",1424],[15,"Load",1424],[10,"ToPrimitive",1874],[6,"TypeKind",1464],[5,"ArrayDef",1464],[5,"TupleDef",1464],[5,"StructDef",1464],[5,"EnumDef",1464],[5,"EnumVariant",1464],[5,"EventDef",1464],[5,"MapDef",1464],[15,"Aggregate",1820],[15,"Map",1820],[5,"Box",1875,null,1],[15,"Constant",1824],[15,"Immediate",1824],[15,"Temporary",1824],[15,"Unit",1824],[10,"PrettyPrint",1831],[5,"MirDbStorage",165]],"r":[[5,13],[6,46],[7,78],[8,132],[575,623],[576,623],[577,815],[578,815],[579,885],[580,885],[581,885],[582,885],[583,1056],[584,1056],[586,1464],[587,1464],[588,1464],[589,1739],[590,1739]],"b":[[313,"impl-HasQueryGroup%3CSourceDbStorage%3E-for-NewDb"],[314,"impl-HasQueryGroup%3CAnalyzerDbStorage%3E-for-NewDb"],[315,"impl-HasQueryGroup%3CMirDbStorage%3E-for-NewDb"],[570,"impl-Upcast%3Cdyn+SourceDb%3E-for-NewDb"],[571,"impl-Upcast%3Cdyn+AnalyzerDb%3E-for-NewDb"],[572,"impl-UpcastMut%3Cdyn+SourceDb%3E-for-NewDb"],[573,"impl-UpcastMut%3Cdyn+AnalyzerDb%3E-for-NewDb"],[1317,"impl-Display-for-UnOp"],[1318,"impl-Debug-for-UnOp"],[1319,"impl-Display-for-BinOp"],[1320,"impl-Debug-for-BinOp"],[1321,"impl-Display-for-CallType"],[1322,"impl-Debug-for-CallType"],[1324,"impl-Display-for-YulIntrinsicOp"],[1325,"impl-Debug-for-YulIntrinsicOp"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABYGUAAAAAoADAAAAA4AEAAjAAsAMAAIADoAAAA8AAEASAAQAFoADgBwAAAAdwAAAHoAHgCeAAkAqQB5ADYBCQBgARQAiAG2AEACCQBLAgYAUwINAGICBABoAhQAfgIAAIACGgCcAgQAogIAAKQCLQDTAhAA5gIAAO0CCAD4AgAA+gIIAAcDBAANAwQAEwMAACMDAAAsAwUAMwMlAFwDBABnAwkAcgMCAHkDAQB8AwAAfwMkAKUDJQDRAwgA4QMFAOgDBwDxAykAHAQJACgEAwAtBAYANQQZAFAEFABmBAQAbAQCAHAEFACGBAAAiAQNAJcEIQC7BHMAOgUIAE4FbAC8BQIAwgUHAMsFAgDPBQAA0QUAANMFBwDcBXwAYwYLAHkGIQCcBjEA0AYAANIGAADVBiQA+wYAAP4GAgAFBwAACAciAA==","P":[[15,"T"],[19,""],[20,"T"],[21,""],[25,"K"],[29,""],[30,"T"],[32,"U"],[34,"I"],[35,""],[39,"T"],[40,"U,T"],[42,"U"],[44,""],[48,"T"],[52,""],[53,"T"],[54,""],[61,"T"],[63,""],[66,"U"],[68,""],[71,"T"],[72,"U,T"],[74,"U"],[76,""],[82,"T"],[88,""],[91,"T"],[93,""],[98,"K"],[102,""],[104,"T"],[107,""],[108,"U"],[111,"I"],[112,""],[118,"Iterator::Item"],[119,""],[121,"T"],[123,"U,T"],[126,"U"],[129,""],[137,"T"],[141,""],[142,"T"],[143,""],[146,"K"],[150,""],[152,"T"],[154,"U"],[156,""],[158,"T"],[159,"U,T"],[161,"U"],[163,""],[186,"T"],[224,""],[257,"QueryDb::DynDb,Query::Key,Query::Value"],[267,""],[290,"T"],[309,""],[372,"U"],[391,""],[478,"QueryDb::GroupStorage,Query::Storage"],[494,""],[512,"U,T"],[531,"U"],[550,""],[574,"W"],[595,"T"],[597,""],[598,"T"],[599,""],[603,"K"],[607,""],[608,"T"],[611,"__H"],[612,""],[614,"U"],[615,""],[617,"T"],[618,"U,T"],[619,"U"],[620,""],[625,"T"],[627,""],[628,"T"],[629,""],[631,"K"],[635,""],[636,"T"],[637,"__H"],[638,"U"],[639,"T"],[640,"U,T"],[641,"U"],[642,""],[653,"T"],[655,""],[666,"T"],[667,""],[672,"U"],[673,""],[711,"U,T"],[712,"U"],[713,""],[727,"T"],[731,""],[732,"T"],[733,""],[735,"K"],[739,""],[742,"T"],[744,""],[746,"U"],[748,""],[763,"T"],[764,"U,T"],[766,"U"],[768,""],[774,"T"],[776,""],[777,"T"],[778,""],[781,"K"],[785,""],[787,"T"],[788,""],[793,"U"],[794,""],[811,"T"],[812,"U,T"],[813,"U"],[814,""],[822,"T"],[828,""],[831,"T"],[834,""],[841,"K"],[853,""],[856,"T"],[859,""],[861,"__H"],[864,"U"],[867,""],[870,"T"],[873,"U,T"],[876,"U"],[879,""],[898,"T"],[910,""],[917,"T"],[923,""],[930,"K"],[931,""],[939,"K"],[963,""],[970,"T"],[976,""],[979,"__H"],[983,""],[986,"U"],[992,""],[1025,"T"],[1031,"U,T"],[1037,"U"],[1043,""],[1225,"T"],[1247,""],[1248,"I"],[1249,""],[1257,"T"],[1265,""],[1282,"K"],[1314,""],[1326,"T"],[1337,""],[1338,"__H"],[1346,"U"],[1357,"I"],[1359,""],[1368,"T,Iterator::Item"],[1370,"I"],[1374,""],[1375,"W"],[1376,""],[1377,"I"],[1378,"T"],[1386,""],[1390,"U,T"],[1401,"U"],[1412,""],[1498,"T"],[1499,""],[1506,"T"],[1526,""],[1536,"T"],[1546,""],[1572,"K"],[1612,""],[1624,"T"],[1634,""],[1635,"__H"],[1645,""],[1646,"U"],[1656,""],[1686,"W"],[1688,""],[1696,"T"],[1706,"U,T"],[1716,"U"],[1726,""],[1752,"T"],[1758,""],[1761,"T"],[1764,""],[1770,"K"],[1782,""],[1785,"T"],[1786,""],[1787,"T"],[1789,"__H"],[1792,"U"],[1795,""],[1799,"W"],[1801,""],[1803,"T"],[1806,"U,T"],[1809,"U"],[1812,""],[1832,"W"],[1833,""]]}],["fe_parser",{"t":"PFPFIFEENNCNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNONNNNNNCNNNNNNCONNCNHNNNNONONNNNNNNNNNNNNPPPPPPPPPGPPPPPPGPPPFPGPPFPPFPGPFPPGPFPGFPPGFPGGPPPPFPPPPPPGPPPFPFGPPPPPPPPPPFPPPPPGPFPPPPPPPPPPFPFPPPPFPPPPPPFPGPPPGPPPPPFPGPGFGPPONOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONOONNNOOOOOOOOONNNNNNOOOOOOOOONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOCCCCCHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFGPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNOONNNNNNNNNNNNFFFKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNONNNNNONNNNNNNNNNNNNNNMNOONNNNNNNNNNNNNN","n":["Err","Label","Ok","ParseFailed","ParseResult","Parser","Token","TokenKind","as_bt_parser","assert","ast","borrow","","","borrow_mut","","","clone","","clone_into","","clone_to_uninit","","diagnostics","done","eat_newlines","enter_block","eq","","equivalent","","","","","","","","error","expect","expect_stmt_end","expect_with_notes","fancy_error","file_id","fmt","","","from","","","grammar","hash","","into","","","into_cs_label","lexer","message","new","next","node","optional","parse_file","peek","peek_or_err","primary","secondary","span","split_next","style","to_owned","","to_string","try_from","","","try_into","","","type_id","","","unexpected_token_error","Add","And","Assert","Assign","Attribute","","AugAssign","Base","BinOperation","BinOperator","BitAnd","BitOr","BitXor","Bool","","BoolOperation","BoolOperator","Bounded","Break","Call","CallArg","CompOperation","CompOperator","ConstExpr","Constant","ConstantDecl","","Continue","Contract","","ContractStmt","Div","Enum","","Eq","Expr","","Field","For","FuncStmt","Function","","","FunctionArg","FunctionSignature","Generic","GenericArg","GenericParameter","Glob","Gt","GtE","If","Impl","","Int","Invert","LShift","List","Literal","LiteralPattern","Lt","LtE","Match","MatchArm","Mod","Module","ModuleStmt","Mult","Name","","Nested","Not","NotEq","Num","Or","","ParseError","Path","","","","PathStruct","PathTuple","Pattern","Pow","Pragma","","RShift","Regular","Repeat","Rest","Return","Revert","SelfType","Self_","Simple","SmolStr","Str","Struct","","Sub","Subscript","Ternary","Trait","","Tuple","","","","","TypeAlias","","TypeDesc","","USub","UnaryOperation","UnaryOperator","Unbounded","Unit","","","Unsafe","Use","","UseTree","VarDecl","VarDeclTarget","Variant","VariantKind","While","WildCard","args","as_str","attributes","body","","","","borrow","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_to_uninit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","cmp","compare","default","deref","deserialize","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","eq","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fields","","fmt","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","from_iter","","","","from_str","functions","","","","generic_params","hash","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","impl_trait","into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","is_const","is_empty","is_heap_allocated","is_pub","is_rest","kind","label","label_span","len","name","","","","","","","","","","name_node","name_span","new","new_inline","new_inline_from_ascii","partial_cmp","pat","pub_","pub_qual","","","","","","receiver","remove_last","return_type","segments","serialize","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","sig","span","","","","to_owned","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","to_string","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","tree","try_from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","typ","","","typ_span","type_id","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","unsafe_","value","","","variants","version_requirement","args","attr","else_expr","elts","","func","generic_args","if_expr","index","left","","","len","op","","","","operand","right","","","test","value","","","arms","body","","","error","expr","iter","msg","mut_","name","op","or_else","target","","","","test","","","typ","","value","","","","","","label","mut_","","name","typ","bound","name","fields","has_rest","path","args","base","","items","children","path","prefix","","rename","contracts","expressions","functions","module","types","parse_contract_def","parse_call_args","parse_expr","parse_expr_with_min_bp","parse_assert_stmt","parse_fn_def","parse_fn_sig","parse_for_stmt","parse_generic_param","parse_generic_params","parse_if_stmt","parse_match_arms","parse_match_stmt","parse_pattern","parse_return_stmt","parse_revert_stmt","parse_single_word_stmt","parse_stmt","parse_unsafe_block","parse_while_stmt","parse_constant","parse_module","parse_module_stmt","parse_pragma","parse_use","parse_use_tree","parse_enum_def","parse_field","parse_generic_args","parse_impl_def","parse_opt_qualifier","parse_path_tail","parse_struct_def","parse_trait_def","parse_type_alias","parse_type_desc","parse_variant","Amper","AmperEq","And","Arrow","As","Assert","Binary","BraceClose","BraceOpen","BracketClose","BracketOpen","Break","Colon","ColonColon","Comma","Const","Continue","Contract","Dot","DotDot","Else","Enum","Eq","EqEq","Error","False","FatArrow","Fn","For","Gt","GtEq","GtGt","GtGtEq","Hash","Hat","HatEq","Hex","Idx","If","Impl","In","Int","Let","Lexer","Lt","LtEq","LtLt","LtLtEq","Match","Minus","MinusEq","Mut","Name","Newline","Not","NotEq","Octal","Or","ParenClose","ParenOpen","Percent","PercentEq","Pipe","PipeEq","Plus","PlusEq","Pragma","Pub","Return","Revert","SelfType","SelfValue","Semi","Slash","SlashEq","Star","StarEq","StarStar","StarStarEq","Struct","Text","Tilde","Token","TokenKind","Trait","True","Type","Unsafe","Use","While","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","describe","eq","","equivalent","","","","","","","","fmt","","from","","","into","","","into_iter","kind","lex","new","next","source","span","text","to_owned","","","try_from","","","try_into","","","type_id","","","Node","NodeId","Span","Spanned","add","","","","","add_assign","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","cmp","compare","create","default","deserialize","","dummy","","end","eq","","","equivalent","","","","","","","","","","","","file_id","fmt","","","","from","","","","","","","","from_pair","hash","","","id","into","","","is_dummy","","kind","name","","","","","","","","","name_span","new","","partial_cmp","serialize","","span","","","start","to_owned","","","to_string","try_from","","","try_into","","","type_id","","","zero"],"q":[[0,"fe_parser"],[83,"fe_parser::ast"],[1064,"fe_parser::ast::Expr"],[1089,"fe_parser::ast::FuncStmt"],[1116,"fe_parser::ast::FunctionArg"],[1121,"fe_parser::ast::GenericParameter"],[1123,"fe_parser::ast::Pattern"],[1126,"fe_parser::ast::TypeDesc"],[1130,"fe_parser::ast::UseTree"],[1135,"fe_parser::grammar"],[1140,"fe_parser::grammar::contracts"],[1141,"fe_parser::grammar::expressions"],[1144,"fe_parser::grammar::functions"],[1160,"fe_parser::grammar::module"],[1166,"fe_parser::grammar::types"],[1177,"fe_parser::lexer"],[1321,"fe_parser::node"],[1427,"fe_parser::parser"],[1428,"fe_parser::lexer::token"],[1429,"fe_common::diagnostics"],[1430,"alloc::vec"],[1431,"fe_common::span"],[1432,"alloc::string"],[1433,"core::convert"],[1434,"core::ops::function"],[1435,"fe_common::files"],[1436,"core::fmt"],[1437,"core::result"],[1438,"core::hash"],[1439,"codespan_reporting::diagnostic"],[1440,"core::option"],[1441,"core::any"],[1442,"smol_str"],[1443,"core::cmp"],[1444,"serde::de"],[1445,"core::iter::traits::collect"],[1446,"serde::ser"],[1447,"alloc::boxed"],[1448,"vec1"],[1449,"logos::lexer"],[1450,"core::clone"]],"i":"Al`0`````d0`0ln21010101022221011110000222222100210`102101`122`2`22111211002102102102GnGlG`0DlGh2Fb1`555Gd22`Ff53`3`Fd5`66`5`8`5Hb`7`7``6Fl``5``Ed229`83H`<8Gb`44;`=``=Gf:325:1=;`91:11`>`;>Fn;2==:04`;``=`>```>3D`DbDdCfDfDhDj553DlDnE`EbEdEfEh9EjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb0000CfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb0000CfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb000Cf000Dl000Dn000E`000Eb000Ed000Ef000Eh000Df000Ej000El000En000F`000Fb000Fd000Ff000Dd000Fh000Fj000Fl000D`000Dh000Fn000G`000Dj000Gb000Gd000Gf000Gh000Gj000Gl000Gn000H`000Hb000DfEjDb0Cf0Dl0Dn0E`0Eb0Ed0Ef0Eh0::99El0En0F`0Fb0Fd0Ff0Dd0Fh0FjFl0D`Dh0Fn0G`0Dj0Gb0Gd0Gf0Gh0Gj0Gl0Gn0H`0Hb0Db0CfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb0000EjElEnF`D`5CfDlDnE`EbEdEfEhDf=<;:FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbF`DbCfDlDnE`EbEdEfEhDfEjElEn=FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDdDb01:Fh7>1FfEfEhDfEjElEn97D`7Fn::::Dj2876543F`E`40=CfDlDn3EbEd?>=<;:6FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEd98DfEjElEnF`FbFdFf?FhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`Hb=EfDd6ElDnIhIjIlJ`Jb442JdJfJhJjJl32Jn204328951K`KbKdKfKh43KjKlKnL`52Lb1876432Ld4312LfLh0Lj11Ll0Ln00M`Mb1MdMhMjMl21``````````````````````````````````````````h000000000000000000000000000000000000000000`00000000000000000000000000000000000000``000000j1Mn120120120120212111122221212012001200011120120120120````Ah000000NdI`210210210210111120212210222211110000221002221110022100210210000000000020120Nb11332113213213213","f":"`````````{{{f{bd}}h}j}`{f{{f{c}}}{}}00{{{f{b}}}{{f{bc}}}{}}00{{{f{l}}}l}{{{f{n}}}n}{{f{f{bc}}}A`{}}0{{fAb}A`}0{dAd}{{{f{bd}}}Af}{{{f{bd}}}A`}{{{f{bd}}Ah{f{Aj}}}{{Al{A`}}}}{{{f{l}}{f{l}}}Af}{{{f{n}}{f{n}}}Af}{{f{f{c}}}Af{}}0000000{{{f{bd}}Ahc}A`{{B`{An}}}}{{{f{bd}}hc}{{Al{j}}}{{B`{An}}}}{{{f{bd}}{f{Aj}}}{{Al{A`}}}}{{{f{bd}}hce}{{Al{j}}}{{B`{An}}}{{Bd{{f{j}}}{{Bb{{Ad{An}}}}}}}}{{{f{bd}}c{Ad{l}}{Ad{An}}}A`{{B`{An}}}}{dBf}{{{f{l}}{f{bBh}}}{{Bl{A`Bj}}}}{{{f{n}}{f{bBh}}}Bn}{{{f{n}}{f{bBh}}}{{Bl{A`Bj}}}}{cc{}}00`{{{f{l}}{f{bc}}}A`C`}{{{f{n}}{f{bc}}}A`C`}{{}c{}}00{l{{Cb{Bf}}}}`{lAn}{{Bf{f{Aj}}}d}{{{f{bd}}}{{Al{j}}}}`{{{f{bd}}h}{{Cd{j}}}}{{Bf{f{Aj}}}{{Cj{Cf{Ad{Ch}}}}}}{{{f{bd}}}{{Cd{h}}}}{{{f{bd}}}{{Al{h}}}}{{Ahc}l{{B`{An}}}}0{lAh}6{lCl}{fc{}}0{fAn}{c{{Bl{e}}}{}{}}00{{}{{Bl{c}}}{}}00{fCn}00{{{f{bd}}{f{j}}c{Ad{An}}}A`{{B`{An}}}}```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{D`Ad}{{{f{Db}}}{{f{Aj}}}}{DdAd}{CfAd}{DfAd}{DhAd}{DjAd}5{f{{f{c}}}{}}0000000000000000000000000000000000{{{f{b}}}{{f{bc}}}{}}0000000000000000000000000000000000{{{f{Db}}}Db}{{{f{Cf}}}Cf}{{{f{Dl}}}Dl}{{{f{Dn}}}Dn}{{{f{E`}}}E`}{{{f{Eb}}}Eb}{{{f{Ed}}}Ed}{{{f{Ef}}}Ef}{{{f{Eh}}}Eh}{{{f{Df}}}Df}{{{f{Ej}}}Ej}{{{f{El}}}El}{{{f{En}}}En}{{{f{F`}}}F`}{{{f{Fb}}}Fb}{{{f{Fd}}}Fd}{{{f{Ff}}}Ff}{{{f{Dd}}}Dd}{{{f{Fh}}}Fh}{{{f{Fj}}}Fj}{{{f{Fl}}}Fl}{{{f{D`}}}D`}{{{f{Dh}}}Dh}{{{f{Fn}}}Fn}{{{f{G`}}}G`}{{{f{Dj}}}Dj}{{{f{Gb}}}Gb}{{{f{Gd}}}Gd}{{{f{Gf}}}Gf}{{{f{Gh}}}Gh}{{{f{Gj}}}Gj}{{{f{Gl}}}Gl}{{{f{Gn}}}Gn}{{{f{H`}}}H`}{{{f{Hb}}}Hb}{{f{f{bc}}}A`{}}0000000000000000000000000000000000{{fAb}A`}0000000000000000000000000000000000{{{f{Db}}{f{Db}}}Hd}{{f{f{c}}}Hd{}}{{}Db}{{{f{Db}}}{{f{Aj}}}}{c{{Bl{Db}}}Hf}{c{{Bl{Cf}}}Hf}{c{{Bl{Dl}}}Hf}{c{{Bl{Dn}}}Hf}{c{{Bl{E`}}}Hf}{c{{Bl{Eb}}}Hf}{c{{Bl{Ed}}}Hf}{c{{Bl{Ef}}}Hf}{c{{Bl{Eh}}}Hf}{c{{Bl{Df}}}Hf}{c{{Bl{Ej}}}Hf}{c{{Bl{El}}}Hf}{c{{Bl{En}}}Hf}{c{{Bl{F`}}}Hf}{c{{Bl{Fb}}}Hf}{c{{Bl{Fd}}}Hf}{c{{Bl{Ff}}}Hf}{c{{Bl{Dd}}}Hf}{c{{Bl{Fh}}}Hf}{c{{Bl{Fj}}}Hf}{c{{Bl{Fl}}}Hf}{c{{Bl{D`}}}Hf}{c{{Bl{Dh}}}Hf}{c{{Bl{Fn}}}Hf}{c{{Bl{G`}}}Hf}{c{{Bl{Dj}}}Hf}{c{{Bl{Gb}}}Hf}{c{{Bl{Gd}}}Hf}{c{{Bl{Gf}}}Hf}{c{{Bl{Gh}}}Hf}{c{{Bl{Gj}}}Hf}{c{{Bl{Gl}}}Hf}{c{{Bl{Gn}}}Hf}{c{{Bl{H`}}}Hf}{c{{Bl{Hb}}}Hf}{{{f{Db}}{f{{f{Aj}}}}}Af}{{{f{Db}}{f{Aj}}}Af}{{{f{Db}}{f{An}}}Af}{{{f{Db}}{f{Db}}}Af}{{{f{Db}}{f{{f{An}}}}}Af}{{{f{Cf}}{f{Cf}}}Af}{{{f{Dl}}{f{Dl}}}Af}{{{f{Dn}}{f{Dn}}}Af}{{{f{E`}}{f{E`}}}Af}{{{f{Eb}}{f{Eb}}}Af}{{{f{Ed}}{f{Ed}}}Af}{{{f{Ef}}{f{Ef}}}Af}{{{f{Eh}}{f{Eh}}}Af}{{{f{Df}}{f{Df}}}Af}{{{f{Ej}}{f{Ej}}}Af}{{{f{El}}{f{El}}}Af}{{{f{En}}{f{En}}}Af}{{{f{F`}}{f{F`}}}Af}{{{f{Fb}}{f{Fb}}}Af}{{{f{Fd}}{f{Fd}}}Af}{{{f{Ff}}{f{Ff}}}Af}{{{f{Dd}}{f{Dd}}}Af}{{{f{Fh}}{f{Fh}}}Af}{{{f{Fj}}{f{Fj}}}Af}{{{f{Fl}}{f{Fl}}}Af}{{{f{D`}}{f{D`}}}Af}{{{f{Dh}}{f{Dh}}}Af}{{{f{Fn}}{f{Fn}}}Af}{{{f{G`}}{f{G`}}}Af}{{{f{Dj}}{f{Dj}}}Af}{{{f{Gb}}{f{Gb}}}Af}{{{f{Gd}}{f{Gd}}}Af}{{{f{Gf}}{f{Gf}}}Af}{{{f{Gh}}{f{Gh}}}Af}{{{f{Gj}}{f{Gj}}}Af}{{{f{Gl}}{f{Gl}}}Af}{{{f{Gn}}{f{Gn}}}Af}{{{f{H`}}{f{H`}}}Af}{{{f{Hb}}{f{Hb}}}Af}{{f{f{c}}}Af{}}0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{DfAd}{EjAd}{{{f{Db}}{f{bBh}}}{{Bl{A`Bj}}}}0{{{f{Cf}}{f{bBh}}}Bn}0{{{f{Dl}}{f{bBh}}}Bn}0{{{f{Dn}}{f{bBh}}}Bn}0{{{f{E`}}{f{bBh}}}Bn}0{{{f{Eb}}{f{bBh}}}Bn}0{{{f{Ed}}{f{bBh}}}Bn}0{{{f{Ef}}{f{bBh}}}Bn}0{{{f{Eh}}{f{bBh}}}Bn}0{{{f{Df}}{f{bBh}}}Bn}0{{{f{Ej}}{f{bBh}}}Bn}0{{{f{El}}{f{bBh}}}Bn}0{{{f{En}}{f{bBh}}}Bn}0{{{f{F`}}{f{bBh}}}Bn}0{{{f{Fb}}{f{bBh}}}Bn}0{{{f{Fd}}{f{bBh}}}Bn}0{{{f{Ff}}{f{bBh}}}Bn}0{{{f{Dd}}{f{bBh}}}Bn}0{{{f{Fh}}{f{bBh}}}Bn}0{{{f{Fj}}{f{bBh}}}Bn}{{{f{Fl}}{f{bBh}}}Bn}0{{{f{D`}}{f{bBh}}}Bn}{{{f{Dh}}{f{bBh}}}Bn}0{{{f{Fn}}{f{bBh}}}Bn}0{{{f{G`}}{f{bBh}}}Bn}0{{{f{Dj}}{f{bBh}}}Bn}0{{{f{Gb}}{f{bBh}}}Bn}0{{{f{Gd}}{f{bBh}}}Bn}0{{{f{Gf}}{f{bBh}}}Bn}0{{{f{Gh}}{f{bBh}}}Bn}0{{{f{Gj}}{f{bBh}}}Bn}0{{{f{Gl}}{f{bBh}}}Bn}0{{{f{Gn}}{f{bBh}}}Bn}0{{{f{H`}}{f{bBh}}}Bn}0{{{f{Hb}}{f{bBh}}}Bn}0{cc{}}{cDb{{Hh{Aj}}}}1111111111111111111111111111111111{cDb{{Hl{}{{Hj{{f{An}}}}}}}}{cDb{{Hl{}{{Hj{{f{Aj}}}}}}}}{cDb{{Hl{}{{Hj{An}}}}}}{cDb{{Hl{}{{Hj{Hn}}}}}}{{{f{Aj}}}{{Bl{Db}}}}{EjAd}{ElAd}{EnAd}{F`Ad}{D`I`}{{{f{Db}}{f{bc}}}A`C`}{{{f{Cf}}{f{bc}}}A`C`}{{{f{Dl}}{f{bc}}}A`C`}{{{f{Dn}}{f{bc}}}A`C`}{{{f{E`}}{f{bc}}}A`C`}{{{f{Eb}}{f{bc}}}A`C`}{{{f{Ed}}{f{bc}}}A`C`}{{{f{Ef}}{f{bc}}}A`C`}{{{f{Eh}}{f{bc}}}A`C`}{{{f{Df}}{f{bc}}}A`C`}{{{f{Ej}}{f{bc}}}A`C`}{{{f{El}}{f{bc}}}A`C`}{{{f{En}}{f{bc}}}A`C`}{{{f{F`}}{f{bc}}}A`C`}{{{f{Fb}}{f{bc}}}A`C`}{{{f{Fd}}{f{bc}}}A`C`}{{{f{Ff}}{f{bc}}}A`C`}{{{f{Dd}}{f{bc}}}A`C`}{{{f{Fh}}{f{bc}}}A`C`}{{{f{Fj}}{f{bc}}}A`C`}{{{f{Fl}}{f{bc}}}A`C`}{{{f{D`}}{f{bc}}}A`C`}{{{f{Dh}}{f{bc}}}A`C`}{{{f{Fn}}{f{bc}}}A`C`}{{{f{G`}}{f{bc}}}A`C`}{{{f{Dj}}{f{bc}}}A`C`}{{{f{Gb}}{f{bc}}}A`C`}{{{f{Gd}}{f{bc}}}A`C`}{{{f{Gf}}{f{bc}}}A`C`}{{{f{Gh}}{f{bc}}}A`C`}{{{f{Gj}}{f{bc}}}A`C`}{{{f{Gl}}{f{bc}}}A`C`}{{{f{Gn}}{f{bc}}}A`C`}{{{f{H`}}{f{bc}}}A`C`}{{{f{Hb}}{f{bc}}}A`C`}{F`I`}{{}c{}}0000000000000000000000000000000000{DdAf}{{{f{Db}}}Af}01{{{f{Gb}}}Af}{FhFj}{GjCd}{{{f{Fn}}}{{Cd{Ah}}}}{{{f{Db}}}Ib}{{{f{Ff}}}Db}{EfI`}{EhI`}{DfI`}{EjI`}{ElI`}{EnI`}{DdI`}{FhI`}{D`I`}{{{f{Ff}}}{{I`{Db}}}}<{cDb{{Hh{Aj}}}}{{{f{Aj}}}Db}{{Ib{f{{Id{Ab}}}}}Db}{{{f{Db}}{f{Db}}}{{Cd{Hd}}}}{DjI`}{D`Cd}{EfCd}{EhCd}{DfCd}{EjCd}{ElCd}{EnCd}{F`I`}{{{f{E`}}}E`}8{E`Ad}{{{f{Db}}c}BlIf}{{{f{Cf}}c}BlIf}{{{f{Dl}}c}BlIf}{{{f{Dn}}c}BlIf}{{{f{E`}}c}BlIf}{{{f{Eb}}c}BlIf}{{{f{Ed}}c}BlIf}{{{f{Ef}}c}BlIf}{{{f{Eh}}c}BlIf}{{{f{Df}}c}BlIf}{{{f{Ej}}c}BlIf}{{{f{El}}c}BlIf}{{{f{En}}c}BlIf}{{{f{F`}}c}BlIf}{{{f{Fb}}c}BlIf}{{{f{Fd}}c}BlIf}{{{f{Ff}}c}BlIf}{{{f{Dd}}c}BlIf}{{{f{Fh}}c}BlIf}{{{f{Fj}}c}BlIf}{{{f{Fl}}c}BlIf}{{{f{D`}}c}BlIf}{{{f{Dh}}c}BlIf}{{{f{Fn}}c}BlIf}{{{f{G`}}c}BlIf}{{{f{Dj}}c}BlIf}{{{f{Gb}}c}BlIf}{{{f{Gd}}c}BlIf}{{{f{Gf}}c}BlIf}{{{f{Gh}}c}BlIf}{{{f{Gj}}c}BlIf}{{{f{Gl}}c}BlIf}{{{f{Gn}}c}BlIf}{{{f{H`}}c}BlIf}{{{f{Hb}}c}BlIf}{DhI`}{{{f{Dl}}}Ah}{{{f{Fd}}}Ah}{{{f{Ff}}}Ah}{{{f{Fl}}}Ah}{fc{}}0000000000000000000000000000000000{{{f{Db}}}An}{fAn}00000000000000000000000000000000{EbI`}{c{{Bl{e}}}{}{}}0000000000000000000000000000000000{{}{{Bl{c}}}{}}0000000000000000000000000000000000{EfI`}{EhI`}{DdI`}{{{f{Fn}}}{{Cd{Ah}}}}{fCn}0000000000000000000000000000000000{D`Cd}5{DdCd}{GjI`}{ElAd}{DnI`}{IhI`}{IjI`}{IlIn}{J`Ad}{JbAd}{IhIn}{IhCd}4{JdIn}{JfIn}{JhIn}{JjIn}{JlIn}{JfI`}{JhI`}{JnI`}{JjI`}{JnIn}876>{IjIn}:6{K`Ad}{KbAd}{KdAd}{KfAd}{KhCd}{K`I`}{KbI`}{KjCd}{KlCd}{KnI`}{L`I`}7{KlI`}{LbI`}26{KdI`}{KfI`}{KjI`}46{LdCd}8746{LfI`}{LhCd}0{LjCd}{LhI`}0{LlI`}0{LnAd}{LnAf}{LnI`}{M`I`}{MbDb}1{MdMf}{MhAd}{MjE`}{MlE`}{MhE`}{MjCd}`````{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Df}}}}}}{{{f{bd}}}{{Al{{I`{{Ad{{I`{Gj}}}}}}}}}}{{{f{bd}}}{{Al{{I`{Gh}}}}}}{{{f{bd}}Ab}{{Al{{I`{Gh}}}}}}{{{f{bd}}}{{Al{{I`{G`}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Dh}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{D`}}}}}}2{{{f{bd}}}{{Al{Ff}}}}{{{f{bd}}}{{Al{{I`{{Ad{Ff}}}}}}}}4{{{f{bd}}}{{Al{{Ad{{I`{Dj}}}}}}}}5{{{f{bd}}}{{Al{{I`{Gb}}}}}}666666{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Ef}}}}}}{{{f{bd}}}{{I`{Cf}}}}{{{f{bd}}}{{Al{Dl}}}}{{{f{bd}}}{{Al{{I`{Dn}}}}}}{{{f{bd}}}{{Al{{I`{Eb}}}}}}{{{f{bd}}}{{Al{{I`{Ed}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{El}}}}}}{{{f{bd}}{Ad{{I`{Db}}}}{Cd{Ah}}{Cd{Ah}}}{{Al{{I`{Dd}}}}}}{{{f{bd}}}{{Al{{I`{{Ad{Fd}}}}}}}}{{{f{bd}}}{{Al{{I`{F`}}}}}}{{{f{bd}}h}{{Cd{Ah}}}}{{{f{bd}}{I`{Db}}}{{Cj{E`Ah{Cd{j}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Ej}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{En}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Eh}}}}}}{{{f{bd}}}{{Al{{I`{Fb}}}}}}{{{f{bd}}}{{Al{{I`{Fh}}}}}}``````````````````````````````````````````````````````````````````````````````````````````{f{{f{c}}}{}}00{{{f{b}}}{{f{bc}}}{}}00{{{f{j}}}j}{{{f{h}}}h}{{{f{Mn}}}Mn}{{f{f{bc}}}A`{}}00{{fAb}A`}00{{{f{h}}}{{f{Aj}}}}{{{f{j}}{f{j}}}Af}{{{f{h}}{f{h}}}Af}{{f{f{c}}}Af{}}0000000{{{f{j}}{f{bBh}}}Bn}{{{f{h}}{f{bBh}}}Bn}{cc{}}00{{}c{}}00{{}c{}}{jh}{{{f{b{N`{h}}}}}A`}{{Bf{f{Aj}}}Mn}{{{f{bMn}}}{{Cd{c}}}{}}{{{f{Mn}}}{{f{Aj}}}}{jAh}{jf}{fc{}}00{c{{Bl{e}}}{}{}}00{{}{{Bl{c}}}{}}00{fCn}00````{{Ah{f{c}}}AhNb}{{Ah{Cd{{f{c}}}}}Ah{}}{{Ah{Cd{Ah}}}Ah}{{AhAh}Ah}{{Ah{f{j}}}Ah}{{{f{bAh}}c}A`{}}{f{{f{c}}}{}}00{{{f{b}}}{{f{bc}}}{}}00{{{f{Ah}}}Ah}{{{f{Nd}}}Nd}{{{f{{I`{c}}}}}{{I`{c}}}Nf}{{f{f{bc}}}A`{}}00{{fAb}A`}00{{{f{Nd}}{f{Nd}}}Hd}{{f{f{c}}}Hd{}}{{}Nd}0{c{{Bl{Ah}}}Hf}{c{{Bl{{I`{e}}}}}HfNh}{{}Ah}3{AhIb}{{{f{Ah}}{f{Ah}}}Af}{{{f{Nd}}{f{Nd}}}Af}{{{f{{I`{c}}}}{f{{I`{c}}}}}AfNj}{{f{f{c}}}Af{}}00000000000{AhBf}{{{f{Ah}}{f{bBh}}}{{Bl{A`Bj}}}}{{{f{Nd}}{f{bBh}}}Bn}{{{f{{I`{c}}}}{f{bBh}}}BnNl}{{{f{{I`{Dh}}}}{f{bBh}}}Bn}{cc{}}{{{f{{I`{c}}}}}Ah{}}{{{f{{In{{I`{c}}}}}}}Ah{}}{{{f{{I`{c}}}}}Nd{}}3{{{f{{In{{I`{c}}}}}}}Nd{}}4{j{{I`{Db}}}}{{ce}Ah{{B`{Ah}}}{{B`{Ah}}}}{{{f{Ah}}{f{bc}}}A`C`}{{{f{Nd}}{f{bc}}}A`C`}{{{f{{I`{c}}}}{f{be}}}A`NnC`}{I`Nd}{{}c{}}00{{{f{Ah}}}Af}{NdAf}{I`}{{{f{{I`{Dd}}}}}{{f{Aj}}}}{{{f{{I`{Ej}}}}}{{f{Aj}}}}{{{f{{I`{Dh}}}}}{{f{Aj}}}}{{{f{{I`{Eh}}}}}{{f{Aj}}}}{{{f{{I`{En}}}}}{{f{Aj}}}}{{{f{{I`{Fn}}}}}{{f{Aj}}}}{{{f{{I`{Df}}}}}{{f{Aj}}}}{{{f{{I`{Fh}}}}}{{f{Aj}}}}{{{f{{I`{El}}}}}{{f{Aj}}}}{{{f{{I`{Fn}}}}}Ah}{{BfIbIb}Ah}{{cAh}{{I`{c}}}{}}{{{f{Nd}}{f{Nd}}}{{Cd{Hd}}}}{{{f{Ah}}c}BlIf}{{{f{{I`{c}}}}e}BlO`If}{{{f{Nb}}}Ah}{{{f{{I`{c}}}}}Ah{}}{I`Ah}{AhIb}{fc{}}00{fAn}{c{{Bl{e}}}{}{}}00{{}{{Bl{c}}}{}}00{fCn}00{BfAh}","D":"AE`","p":[[0,"mut"],[5,"Parser",0,1427],[1,"reference",null,null,1],[6,"TokenKind",1177,1428],[5,"Token",1177,1428],[5,"Label",0,1429],[5,"ParseFailed",0,1427],[1,"unit"],[1,"u8"],[5,"Vec",1430],[1,"bool"],[5,"Span",1321,1431],[1,"str"],[8,"ParseResult",0,1427],[5,"String",1432],[10,"Into",1433,null,1],[17,"Output"],[10,"FnOnce",1434],[5,"SourceFileId",1435],[5,"Formatter",1436],[5,"Error",1436],[6,"Result",1437,null,1],[8,"Result",1436],[10,"Hasher",1438],[5,"Label",1439],[6,"Option",1440,null,1],[5,"Module",83],[5,"Diagnostic",1429],[1,"tuple",null,null,1],[6,"LabelStyle",1429],[5,"TypeId",1441],[5,"FunctionSignature",83],[5,"SmolStr",83,1442],[5,"Field",83],[5,"Contract",83],[5,"Function",83],[5,"MatchArm",83],[6,"ModuleStmt",83],[5,"Pragma",83],[5,"Path",83],[5,"Use",83],[6,"UseTree",83],[5,"ConstantDecl",83],[5,"TypeAlias",83],[5,"Struct",83],[5,"Enum",83],[5,"Trait",83],[5,"Impl",83],[6,"TypeDesc",83],[6,"GenericArg",83],[6,"GenericParameter",83],[5,"Variant",83],[6,"VariantKind",83],[6,"ContractStmt",83],[6,"FunctionArg",83],[6,"FuncStmt",83],[6,"Pattern",83],[6,"LiteralPattern",83],[6,"VarDeclTarget",83],[6,"Expr",83],[5,"CallArg",83],[6,"BoolOperator",83],[6,"BinOperator",83],[6,"UnaryOperator",83],[6,"CompOperator",83],[6,"Ordering",1443],[10,"Deserializer",1444],[10,"AsRef",1433],[17,"Item"],[10,"IntoIterator",1445],[1,"char"],[5,"Node",1321],[1,"usize"],[1,"slice"],[10,"Serializer",1446],[15,"Call",1064],[15,"Attribute",1064],[15,"Ternary",1064],[5,"Box",1447,null,1],[15,"List",1064],[15,"Tuple",1064],[15,"Subscript",1064],[15,"BoolOperation",1064],[15,"BinOperation",1064],[15,"CompOperation",1064],[15,"Repeat",1064],[15,"UnaryOperation",1064],[15,"Match",1089],[15,"For",1089],[15,"While",1089],[15,"If",1089],[15,"Revert",1089],[15,"Assert",1089],[15,"VarDecl",1089],[15,"ConstantDecl",1089],[15,"AugAssign",1089],[15,"Assign",1089],[15,"Return",1089],[15,"Expr",1089],[15,"Regular",1116],[15,"Self_",1116],[15,"Bounded",1121],[15,"PathStruct",1123],[15,"Generic",1126],[15,"Base",1126],[15,"Tuple",1126],[5,"Vec1",1448],[15,"Nested",1130],[15,"Simple",1130],[15,"Glob",1130],[5,"Lexer",1177],[5,"Lexer",1449],[10,"Spanned",1321,1431],[5,"NodeId",1321],[10,"Clone",1450],[10,"Deserialize",1444],[10,"PartialEq",1443],[10,"Debug",1436],[10,"Hash",1438],[10,"Serialize",1446]],"r":[[0,1427],[1,1429],[2,1427],[3,1427],[4,1427],[5,1427],[6,1428],[7,1428],[8,1427],[9,1427],[11,1427],[12,1429],[13,1427],[14,1427],[15,1429],[16,1427],[17,1429],[18,1427],[19,1429],[20,1427],[21,1429],[22,1427],[23,1427],[24,1427],[25,1427],[26,1427],[27,1429],[28,1427],[29,1429],[30,1429],[31,1429],[32,1429],[33,1427],[34,1427],[35,1427],[36,1427],[37,1427],[38,1427],[39,1427],[40,1427],[41,1427],[42,1427],[43,1429],[44,1427],[45,1427],[46,1427],[47,1429],[48,1427],[50,1429],[51,1427],[52,1427],[53,1429],[54,1427],[55,1429],[57,1429],[58,1427],[59,1427],[61,1427],[63,1427],[64,1427],[65,1429],[66,1429],[67,1429],[68,1427],[69,1429],[70,1429],[71,1427],[72,1427],[73,1427],[74,1429],[75,1427],[76,1427],[77,1429],[78,1427],[79,1427],[80,1429],[81,1427],[82,1427],[179,1442],[215,1442],[221,1442],[222,1442],[257,1442],[292,1442],[327,1442],[362,1442],[397,1442],[398,1442],[399,1442],[400,1442],[401,1442],[436,1442],[437,1442],[438,1442],[439,1442],[440,1442],[475,1442],[476,1442],[477,1442],[478,1442],[617,1442],[618,1442],[685,1442],[686,1442],[721,1442],[722,1442],[723,1442],[724,1442],[725,1442],[731,1442],[767,1442],[803,1442],[804,1442],[810,1442],[823,1442],[824,1442],[825,1442],[826,1442],[839,1442],[879,1442],[914,1442],[915,1442],[949,1442],[984,1442],[1023,1442],[1177,1428],[1178,1428],[1179,1428],[1180,1428],[1181,1428],[1182,1428],[1183,1428],[1184,1428],[1185,1428],[1186,1428],[1187,1428],[1188,1428],[1189,1428],[1190,1428],[1191,1428],[1192,1428],[1193,1428],[1194,1428],[1195,1428],[1196,1428],[1197,1428],[1198,1428],[1199,1428],[1200,1428],[1201,1428],[1202,1428],[1203,1428],[1204,1428],[1205,1428],[1206,1428],[1207,1428],[1208,1428],[1209,1428],[1210,1428],[1211,1428],[1212,1428],[1213,1428],[1214,1428],[1215,1428],[1216,1428],[1217,1428],[1218,1428],[1219,1428],[1221,1428],[1222,1428],[1223,1428],[1224,1428],[1225,1428],[1226,1428],[1227,1428],[1228,1428],[1229,1428],[1230,1428],[1231,1428],[1232,1428],[1233,1428],[1234,1428],[1235,1428],[1236,1428],[1237,1428],[1238,1428],[1239,1428],[1240,1428],[1241,1428],[1242,1428],[1243,1428],[1244,1428],[1245,1428],[1246,1428],[1247,1428],[1248,1428],[1249,1428],[1250,1428],[1251,1428],[1252,1428],[1253,1428],[1254,1428],[1255,1428],[1256,1428],[1257,1428],[1258,1428],[1259,1428],[1260,1428],[1261,1428],[1262,1428],[1263,1428],[1264,1428],[1265,1428],[1266,1428],[1267,1428],[1268,1428],[1270,1428],[1271,1428],[1273,1428],[1274,1428],[1276,1428],[1277,1428],[1279,1428],[1280,1428],[1282,1428],[1283,1428],[1284,1428],[1285,1428],[1286,1428],[1287,1428],[1288,1428],[1289,1428],[1290,1428],[1291,1428],[1292,1428],[1293,1428],[1294,1428],[1295,1428],[1296,1428],[1298,1428],[1299,1428],[1302,1428],[1303,1428],[1307,1428],[1308,1428],[1309,1428],[1310,1428],[1312,1428],[1313,1428],[1315,1428],[1316,1428],[1318,1428],[1319,1428],[1323,1431],[1324,1431],[1325,1431],[1326,1431],[1327,1431],[1328,1431],[1329,1431],[1330,1431],[1331,1431],[1334,1431],[1337,1431],[1340,1431],[1343,1431],[1350,1431],[1352,1431],[1354,1431],[1355,1431],[1358,1431],[1359,1431],[1360,1431],[1361,1431],[1370,1431],[1371,1431],[1375,1431],[1376,1431],[1377,1431],[1383,1431],[1384,1431],[1388,1431],[1391,1431],[1404,1431],[1407,1431],[1409,1431],[1412,1431],[1413,1431],[1417,1431],[1420,1431],[1423,1431],[1426,1431]],"b":[[44,"impl-Debug-for-ParseFailed"],[45,"impl-Display-for-ParseFailed"],[436,"impl-PartialEq%3C%26str%3E-for-SmolStr"],[437,"impl-PartialEq%3Cstr%3E-for-SmolStr"],[438,"impl-PartialEq%3CString%3E-for-SmolStr"],[439,"impl-PartialEq-for-SmolStr"],[440,"impl-PartialEq%3C%26String%3E-for-SmolStr"],[617,"impl-Debug-for-SmolStr"],[618,"impl-Display-for-SmolStr"],[619,"impl-Display-for-Module"],[620,"impl-Debug-for-Module"],[621,"impl-Display-for-ModuleStmt"],[622,"impl-Debug-for-ModuleStmt"],[623,"impl-Display-for-Pragma"],[624,"impl-Debug-for-Pragma"],[625,"impl-Debug-for-Path"],[626,"impl-Display-for-Path"],[627,"impl-Display-for-Use"],[628,"impl-Debug-for-Use"],[629,"impl-Display-for-UseTree"],[630,"impl-Debug-for-UseTree"],[631,"impl-Display-for-ConstantDecl"],[632,"impl-Debug-for-ConstantDecl"],[633,"impl-Debug-for-TypeAlias"],[634,"impl-Display-for-TypeAlias"],[635,"impl-Debug-for-Contract"],[636,"impl-Display-for-Contract"],[637,"impl-Debug-for-Struct"],[638,"impl-Display-for-Struct"],[639,"impl-Display-for-Enum"],[640,"impl-Debug-for-Enum"],[641,"impl-Display-for-Trait"],[642,"impl-Debug-for-Trait"],[643,"impl-Display-for-Impl"],[644,"impl-Debug-for-Impl"],[645,"impl-Display-for-TypeDesc"],[646,"impl-Debug-for-TypeDesc"],[647,"impl-Debug-for-GenericArg"],[648,"impl-Display-for-GenericArg"],[649,"impl-Debug-for-GenericParameter"],[650,"impl-Display-for-GenericParameter"],[651,"impl-Debug-for-Field"],[652,"impl-Display-for-Field"],[653,"impl-Display-for-Variant"],[654,"impl-Debug-for-Variant"],[656,"impl-Display-for-ContractStmt"],[657,"impl-Debug-for-ContractStmt"],[659,"impl-Display-for-Function"],[660,"impl-Debug-for-Function"],[661,"impl-Display-for-FunctionArg"],[662,"impl-Debug-for-FunctionArg"],[663,"impl-Debug-for-FuncStmt"],[664,"impl-Display-for-FuncStmt"],[665,"impl-Display-for-MatchArm"],[666,"impl-Debug-for-MatchArm"],[667,"impl-Debug-for-Pattern"],[668,"impl-Display-for-Pattern"],[669,"impl-Display-for-LiteralPattern"],[670,"impl-Debug-for-LiteralPattern"],[671,"impl-Debug-for-VarDeclTarget"],[672,"impl-Display-for-VarDeclTarget"],[673,"impl-Debug-for-Expr"],[674,"impl-Display-for-Expr"],[675,"impl-Display-for-CallArg"],[676,"impl-Debug-for-CallArg"],[677,"impl-Display-for-BoolOperator"],[678,"impl-Debug-for-BoolOperator"],[679,"impl-Display-for-BinOperator"],[680,"impl-Debug-for-BinOperator"],[681,"impl-Display-for-UnaryOperator"],[682,"impl-Debug-for-UnaryOperator"],[683,"impl-Debug-for-CompOperator"],[684,"impl-Display-for-CompOperator"],[721,"impl-FromIterator%3C%26String%3E-for-SmolStr"],[722,"impl-FromIterator%3C%26str%3E-for-SmolStr"],[723,"impl-FromIterator%3CString%3E-for-SmolStr"],[724,"impl-FromIterator%3Cchar%3E-for-SmolStr"],[1325,"impl-Add%3C%26T%3E-for-Span"],[1326,"impl-Add%3COption%3C%26T%3E%3E-for-Span"],[1327,"impl-Add%3COption%3CSpan%3E%3E-for-Span"],[1328,"impl-Add-for-Span"],[1329,"impl-Add%3C%26Token%3C\'a%3E%3E-for-Span"],[1373,"impl-Debug-for-Node%3CT%3E"],[1374,"impl-Display-for-Node%3CFunction%3E"],[1376,"impl-From%3C%26Node%3CT%3E%3E-for-Span"],[1377,"impl-From%3C%26Box%3CNode%3CT%3E%3E%3E-for-Span"],[1378,"impl-From%3C%26Node%3CT%3E%3E-for-NodeId"],[1380,"impl-From%3C%26Box%3CNode%3CT%3E%3E%3E-for-NodeId"],[1394,"impl-Node%3CField%3E"],[1395,"impl-Node%3CStruct%3E"],[1396,"impl-Node%3CFunction%3E"],[1397,"impl-Node%3CTypeAlias%3E"],[1398,"impl-Node%3CTrait%3E"],[1399,"impl-Node%3CFunctionArg%3E"],[1400,"impl-Node%3CContract%3E"],[1401,"impl-Node%3CVariant%3E"],[1402,"impl-Node%3CEnum%3E"]],"c":"OjAAAAEAAAAAAAAAEAAAADoD","e":"OzAAAAEAAOsEKwAAAAAAAgAAAAQAAQAHAAEACwAMABoAAAAcAAkAKwADADIAAgA5AAEAPQAAAEQAAABGAAwAVAAkAHoAEwCPAA4AnwADAKQAAACnAAYArwAEALUACADAAAoAzAAGANUAAADXANYBrwIAANICLQAjAxUAOgM6AYAEAACCBAAAmgRoAAQFCwAWBQIAGgUAABwFDwAtBR0ATAUTAGEFAgBlBQAAZwUFAHAFFACGBQ0A","P":[[11,"T"],[17,""],[19,"T"],[21,""],[29,"K"],[37,"S"],[39,""],[40,"Str,NotesFn"],[41,"S"],[42,""],[46,"T"],[50,"__H"],[52,"U"],[55,""],[65,"S"],[67,""],[70,"T"],[72,""],[73,"U,T"],[76,"U"],[79,""],[82,"S"],[214,""],[222,"T"],[292,""],[327,"T"],[362,""],[398,"K"],[399,""],[401,"D"],[402,"__D"],[436,""],[475,"K"],[615,""],[685,"T"],[721,"I"],[725,""],[731,"H"],[732,"__H"],[766,""],[767,"U"],[802,""],[823,"T"],[824,""],[839,"S"],[840,"__S"],[874,""],[879,"T"],[914,""],[949,"U,T"],[984,"U"],[1019,""],[1267,"T"],[1273,""],[1276,"T"],[1279,""],[1285,"K"],[1293,""],[1295,"T"],[1298,"U"],[1301,"I"],[1302,""],[1305,"Iterator::Item"],[1306,""],[1309,"T"],[1312,"U,T"],[1315,"U"],[1318,""],[1325,"T"],[1327,""],[1330,"T"],[1337,""],[1339,"T"],[1343,""],[1347,"K"],[1348,""],[1350,"__D"],[1351,"__D,T"],[1352,""],[1357,"T"],[1358,"K"],[1370,""],[1373,"T"],[1374,""],[1375,"T"],[1382,""],[1383,"S,E"],[1384,"__H"],[1386,"T,__H"],[1387,""],[1388,"U"],[1391,""],[1405,"T"],[1406,""],[1407,"__S"],[1408,"T,__S"],[1409,""],[1410,"T"],[1411,""],[1413,"T"],[1416,""],[1417,"U,T"],[1420,"U"],[1423,""]]}],["fe_test_files",{"t":"HHHHH","n":["fixture","fixture_bytes","fixture_dir","fixture_dir_files","new_fixture_dir_files"],"q":[[0,"fe_test_files"],[5,"include_dir::dir"],[6,"alloc::vec"]],"i":"`````","f":"{{{d{b}}}{{d{b}}}}{{{d{b}}}{{d{{h{f}}}}}}{{{d{b}}}{{d{j}}}}{{{d{b}}}{{n{{l{{d{b}}{d{b}}}}}}}}0","D":"d","p":[[1,"str"],[1,"reference",null,null,1],[1,"u8"],[1,"slice"],[5,"Dir",5],[1,"tuple",null,null,1],[5,"Vec",6]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAMAEAAAAAAAAQACAAMA","P":[]}],["fe_test_runner",{"t":"FNNEHNNNNNNNNNNNNNNNNNNN","n":["TestSink","borrow","borrow_mut","ethabi","execute","failure_count","failure_details","fmt","","from","inc_success_count","insert_failure","insert_logs","into","logs_count","logs_details","new","success_count","test_count","to_string","try_from","try_into","type_id","vzip"],"q":[[0,"fe_test_runner"],[24,"ethabi::event"],[25,"alloc::string"],[26,"core::fmt"],[27,"core::result"],[28,"core::any"]],"i":"`l0``0000000000000000000","f":"`{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}`{{{b{f}}{b{{j{h}}}}{b{f}}{b{dl}}}n}{{{b{l}}}A`}{{{b{l}}}Ab}{{{b{l}}{b{dAd}}}Af}0{cc{}}{{{b{dl}}}Ah}{{{b{dl}}{b{f}}{b{f}}}Ah}0{{}c{}}65{nl}77{bAb}{c{{Aj{e}}}{}{}}{{}{{Aj{c}}}{}}{bAl}{{}c{}}","D":"d","p":[[1,"reference",null,null,1],[0,"mut"],[1,"str"],[5,"Event",24],[1,"slice"],[5,"TestSink",0],[1,"bool"],[1,"usize"],[5,"String",25],[5,"Formatter",26],[8,"Result",26],[1,"unit"],[6,"Result",27,null,1],[5,"TypeId",28]],"r":[],"b":[[7,"impl-Display-for-TestSink"],[8,"impl-Debug-for-TestSink"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABYAAwAAAAkACwACAA8ACQA=","P":[[1,"T"],[4,""],[9,"T"],[10,""],[13,"U"],[14,""],[20,"U,T"],[21,"U"],[22,""],[23,"V"]]}],["fe_yulc",{"t":"FFNNNNOHHNNNNNONNNNNN","n":["ContractBytecode","YulcError","borrow","","borrow_mut","","bytecode","compile","compile_single_contract","fmt","from","","into","","runtime_bytecode","try_from","","try_into","","type_id",""],"q":[[0,"fe_yulc"],[21,"alloc::string"],[22,"indexmap::map"],[23,"core::result"],[24,"core::convert"],[25,"core::iter::traits::iterator"],[26,"core::fmt"],[27,"core::any"]],"i":"``fn101``010101101010","f":"``{b{{b{c}}}{}}0{{{b{d}}}{{b{dc}}}{}}0{fh}{{gj}{{A`{{l{hf}}n}}}{{Ad{Ab}}}{{Ad{Ab}}}{{Aj{}{{Af{{Ah{ce}}}}}}}}{{{b{Ab}}{b{Ab}}jj}{{A`{fn}}}}{{{b{n}}{b{dAl}}}An}{cc{}}0{{}c{}}05{c{{A`{e}}}{}{}}0{{}{{A`{c}}}{}}0{bB`}0","D":"l","p":[[1,"reference",null,null,1],[0,"mut"],[5,"ContractBytecode",0],[5,"String",21],[1,"bool"],[5,"IndexMap",22],[5,"YulcError",0],[6,"Result",23,null,1],[1,"str"],[10,"AsRef",24],[17,"Item"],[1,"tuple",null,null,1],[10,"Iterator",25],[5,"Formatter",26],[8,"Result",26],[5,"TypeId",27]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAA8AAwAAAAcACgAAAA8ABgA=","P":[[2,"T"],[6,""],[10,"T"],[12,"U"],[14,""],[15,"U,T"],[17,"U"],[19,""]]}]]')); +if (typeof exports !== 'undefined') exports.searchIndex = searchIndex; +else if (window.initSearch) window.initSearch(searchIndex); +//{"start":39,"fragment_lengths":[5493,5433,86127,17574,31363,4368,145,152,11561,421,42802,31988,501,1171,1103]} \ No newline at end of file diff --git a/compiler-docs/search.desc/fe/fe-desc-0-.js b/compiler-docs/search.desc/fe/fe-desc-0-.js new file mode 100644 index 0000000000..f17cc328b2 --- /dev/null +++ b/compiler-docs/search.desc/fe/fe-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe", 0, "Returns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js b/compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js new file mode 100644 index 0000000000..4aa7e87623 --- /dev/null +++ b/compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_abi", 0, "Returns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe mutability of a public function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns first 4 bytes of signature hash in hex.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns bytes size of the encoded type if the type is …") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js b/compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js new file mode 100644 index 0000000000..dc5b20cf83 --- /dev/null +++ b/compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_analyzer", 0, "Fe semantic analysis.\nSemantic errors.\nThis module includes utility structs and its functions for …\nThe evm functions exposed by yul.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe type of a function call.\nRepresents constant value.\nThis should only be created by AnalyzerContext.\nContains contextual information relating to an expression …\nLoad from storage ptr\nPanics\nAdd evaluated constant value in a constant declaration to …\nAttribute contextual information to an expression node.\nReturns constant value from variable name.\nReturns a type of an expression.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns constant from numeric literal represented by …\nReturns the Context type, if it is defined.\nReturns true if the scope or any of its parents is of the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a [codespan_reporting::Diagnostic::Label]\nReturns true if the context is in function scope.\nReturns the module enclosing current context.\nReturns an item enclosing current context.\nReturns a function id that encloses a context.\nCreate a primary label with the given message. This will …\nResolves the given path. Does not register any errors\nResolves the given path and registers all errors\nResolves the given path only if it is visible. Does not …\nReturns a non-function item that encloses a context.\nCreate a secondary label with the given message. This will …\nUpdate the expression attributes.\nFunction self parameter.\nThe function’s parent, if any. If None, self has been …\nRepresentative struct for the query group.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nSet the value of the ingot_external_ingots input.\nSet the value of the ingot_external_ingots input and …\nSet the value of the ingot_files input.\nSet the value of the ingot_files input and promise that …\nSet the value of the root_ingot input.\nSet the value of the root_ingot input and promise that its …\nReturns the argument unchanged.\nCalls U::from(self).\nError to be returned from APIs that should reject …\nErrors that can result from a binary operation\nError indicating constant evaluation failed.\nError to be returned when otherwise no meaningful …\nValue type cannot be coerced to the expected type\nError returned by ModuleId::resolve_name if the name is …\nErrors that can result from indexing\nValue is in storage and must be explicitly moved with …\nself contract used where an external contract value is …\nErrors that can result from an implicit type coercion\nError indicating that a type is invalid.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a FatalError instance, given a “voucher” …\nDepGraph edge label. “Locality” refers to the deployed …\nFor directory modules without a corresponding source file …\nAn Ingot is composed of a tree of Modules (set via […\nA named item. This does not include things inside of a …\nA library; expected to have a lib.fe file.\nThe target of compilation. Expected to have a main.fe file.\nId of a Module, which corresponds to a single Fe source …\nA fake ingot, created to hold a single module with any …\nAll module constants.\nAll contracts, including from submodules and including …\nAll functions, including from submodules and including …\nIncludes duplicate names\nIncludes duplicate names\nReturns true if the type_in_impl can stand in for the …\nDependency graph of the contract type, which consists of …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nLookup a function by name. Searches all user functions, …\nLooks up the FunctionId based on the parent of the …\nUser functions, public and not. Excludes __init__ and …\nReturns the map of ingot deps, built-ins, and the ingot …\nReturns all of the internal items. Internal items refers …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if the item is in scope of the module.\nReturns true if other either is Self or the type of the …\nReturns a map of the named items in the module\nReturns all of the internal items, except for used items. …\nExcludes __init__ and __call__.\nReturns Err(IncompleteItem) if the name could not be …\nResolve a path that starts with an item defined in the …\nResolve a path that starts with an internal item.\nResolve a path that starts with an internal item. We omit …\nReturns the main.fe, or lib.fe module, depending on the …\nDependency graph of the (imaginary) __call__ function, …\nReturns a name -> (name_span, external_item) map for all …\nAdd a variable to the block scope.\nCheck an item visibility and sink diagnostics if an item …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGets std::context::Context if it exists\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMaps Name -> (Type, is_const, span)\nAn “external” contract. Effectively just a newtyped …\nNames that can be used to build identifiers without …\nThe type of a contract while it’s being executed. Ie. …\nCreates an instance of address.\nReturns size of integer type in bits.\nCreates an instance of bool.\nReturns true if the integer is at least the same size (or …\nReturns true if num represents a number that fits the type\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nSignature for the function with the given name defined …\nLike function_sig but returns a Vec<FunctionSigId> which …\nReturn the impl for the given trait. There can only ever …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if the type qualifies to implement the …\nReturns true if the type is encodable in Solidity ABI. …\ntrue if Type::Base or Type::Contract (which is just an …\nReturns true if the integer is signed, otherwise false\nName in the lower snake format (e.g. lower_snake_case).\nReturns max value of the integer type.\nReturns min value of the integer type.\nLooks up all possible candidates of the given function …\nCreates an instance of u256.\nCreates an instance of u8.\nCreates an instance of ().\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js b/compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js new file mode 100644 index 0000000000..9108a6ba94 --- /dev/null +++ b/compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_codegen", 0, "Representative struct for the query group.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCopy data from src to dst. NOTE: src and dst must be …") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_common/fe_common-desc-0-.js b/compiler-docs/search.desc/fe_common/fe_common-desc-0-.js new file mode 100644 index 0000000000..231ad4640c --- /dev/null +++ b/compiler-docs/search.desc/fe_common/fe_common-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_common", 0, "An exclusive span of byte offsets in a source file.\nCompare the given strings and panic when not equal with a …\nA byte offset specifying the exclusive end of a span.\nReturns the argument unchanged.\nCalls U::from(self).\nA byte offset specifying the inclusive start of a span.\nRepresentative struct for the query group.\nSet with `fn set_file_content(&mut self, file: …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nSet the value of the file_content input.\nSet the value of the file_content input and promise that …\nAn unexpected bug.\nAn error.\nA help message.\nA note.\nA severity level for diagnostic messages.\nA warning.\nDiagnostic data structures.\nFormat the given diagnostics as a string.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a [codespan_reporting::Diagnostic::Label]\nCreate a primary label with the given message. This will …\nPrint the given diagnostics to stderr.\nCreate a secondary label with the given message. This will …\nAn unexpected bug.\nRepresents a diagnostic message that can provide …\nAn error.\nA help message.\nA label describing an underlined region of code associated …\nA note.\nLabels that describe the primary cause of a diagnostic.\nLabels that provide additional context for a diagnostic.\nA severity level for diagnostic messages.\nA warning.\nCreate a new diagnostic with a severity of Severity::Bug.\nAn optional code that identifies this diagnostic.\nCreate a new diagnostic with a severity of Severity::Error.\nThe file that we are labelling.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a new diagnostic with a severity of Severity::Help.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nSource labels that describe the cause of the diagnostic. …\nAn optional message to provide some additional information …\nThe main message associated with this diagnostic.\nCreate a new label.\nCreate a new diagnostic.\nCreate a new diagnostic with a severity of Severity::Note.\nNotes that are associated with the primary cause of the …\nCreate a new label with a style of LabelStyle::Primary.\nThe range in bytes we are going to include in the final …\nCreate a new label with a style of LabelStyle::Secondary.\nThe overall severity of the diagnostic\nThe style of the label.\nCreate a new diagnostic with a severity of …\nSet the error code of the diagnostic.\nAdd some labels to the diagnostic.\nAdd a message to the diagnostic.\nSet the message of the diagnostic.\nAdd some notes to the diagnostic.\nA reference to the current directory, i.e., ..\nUser file; either part of the target project or an …\nA normal component, e.g., a and b in a/b.\nA reference to the parent directory, i.e., ...\nA Windows path prefix, e.g., C: or \\\\server\\share.\nThe root directory component, appears after any prefix and …\nFile is part of the fe standard library\nA single component of a path.\nA slice of a UTF-8 path (akin to str).\nAn owned, mutable UTF-8 path (akin to String).\nProduces an iterator over Utf8Path and its ancestors.\nYields the underlying OsStr slice.\nExtracts the underlying OsStr slice.\nCoerces to a Utf8Path slice.\nConverts a Utf8Path to a Path.\nYields the underlying str slice.\nExtracts the underlying str slice.\nReturns the canonical, absolute form of the path with all …\nReturns the canonical, absolute form of the path with all …\nInvokes capacity on the underlying instance of PathBuf.\nInvokes clear on the underlying instance of PathBuf.\nReturns the common prefix of two paths. If the paths are …\nProduces an iterator over the Utf8Components of the path.\nDetermines whether child is a suffix of self.\nReturns true if the path points at an existing entity.\nExtracts the extension of self.file_name, if possible.\nReturns the final component of the Utf8Path, if there is …\nExtracts the stem (non-extension) portion of self.file_name…\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a Path to a Utf8Path.\nCreates a new Utf8PathBuf from a PathBuf containing valid …\nReturns true if the Utf8Path has a root.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts this Utf8PathBuf into a boxed Utf8Path.\nConsumes the Utf8PathBuf, yielding its internal OsString …\nConverts a Box<Utf8Path> into a Utf8PathBuf without …\nConverts a Utf8PathBuf to a PathBuf.\nConsumes the Utf8PathBuf, yielding its internal String …\nReturns true if the Utf8Path is absolute, i.e., if it is …\nReturns true if the path exists on disk and is pointing at …\nReturns true if the path exists on disk and is pointing at …\nReturns true if the Utf8Path is relative, i.e., not …\nReturns true if the path exists on disk and is pointing at …\nProduces an iterator over the path’s components viewed …\nCreates an owned Utf8PathBuf with path adjoined to self.\nCreates an owned PathBuf with path adjoined to self.\nDifferentiates between local source files and fe std lib …\nQueries the file system to get information about a file, …\nDirectly wraps a string slice as a Utf8Path slice.\nAllocates an empty Utf8PathBuf.\nReturns the Path without its final component, if there is …\nPath of the file. May include src/ dir or longer prefix; …\nTruncates self to self.parent.\nExtends self with path.\nReturns an iterator over the entries within a directory.\nReturns an iterator over the entries within a directory.\nReads a symbolic link, returning the file that the link …\nReads a symbolic link, returning the file that the link …\nInvokes reserve on the underlying instance of PathBuf.\nInvokes reserve_exact on the underlying instance of PathBuf…\nUpdates self.extension to extension.\nUpdates self.file_name to file_name.\nInvokes shrink_to on the underlying instance of PathBuf.\nInvokes shrink_to_fit on the underlying instance of PathBuf…\nDetermines whether base is a prefix of self.\nReturns a path that, when joined onto base, yields self.\nQueries the metadata about a file without following …\nConverts a Utf8Path to an owned Utf8PathBuf.\nReturns Ok(true) if the path points at an existing entity.\nInvokes try_reserve on the underlying instance of PathBuf.\nInvokes try_reserve_exact on the underlying instance of …\nCreates a new Utf8PathBuf with a given capacity used to …\nCreates an owned Utf8PathBuf like self but with the given …\nCreates an owned Utf8PathBuf like self but with the given …\nA helper type to interpret a numeric literal represented …\nA type that represents the radix of a numeric literal.\nReturns number representation of the radix.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nParse the numeric literal to T.\nReturns radix of the numeric literal.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the root path of the current Fe project\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nBuild files are loaded from the file system.\nBuild files are loaded from static file vector.\nFetch and checkout the specified refspec from the remote …\nA trait to derive plural or singular representations from\nGet the full 32 byte hash of the content.\nGet the full 32 byte hash of the content as a byte array.\nTake the first size number of bytes of the hash with no …\nTake the first size number of bytes of the hash and pad …\nWrapper struct for formatting changesets from the …\nReturns the argument unchanged.\nCalls U::from(self).\nConvenience function to serialize objects in RON format …") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js b/compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js new file mode 100644 index 0000000000..ed5c13f5af --- /dev/null +++ b/compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_compiler_test_utils", 0, "Panic if the execution did not revert.\nPanic if the output is not an encoded error reason of the …\nPanic if the execution did not succeed.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nTo get the 2s complement value for e.g. -128 call …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new Runtime instance.\nCreate an ExecutionOutput instance\nGenerate the top level YUL object\nAdd the given set of functions\nAdd the given set of test statements") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js b/compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js new file mode 100644 index 0000000000..c44c3c48eb --- /dev/null +++ b/compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_compiler_tests", 0, "") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js b/compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js new file mode 100644 index 0000000000..baaf135be0 --- /dev/null +++ b/compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_compiler_tests_legacy", 0, "") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js b/compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js new file mode 100644 index 0000000000..45e6031ffc --- /dev/null +++ b/compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_driver", 0, "The artifacts of a compiled contract.\nThe artifacts of a compiled module.\nCompiles the main module of a project.\nReturns graphviz string.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_library/fe_library-desc-0-.js b/compiler-docs/search.desc/fe_library/fe_library-desc-0-.js new file mode 100644 index 0000000000..f7288c344a --- /dev/null +++ b/compiler-docs/search.desc/fe_library/fe_library-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_library", 0, "") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js b/compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js new file mode 100644 index 0000000000..68eef8c25b --- /dev/null +++ b/compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_mir", 0, "This module contains dominator tree related structs.\nThis module contains implementation of Post Dominator Tree.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nDominance frontiers of each blocks.\nCompute dominance frontiers of each blocks.\nReturns true if block1 dominates block2.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns number of frontier blocks of a block.\nReturns all dominance frontieres of a block.\nReturns the immediate dominator of the block. Returns None …\nCalls U::from(self).\nCalls U::from(self).\nReturns true if block is reachable from the entry block.\nReturns blocks in RPO.\nReturns true if block1 strictly dominates block2.\nChild loops that the loop includes.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nA header of the loop.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if the block is in the lp.\nReturns all blocks in the loop.\nReturns header block of the lp.\nReturns number of loops found.\nReturns the loop that the block belongs to. If the block …\nReturns all loops in a function body. An outer loop is …\nA parent loop that includes the loop.\nGet parent loop of the lp if exists.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns true if block is reachable from the exit blocks.\nRepresentative struct for the query group.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nWrites mir graphs of functions in a module.\nAn original source information that indicates where mir …\nThis module provides a collection of structs to modify …\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns true if current block is terminated.\nSpecify a current location of BodyCursor\nReturns current block that cursor points.\nReturns current inst that cursor points.\nReturns the argument unchanged.\nReturns the argument unchanged.\nInsert BasicBlockId to a location where a cursor points. …\nInsert InstId to a location where a cursor points. If you …\nCalls U::from(self).\nCalls U::from(self).\nRemove a current pointed block and contained insts from a …\nRemove a current pointed Inst from a function body. A …\nSets a cursor to an entry block.\nRepresents basic block order and instruction order.\nAppends a given block to a function body.\nAppends inst to the end of a block\nReturns a number of block in a function.\nReturns an entry block of a function body.\nReturns first instruction of a block if exists.\nReturns the argument unchanged.\nInserts a given block after a after block.\nInserts a given block before a before block.\nInsert inst after after inst.\nInsert inst before before inst.\nReturns a block to which a given inst belongs.\nCalls U::from(self).\nReturns true if a block doesn’t contain any block.\nReturns true if a function body contains a given block.\nReturns true is a given inst is inserted.\nReturns true if a block is terminated.\nReturns an iterator which iterates all basic blocks in a …\nReturns an iterator which iterates all instruction in a …\nReturns a last block of a function body.\nReturns a last instruction of a block.\nReturns a next block of a given block.\nReturns a next instruction of a given inst.\nPrepends inst to the beginning of a block\nReturns a previous block of a given block.\nReturns a previous instruction of a given inst.\nRemove a given block from a function. All instructions in …\nRemove instruction from the function body.\nReturns a terminator instruction of a block.\nAn interned Id for Constant.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA module where a constant is declared.\nA name of a constant.\nA span where a constant is declared.\nA type of a constant.\nA value of a constant.\nA collection of basic block, instructions and values …\nA function can be called from other modules, and also can …\nA function body, which is not stored in salsa db to enable …\nRepresents function signature.\nA function can only be called within the same module.\nA function can be called from other modules, but can NOT …\nReturns class_name::fn_name if a function is a method else …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns an instruction result\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns Some(local_name) if value is Value::Local.\nTracks order of basic blocks and instructions in a …\nReturns a type suffix if a generic function was …\nAccess to aggregate fields or elements.\nConstructs aggregate value, i.e. struct, tuple and array.\nBinary instruction.\nConditional branching instruction.\nThis is not a real instruction, just used to tag a …\n~ operator for bitwise inversion.\nUnconditional jump instruction.\nLoad a primitive value from a ptr\n- operator for negation.\nnot operator for logical inversion.\nA cast from a primitive type to a primitive type.\nUnary instruction.\nA cast from an enum type to its underlying type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA static array type definition.\nA user defined struct type definition.\nA user defined struct type definition.\nA user defined struct type definition.\nA map type definition.\nA user defined struct type definition.\nA tuple type definition.\nAn interned Id for ArrayDef.\nReturns an offset of the element of aggregate type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns size of the type in bytes.\nA constant value.\nAn immediate value.\nA local variable declared in a function body.\nA value resulted from an instruction.\nA singleton value representing Unit type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\ntrue if a local is a function argument.\ntrue if a local is introduced in MIR.\nAn original name of a local variable.") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js b/compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js new file mode 100644 index 0000000000..5888c7c3ce --- /dev/null +++ b/compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_parser", 0, "Contains the error value\nContains the success value\nParser maintains the parsing state, such as the token …\nReturns back tracking parser.\nAssert that the next token kind it matches the expected …\nThe diagnostics (errors and warnings) emitted during …\nReturns true if the parser has reached the end of the file.\nEnter a “block”, which is a brace-enclosed list of …\nEmit an error diagnostic, but don’t stop parsing\nIf the next token matches the expected kind, return it. …\nConsumes newlines and semicolons. Returns Ok if one or …\nLike Parser::expect, but with additional notes to be …\nEmit a “fancy” error diagnostic with any number of …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a [codespan_reporting::Diagnostic::Label]\nCreate a new parser for a source code string and …\nReturn the next token, or an error if we’ve reached the …\nIf the next token matches the expected kind, return it. …\nParse a Module from the file content string.\nTake a peek at the next token kind. Returns None if we’…\nTake a peek at the next token kind without consuming it, …\nCreate a primary label with the given message. This will …\nCreate a secondary label with the given message. This will …\nSplit the next token into two tokens, returning the first. …\nEmit an “unexpected token” error diagnostic with the …\nstruct or contract field, with optional ‘pub’ and ‘…\nRepresents a literal pattern. e.g., true.\nRepresents or pattern. e.g., EnumUnit | EnumTuple(_, _, _)\nRepresents unit variant pattern. e.g., Enum::Unit.\nRepresents struct or struct variant destructuring pattern. …\nRepresents tuple variant pattern. e.g., …\nRest pattern. e.g., ..\nA SmolStr is a string type that has the following …\nTuple variant. E.g., Baz(u32, i32) in\nRepresents tuple destructuring pattern. e.g., (x, y, z).\nUnit variant. E.g., Bar in\nEnum variant definition.\nEnum variant kind.\nRepresents a wildcard pattern _.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConstructs inline variant of SmolStr.\nParse a contract definition.\nParse call arguments\nParse an expression, starting with the next token.\nParse an expression, stopping if/when we reach an operator …\nParse an assert statement.\nParse a function definition. The optional pub qualifier …\nParse a function definition without a body. The optional …\nParse a for statement.\nParse a single generic function parameter (eg. T:SomeTrait …\nParse an angle-bracket-wrapped list of generic arguments …\nParse an if statement.\nParse a match statement.\nParse a return statement.\nParse a revert statement.\nParse a continue, break, pass, or revert statement.\nParse a function-level statement.\nParse an unsafe block.\nParse a while statement.\nParse a constant, e.g. const MAGIC_NUMBER: u256 = 4711.\nParse a Module.\nParse a ModuleStmt.\nParse a pragma <version-requirement> statement.\nParse a use statement.\nParse a use tree.\nParse a [ModuleStmt::Enum].\nParse a field for a struct or contract. The leading …\nParse an angle-bracket-wrapped list of generic arguments …\nParse an impl block.\nParse an optional qualifier (pub, const, or idx).\nReturns path and trailing :: token, if present.\nParse a [ModuleStmt::Struct].\nParse a trait definition.\nParse a type alias definition, e.g. …\nParse a type description, e.g. u8 or Map<address, u256>.\nParse a variant for a enum definition.\nReturn a user-friendly description of the token kind. E.g. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new lexer with the given source code string.\nReturn the full source code string that’s being …\nAn exclusive span of byte offsets in a source file.\nA byte offset specifying the exclusive end of a span.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA byte offset specifying the inclusive start of a span.") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js b/compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js new file mode 100644 index 0000000000..58e30443ce --- /dev/null +++ b/compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_test_files", 0, "Returns (file_path, file_content)\nReturns (file_path, file_content)") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js b/compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js new file mode 100644 index 0000000000..e7447b352e --- /dev/null +++ b/compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_test_runner", 0, "Returns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js b/compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js new file mode 100644 index 0000000000..aa537409c4 --- /dev/null +++ b/compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_yulc", 0, "Compile a map of Yul contracts to a map of bytecode …\nCompiles a single Yul contract to bytecode.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/settings.html b/compiler-docs/settings.html new file mode 100644 index 0000000000..fd6fec8a66 --- /dev/null +++ b/compiler-docs/settings.html @@ -0,0 +1 @@ +Settings

Rustdoc settings

Back
\ No newline at end of file diff --git a/compiler-docs/src-files.js b/compiler-docs/src-files.js new file mode 100644 index 0000000000..583a4c339b --- /dev/null +++ b/compiler-docs/src-files.js @@ -0,0 +1,2 @@ +createSrcSidebar('[["fe",["",[["task",[],["build.rs","check.rs","mod.rs","new.rs"]]],["main.rs"]]],["fe_abi",["",[],["contract.rs","event.rs","function.rs","lib.rs","types.rs"]]],["fe_analyzer",["",[["db",[["queries",[],["contracts.rs","enums.rs","functions.rs","impls.rs","ingots.rs","module.rs","structs.rs","traits.rs","types.rs"]]],["queries.rs"]],["namespace",[],["items.rs","mod.rs","scopes.rs","types.rs"]],["traversal",[],["assignments.rs","borrowck.rs","call_args.rs","const_expr.rs","declarations.rs","expressions.rs","functions.rs","matching_anomaly.rs","mod.rs","pattern_analysis.rs","pragma.rs","types.rs","utils.rs"]]],["builtins.rs","constants.rs","context.rs","db.rs","display.rs","errors.rs","lib.rs","operations.rs"]]],["fe_codegen",["",[["db",[["queries",[],["abi.rs","constant.rs","contract.rs","function.rs","types.rs"]]],["queries.rs"]],["yul",[["isel",[],["context.rs","contract.rs","function.rs","inst_order.rs","mod.rs","test.rs"]],["legalize",[],["body.rs","critical_edge.rs","mod.rs","signature.rs"]],["runtime",[],["abi.rs","contract.rs","data.rs","emit.rs","mod.rs","revert.rs","safe_math.rs"]]],["mod.rs","slot_size.rs"]]],["db.rs","lib.rs"]]],["fe_common",["",[["utils",[],["dirs.rs","files.rs","git.rs","humanize.rs","keccak.rs","mod.rs","ron.rs"]]],["db.rs","diagnostics.rs","files.rs","lib.rs","numeric.rs","panic.rs","span.rs"]]],["fe_compiler_test_utils",["",[],["lib.rs"]]],["fe_compiler_tests",["",[],["lib.rs"]]],["fe_compiler_tests_legacy",["",[],["lib.rs"]]],["fe_driver",["",[],["lib.rs"]]],["fe_library",["",[],["lib.rs"]]],["fe_mir",["",[["analysis",[],["cfg.rs","domtree.rs","loop_tree.rs","mod.rs","post_domtree.rs"]],["db",[["queries",[],["constant.rs","contract.rs","enums.rs","function.rs","module.rs","structs.rs","types.rs"]]],["queries.rs"]],["graphviz",[],["block.rs","function.rs","mod.rs","module.rs"]],["ir",[],["basic_block.rs","body_builder.rs","body_cursor.rs","body_order.rs","constant.rs","function.rs","inst.rs","mod.rs","types.rs","value.rs"]],["lower",[["pattern_match",[],["decision_tree.rs","mod.rs","tree_vis.rs"]]],["function.rs","mod.rs","types.rs"]],["pretty_print",[],["inst.rs","mod.rs","types.rs","value.rs"]]],["db.rs","lib.rs"]]],["fe_parser",["",[["grammar",[],["contracts.rs","expressions.rs","functions.rs","module.rs","types.rs"]],["lexer",[],["token.rs"]]],["ast.rs","grammar.rs","lexer.rs","lib.rs","node.rs","parser.rs"]]],["fe_test_files",["",[],["lib.rs"]]],["fe_test_runner",["",[],["lib.rs"]]],["fe_yulc",["",[],["lib.rs"]]]]'); +//{"start":19,"fragment_lengths":[79,80,558,437,191,46,41,48,33,34,638,200,37,38,31]} \ No newline at end of file diff --git a/compiler-docs/src/fe/main.rs.html b/compiler-docs/src/fe/main.rs.html new file mode 100644 index 0000000000..93a0609783 --- /dev/null +++ b/compiler-docs/src/fe/main.rs.html @@ -0,0 +1,38 @@ +main.rs - source

fe/
main.rs

1mod task;
+2
+3use clap::Parser;
+4use fe_common::panic::install_panic_hook;
+5use task::Commands;
+6
+7#[derive(Parser)]
+8#[clap(author, version, about, long_about = None)]
+9struct FelangCli {
+10    #[clap(subcommand)]
+11    command: Commands,
+12}
+13
+14fn main() {
+15    install_panic_hook();
+16
+17    let cli = FelangCli::parse();
+18
+19    match cli.command {
+20        Commands::Build(arg) => {
+21            task::build(arg);
+22        }
+23        Commands::Check(arg) => {
+24            task::check(arg);
+25        }
+26        Commands::New(arg) => {
+27            task::create_new_project(arg);
+28        }
+29        #[cfg(feature = "solc-backend")]
+30        Commands::Verify(arg) => {
+31            task::verify(arg);
+32        }
+33        #[cfg(feature = "solc-backend")]
+34        Commands::Test(arg) => {
+35            task::test(arg);
+36        }
+37    }
+38}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/build.rs.html b/compiler-docs/src/fe/task/build.rs.html new file mode 100644 index 0000000000..5a28008d5f --- /dev/null +++ b/compiler-docs/src/fe/task/build.rs.html @@ -0,0 +1,278 @@ +build.rs - source

fe/task/
build.rs

1use std::fs;
+2use std::io::{Error, Write};
+3use std::path::Path;
+4
+5use clap::{ArgEnum, Args};
+6use fe_common::diagnostics::print_diagnostics;
+7use fe_common::files::SourceFileId;
+8use fe_common::utils::files::{get_project_root, BuildFiles, ProjectMode};
+9use fe_driver::CompiledModule;
+10
+11const DEFAULT_OUTPUT_DIR_NAME: &str = "output";
+12
+13#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ArgEnum, Debug)]
+14enum Emit {
+15    Abi,
+16    Ast,
+17    LoweredAst,
+18    Bytecode,
+19    RuntimeBytecode,
+20    Tokens,
+21    Yul,
+22}
+23
+24#[derive(Args)]
+25#[clap(about = "Build the current project")]
+26pub struct BuildArgs {
+27    #[clap(default_value_t = get_project_root().unwrap_or(".".to_string()))]
+28    input_path: String,
+29    #[clap(short, long, default_value = DEFAULT_OUTPUT_DIR_NAME)]
+30    output_dir: String,
+31    #[clap(
+32        arg_enum,
+33        use_value_delimiter = true,
+34        long,
+35        short,
+36        default_value = "abi,bytecode"
+37    )]
+38    emit: Vec<Emit>,
+39    #[clap(long)]
+40    mir: bool,
+41    #[clap(long)]
+42    overwrite: bool,
+43    #[clap(long, takes_value(true))]
+44    optimize: Option<bool>,
+45}
+46
+47fn build_single_file(compile_arg: &BuildArgs) -> (String, CompiledModule) {
+48    let emit = &compile_arg.emit;
+49    let with_bytecode = emit.contains(&Emit::Bytecode);
+50    let with_runtime_bytecode = emit.contains(&Emit::RuntimeBytecode);
+51    let input_path = &compile_arg.input_path;
+52    let optimize = compile_arg.optimize.unwrap_or(true);
+53
+54    let mut db = fe_driver::Db::default();
+55    let content = match std::fs::read_to_string(input_path) {
+56        Err(err) => {
+57            eprintln!("Failed to load file: `{input_path}`. Error: {err}");
+58            std::process::exit(1)
+59        }
+60        Ok(content) => content,
+61    };
+62
+63    let compiled_module = match fe_driver::compile_single_file(
+64        &mut db,
+65        input_path,
+66        &content,
+67        with_bytecode,
+68        with_runtime_bytecode,
+69        optimize,
+70    ) {
+71        Ok(module) => module,
+72        Err(error) => {
+73            eprintln!("Unable to compile {input_path}.");
+74            print_diagnostics(&db, &error.0);
+75            std::process::exit(1)
+76        }
+77    };
+78    (content, compiled_module)
+79}
+80
+81fn build_ingot(compile_arg: &BuildArgs) -> (String, CompiledModule) {
+82    let emit = &compile_arg.emit;
+83    let with_bytecode = emit.contains(&Emit::Bytecode);
+84    let with_runtime_bytecode = emit.contains(&Emit::RuntimeBytecode);
+85    let input_path = &compile_arg.input_path;
+86    let optimize = compile_arg.optimize.unwrap_or(true);
+87
+88    if !Path::new(input_path).exists() {
+89        eprintln!("Input directory does not exist: `{input_path}`.");
+90        std::process::exit(1)
+91    }
+92
+93    let build_files = match BuildFiles::load_fs(input_path) {
+94        Ok(files) => files,
+95        Err(err) => {
+96            eprintln!("Failed to load project files.\nError: {err}");
+97            std::process::exit(1)
+98        }
+99    };
+100
+101    if build_files.root_project_mode() == ProjectMode::Lib {
+102        eprintln!("Unable to compile {input_path}. No build targets in library mode.");
+103        eprintln!("Consider replacing `src/lib.fe` with `src/main.fe`.");
+104        std::process::exit(1)
+105    }
+106
+107    let mut db = fe_driver::Db::default();
+108    let compiled_module = match fe_driver::compile_ingot(
+109        &mut db,
+110        &build_files,
+111        with_bytecode,
+112        with_runtime_bytecode,
+113        optimize,
+114    ) {
+115        Ok(module) => module,
+116        Err(error) => {
+117            eprintln!("Unable to compile {input_path}.");
+118            print_diagnostics(&db, &error.0);
+119            std::process::exit(1)
+120        }
+121    };
+122
+123    // no file content for ingots
+124    ("".to_string(), compiled_module)
+125}
+126
+127pub fn build(compile_arg: BuildArgs) {
+128    let emit = &compile_arg.emit;
+129
+130    let input_path = &compile_arg.input_path;
+131
+132    if compile_arg.mir {
+133        return mir_dump(input_path);
+134    }
+135
+136    let _with_bytecode = emit.contains(&Emit::Bytecode);
+137    #[cfg(not(feature = "solc-backend"))]
+138    if _with_bytecode {
+139        eprintln!("Warning: bytecode output requires 'solc-backend' feature. Try `cargo build --release --features solc-backend`. Skipping.");
+140    }
+141
+142    let (content, compiled_module) = if Path::new(input_path).is_file() {
+143        build_single_file(&compile_arg)
+144    } else {
+145        build_ingot(&compile_arg)
+146    };
+147
+148    let output_dir = &compile_arg.output_dir;
+149    let overwrite = compile_arg.overwrite;
+150    match write_compiled_module(compiled_module, &content, emit, output_dir, overwrite) {
+151        Ok(_) => eprintln!("Compiled {input_path}. Outputs in `{output_dir}`"),
+152        Err(err) => {
+153            eprintln!("Failed to write output to directory: `{output_dir}`. Error: {err}");
+154            std::process::exit(1)
+155        }
+156    }
+157}
+158
+159fn write_compiled_module(
+160    mut module: CompiledModule,
+161    file_content: &str,
+162    targets: &[Emit],
+163    output_dir: &str,
+164    overwrite: bool,
+165) -> Result<(), String> {
+166    let output_dir = Path::new(output_dir);
+167    if output_dir.is_file() {
+168        return Err(format!(
+169            "A file exists at path `{}`, the location of the output directory. Refusing to overwrite.",
+170            output_dir.display()
+171        ));
+172    }
+173
+174    if !overwrite {
+175        verify_nonexistent_or_empty(output_dir)?;
+176    }
+177
+178    fs::create_dir_all(output_dir).map_err(ioerr_to_string)?;
+179
+180    if targets.contains(&Emit::Ast) {
+181        write_output(&output_dir.join("module.ast"), &module.src_ast)?;
+182    }
+183
+184    if targets.contains(&Emit::LoweredAst) {
+185        write_output(&output_dir.join("lowered_module.ast"), &module.lowered_ast)?;
+186    }
+187
+188    if targets.contains(&Emit::Tokens) {
+189        let tokens = {
+190            let lexer = fe_parser::lexer::Lexer::new(SourceFileId::dummy_file(), file_content);
+191            lexer.collect::<Vec<_>>()
+192        };
+193        write_output(&output_dir.join("module.tokens"), &format!("{tokens:#?}"))?;
+194    }
+195
+196    for (name, contract) in module.contracts.drain(0..) {
+197        let contract_output_dir = output_dir.join(&name);
+198        fs::create_dir_all(&contract_output_dir).map_err(ioerr_to_string)?;
+199
+200        if targets.contains(&Emit::Abi) {
+201            let file_name = format!("{}_abi.json", &name);
+202            write_output(&contract_output_dir.join(file_name), &contract.json_abi)?;
+203        }
+204
+205        if targets.contains(&Emit::Yul) {
+206            let file_name = format!("{}_ir.yul", &name);
+207            write_output(&contract_output_dir.join(file_name), &contract.yul)?;
+208        }
+209
+210        #[cfg(feature = "solc-backend")]
+211        if targets.contains(&Emit::Bytecode) {
+212            let file_name = format!("{}.bin", &name);
+213            write_output(&contract_output_dir.join(file_name), &contract.bytecode)?;
+214        }
+215        #[cfg(feature = "solc-backend")]
+216        if targets.contains(&Emit::RuntimeBytecode) {
+217            let file_name = format!("{}.runtime.bin", &name);
+218            write_output(
+219                &contract_output_dir.join(file_name),
+220                &contract.runtime_bytecode,
+221            )?;
+222        }
+223    }
+224
+225    Ok(())
+226}
+227
+228fn write_output(path: &Path, content: &str) -> Result<(), String> {
+229    let mut file = fs::OpenOptions::new()
+230        .write(true)
+231        .create(true)
+232        .truncate(true)
+233        .open(path)
+234        .map_err(ioerr_to_string)?;
+235    file.write_all(content.as_bytes())
+236        .map_err(ioerr_to_string)?;
+237    Ok(())
+238}
+239
+240fn ioerr_to_string(error: Error) -> String {
+241    format!("{error}")
+242}
+243
+244fn verify_nonexistent_or_empty(dir: &Path) -> Result<(), String> {
+245    if !dir.exists() || dir.read_dir().map_err(ioerr_to_string)?.next().is_none() {
+246        Ok(())
+247    } else {
+248        Err(format!(
+249            "Directory '{}' is not empty. Use --overwrite to overwrite.",
+250            dir.display()
+251        ))
+252    }
+253}
+254
+255fn mir_dump(input_path: &str) {
+256    let mut db = fe_driver::Db::default();
+257    if Path::new(input_path).is_file() {
+258        let content = match std::fs::read_to_string(input_path) {
+259            Err(err) => {
+260                eprintln!("Failed to load file: `{input_path}`. Error: {err}");
+261                std::process::exit(1)
+262            }
+263            Ok(content) => content,
+264        };
+265
+266        match fe_driver::dump_mir_single_file(&mut db, input_path, &content) {
+267            Ok(text) => println!("{text}"),
+268            Err(err) => {
+269                eprintln!("Unable to dump mir `{input_path}");
+270                print_diagnostics(&db, &err.0);
+271                std::process::exit(1)
+272            }
+273        }
+274    } else {
+275        eprintln!("dumping mir for ingot is not supported yet");
+276        std::process::exit(1)
+277    }
+278}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/check.rs.html b/compiler-docs/src/fe/task/check.rs.html new file mode 100644 index 0000000000..fa504e090c --- /dev/null +++ b/compiler-docs/src/fe/task/check.rs.html @@ -0,0 +1,59 @@ +check.rs - source

fe/task/
check.rs

1use std::path::Path;
+2
+3use clap::Args;
+4use fe_common::{
+5    diagnostics::{print_diagnostics, Diagnostic},
+6    utils::files::get_project_root,
+7    utils::files::BuildFiles,
+8};
+9use fe_driver::Db;
+10
+11#[derive(Args)]
+12#[clap(about = "Analyze the current project and report errors, but don't build artifacts")]
+13pub struct CheckArgs {
+14    #[clap(default_value_t = get_project_root().unwrap_or(".".to_string()))]
+15    input_path: String,
+16}
+17
+18fn check_single_file(db: &mut Db, input_path: &str) -> Vec<Diagnostic> {
+19    let content = match std::fs::read_to_string(input_path) {
+20        Err(err) => {
+21            eprintln!("Failed to load file: `{}`. Error: {}", &input_path, err);
+22            std::process::exit(1)
+23        }
+24        Ok(content) => content,
+25    };
+26
+27    fe_driver::check_single_file(db, input_path, &content)
+28}
+29
+30fn check_ingot(db: &mut Db, input_path: &str) -> Vec<Diagnostic> {
+31    let build_files = match BuildFiles::load_fs(input_path) {
+32        Ok(files) => files,
+33        Err(err) => {
+34            eprintln!("Failed to load project files.\nError: {err}");
+35            std::process::exit(1)
+36        }
+37    };
+38
+39    fe_driver::check_ingot(db, &build_files)
+40}
+41
+42pub fn check(args: CheckArgs) {
+43    let mut db = fe_driver::Db::default();
+44    let input_path = args.input_path;
+45
+46    // check project
+47    let diags = if Path::new(&input_path).is_file() {
+48        check_single_file(&mut db, &input_path)
+49    } else {
+50        check_ingot(&mut db, &input_path)
+51    };
+52
+53    if !diags.is_empty() {
+54        print_diagnostics(&db, &diags);
+55        std::process::exit(1);
+56    }
+57
+58    eprintln!("Finished");
+59}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/mod.rs.html b/compiler-docs/src/fe/task/mod.rs.html new file mode 100644 index 0000000000..8f63150c22 --- /dev/null +++ b/compiler-docs/src/fe/task/mod.rs.html @@ -0,0 +1,26 @@ +mod.rs - source

fe/task/
mod.rs

1mod build;
+2mod check;
+3mod new;
+4#[cfg(feature = "solc-backend")]
+5mod test;
+6mod verify;
+7
+8pub use build::{build, BuildArgs};
+9pub use check::{check, CheckArgs};
+10use clap::Subcommand;
+11pub use new::{create_new_project, NewProjectArgs};
+12#[cfg(feature = "solc-backend")]
+13pub use test::{test, TestArgs};
+14#[cfg(feature = "solc-backend")]
+15pub use verify::{verify, VerifyArgs};
+16
+17#[derive(Subcommand)]
+18pub enum Commands {
+19    Build(BuildArgs),
+20    Check(CheckArgs),
+21    New(NewProjectArgs),
+22    #[cfg(feature = "solc-backend")]
+23    Verify(VerifyArgs),
+24    #[cfg(feature = "solc-backend")]
+25    Test(TestArgs),
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/new.rs.html b/compiler-docs/src/fe/task/new.rs.html new file mode 100644 index 0000000000..145f93e9ac --- /dev/null +++ b/compiler-docs/src/fe/task/new.rs.html @@ -0,0 +1,49 @@ +new.rs - source

fe/task/
new.rs

1use clap::Args;
+2use include_dir::{include_dir, Dir};
+3use std::{fs, path::Path};
+4
+5const SRC_TEMPLATE_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/src/template/src");
+6
+7#[derive(Args)]
+8#[clap(about = "Create new fe project")]
+9pub struct NewProjectArgs {
+10    name: String,
+11}
+12
+13fn create_project(name: &str, path: &Path) {
+14    for src_file in SRC_TEMPLATE_DIR.entries() {
+15        let file = src_file.as_file().unwrap();
+16        fs::write(path.join("src").join(file.path()), file.contents()).unwrap();
+17    }
+18
+19    let manifest_content = format!(
+20        "name = \"{name}\"
+21version = \"1.0\"
+22
+23[dependencies]
+24# my_lib = \"../my_lib\"
+25# my_lib = {{ path = \"../my_lib\", version = \"1.0\" }}"
+26    );
+27    fs::write(path.join("fe.toml"), manifest_content).unwrap();
+28}
+29
+30pub fn create_new_project(args: NewProjectArgs) {
+31    let project_path = Path::new(&args.name);
+32
+33    if project_path.exists() {
+34        eprintln!(
+35            "Error: destination directory {} already exists",
+36            project_path.canonicalize().unwrap().display(),
+37        );
+38        std::process::exit(1)
+39    }
+40
+41    match fs::create_dir_all(project_path.join("src")) {
+42        Ok(_) => create_project(&args.name, project_path),
+43        Err(err) => {
+44            eprintln!("{err}");
+45            std::process::exit(1);
+46        }
+47    }
+48    eprintln!("Created {}", project_path.display());
+49}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/contract.rs.html b/compiler-docs/src/fe_abi/contract.rs.html new file mode 100644 index 0000000000..a4651d8c6b --- /dev/null +++ b/compiler-docs/src/fe_abi/contract.rs.html @@ -0,0 +1,33 @@ +contract.rs - source

fe_abi/
contract.rs

1use super::{event::AbiEvent, function::AbiFunction};
+2
+3use serde::{ser::SerializeSeq, Serialize, Serializer};
+4
+5#[derive(Debug, Clone, PartialEq, Eq)]
+6pub struct AbiContract {
+7    /// Public functions in the contract.
+8    funcs: Vec<AbiFunction>,
+9
+10    /// Events emitted from the contract.
+11    events: Vec<AbiEvent>,
+12}
+13
+14impl Serialize for AbiContract {
+15    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
+16        let mut seq = s.serialize_seq(Some(self.funcs.len() + self.events.len()))?;
+17        for func in &self.funcs {
+18            seq.serialize_element(func)?;
+19        }
+20
+21        for event in &self.events {
+22            seq.serialize_element(event)?;
+23        }
+24
+25        seq.end()
+26    }
+27}
+28
+29impl AbiContract {
+30    pub fn new(funcs: Vec<AbiFunction>, events: Vec<AbiEvent>) -> Self {
+31        Self { funcs, events }
+32    }
+33}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/event.rs.html b/compiler-docs/src/fe_abi/event.rs.html new file mode 100644 index 0000000000..8af29b798b --- /dev/null +++ b/compiler-docs/src/fe_abi/event.rs.html @@ -0,0 +1,148 @@ +event.rs - source

fe_abi/
event.rs

1use super::types::AbiType;
+2
+3use fe_common::utils::keccak;
+4use serde::Serialize;
+5
+6#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+7pub struct AbiEvent {
+8    #[serde(rename = "type")]
+9    pub ty: &'static str,
+10    pub name: String,
+11    pub inputs: Vec<AbiEventField>,
+12    pub anonymous: bool,
+13}
+14
+15impl AbiEvent {
+16    pub fn new(name: String, fields: Vec<AbiEventField>, anonymous: bool) -> Self {
+17        Self {
+18            ty: "event",
+19            name,
+20            inputs: fields,
+21            anonymous,
+22        }
+23    }
+24
+25    pub fn signature(&self) -> AbiEventSignature {
+26        AbiEventSignature::new(self)
+27    }
+28}
+29
+30pub struct AbiEventSignature {
+31    sig: String,
+32}
+33
+34impl AbiEventSignature {
+35    pub fn signature(&self) -> &str {
+36        &self.sig
+37    }
+38
+39    pub fn hash_hex(&self) -> String {
+40        keccak::full(self.sig.as_bytes())
+41    }
+42
+43    pub fn hash_raw(&self) -> [u8; 32] {
+44        keccak::full_as_bytes(self.sig.as_bytes())
+45    }
+46
+47    fn new(event: &AbiEvent) -> Self {
+48        let sig = format!(
+49            "{}({})",
+50            event.name,
+51            event
+52                .inputs
+53                .iter()
+54                .map(|input| input.ty.selector_type_name())
+55                .collect::<Vec<_>>()
+56                .join(",")
+57        );
+58
+59        Self { sig }
+60    }
+61}
+62
+63#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+64pub struct AbiEventField {
+65    pub name: String,
+66    #[serde(flatten)]
+67    pub ty: AbiType,
+68    pub indexed: bool,
+69}
+70
+71impl AbiEventField {
+72    pub fn new(name: String, ty: impl Into<AbiType>, indexed: bool) -> Self {
+73        Self {
+74            name,
+75            ty: ty.into(),
+76            indexed,
+77        }
+78    }
+79}
+80
+81#[cfg(test)]
+82mod tests {
+83    use super::*;
+84
+85    use serde_test::{assert_ser_tokens, Token};
+86
+87    fn test_event() -> AbiEvent {
+88        let i32_ty = AbiType::Int(32);
+89        let u32_ty = AbiType::UInt(32);
+90        let field1 = AbiEventField::new("x".into(), i32_ty, true);
+91        let field2 = AbiEventField::new("y".into(), u32_ty, false);
+92
+93        AbiEvent::new("MyEvent".into(), vec![field1, field2], false)
+94    }
+95
+96    #[test]
+97    fn serialize_event() {
+98        let event = test_event();
+99
+100        assert_ser_tokens(
+101            &event,
+102            &[
+103                Token::Struct {
+104                    name: "AbiEvent",
+105                    len: 4,
+106                },
+107                Token::Str("type"),
+108                Token::Str("event"),
+109                Token::String("name"),
+110                Token::String("MyEvent"),
+111                Token::Str("inputs"),
+112                Token::Seq { len: Some(2) },
+113                Token::Map { len: None },
+114                Token::String("name"),
+115                Token::String("x"),
+116                Token::String("type"),
+117                Token::String("int32"),
+118                Token::Str("indexed"),
+119                Token::Bool(true),
+120                Token::MapEnd,
+121                Token::Map { len: None },
+122                Token::String("name"),
+123                Token::String("y"),
+124                Token::String("type"),
+125                Token::String("uint32"),
+126                Token::Str("indexed"),
+127                Token::Bool(false),
+128                Token::MapEnd,
+129                Token::SeqEnd,
+130                Token::Str("anonymous"),
+131                Token::Bool(false),
+132                Token::StructEnd,
+133            ],
+134        )
+135    }
+136
+137    #[test]
+138    fn event_signature() {
+139        let event = test_event();
+140
+141        let sig = event.signature();
+142        debug_assert_eq!(sig.signature(), "MyEvent(int32,uint32)");
+143        debug_assert_eq!(
+144            sig.hash_hex(),
+145            "ec835d5150565cb216f72ba07d715e875b0738b1ac3f412e103839e5157b7ee6"
+146        );
+147    }
+148}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/function.rs.html b/compiler-docs/src/fe_abi/function.rs.html new file mode 100644 index 0000000000..eb2ea0e01f --- /dev/null +++ b/compiler-docs/src/fe_abi/function.rs.html @@ -0,0 +1,307 @@ +function.rs - source

fe_abi/
function.rs

1use fe_common::utils::keccak;
+2
+3use serde::Serialize;
+4
+5use super::types::AbiType;
+6
+7/// The mutability of a public function.
+8#[derive(Serialize, Debug, PartialEq, Eq, Clone)]
+9#[serde(rename_all = "lowercase")]
+10pub enum StateMutability {
+11    Pure,
+12    View,
+13    Nonpayable,
+14    Payable,
+15}
+16
+17pub enum SelfParam {
+18    None,
+19    Imm,
+20    Mut,
+21}
+22pub enum CtxParam {
+23    None,
+24    Imm,
+25    Mut,
+26}
+27
+28impl StateMutability {
+29    pub fn from_self_and_ctx_params(self_: SelfParam, ctx: CtxParam) -> Self {
+30        // Check ABI conformity
+31        // See https://github.com/ethereum/fe/issues/558
+32        //
+33        //              no self   |   self   |  mut self  |
+34        //           ......................................
+35        // no ctx    :    pure    |   view    |  payable  |
+36        // ctx       :    view    |   view    |  payable  |
+37        // mut ctx   :   payable  |  payable  |  payable  |
+38
+39        match (self_, ctx) {
+40            (SelfParam::None, CtxParam::None) => StateMutability::Pure,
+41            (SelfParam::None, CtxParam::Imm) => StateMutability::View,
+42            (SelfParam::None, CtxParam::Mut) => StateMutability::Payable,
+43            (SelfParam::Imm, CtxParam::None) => StateMutability::View,
+44            (SelfParam::Imm, CtxParam::Imm) => StateMutability::View,
+45            (SelfParam::Imm, CtxParam::Mut) => StateMutability::Payable,
+46            (SelfParam::Mut, _) => StateMutability::Payable,
+47        }
+48    }
+49}
+50
+51#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+52pub struct AbiFunction {
+53    #[serde(rename = "type")]
+54    func_type: AbiFunctionType,
+55    name: String,
+56    inputs: Vec<AbiFunctionParamInner>,
+57    outputs: Vec<AbiFunctionParamInner>,
+58    #[serde(rename = "stateMutability")]
+59    state_mutability: StateMutability,
+60}
+61
+62impl AbiFunction {
+63    pub fn new(
+64        func_type: AbiFunctionType,
+65        name: String,
+66        args: Vec<(String, AbiType)>,
+67        ret_ty: Option<AbiType>,
+68        state_mutability: StateMutability,
+69    ) -> Self {
+70        let inputs = args
+71            .into_iter()
+72            .map(|(arg_name, arg_ty)| AbiFunctionParamInner::new(arg_name, arg_ty))
+73            .collect();
+74        let outputs = ret_ty.map_or_else(Vec::new, |ret_ty| {
+75            vec![AbiFunctionParamInner::new("".into(), ret_ty)]
+76        });
+77
+78        Self {
+79            func_type,
+80            name,
+81            inputs,
+82            outputs,
+83            state_mutability,
+84        }
+85    }
+86
+87    pub fn selector(&self) -> AbiFunctionSelector {
+88        AbiFunctionSelector::new(self)
+89    }
+90}
+91
+92#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
+93#[serde(rename_all = "lowercase")]
+94pub enum AbiFunctionType {
+95    Function,
+96    Constructor,
+97    Receive,
+98    Payable,
+99    Fallback,
+100}
+101
+102pub struct AbiFunctionSelector {
+103    selector_sig: String,
+104}
+105
+106impl AbiFunctionSelector {
+107    fn new(func_sig: &AbiFunction) -> Self {
+108        let selector_sig = format!(
+109            "{}({})",
+110            func_sig.name,
+111            func_sig
+112                .inputs
+113                .iter()
+114                .map(|param| param.ty.selector_type_name())
+115                .collect::<Vec<_>>()
+116                .join(",")
+117        );
+118
+119        Self { selector_sig }
+120    }
+121
+122    pub fn selector_signature(&self) -> &str {
+123        &self.selector_sig
+124    }
+125
+126    pub fn selector_raw(&self) -> [u8; 4] {
+127        keccak::full_as_bytes(self.selector_sig.as_bytes())[..4]
+128            .try_into()
+129            .unwrap()
+130    }
+131
+132    /// Returns first 4 bytes of signature hash in hex.
+133    pub fn hex(&self) -> String {
+134        keccak::partial(self.selector_sig.as_bytes(), 4)
+135    }
+136}
+137
+138#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+139struct AbiFunctionParamInner {
+140    name: String,
+141    #[serde(flatten)]
+142    ty: AbiType,
+143}
+144
+145impl AbiFunctionParamInner {
+146    fn new(name: String, ty: AbiType) -> Self {
+147        Self { name, ty }
+148    }
+149}
+150
+151#[cfg(test)]
+152mod tests {
+153    use crate::types::AbiTupleField;
+154
+155    use super::*;
+156    use serde_test::{assert_ser_tokens, Token};
+157
+158    fn simple_tuple() -> AbiType {
+159        let u16_ty = AbiType::UInt(16);
+160        let bool_ty = AbiType::Bool;
+161        let field1 = AbiTupleField::new("field1".into(), u16_ty);
+162        let field2 = AbiTupleField::new("field2".into(), bool_ty);
+163
+164        AbiType::Tuple(vec![field1, field2])
+165    }
+166
+167    fn test_func(state_mutability: StateMutability) -> AbiFunction {
+168        let i32_ty = AbiType::Int(32);
+169        let tuple_ty = simple_tuple();
+170        let u64_ty = AbiType::UInt(64);
+171
+172        AbiFunction::new(
+173            AbiFunctionType::Function,
+174            "test_func".into(),
+175            vec![("arg1".into(), i32_ty), ("arg2".into(), tuple_ty)],
+176            Some(u64_ty),
+177            state_mutability,
+178        )
+179    }
+180
+181    #[test]
+182    fn serialize_func() {
+183        let func = test_func(StateMutability::Payable);
+184
+185        assert_ser_tokens(
+186            &func,
+187            &[
+188                Token::Struct {
+189                    name: "AbiFunction",
+190                    len: 5,
+191                },
+192                Token::Str("type"),
+193                Token::UnitVariant {
+194                    name: "AbiFunctionType",
+195                    variant: "function",
+196                },
+197                Token::String("name"),
+198                Token::String("test_func"),
+199                Token::Str("inputs"),
+200                Token::Seq { len: Some(2) },
+201                Token::Map { len: None },
+202                Token::String("name"),
+203                Token::String("arg1"),
+204                Token::String("type"),
+205                Token::String("int32"),
+206                Token::MapEnd,
+207                Token::Map { len: None },
+208                Token::String("name"),
+209                Token::String("arg2"),
+210                Token::String("type"),
+211                Token::String("tuple"),
+212                Token::String("components"),
+213                Token::Seq { len: Some(2) },
+214                Token::Map { len: None },
+215                Token::String("name"),
+216                Token::String("field1"),
+217                Token::String("type"),
+218                Token::String("uint16"),
+219                Token::MapEnd,
+220                Token::Map { len: None },
+221                Token::String("name"),
+222                Token::String("field2"),
+223                Token::String("type"),
+224                Token::String("bool"),
+225                Token::MapEnd,
+226                Token::SeqEnd,
+227                Token::MapEnd,
+228                Token::SeqEnd,
+229                Token::Str("outputs"),
+230                Token::Seq { len: Some(1) },
+231                Token::Map { len: None },
+232                Token::String("name"),
+233                Token::String(""),
+234                Token::String("type"),
+235                Token::String("uint64"),
+236                Token::MapEnd,
+237                Token::SeqEnd,
+238                Token::Str("stateMutability"),
+239                Token::UnitVariant {
+240                    name: "StateMutability",
+241                    variant: "payable",
+242                },
+243                Token::StructEnd,
+244            ],
+245        )
+246    }
+247
+248    #[test]
+249    fn test_state_mutability() {
+250        assert_eq!(
+251            StateMutability::from_self_and_ctx_params(SelfParam::None, CtxParam::None),
+252            StateMutability::Pure
+253        );
+254        assert_eq!(
+255            StateMutability::from_self_and_ctx_params(SelfParam::None, CtxParam::Imm),
+256            StateMutability::View
+257        );
+258        assert_eq!(
+259            StateMutability::from_self_and_ctx_params(SelfParam::None, CtxParam::Mut),
+260            StateMutability::Payable
+261        );
+262
+263        assert_eq!(
+264            StateMutability::from_self_and_ctx_params(SelfParam::Imm, CtxParam::None),
+265            StateMutability::View
+266        );
+267        assert_eq!(
+268            StateMutability::from_self_and_ctx_params(SelfParam::Imm, CtxParam::Imm),
+269            StateMutability::View
+270        );
+271        assert_eq!(
+272            StateMutability::from_self_and_ctx_params(SelfParam::Imm, CtxParam::Mut),
+273            StateMutability::Payable
+274        );
+275
+276        assert_eq!(
+277            StateMutability::from_self_and_ctx_params(SelfParam::Mut, CtxParam::None),
+278            StateMutability::Payable
+279        );
+280        assert_eq!(
+281            StateMutability::from_self_and_ctx_params(SelfParam::Mut, CtxParam::Imm),
+282            StateMutability::Payable
+283        );
+284        assert_eq!(
+285            StateMutability::from_self_and_ctx_params(SelfParam::Mut, CtxParam::Mut),
+286            StateMutability::Payable
+287        );
+288
+289        let pure_func = test_func(StateMutability::Pure);
+290        assert_eq!(pure_func.state_mutability, StateMutability::Pure);
+291
+292        let impure_func = test_func(StateMutability::Payable);
+293        assert_eq!(impure_func.state_mutability, StateMutability::Payable);
+294    }
+295
+296    #[test]
+297    fn func_selector() {
+298        let func = test_func(StateMutability::Payable);
+299        let selector = func.selector();
+300
+301        debug_assert_eq!(
+302            selector.selector_signature(),
+303            "test_func(int32,(uint16,bool))"
+304        );
+305        debug_assert_eq!(selector.hex(), "79c3c8b2");
+306    }
+307}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/lib.rs.html b/compiler-docs/src/fe_abi/lib.rs.html new file mode 100644 index 0000000000..7df2ca15e0 --- /dev/null +++ b/compiler-docs/src/fe_abi/lib.rs.html @@ -0,0 +1,4 @@ +lib.rs - source

fe_abi/
lib.rs

1pub mod contract;
+2pub mod event;
+3pub mod function;
+4pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/types.rs.html b/compiler-docs/src/fe_abi/types.rs.html new file mode 100644 index 0000000000..b4efbedf58 --- /dev/null +++ b/compiler-docs/src/fe_abi/types.rs.html @@ -0,0 +1,374 @@ +types.rs - source

fe_abi/
types.rs

1use serde::{ser::SerializeMap, Serialize, Serializer};
+2
+3#[derive(Debug, Clone, PartialEq, Eq)]
+4pub enum AbiType {
+5    UInt(usize),
+6    Int(usize),
+7    Address,
+8    Bool,
+9    Function,
+10    Array { elem_ty: Box<AbiType>, len: usize },
+11    Tuple(Vec<AbiTupleField>),
+12    Bytes,
+13    String,
+14}
+15
+16impl AbiType {
+17    pub fn selector_type_name(&self) -> String {
+18        match self {
+19            Self::UInt(bits) => format!("uint{bits}"),
+20            Self::Int(bits) => format!("int{bits}"),
+21            Self::Address => "address".to_string(),
+22            Self::Bool => "bool".to_string(),
+23            Self::Function => "function".to_string(),
+24            Self::Array { elem_ty, len } => {
+25                if elem_ty.as_ref() == &AbiType::UInt(8) {
+26                    "bytes".to_string()
+27                } else {
+28                    format!("{}[{}]", elem_ty.selector_type_name(), len)
+29                }
+30            }
+31            Self::Tuple(elems) => format!(
+32                "({})",
+33                elems
+34                    .iter()
+35                    .map(|component| component.ty.selector_type_name())
+36                    .collect::<Vec<_>>()
+37                    .join(",")
+38            ),
+39
+40            Self::Bytes => "bytes".to_string(),
+41            Self::String => "string".to_string(),
+42        }
+43    }
+44
+45    pub fn abi_type_name(&self) -> String {
+46        match self {
+47            Self::Tuple(_) => "tuple".to_string(),
+48            Self::Array { elem_ty, len } => {
+49                if elem_ty.as_ref() == &AbiType::UInt(8) {
+50                    "bytes".to_string()
+51                } else {
+52                    format!("{}[{}]", elem_ty.abi_type_name(), len)
+53                }
+54            }
+55            _ => self.selector_type_name(),
+56        }
+57    }
+58
+59    pub fn header_size(&self) -> usize {
+60        match self {
+61            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool | Self::Function => 32,
+62
+63            Self::Array { elem_ty, len } if elem_ty.is_static() => elem_ty.header_size() * len,
+64            Self::Array { .. } => 32,
+65
+66            Self::Tuple(fields) if self.is_static() => fields
+67                .iter()
+68                .fold(0, |acc, field| field.ty.header_size() + acc),
+69            Self::Tuple(_) => 32,
+70
+71            Self::Bytes | Self::String => 32,
+72        }
+73    }
+74
+75    pub fn is_primitive(&self) -> bool {
+76        matches! {
+77            self,
+78            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool
+79        }
+80    }
+81
+82    pub fn is_bytes(&self) -> bool {
+83        matches! {
+84            self,
+85            Self::Bytes,
+86        }
+87    }
+88
+89    pub fn is_string(&self) -> bool {
+90        matches! {
+91            self,
+92            Self::String
+93        }
+94    }
+95
+96    pub fn is_static(&self) -> bool {
+97        match self {
+98            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool | Self::Function => true,
+99            Self::Array { elem_ty, .. } => elem_ty.is_static(),
+100            Self::Tuple(fields) => fields.iter().all(|field| field.ty.is_static()),
+101            Self::Bytes | Self::String => false,
+102        }
+103    }
+104
+105    /// Returns bytes size of the encoded type if the type is static.
+106    pub fn size(&self) -> Option<usize> {
+107        match self {
+108            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool => Some(32),
+109            Self::Function => Some(24),
+110            Self::Array { elem_ty, len } => Some(elem_ty.size()? * len),
+111            Self::Tuple(fields) => {
+112                let mut size = 0;
+113                for field in fields.iter() {
+114                    size += field.ty.size()?;
+115                }
+116                Some(size)
+117            }
+118
+119            Self::Bytes | Self::String => None,
+120        }
+121    }
+122
+123    fn serialize_component<S: SerializeMap>(&self, s: &mut S) -> Result<(), S::Error> {
+124        match self {
+125            Self::Tuple(entry) => s.serialize_entry("components", entry),
+126            Self::Array { elem_ty, .. } => elem_ty.serialize_component(s),
+127            _ => Ok(()),
+128        }
+129    }
+130}
+131
+132impl Serialize for AbiType {
+133    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
+134        let mut map = s.serialize_map(None)?;
+135        let type_name = self.abi_type_name();
+136
+137        map.serialize_entry("type", &type_name)?;
+138
+139        self.serialize_component(&mut map)?;
+140        map.end()
+141    }
+142}
+143
+144#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+145pub struct AbiTupleField {
+146    pub name: String,
+147    #[serde(flatten)]
+148    pub ty: AbiType,
+149}
+150
+151impl AbiTupleField {
+152    pub fn new(name: String, ty: impl Into<AbiType>) -> Self {
+153        Self {
+154            name,
+155            ty: ty.into(),
+156        }
+157    }
+158}
+159
+160#[cfg(test)]
+161mod tests {
+162    use super::*;
+163
+164    use serde_test::{assert_ser_tokens, Token};
+165
+166    #[test]
+167    fn primitive() {
+168        let u32_ty = AbiType::UInt(32);
+169        assert_ser_tokens(
+170            &u32_ty,
+171            &[
+172                Token::Map { len: None },
+173                Token::String("type"),
+174                Token::String("uint32"),
+175                Token::MapEnd,
+176            ],
+177        )
+178    }
+179
+180    #[test]
+181    fn primitive_array() {
+182        let i32_ty = AbiType::Int(32);
+183        let array_i32 = AbiType::Array {
+184            elem_ty: i32_ty.into(),
+185            len: 10,
+186        };
+187
+188        assert_ser_tokens(
+189            &array_i32,
+190            &[
+191                Token::Map { len: None },
+192                Token::String("type"),
+193                Token::String("int32[10]"),
+194                Token::MapEnd,
+195            ],
+196        )
+197    }
+198
+199    #[test]
+200    fn tuple_array() {
+201        let u16_ty = AbiType::UInt(16);
+202        let bool_ty = AbiType::Bool;
+203        let array_bool = AbiType::Array {
+204            elem_ty: bool_ty.into(),
+205            len: 16,
+206        };
+207
+208        let field1 = AbiTupleField::new("field1".into(), u16_ty);
+209        let field2 = AbiTupleField::new("field2".into(), array_bool);
+210        let tuple_ty = AbiType::Tuple(vec![field1, field2]);
+211
+212        let tuple_array_ty = AbiType::Array {
+213            elem_ty: tuple_ty.into(),
+214            len: 16,
+215        };
+216
+217        assert_ser_tokens(
+218            &tuple_array_ty,
+219            &[
+220                Token::Map { len: None },
+221                Token::String("type"),
+222                Token::String("tuple[16]"),
+223                Token::String("components"),
+224                Token::Seq { len: Some(2) },
+225                // Field1.
+226                Token::Map { len: None },
+227                Token::String("name"),
+228                Token::String("field1"),
+229                Token::String("type"),
+230                Token::String("uint16"),
+231                Token::MapEnd,
+232                // Field2.
+233                Token::Map { len: None },
+234                Token::String("name"),
+235                Token::String("field2"),
+236                Token::String("type"),
+237                Token::String("bool[16]"),
+238                Token::MapEnd,
+239                Token::SeqEnd,
+240                Token::MapEnd,
+241            ],
+242        )
+243    }
+244
+245    #[test]
+246    fn simple_tuple() {
+247        let u16_ty = AbiType::UInt(16);
+248        let bool_ty = AbiType::Bool;
+249        let bool_array_ty = AbiType::Array {
+250            elem_ty: bool_ty.into(),
+251            len: 16,
+252        };
+253
+254        let field1 = AbiTupleField::new("field1".into(), u16_ty);
+255        let field2 = AbiTupleField::new("field2".into(), bool_array_ty);
+256        let tuple_ty = AbiType::Tuple(vec![field1, field2]);
+257
+258        assert_ser_tokens(
+259            &tuple_ty,
+260            &[
+261                Token::Map { len: None },
+262                Token::String("type"),
+263                Token::String("tuple"),
+264                Token::String("components"),
+265                Token::Seq { len: Some(2) },
+266                // Field1.
+267                Token::Map { len: None },
+268                Token::String("name"),
+269                Token::String("field1"),
+270                Token::String("type"),
+271                Token::String("uint16"),
+272                Token::MapEnd,
+273                // Field2.
+274                Token::Map { len: None },
+275                Token::String("name"),
+276                Token::String("field2"),
+277                Token::String("type"),
+278                Token::String("bool[16]"),
+279                Token::MapEnd,
+280                Token::SeqEnd,
+281                Token::MapEnd,
+282            ],
+283        )
+284    }
+285
+286    #[test]
+287    fn complex_tuple() {
+288        let u16_ty = AbiType::UInt(16);
+289        let bool_ty = AbiType::Bool;
+290
+291        let inner_field1 = AbiTupleField::new("inner_field1".into(), u16_ty);
+292        let inner_field2 = AbiTupleField::new("inner_field2".into(), bool_ty);
+293        let inner_tuple_ty = AbiType::Tuple(vec![inner_field1, inner_field2]);
+294
+295        let inner_tuple_array_ty = AbiType::Array {
+296            elem_ty: inner_tuple_ty.clone().into(),
+297            len: 16,
+298        };
+299
+300        let outer_field1 = AbiTupleField::new("outer_field1".into(), inner_tuple_array_ty);
+301        let outer_field2 = AbiTupleField::new("outer_field2".into(), inner_tuple_ty);
+302        let outer_tuple_ty = AbiType::Tuple(vec![outer_field1, outer_field2]);
+303
+304        assert_ser_tokens(
+305            &outer_tuple_ty,
+306            &[
+307                // Outer tuple start.
+308                Token::Map { len: None },
+309                Token::String("type"),
+310                Token::String("tuple"),
+311                // Outer tuple components start.
+312                Token::String("components"),
+313                Token::Seq { len: Some(2) },
+314                // Outer field1 start.
+315                Token::Map { len: None },
+316                Token::String("name"),
+317                Token::String("outer_field1"),
+318                Token::String("type"),
+319                Token::String("tuple[16]"),
+320                Token::String("components"),
+321                Token::Seq { len: Some(2) },
+322                // Inner field1 start.
+323                Token::Map { len: None },
+324                Token::String("name"),
+325                Token::String("inner_field1"),
+326                Token::String("type"),
+327                Token::String("uint16"),
+328                Token::MapEnd,
+329                // Inner field1 end.
+330                // Inner field2 start.
+331                Token::Map { len: None },
+332                Token::String("name"),
+333                Token::String("inner_field2"),
+334                Token::String("type"),
+335                Token::String("bool"),
+336                Token::MapEnd,
+337                // Inner field2 end.
+338                Token::SeqEnd,
+339                Token::MapEnd,
+340                // Outer field1 end.
+341                // Outer field2 start.
+342                Token::Map { len: None },
+343                Token::String("name"),
+344                Token::String("outer_field2"),
+345                Token::String("type"),
+346                Token::String("tuple"),
+347                Token::String("components"),
+348                Token::Seq { len: Some(2) },
+349                // Inner field1 start.
+350                Token::Map { len: None },
+351                Token::String("name"),
+352                Token::String("inner_field1"),
+353                Token::String("type"),
+354                Token::String("uint16"),
+355                Token::MapEnd,
+356                // Inner field1 end.
+357                // Inner field2 start.
+358                Token::Map { len: None },
+359                Token::String("name"),
+360                Token::String("inner_field2"),
+361                Token::String("type"),
+362                Token::String("bool"),
+363                Token::MapEnd,
+364                // Inner field2 end.
+365                Token::SeqEnd,
+366                Token::MapEnd,
+367                // Outer field2 end.
+368                Token::SeqEnd,
+369                // Outer tuple components end.
+370                Token::MapEnd,
+371            ],
+372        )
+373    }
+374}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/builtins.rs.html b/compiler-docs/src/fe_analyzer/builtins.rs.html new file mode 100644 index 0000000000..b65b1494a5 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/builtins.rs.html @@ -0,0 +1,154 @@ +builtins.rs - source

fe_analyzer/
builtins.rs

1use crate::namespace::types::Base;
+2use strum::{AsRefStr, EnumIter, EnumString};
+3
+4#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, EnumString, AsRefStr)]
+5#[strum(serialize_all = "snake_case")]
+6pub enum ValueMethod {
+7    ToMem,
+8    AbiEncode,
+9}
+10
+11#[derive(
+12    Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, EnumString, AsRefStr, EnumIter,
+13)]
+14#[strum(serialize_all = "snake_case")]
+15pub enum GlobalFunction {
+16    Keccak256,
+17}
+18
+19#[derive(Debug, Copy, Clone, PartialEq, Eq, EnumString, AsRefStr)]
+20#[strum(serialize_all = "snake_case")]
+21pub enum ContractTypeMethod {
+22    Create,
+23    Create2,
+24}
+25
+26impl ContractTypeMethod {
+27    pub fn arg_count(&self) -> usize {
+28        match self {
+29            ContractTypeMethod::Create => 2,
+30            ContractTypeMethod::Create2 => 3,
+31        }
+32    }
+33}
+34
+35/// The evm functions exposed by yul.
+36#[allow(non_camel_case_types)]
+37#[derive(
+38    Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, EnumString, AsRefStr, EnumIter,
+39)]
+40pub enum Intrinsic {
+41    __stop,           // () -> ()
+42    __add,            // (x, y)
+43    __sub,            // (x, y)
+44    __mul,            // (x, y)
+45    __div,            // (x, y)
+46    __sdiv,           // (x, y)
+47    __mod,            // (x, y)
+48    __smod,           // (x, y)
+49    __exp,            // (x, y)
+50    __not,            // (x)
+51    __lt,             // (x, y)
+52    __gt,             // (x, y)
+53    __slt,            // (x, y)
+54    __sgt,            // (x, y)
+55    __eq,             // (x, y)
+56    __iszero,         // (x)
+57    __and,            // (x, y)
+58    __or,             // (x, y)
+59    __xor,            // (x, y)
+60    __byte,           // (n, x)
+61    __shl,            // (x, y)
+62    __shr,            // (x, y)
+63    __sar,            // (x, y)
+64    __addmod,         // (x, y, m)
+65    __mulmod,         // (x, y, m)
+66    __signextend,     // (i, x)
+67    __keccak256,      // (p, n)
+68    __pc,             // ()
+69    __pop,            // (x) -> ()
+70    __mload,          // (p)
+71    __mstore,         // (p, v) -> ()
+72    __mstore8,        // (p, v) -> ()
+73    __sload,          // (p)
+74    __sstore,         // (p, v) -> ()
+75    __msize,          // ()
+76    __gas,            // ()
+77    __address,        // ()
+78    __balance,        // (a)
+79    __selfbalance,    // ()
+80    __caller,         // ()
+81    __callvalue,      // ()
+82    __calldataload,   // (p)
+83    __calldatasize,   // ()
+84    __calldatacopy,   // (t, f, s) -> ()
+85    __codesize,       // ()
+86    __codecopy,       // (t, f, s) -> ()
+87    __extcodesize,    // (a)
+88    __extcodecopy,    // (a, t, f, s) -> ()
+89    __returndatasize, // ()
+90    __returndatacopy, // (t, f, s) -> ()
+91    __extcodehash,    // (a)
+92    __create,         // (v, p, n)
+93    __create2,        // (v, p, n, s)
+94    __call,           // (g, a, v, in, insize, out, outsize)
+95    __callcode,       // (g, a, v, in, insize, out, outsize)
+96    __delegatecall,   // (g, a, in, insize, out, outsize)
+97    __staticcall,     // (g, a, in, insize, out, outsize)
+98    __return,         // (p, s) -> ()
+99    __revert,         // (p, s) -> ()
+100    __selfdestruct,   // (a) -> ()
+101    __invalid,        // () -> ()
+102    __log0,           // (p, s) -> ()
+103    __log1,           // (p, s, t1) -> ()
+104    __log2,           // (p, s, t1, t2) -> ()
+105    __log3,           // (p, s, t1, t2, t3) -> ()
+106    __log4,           // (p, s, t1, t2, t3, t4) -> ()
+107    __chainid,        // ()
+108    __basefee,        // ()
+109    __origin,         // ()
+110    __gasprice,       // ()
+111    __blockhash,      // (b)
+112    __coinbase,       // ()
+113    __timestamp,      // ()
+114    __number,         // ()
+115    __prevrandao,     // ()
+116    __gaslimit,       // ()
+117}
+118
+119impl Intrinsic {
+120    pub fn arg_count(&self) -> usize {
+121        use Intrinsic::*;
+122        match self {
+123            __stop | __basefee | __origin | __gasprice | __coinbase | __timestamp | __number
+124            | __prevrandao | __gaslimit | __pc | __msize | __gas | __address | __selfbalance
+125            | __caller | __callvalue | __calldatasize | __codesize | __returndatasize
+126            | __invalid | __chainid => 0,
+127
+128            __not | __iszero | __pop | __mload | __balance | __sload | __calldataload
+129            | __extcodesize | __extcodehash | __selfdestruct | __blockhash => 1,
+130
+131            __add | __sub | __mul | __div | __sdiv | __mod | __smod | __exp | __lt | __gt
+132            | __slt | __sgt | __eq | __and | __or | __xor | __byte | __shl | __shr | __sar
+133            | __signextend | __keccak256 | __mstore | __mstore8 | __sstore | __return
+134            | __revert | __log0 => 2,
+135
+136            __addmod | __mulmod | __calldatacopy | __codecopy | __returndatacopy | __create
+137            | __log1 => 3,
+138            __extcodecopy | __create2 | __log2 => 4,
+139            __log3 => 5,
+140            __delegatecall | __staticcall | __log4 => 6,
+141            __call | __callcode => 7,
+142        }
+143    }
+144
+145    pub fn return_type(&self) -> Base {
+146        use Intrinsic::*;
+147        match self {
+148            __stop | __pop | __mstore | __mstore8 | __sstore | __calldatacopy | __codecopy
+149            | __extcodecopy | __returndatacopy | __return | __revert | __selfdestruct
+150            | __invalid | __log0 | __log1 | __log2 | __log3 | __log4 => Base::Unit,
+151            _ => Base::u256(),
+152        }
+153    }
+154}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/constants.rs.html b/compiler-docs/src/fe_analyzer/constants.rs.html new file mode 100644 index 0000000000..40d2bfae47 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/constants.rs.html @@ -0,0 +1,4 @@ +constants.rs - source

fe_analyzer/
constants.rs

1pub const EMITTABLE_TRAIT_NAME: &str = "Emittable";
+2pub const EMIT_FN_NAME: &str = "emit";
+3pub const INDEXED: &str = "indexed";
+4pub const MAX_INDEXED_EVENT_FIELDS: usize = 3;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/context.rs.html b/compiler-docs/src/fe_analyzer/context.rs.html new file mode 100644 index 0000000000..2f827859ed --- /dev/null +++ b/compiler-docs/src/fe_analyzer/context.rs.html @@ -0,0 +1,595 @@ +context.rs - source

fe_analyzer/
context.rs

1use crate::{
+2    display::Displayable,
+3    errors::FatalError,
+4    namespace::items::{EnumVariantId, TypeDef},
+5    pattern_analysis::PatternMatrix,
+6};
+7
+8use crate::namespace::items::{
+9    ContractId, DiagnosticSink, FunctionId, FunctionSigId, Item, TraitId,
+10};
+11use crate::namespace::types::{Generic, SelfDecl, Type, TypeId};
+12use crate::AnalyzerDb;
+13use crate::{
+14    builtins::{ContractTypeMethod, GlobalFunction, Intrinsic, ValueMethod},
+15    namespace::scopes::BlockScopeType,
+16};
+17use crate::{
+18    errors::{self, IncompleteItem, TypeError},
+19    namespace::items::ModuleId,
+20};
+21use fe_common::diagnostics::Diagnostic;
+22pub use fe_common::diagnostics::Label;
+23use fe_common::Span;
+24use fe_parser::ast;
+25use fe_parser::node::{Node, NodeId};
+26
+27use indexmap::IndexMap;
+28use num_bigint::BigInt;
+29use smol_str::SmolStr;
+30use std::fmt::{self, Debug};
+31use std::hash::Hash;
+32use std::marker::PhantomData;
+33use std::rc::Rc;
+34use std::{cell::RefCell, collections::HashMap};
+35
+36#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+37pub struct Analysis<T> {
+38    pub value: T,
+39    pub diagnostics: Rc<[Diagnostic]>,
+40}
+41impl<T> Analysis<T> {
+42    pub fn new(value: T, diagnostics: Rc<[Diagnostic]>) -> Self {
+43        Self { value, diagnostics }
+44    }
+45    pub fn sink_diagnostics(&self, sink: &mut impl DiagnosticSink) {
+46        self.diagnostics.iter().for_each(|diag| sink.push(diag))
+47    }
+48    pub fn has_diag(&self) -> bool {
+49        !self.diagnostics.is_empty()
+50    }
+51}
+52
+53pub trait AnalyzerContext {
+54    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem>;
+55    /// Resolves the given path and registers all errors
+56    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError>;
+57    /// Resolves the given path only if it is visible. Does not register any errors
+58    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing>;
+59    /// Resolves the given path. Does not register any errors
+60    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing>;
+61
+62    fn add_diagnostic(&self, diag: Diagnostic);
+63    fn db(&self) -> &dyn AnalyzerDb;
+64
+65    fn error(&self, message: &str, label_span: Span, label: &str) -> DiagnosticVoucher {
+66        self.register_diag(errors::error(message, label_span, label))
+67    }
+68
+69    /// Attribute contextual information to an expression node.
+70    ///
+71    /// # Panics
+72    ///
+73    /// Panics if an entry already exists for the node id.
+74    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes);
+75
+76    /// Update the expression attributes.
+77    ///
+78    /// # Panics
+79    ///
+80    /// Panics if an entry does not already exist for the node id.
+81    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes));
+82
+83    /// Returns a type of an expression.
+84    ///
+85    /// # Panics
+86    ///
+87    /// Panics if type analysis is not performed for an `expr`.
+88    fn expr_typ(&self, expr: &Node<ast::Expr>) -> Type;
+89
+90    /// Add evaluated constant value in a constant declaration to the context.
+91    fn add_constant(&self, name: &Node<ast::SmolStr>, expr: &Node<ast::Expr>, value: Constant);
+92
+93    /// Returns constant value from variable name.
+94    fn constant_value_by_name(
+95        &self,
+96        name: &ast::SmolStr,
+97        span: Span,
+98    ) -> Result<Option<Constant>, IncompleteItem>;
+99
+100    /// Returns an item enclosing current context.
+101    ///
+102    /// # Example
+103    ///
+104    /// ```fe
+105    /// contract Foo:
+106    ///     fn foo():
+107    ///        if ...:
+108    ///            ...
+109    ///        else:
+110    ///            ...
+111    /// ```
+112    /// If the context is in `then` block, then this function returns
+113    /// `Item::Function(..)`.
+114    fn parent(&self) -> Item;
+115
+116    /// Returns the module enclosing current context.
+117    fn module(&self) -> ModuleId;
+118
+119    /// Returns a function id that encloses a context.
+120    ///
+121    /// # Panics
+122    ///
+123    /// Panics if a context is not in a function. Use [`Self::is_in_function`]
+124    /// to determine whether a context is in a function.
+125    fn parent_function(&self) -> FunctionId;
+126
+127    /// Returns a non-function item that encloses a context.
+128    ///
+129    /// # Example
+130    ///
+131    /// ```fe
+132    /// contract Foo:
+133    ///     fn foo():
+134    ///        if ...:
+135    ///            ...
+136    ///        else:
+137    ///            ...
+138    /// ```
+139    /// If the context is in `then` block, then this function returns
+140    /// `Item::Type(TypeDef::Contract(..))`.
+141    fn root_item(&self) -> Item {
+142        let mut item = self.parent();
+143        while let Item::Function(func_id) = item {
+144            item = func_id.parent(self.db());
+145        }
+146        item
+147    }
+148
+149    /// # Panics
+150    ///
+151    /// Panics if a context is not in a function. Use [`Self::is_in_function`]
+152    /// to determine whether a context is in a function.
+153    fn add_call(&self, node: &Node<ast::Expr>, call_type: CallType);
+154    fn get_call(&self, node: &Node<ast::Expr>) -> Option<CallType>;
+155
+156    /// Returns `true` if the context is in function scope.
+157    fn is_in_function(&self) -> bool;
+158
+159    /// Returns `true` if the scope or any of its parents is of the given type.
+160    fn inherits_type(&self, typ: BlockScopeType) -> bool;
+161
+162    /// Returns the `Context` type, if it is defined.
+163    fn get_context_type(&self) -> Option<TypeId>;
+164
+165    fn type_error(
+166        &self,
+167        message: &str,
+168        span: Span,
+169        expected: TypeId,
+170        actual: TypeId,
+171    ) -> DiagnosticVoucher {
+172        self.register_diag(errors::type_error(
+173            message,
+174            span,
+175            expected.display(self.db()),
+176            actual.display(self.db()),
+177        ))
+178    }
+179
+180    fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher {
+181        self.register_diag(errors::not_yet_implemented(feature, span))
+182    }
+183
+184    fn fancy_error(
+185        &self,
+186        message: &str,
+187        labels: Vec<Label>,
+188        notes: Vec<String>,
+189    ) -> DiagnosticVoucher {
+190        self.register_diag(errors::fancy_error(message, labels, notes))
+191    }
+192
+193    fn duplicate_name_error(
+194        &self,
+195        message: &str,
+196        name: &str,
+197        original: Span,
+198        duplicate: Span,
+199    ) -> DiagnosticVoucher {
+200        self.register_diag(errors::duplicate_name_error(
+201            message, name, original, duplicate,
+202        ))
+203    }
+204
+205    fn name_conflict_error(
+206        &self,
+207        name_kind: &str, // Eg "function parameter" or "variable name"
+208        name: &str,
+209        original: &NamedThing,
+210        original_span: Option<Span>,
+211        duplicate_span: Span,
+212    ) -> DiagnosticVoucher {
+213        self.register_diag(errors::name_conflict_error(
+214            name_kind,
+215            name,
+216            original,
+217            original_span,
+218            duplicate_span,
+219        ))
+220    }
+221
+222    fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher {
+223        self.add_diagnostic(diag);
+224        DiagnosticVoucher(PhantomData)
+225    }
+226}
+227
+228#[derive(Clone, Debug, PartialEq, Eq)]
+229pub enum NamedThing {
+230    Item(Item),
+231    EnumVariant(EnumVariantId),
+232    SelfValue {
+233        /// Function `self` parameter.
+234        decl: Option<SelfDecl>,
+235
+236        /// The function's parent, if any. If `None`, `self` has been
+237        /// used in a module-level function.
+238        parent: Option<Item>,
+239        span: Option<Span>,
+240    },
+241    // SelfType // when/if we add a `Self` type keyword
+242    Variable {
+243        name: SmolStr,
+244        typ: Result<TypeId, TypeError>,
+245        is_const: bool,
+246        span: Span,
+247    },
+248}
+249
+250impl NamedThing {
+251    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+252        match self {
+253            NamedThing::Item(item) => item.name(db),
+254            NamedThing::EnumVariant(variant) => variant.name(db),
+255            NamedThing::SelfValue { .. } => "self".into(),
+256            NamedThing::Variable { name, .. } => name.clone(),
+257        }
+258    }
+259
+260    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+261        match self {
+262            NamedThing::Item(item) => item.name_span(db),
+263            NamedThing::EnumVariant(variant) => Some(variant.span(db)),
+264            NamedThing::SelfValue { span, .. } => *span,
+265            NamedThing::Variable { span, .. } => Some(*span),
+266        }
+267    }
+268
+269    pub fn is_builtin(&self) -> bool {
+270        match self {
+271            NamedThing::Item(item) => item.is_builtin(),
+272            NamedThing::EnumVariant(_)
+273            | NamedThing::Variable { .. }
+274            | NamedThing::SelfValue { .. } => false,
+275        }
+276    }
+277
+278    pub fn item_kind_display_name(&self) -> &str {
+279        match self {
+280            NamedThing::Item(item) => item.item_kind_display_name(),
+281            NamedThing::EnumVariant(_) => "enum variant",
+282            NamedThing::Variable { .. } => "variable",
+283            NamedThing::SelfValue { .. } => "value",
+284        }
+285    }
+286
+287    pub fn resolve_path_segment(
+288        &self,
+289        db: &dyn AnalyzerDb,
+290        segment: &SmolStr,
+291    ) -> Option<NamedThing> {
+292        if let Self::Item(Item::Type(TypeDef::Enum(enum_))) = self {
+293            if let Some(variant) = enum_.variant(db, segment) {
+294                return Some(NamedThing::EnumVariant(variant));
+295            }
+296        }
+297
+298        match self {
+299            Self::Item(item) => item
+300                .items(db)
+301                .get(segment)
+302                .map(|resolved| NamedThing::Item(*resolved)),
+303
+304            _ => None,
+305        }
+306    }
+307}
+308
+309/// This should only be created by [`AnalyzerContext`].
+310#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+311pub struct DiagnosticVoucher(PhantomData<()>);
+312
+313impl DiagnosticVoucher {
+314    pub fn assume_the_parser_handled_it() -> Self {
+315        Self(PhantomData)
+316    }
+317}
+318
+319#[derive(Default)]
+320pub struct TempContext {
+321    pub diagnostics: RefCell<Vec<Diagnostic>>,
+322}
+323impl AnalyzerContext for TempContext {
+324    fn db(&self) -> &dyn AnalyzerDb {
+325        panic!("TempContext has no analyzer db")
+326    }
+327
+328    fn resolve_name(&self, _name: &str, _span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+329        panic!("TempContext can't resolve names")
+330    }
+331
+332    fn resolve_path(&self, _path: &ast::Path, _span: Span) -> Result<NamedThing, FatalError> {
+333        panic!("TempContext can't resolve paths")
+334    }
+335
+336    fn resolve_visible_path(&self, _path: &ast::Path) -> Option<NamedThing> {
+337        panic!("TempContext can't resolve paths")
+338    }
+339
+340    fn resolve_any_path(&self, _path: &ast::Path) -> Option<NamedThing> {
+341        panic!("TempContext can't resolve paths")
+342    }
+343
+344    fn add_expression(&self, _node: &Node<ast::Expr>, _attributes: ExpressionAttributes) {
+345        panic!("TempContext can't store expression")
+346    }
+347
+348    fn update_expression(&self, _node: &Node<ast::Expr>, _f: &dyn Fn(&mut ExpressionAttributes)) {
+349        panic!("TempContext can't update expression");
+350    }
+351
+352    fn expr_typ(&self, _expr: &Node<ast::Expr>) -> Type {
+353        panic!("TempContext can't return expression type")
+354    }
+355
+356    fn add_constant(&self, _name: &Node<ast::SmolStr>, _expr: &Node<ast::Expr>, _value: Constant) {
+357        panic!("TempContext can't store constant")
+358    }
+359
+360    fn constant_value_by_name(
+361        &self,
+362        _name: &ast::SmolStr,
+363        _span: Span,
+364    ) -> Result<Option<Constant>, IncompleteItem> {
+365        Ok(None)
+366    }
+367
+368    fn parent(&self) -> Item {
+369        panic!("TempContext has no root item")
+370    }
+371
+372    fn module(&self) -> ModuleId {
+373        panic!("TempContext has no module")
+374    }
+375
+376    fn parent_function(&self) -> FunctionId {
+377        panic!("TempContext has no parent function")
+378    }
+379
+380    fn add_call(&self, _node: &Node<ast::Expr>, _call_type: CallType) {
+381        panic!("TempContext can't add call");
+382    }
+383
+384    fn get_call(&self, _node: &Node<ast::Expr>) -> Option<CallType> {
+385        panic!("TempContext can't have calls");
+386    }
+387
+388    fn is_in_function(&self) -> bool {
+389        false
+390    }
+391
+392    fn inherits_type(&self, _typ: BlockScopeType) -> bool {
+393        false
+394    }
+395
+396    fn add_diagnostic(&self, diag: Diagnostic) {
+397        self.diagnostics.borrow_mut().push(diag)
+398    }
+399
+400    fn get_context_type(&self) -> Option<TypeId> {
+401        panic!("TempContext can't resolve Context")
+402    }
+403}
+404
+405#[derive(Default, Clone, Debug, PartialEq, Eq)]
+406pub struct FunctionBody {
+407    pub expressions: IndexMap<NodeId, ExpressionAttributes>,
+408    // Map match statements to the corresponding [`PatternMatrix`]
+409    pub matches: IndexMap<NodeId, PatternMatrix>,
+410    // Map lhs of variable declaration to type.
+411    pub var_types: IndexMap<NodeId, TypeId>,
+412    pub calls: IndexMap<NodeId, CallType>,
+413    pub spans: HashMap<NodeId, Span>,
+414}
+415
+416/// Contains contextual information relating to an expression AST node.
+417#[derive(Clone, Debug, PartialEq, Eq)]
+418pub struct ExpressionAttributes {
+419    pub typ: TypeId,
+420    // Evaluated constant value of const local definition.
+421    pub const_value: Option<Constant>,
+422    pub type_adjustments: Vec<Adjustment>,
+423}
+424impl ExpressionAttributes {
+425    pub fn original_type(&self) -> TypeId {
+426        self.typ
+427    }
+428    pub fn adjusted_type(&self) -> TypeId {
+429        if let Some(adj) = self.type_adjustments.last() {
+430            adj.into
+431        } else {
+432            self.typ
+433        }
+434    }
+435}
+436
+437#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+438pub struct Adjustment {
+439    pub into: TypeId,
+440    pub kind: AdjustmentKind,
+441}
+442
+443#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+444pub enum AdjustmentKind {
+445    Copy,
+446    /// Load from storage ptr
+447    Load,
+448    IntSizeIncrease,
+449    StringSizeIncrease,
+450}
+451
+452impl ExpressionAttributes {
+453    pub fn new(typ: TypeId) -> Self {
+454        Self {
+455            typ,
+456            const_value: None,
+457            type_adjustments: vec![],
+458        }
+459    }
+460}
+461
+462impl crate::display::DisplayWithDb for ExpressionAttributes {
+463    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+464        let ExpressionAttributes {
+465            typ,
+466            const_value,
+467            type_adjustments,
+468        } = self;
+469        write!(f, "{}", typ.display(db))?;
+470        if let Some(val) = &const_value {
+471            write!(f, " = {val:?}")?;
+472        }
+473        for adj in type_adjustments {
+474            write!(f, " -{:?}-> {}", adj.kind, adj.into.display(db))?;
+475        }
+476        Ok(())
+477    }
+478}
+479
+480/// The type of a function call.
+481#[derive(Clone, Debug, PartialEq, Eq)]
+482pub enum CallType {
+483    BuiltinFunction(GlobalFunction),
+484    Intrinsic(Intrinsic),
+485    BuiltinValueMethod {
+486        method: ValueMethod,
+487        typ: TypeId,
+488    },
+489
+490    // create, create2 (will be methods of the context struct soon)
+491    BuiltinAssociatedFunction {
+492        contract: ContractId,
+493        function: ContractTypeMethod,
+494    },
+495
+496    // MyStruct.foo() (soon MyStruct::foo())
+497    AssociatedFunction {
+498        typ: TypeId,
+499        function: FunctionId,
+500    },
+501    // some_struct_or_contract.foo()
+502    ValueMethod {
+503        typ: TypeId,
+504        method: FunctionId,
+505    },
+506    // some_trait.foo()
+507    // The reason this can not use `ValueMethod` is mainly because the trait might not have a
+508    // function implementation and even if it had it might not be the one that ends up getting
+509    // executed. An `impl` block will decide that.
+510    TraitValueMethod {
+511        trait_id: TraitId,
+512        method: FunctionSigId,
+513        // Traits can not directly be used as types but can act as bounds for generics. This is the
+514        // generic type that the method is called on.
+515        generic_type: Generic,
+516    },
+517    External {
+518        contract: ContractId,
+519        function: FunctionId,
+520    },
+521    Pure(FunctionId),
+522    TypeConstructor(TypeId),
+523    EnumConstructor(EnumVariantId),
+524}
+525
+526impl CallType {
+527    pub fn function(&self) -> Option<FunctionId> {
+528        use CallType::*;
+529        match self {
+530            BuiltinFunction(_)
+531            | BuiltinValueMethod { .. }
+532            | TypeConstructor(_)
+533            | EnumConstructor(_)
+534            | Intrinsic(_)
+535            | TraitValueMethod { .. }
+536            | BuiltinAssociatedFunction { .. } => None,
+537            AssociatedFunction { function: id, .. }
+538            | ValueMethod { method: id, .. }
+539            | External { function: id, .. }
+540            | Pure(id) => Some(*id),
+541        }
+542    }
+543
+544    pub fn function_name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+545        match self {
+546            CallType::BuiltinFunction(f) => f.as_ref().into(),
+547            CallType::Intrinsic(f) => f.as_ref().into(),
+548            CallType::BuiltinValueMethod { method, .. } => method.as_ref().into(),
+549            CallType::BuiltinAssociatedFunction { function, .. } => function.as_ref().into(),
+550            CallType::AssociatedFunction { function: id, .. }
+551            | CallType::ValueMethod { method: id, .. }
+552            | CallType::External { function: id, .. }
+553            | CallType::Pure(id) => id.name(db),
+554            CallType::TraitValueMethod { method: id, .. } => id.name(db),
+555            CallType::TypeConstructor(typ) => typ.display(db).to_string().into(),
+556            CallType::EnumConstructor(variant) => {
+557                let enum_name = variant.parent(db).name(db);
+558                let variant_name = variant.name(db);
+559                format!("{enum_name}::{variant_name}").into()
+560            }
+561        }
+562    }
+563
+564    pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool {
+565        if let CallType::Intrinsic(_) = self {
+566            true
+567        } else if let CallType::TypeConstructor(type_id) = self {
+568            // check that this is the `Context` struct defined in `std`
+569            // this should be deleted once associated functions are supported and we can
+570            // define unsafe constructors in Fe
+571            if let Type::Struct(struct_) = type_id.typ(db) {
+572                struct_.name(db) == "Context" && struct_.module(db).ingot(db).name(db) == "std"
+573            } else {
+574                false
+575            }
+576        } else {
+577            self.function().map(|id| id.is_unsafe(db)).unwrap_or(false)
+578        }
+579    }
+580}
+581
+582impl fmt::Display for CallType {
+583    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+584        write!(f, "{self:?}")
+585    }
+586}
+587
+588/// Represents constant value.
+589#[derive(Debug, Clone, PartialEq, Eq)]
+590pub enum Constant {
+591    Int(BigInt),
+592    Address(BigInt),
+593    Bool(bool),
+594    Str(SmolStr),
+595}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db.rs.html b/compiler-docs/src/fe_analyzer/db.rs.html new file mode 100644 index 0000000000..48f5b7375a --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db.rs.html @@ -0,0 +1,238 @@ +db.rs - source

fe_analyzer/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use crate::namespace::items::{
+3    self, AttributeId, ContractFieldId, ContractId, DepGraphWrapper, EnumVariantKind, FunctionId,
+4    FunctionSigId, ImplId, IngotId, Item, ModuleConstantId, ModuleId, StructFieldId, StructId,
+5    TraitId, TypeAliasId,
+6};
+7use crate::namespace::types::{self, Type, TypeId};
+8use crate::{
+9    context::{Analysis, Constant, FunctionBody},
+10    namespace::items::EnumId,
+11};
+12use crate::{
+13    errors::{ConstEvalError, TypeError},
+14    namespace::items::EnumVariantId,
+15};
+16use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
+17use fe_common::{SourceFileId, Span};
+18use fe_parser::ast;
+19use indexmap::map::IndexMap;
+20use smol_str::SmolStr;
+21use std::rc::Rc;
+22mod queries;
+23
+24#[salsa::query_group(AnalyzerDbStorage)]
+25pub trait AnalyzerDb: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> {
+26    #[salsa::interned]
+27    fn intern_ingot(&self, data: Rc<items::Ingot>) -> IngotId;
+28    #[salsa::interned]
+29    fn intern_module(&self, data: Rc<items::Module>) -> ModuleId;
+30    #[salsa::interned]
+31    fn intern_module_const(&self, data: Rc<items::ModuleConstant>) -> ModuleConstantId;
+32    #[salsa::interned]
+33    fn intern_struct(&self, data: Rc<items::Struct>) -> StructId;
+34    #[salsa::interned]
+35    fn intern_struct_field(&self, data: Rc<items::StructField>) -> StructFieldId;
+36    #[salsa::interned]
+37    fn intern_enum(&self, data: Rc<items::Enum>) -> EnumId;
+38    #[salsa::interned]
+39    fn intern_attribute(&self, data: Rc<items::Attribute>) -> AttributeId;
+40    #[salsa::interned]
+41    fn intern_enum_variant(&self, data: Rc<items::EnumVariant>) -> EnumVariantId;
+42    #[salsa::interned]
+43    fn intern_trait(&self, data: Rc<items::Trait>) -> TraitId;
+44    #[salsa::interned]
+45    fn intern_impl(&self, data: Rc<items::Impl>) -> ImplId;
+46    #[salsa::interned]
+47    fn intern_type_alias(&self, data: Rc<items::TypeAlias>) -> TypeAliasId;
+48    #[salsa::interned]
+49    fn intern_contract(&self, data: Rc<items::Contract>) -> ContractId;
+50    #[salsa::interned]
+51    fn intern_contract_field(&self, data: Rc<items::ContractField>) -> ContractFieldId;
+52    #[salsa::interned]
+53    fn intern_function_sig(&self, data: Rc<items::FunctionSig>) -> FunctionSigId;
+54    #[salsa::interned]
+55    fn intern_function(&self, data: Rc<items::Function>) -> FunctionId;
+56    #[salsa::interned]
+57    fn intern_type(&self, data: Type) -> TypeId;
+58
+59    // Ingot
+60
+61    // These are inputs so that the (future) language server can add
+62    // and remove files/dependencies. Set via eg `db.set_ingot_files`.
+63    // If an input is used before it's set, salsa will panic.
+64    #[salsa::input]
+65    fn ingot_files(&self, ingot: IngotId) -> Rc<[SourceFileId]>;
+66    #[salsa::input]
+67    fn ingot_external_ingots(&self, ingot: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>;
+68    // Having the root ingot available as a "global" might offend functional
+69    // programming purists but it makes for much nicer ergonomics in queries
+70    // that just need the global entrypoint
+71    #[salsa::input]
+72    fn root_ingot(&self) -> IngotId;
+73
+74    #[salsa::invoke(queries::ingots::ingot_modules)]
+75    fn ingot_modules(&self, ingot: IngotId) -> Rc<[ModuleId]>;
+76    #[salsa::invoke(queries::ingots::ingot_root_module)]
+77    fn ingot_root_module(&self, ingot: IngotId) -> Option<ModuleId>;
+78
+79    // Module
+80    #[salsa::invoke(queries::module::module_file_path)]
+81    fn module_file_path(&self, module: ModuleId) -> SmolStr;
+82    #[salsa::invoke(queries::module::module_parse)]
+83    fn module_parse(&self, module: ModuleId) -> Analysis<Rc<ast::Module>>;
+84    #[salsa::invoke(queries::module::module_is_incomplete)]
+85    fn module_is_incomplete(&self, module: ModuleId) -> bool;
+86    #[salsa::invoke(queries::module::module_all_items)]
+87    fn module_all_items(&self, module: ModuleId) -> Rc<[Item]>;
+88    #[salsa::invoke(queries::module::module_all_impls)]
+89    fn module_all_impls(&self, module: ModuleId) -> Analysis<Rc<[ImplId]>>;
+90    #[salsa::invoke(queries::module::module_item_map)]
+91    fn module_item_map(&self, module: ModuleId) -> Analysis<Rc<IndexMap<SmolStr, Item>>>;
+92    #[salsa::invoke(queries::module::module_impl_map)]
+93    fn module_impl_map(
+94        &self,
+95        module: ModuleId,
+96    ) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>;
+97    #[salsa::invoke(queries::module::module_contracts)]
+98    fn module_contracts(&self, module: ModuleId) -> Rc<[ContractId]>;
+99    #[salsa::invoke(queries::module::module_structs)]
+100    fn module_structs(&self, module: ModuleId) -> Rc<[StructId]>;
+101    #[salsa::invoke(queries::module::module_constants)]
+102    fn module_constants(&self, module: ModuleId) -> Rc<Vec<ModuleConstantId>>;
+103    #[salsa::invoke(queries::module::module_used_item_map)]
+104    fn module_used_item_map(
+105        &self,
+106        module: ModuleId,
+107    ) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>;
+108    #[salsa::invoke(queries::module::module_parent_module)]
+109    fn module_parent_module(&self, module: ModuleId) -> Option<ModuleId>;
+110    #[salsa::invoke(queries::module::module_submodules)]
+111    fn module_submodules(&self, module: ModuleId) -> Rc<[ModuleId]>;
+112    #[salsa::invoke(queries::module::module_tests)]
+113    fn module_tests(&self, module: ModuleId) -> Vec<FunctionId>;
+114
+115    // Module Constant
+116    #[salsa::cycle(queries::module::module_constant_type_cycle)]
+117    #[salsa::invoke(queries::module::module_constant_type)]
+118    fn module_constant_type(&self, id: ModuleConstantId) -> Analysis<Result<TypeId, TypeError>>;
+119    #[salsa::cycle(queries::module::module_constant_value_cycle)]
+120    #[salsa::invoke(queries::module::module_constant_value)]
+121    fn module_constant_value(
+122        &self,
+123        id: ModuleConstantId,
+124    ) -> Analysis<Result<Constant, ConstEvalError>>;
+125
+126    // Contract
+127    #[salsa::invoke(queries::contracts::contract_all_functions)]
+128    fn contract_all_functions(&self, id: ContractId) -> Rc<[FunctionId]>;
+129    #[salsa::invoke(queries::contracts::contract_function_map)]
+130    fn contract_function_map(&self, id: ContractId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+131    #[salsa::invoke(queries::contracts::contract_public_function_map)]
+132    fn contract_public_function_map(&self, id: ContractId) -> Rc<IndexMap<SmolStr, FunctionId>>;
+133    #[salsa::invoke(queries::contracts::contract_init_function)]
+134    fn contract_init_function(&self, id: ContractId) -> Analysis<Option<FunctionId>>;
+135    #[salsa::invoke(queries::contracts::contract_call_function)]
+136    fn contract_call_function(&self, id: ContractId) -> Analysis<Option<FunctionId>>;
+137
+138    #[salsa::invoke(queries::contracts::contract_all_fields)]
+139    fn contract_all_fields(&self, id: ContractId) -> Rc<[ContractFieldId]>;
+140    #[salsa::invoke(queries::contracts::contract_field_map)]
+141    fn contract_field_map(
+142        &self,
+143        id: ContractId,
+144    ) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>;
+145    #[salsa::invoke(queries::contracts::contract_field_type)]
+146    fn contract_field_type(&self, field: ContractFieldId) -> Analysis<Result<TypeId, TypeError>>;
+147    #[salsa::cycle(queries::contracts::contract_dependency_graph_cycle)]
+148    #[salsa::invoke(queries::contracts::contract_dependency_graph)]
+149    fn contract_dependency_graph(&self, id: ContractId) -> DepGraphWrapper;
+150    #[salsa::cycle(queries::contracts::contract_runtime_dependency_graph_cycle)]
+151    #[salsa::invoke(queries::contracts::contract_runtime_dependency_graph)]
+152    fn contract_runtime_dependency_graph(&self, id: ContractId) -> DepGraphWrapper;
+153
+154    // Function
+155    #[salsa::invoke(queries::functions::function_signature)]
+156    fn function_signature(&self, id: FunctionSigId) -> Analysis<Rc<types::FunctionSignature>>;
+157    #[salsa::invoke(queries::functions::function_body)]
+158    fn function_body(&self, id: FunctionId) -> Analysis<Rc<FunctionBody>>;
+159    #[salsa::cycle(queries::functions::function_dependency_graph_cycle)]
+160    #[salsa::invoke(queries::functions::function_dependency_graph)]
+161    fn function_dependency_graph(&self, id: FunctionId) -> DepGraphWrapper;
+162
+163    // Struct
+164    #[salsa::invoke(queries::structs::struct_all_fields)]
+165    fn struct_all_fields(&self, id: StructId) -> Rc<[StructFieldId]>;
+166    #[salsa::invoke(queries::structs::struct_field_map)]
+167    fn struct_field_map(&self, id: StructId) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>;
+168    #[salsa::invoke(queries::structs::struct_field_type)]
+169    fn struct_field_type(&self, field: StructFieldId) -> Analysis<Result<TypeId, TypeError>>;
+170    #[salsa::invoke(queries::structs::struct_all_functions)]
+171    fn struct_all_functions(&self, id: StructId) -> Rc<[FunctionId]>;
+172    #[salsa::invoke(queries::structs::struct_function_map)]
+173    fn struct_function_map(&self, id: StructId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+174    #[salsa::cycle(queries::structs::struct_cycle)]
+175    #[salsa::invoke(queries::structs::struct_dependency_graph)]
+176    fn struct_dependency_graph(&self, id: StructId) -> Analysis<DepGraphWrapper>;
+177
+178    // Enum
+179    #[salsa::invoke(queries::enums::enum_all_variants)]
+180    fn enum_all_variants(&self, id: EnumId) -> Rc<[EnumVariantId]>;
+181    #[salsa::invoke(queries::enums::enum_variant_map)]
+182    fn enum_variant_map(&self, id: EnumId) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>;
+183    #[salsa::invoke(queries::enums::enum_all_functions)]
+184    fn enum_all_functions(&self, id: EnumId) -> Rc<[FunctionId]>;
+185    #[salsa::invoke(queries::enums::enum_function_map)]
+186    fn enum_function_map(&self, id: EnumId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+187    #[salsa::cycle(queries::enums::enum_cycle)]
+188    #[salsa::invoke(queries::enums::enum_dependency_graph)]
+189    fn enum_dependency_graph(&self, id: EnumId) -> Analysis<DepGraphWrapper>;
+190    #[salsa::invoke(queries::enums::enum_variant_kind)]
+191    fn enum_variant_kind(&self, id: EnumVariantId) -> Analysis<Result<EnumVariantKind, TypeError>>;
+192
+193    // Trait
+194    #[salsa::invoke(queries::traits::trait_all_functions)]
+195    fn trait_all_functions(&self, id: TraitId) -> Rc<[FunctionSigId]>;
+196    #[salsa::invoke(queries::traits::trait_function_map)]
+197    fn trait_function_map(&self, id: TraitId) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>;
+198    #[salsa::invoke(queries::traits::trait_is_implemented_for)]
+199    fn trait_is_implemented_for(&self, id: TraitId, typ: TypeId) -> bool;
+200
+201    // Impl
+202    #[salsa::invoke(queries::impls::impl_all_functions)]
+203    fn impl_all_functions(&self, id: ImplId) -> Rc<[FunctionId]>;
+204    #[salsa::invoke(queries::impls::impl_function_map)]
+205    fn impl_function_map(&self, id: ImplId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+206
+207    // Type
+208    #[salsa::invoke(queries::types::all_impls)]
+209    fn all_impls(&self, ty: TypeId) -> Rc<[ImplId]>;
+210    #[salsa::invoke(queries::types::impl_for)]
+211    fn impl_for(&self, ty: TypeId, treit: TraitId) -> Option<ImplId>;
+212    #[salsa::invoke(queries::types::function_sigs)]
+213    fn function_sigs(&self, ty: TypeId, name: SmolStr) -> Rc<[FunctionSigId]>;
+214
+215    // Type alias
+216    #[salsa::invoke(queries::types::type_alias_type)]
+217    #[salsa::cycle(queries::types::type_alias_type_cycle)]
+218    fn type_alias_type(&self, id: TypeAliasId) -> Analysis<Result<TypeId, TypeError>>;
+219}
+220
+221#[salsa::database(AnalyzerDbStorage, SourceDbStorage)]
+222#[derive(Default)]
+223pub struct TestDb {
+224    storage: salsa::Storage<TestDb>,
+225}
+226impl salsa::Database for TestDb {}
+227
+228impl Upcast<dyn SourceDb> for TestDb {
+229    fn upcast(&self) -> &(dyn SourceDb + 'static) {
+230        self
+231    }
+232}
+233
+234impl UpcastMut<dyn SourceDb> for TestDb {
+235    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
+236        &mut *self
+237    }
+238}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries.rs.html b/compiler-docs/src/fe_analyzer/db/queries.rs.html new file mode 100644 index 0000000000..6e0e2953a5 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries.rs.html @@ -0,0 +1,9 @@ +queries.rs - source

fe_analyzer/db/
queries.rs

1pub mod contracts;
+2pub mod enums;
+3pub mod functions;
+4pub mod impls;
+5pub mod ingots;
+6pub mod module;
+7pub mod structs;
+8pub mod traits;
+9pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html b/compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html new file mode 100644 index 0000000000..b0762338dc --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html @@ -0,0 +1,403 @@ +contracts.rs - source

fe_analyzer/db/queries/
contracts.rs

1use crate::context::AnalyzerContext;
+2use crate::db::{Analysis, AnalyzerDb};
+3use crate::errors;
+4use crate::namespace::items::{
+5    self, ContractFieldId, ContractId, DepGraph, DepGraphWrapper, DepLocality, FunctionId, Item,
+6    TypeDef,
+7};
+8use crate::namespace::scopes::ItemScope;
+9use crate::namespace::types::{self, Type};
+10use crate::traversal::types::type_desc;
+11use fe_common::diagnostics::Label;
+12use fe_parser::ast;
+13use indexmap::map::{Entry, IndexMap};
+14use smol_str::SmolStr;
+15use std::rc::Rc;
+16
+17/// A `Vec` of every function defined in the contract, including duplicates and
+18/// the init function.
+19pub fn contract_all_functions(db: &dyn AnalyzerDb, contract: ContractId) -> Rc<[FunctionId]> {
+20    let module = contract.module(db);
+21    let body = &contract.data(db).ast.kind.body;
+22    body.iter()
+23        .map(|stmt| match stmt {
+24            ast::ContractStmt::Function(node) => db.intern_function(Rc::new(items::Function::new(
+25                db,
+26                node,
+27                Some(Item::Type(TypeDef::Contract(contract))),
+28                module,
+29            ))),
+30        })
+31        .collect()
+32}
+33
+34pub fn contract_function_map(
+35    db: &dyn AnalyzerDb,
+36    contract: ContractId,
+37) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+38    let scope = ItemScope::new(db, contract.module(db));
+39    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+40
+41    for func in db.contract_all_functions(contract).iter() {
+42        let def = &func.data(db).ast;
+43        let def_name = def.name();
+44        if def_name == "__init__" || def_name == "__call__" {
+45            continue;
+46        }
+47
+48        if let Ok(Some(named_item)) = scope.resolve_name(def_name, func.name_span(db)) {
+49            scope.name_conflict_error(
+50                "function",
+51                def_name,
+52                &named_item,
+53                named_item.name_span(db),
+54                def.kind.sig.kind.name.span,
+55            );
+56            continue;
+57        }
+58
+59        let func_sig = func.sig(db);
+60        if let Ok(ret_ty) = func_sig.signature(db).return_type {
+61            if func.is_public(db) && !ret_ty.is_encodable(db).unwrap_or(false) {
+62                scope.fancy_error(
+63                    "can't return unencodable type from public contract function",
+64                    vec![Label::primary(
+65                        func_sig
+66                            .data(db)
+67                            .ast
+68                            .kind
+69                            .return_type
+70                            .as_ref()
+71                            .unwrap()
+72                            .span,
+73                        format! {"can't return `{}` here", ret_ty.name(db)},
+74                    )],
+75                    vec![],
+76                );
+77            }
+78        }
+79        for (i, param) in func_sig.signature(db).params.iter().enumerate() {
+80            if let Ok(param_ty) = param.typ {
+81                if func.is_public(db) && !param_ty.is_encodable(db).unwrap_or(false) {
+82                    scope.fancy_error(
+83                        "can't use unencodable type as a public contract function argument",
+84                        vec![Label::primary(
+85                            func_sig.data(db).ast.kind.args[i].kind.typ_span().unwrap(),
+86                            format! {"can't use `{}` here", param_ty.name(db)},
+87                        )],
+88                        vec![],
+89                    );
+90                }
+91            }
+92        }
+93
+94        match map.entry(def.name().into()) {
+95            Entry::Occupied(entry) => {
+96                scope.duplicate_name_error(
+97                    &format!(
+98                        "duplicate function names in `contract {}`",
+99                        contract.name(db),
+100                    ),
+101                    entry.key(),
+102                    entry.get().data(db).ast.span,
+103                    def.span,
+104                );
+105            }
+106            Entry::Vacant(entry) => {
+107                entry.insert(*func);
+108            }
+109        }
+110    }
+111    Analysis {
+112        value: Rc::new(map),
+113        diagnostics: scope.diagnostics.take().into(),
+114    }
+115}
+116
+117pub fn contract_public_function_map(
+118    db: &dyn AnalyzerDb,
+119    contract: ContractId,
+120) -> Rc<IndexMap<SmolStr, FunctionId>> {
+121    Rc::new(
+122        contract
+123            .functions(db)
+124            .iter()
+125            .filter(|(_, func)| func.is_public(db))
+126            .map(|(name, func)| (name.clone(), *func))
+127            .collect(),
+128    )
+129}
+130
+131pub fn contract_init_function(
+132    db: &dyn AnalyzerDb,
+133    contract: ContractId,
+134) -> Analysis<Option<FunctionId>> {
+135    let all_fns = db.contract_all_functions(contract);
+136    let mut init_fns = all_fns.iter().filter_map(|func| {
+137        let def = &func.data(db).ast;
+138        (def.name() == "__init__").then_some((func, def.span))
+139    });
+140
+141    let mut diagnostics = vec![];
+142
+143    let first_def = init_fns.next();
+144    if let Some((_, dupe_span)) = init_fns.next() {
+145        let mut labels = vec![
+146            Label::primary(first_def.unwrap().1, "`__init__` first defined here"),
+147            Label::secondary(dupe_span, "`init` redefined here"),
+148        ];
+149        for (_, dupe_span) in init_fns {
+150            labels.push(Label::secondary(dupe_span, "`__init__` redefined here"));
+151        }
+152        diagnostics.push(errors::fancy_error(
+153            format!(
+154                "`fn __init__()` is defined multiple times in `contract {}`",
+155                contract.name(db),
+156            ),
+157            labels,
+158            vec![],
+159        ));
+160    }
+161
+162    if let Some((id, span)) = first_def {
+163        // `__init__` must be `pub`.
+164        // Return type is checked in `queries::functions::function_signature`.
+165        if !id.is_public(db) {
+166            diagnostics.push(errors::fancy_error(
+167                "`__init__` function is not public",
+168                vec![Label::primary(span, "`__init__` function must be public")],
+169                vec![
+170                    "Hint: Add the `pub` modifier.".to_string(),
+171                    "Example: `pub fn __init__():`".to_string(),
+172                ],
+173            ));
+174        }
+175    }
+176
+177    Analysis {
+178        value: first_def.map(|(id, _span)| *id),
+179        diagnostics: diagnostics.into(),
+180    }
+181}
+182
+183pub fn contract_call_function(
+184    db: &dyn AnalyzerDb,
+185    contract: ContractId,
+186) -> Analysis<Option<FunctionId>> {
+187    let all_fns = db.contract_all_functions(contract);
+188    let mut call_fns = all_fns.iter().filter_map(|func| {
+189        let def = &func.data(db).ast;
+190        (def.name() == "__call__").then_some((func, def.span))
+191    });
+192
+193    let mut diagnostics = vec![];
+194
+195    let first_def = call_fns.next();
+196    if let Some((_, dupe_span)) = call_fns.next() {
+197        let mut labels = vec![
+198            Label::primary(first_def.unwrap().1, "`__call__` first defined here"),
+199            Label::secondary(dupe_span, "`__call__` redefined here"),
+200        ];
+201        for (_, dupe_span) in call_fns {
+202            labels.push(Label::secondary(dupe_span, "`__call__` redefined here"));
+203        }
+204        diagnostics.push(errors::fancy_error(
+205            format!(
+206                "`fn __call__()` is defined multiple times in `contract {}`",
+207                contract.name(db),
+208            ),
+209            labels,
+210            vec![],
+211        ));
+212    }
+213
+214    if let Some((id, span)) = first_def {
+215        // `__call__` must be `pub`.
+216        // Return type is checked in `queries::functions::function_signature`.
+217        if !id.is_public(db) {
+218            diagnostics.push(errors::fancy_error(
+219                "`__call__` function is not public",
+220                vec![Label::primary(span, "`__call__` function must be public")],
+221                vec![
+222                    "Hint: Add the `pub` modifier.".to_string(),
+223                    "Example: `pub fn __call__():`".to_string(),
+224                ],
+225            ));
+226        }
+227    }
+228
+229    if let Some((_id, init_span)) = first_def {
+230        for func in all_fns.iter() {
+231            let name = func.name(db);
+232            if func.is_public(db) && name != "__init__" && name != "__call__" {
+233                diagnostics.push(errors::fancy_error(
+234                    "`pub` not allowed if `__call__` is defined",
+235                    vec![
+236                        Label::primary(func.name_span(db), format!("`{name}` can't be public")),
+237                        Label::secondary(init_span, "`__call__` defined here"),
+238                    ],
+239                    vec![
+240                        "The `__call__` function replaces the default function dispatcher, which makes `pub` modifiers obsolete.".to_string(),
+241                        "Hint: Remove the `pub` modifier or `__call__` function.".to_string(),
+242                    ],
+243                ));
+244            }
+245        }
+246    }
+247
+248    Analysis {
+249        value: first_def.map(|(id, _span)| *id),
+250        diagnostics: diagnostics.into(),
+251    }
+252}
+253
+254/// All field ids, including those with duplicate names
+255pub fn contract_all_fields(db: &dyn AnalyzerDb, contract: ContractId) -> Rc<[ContractFieldId]> {
+256    contract
+257        .data(db)
+258        .ast
+259        .kind
+260        .fields
+261        .iter()
+262        .map(|node| {
+263            db.intern_contract_field(Rc::new(items::ContractField {
+264                ast: node.clone(),
+265                parent: contract,
+266            }))
+267        })
+268        .collect()
+269}
+270
+271pub fn contract_field_map(
+272    db: &dyn AnalyzerDb,
+273    contract: ContractId,
+274) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>> {
+275    let scope = ItemScope::new(db, contract.module(db));
+276    let mut map = IndexMap::<SmolStr, ContractFieldId>::new();
+277
+278    let contract_name = contract.name(db);
+279    for field in db.contract_all_fields(contract).iter() {
+280        let node = &field.data(db).ast;
+281
+282        match map.entry(node.name().into()) {
+283            Entry::Occupied(entry) => {
+284                scope.duplicate_name_error(
+285                    &format!("duplicate field names in `contract {contract_name}`",),
+286                    entry.key(),
+287                    entry.get().data(db).ast.span,
+288                    node.span,
+289                );
+290            }
+291            Entry::Vacant(entry) => {
+292                entry.insert(*field);
+293            }
+294        }
+295    }
+296
+297    Analysis {
+298        value: Rc::new(map),
+299        diagnostics: scope.diagnostics.take().into(),
+300    }
+301}
+302
+303pub fn contract_field_type(
+304    db: &dyn AnalyzerDb,
+305    field: ContractFieldId,
+306) -> Analysis<Result<types::TypeId, errors::TypeError>> {
+307    let mut scope = ItemScope::new(db, field.data(db).parent.module(db));
+308    let self_ty = Some(field.data(db).parent.as_type(db).as_trait_or_type());
+309    let typ = type_desc(&mut scope, &field.data(db).ast.kind.typ, self_ty);
+310
+311    let node = &field.data(db).ast;
+312
+313    if node.kind.is_pub {
+314        scope.not_yet_implemented("contract `pub` fields", node.span);
+315    }
+316    if node.kind.is_const {
+317        scope.not_yet_implemented("contract `const` fields", node.span);
+318    }
+319    if let Some(value_node) = &node.kind.value {
+320        scope.not_yet_implemented("contract field initial value assignment", value_node.span);
+321    }
+322
+323    Analysis {
+324        value: typ,
+325        diagnostics: scope.diagnostics.take().into(),
+326    }
+327}
+328
+329pub fn contract_dependency_graph(db: &dyn AnalyzerDb, contract: ContractId) -> DepGraphWrapper {
+330    // A contract depends on the types of its fields, and the things those types
+331    // depend on. Note that this *does not* include the contract's public
+332    // function graph. (See `contract_runtime_dependency_graph` below)
+333
+334    let fields = contract.fields(db);
+335    let field_types = fields
+336        .values()
+337        .filter_map(|field| match field.typ(db).ok()?.typ(db) {
+338            Type::Contract(id) => Some(Item::Type(TypeDef::Contract(id))),
+339            Type::Struct(id) => Some(Item::Type(TypeDef::Struct(id))),
+340            // TODO: when tuples can contain non-primitive items,
+341            // we'll have to depend on tuple element types
+342            _ => None,
+343        })
+344        .collect::<Vec<_>>();
+345
+346    let root = Item::Type(TypeDef::Contract(contract));
+347    let mut graph = DepGraph::from_edges(
+348        field_types
+349            .iter()
+350            .map(|item| (root, *item, DepLocality::Local)),
+351    );
+352
+353    for item in field_types {
+354        if let Some(subgraph) = item.dependency_graph(db) {
+355            graph.extend(subgraph.all_edges())
+356        }
+357    }
+358    DepGraphWrapper(Rc::new(graph))
+359}
+360
+361pub fn contract_dependency_graph_cycle(
+362    _db: &dyn AnalyzerDb,
+363    _cycle: &[String],
+364    _contract: &ContractId,
+365) -> DepGraphWrapper {
+366    DepGraphWrapper(Rc::new(DepGraph::new()))
+367}
+368
+369pub fn contract_runtime_dependency_graph(
+370    db: &dyn AnalyzerDb,
+371    contract: ContractId,
+372) -> DepGraphWrapper {
+373    // This is the dependency graph of the (as yet imaginary) `__call__` function,
+374    // which dispatches to the contract's public functions. This should be used
+375    // when compiling the runtime object for a contract.
+376
+377    let root = Item::Type(TypeDef::Contract(contract));
+378    let root_fns = if let Some(call_id) = contract.call_function(db) {
+379        vec![call_id]
+380    } else {
+381        contract.public_functions(db).values().copied().collect()
+382    }
+383    .into_iter()
+384    .map(|fun| (root, Item::Function(fun), DepLocality::Local))
+385    .collect::<Vec<_>>();
+386
+387    let mut graph = DepGraph::from_edges(root_fns.iter());
+388
+389    for (_, item, _) in root_fns {
+390        if let Some(subgraph) = item.dependency_graph(db) {
+391            graph.extend(subgraph.all_edges())
+392        }
+393    }
+394    DepGraphWrapper(Rc::new(graph))
+395}
+396
+397pub fn contract_runtime_dependency_graph_cycle(
+398    _db: &dyn AnalyzerDb,
+399    _cycle: &[String],
+400    _contract: &ContractId,
+401) -> DepGraphWrapper {
+402    DepGraphWrapper(Rc::new(DepGraph::new()))
+403}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/enums.rs.html b/compiler-docs/src/fe_analyzer/db/queries/enums.rs.html new file mode 100644 index 0000000000..0663a06d24 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/enums.rs.html @@ -0,0 +1,241 @@ +enums.rs - source

fe_analyzer/db/queries/
enums.rs

1use std::{rc::Rc, str::FromStr};
+2
+3use fe_parser::ast;
+4use indexmap::{map::Entry, IndexMap};
+5use smallvec::SmallVec;
+6use smol_str::SmolStr;
+7
+8use crate::{
+9    builtins,
+10    context::{Analysis, AnalyzerContext},
+11    errors::TypeError,
+12    namespace::{
+13        items::{
+14            self, DepGraph, DepGraphWrapper, DepLocality, EnumId, EnumVariant, EnumVariantId,
+15            EnumVariantKind, FunctionId, Item, TypeDef,
+16        },
+17        scopes::ItemScope,
+18        types::Type,
+19    },
+20    traversal::types::type_desc,
+21    AnalyzerDb,
+22};
+23
+24pub fn enum_all_variants(db: &dyn AnalyzerDb, enum_: EnumId) -> Rc<[EnumVariantId]> {
+25    enum_
+26        .data(db)
+27        .ast
+28        .kind
+29        .variants
+30        .iter()
+31        .enumerate()
+32        .map(|(tag, variant)| {
+33            db.intern_enum_variant(Rc::new(EnumVariant {
+34                ast: variant.clone(),
+35                tag,
+36                parent: enum_,
+37            }))
+38        })
+39        .collect()
+40}
+41
+42pub fn enum_variant_map(
+43    db: &dyn AnalyzerDb,
+44    enum_: EnumId,
+45) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>> {
+46    let scope = ItemScope::new(db, enum_.module(db));
+47    let mut variants = IndexMap::<SmolStr, EnumVariantId>::new();
+48
+49    for &variant in db.enum_all_variants(enum_).iter() {
+50        let variant_name = variant.name(db);
+51
+52        match variants.entry(variant_name) {
+53            Entry::Occupied(entry) => {
+54                scope.duplicate_name_error(
+55                    &format!("duplicate variant names in `enum {}`", enum_.name(db)),
+56                    entry.key(),
+57                    entry.get().data(db).ast.span,
+58                    variant.span(db),
+59                );
+60            }
+61
+62            Entry::Vacant(entry) => {
+63                entry.insert(variant);
+64            }
+65        }
+66    }
+67
+68    Analysis::new(Rc::new(variants), scope.diagnostics.take().into())
+69}
+70
+71pub fn enum_variant_kind(
+72    db: &dyn AnalyzerDb,
+73    variant: EnumVariantId,
+74) -> Analysis<Result<EnumVariantKind, TypeError>> {
+75    let variant_data = variant.data(db);
+76    let mut scope = ItemScope::new(db, variant_data.parent.module(db));
+77    let self_ty = Some(variant.parent(db).as_type(db).as_trait_or_type());
+78    let kind = match &variant_data.ast.kind.kind {
+79        ast::VariantKind::Unit => Ok(EnumVariantKind::Unit),
+80        ast::VariantKind::Tuple(tuple) => {
+81            let elem_tys: Result<SmallVec<[_; 4]>, _> = tuple
+82                .iter()
+83                .map(
+84                    |ast_ty| match type_desc(&mut scope, ast_ty, self_ty.clone()) {
+85                        Ok(ty) if ty.has_fixed_size(db) => Ok(ty),
+86                        Ok(_) => Err(TypeError::new(scope.error(
+87                            "enum variant type must have a fixed size",
+88                            variant_data.ast.span,
+89                            "this can't be used as an struct field",
+90                        ))),
+91                        Err(err) => Err(err),
+92                    },
+93                )
+94                .collect();
+95            elem_tys.map(EnumVariantKind::Tuple)
+96        }
+97    };
+98
+99    Analysis::new(kind, scope.diagnostics.take().into())
+100}
+101
+102pub fn enum_all_functions(db: &dyn AnalyzerDb, enum_: EnumId) -> Rc<[FunctionId]> {
+103    let enum_data = enum_.data(db);
+104    enum_data
+105        .ast
+106        .kind
+107        .functions
+108        .iter()
+109        .map(|node| {
+110            db.intern_function(Rc::new(items::Function::new(
+111                db,
+112                node,
+113                Some(Item::Type(TypeDef::Enum(enum_))),
+114                enum_data.module,
+115            )))
+116        })
+117        .collect()
+118}
+119
+120pub fn enum_function_map(
+121    db: &dyn AnalyzerDb,
+122    enum_: EnumId,
+123) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+124    let scope = ItemScope::new(db, enum_.module(db));
+125    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+126    let variant_map = enum_.variants(db);
+127
+128    for func in db.enum_all_functions(enum_).iter() {
+129        let def = &func.data(db).ast;
+130        let def_name = def.name();
+131
+132        if let Ok(Some(named_item)) = scope.resolve_name(def_name, func.name_span(db)) {
+133            scope.name_conflict_error(
+134                "function",
+135                def_name,
+136                &named_item,
+137                named_item.name_span(db),
+138                func.name_span(db),
+139            );
+140            continue;
+141        }
+142
+143        if builtins::ValueMethod::from_str(def_name).is_ok() {
+144            scope.error(
+145                &format!("function name `{def_name}` conflicts with built-in function"),
+146                func.name_span(db),
+147                &format!("`{def_name}` is a built-in function"),
+148            );
+149            continue;
+150        }
+151
+152        match map.entry(def_name.into()) {
+153            Entry::Occupied(entry) => {
+154                scope.duplicate_name_error(
+155                    &format!("duplicate function names in `struct {}`", enum_.name(db)),
+156                    entry.key(),
+157                    entry.get().data(db).ast.span,
+158                    def.span,
+159                );
+160            }
+161
+162            Entry::Vacant(entry) => {
+163                if let Some(variant) = variant_map.get(def_name) {
+164                    scope.duplicate_name_error(
+165                        &format!("function name `{def_name}` conflicts with enum variant"),
+166                        def_name,
+167                        variant.span(db),
+168                        func.name_span(db),
+169                    );
+170                    continue;
+171                }
+172                entry.insert(*func);
+173            }
+174        }
+175    }
+176    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+177}
+178
+179pub fn enum_dependency_graph(db: &dyn AnalyzerDb, enum_: EnumId) -> Analysis<DepGraphWrapper> {
+180    let scope = ItemScope::new(db, enum_.module(db));
+181    let root = Item::Type(TypeDef::Enum(enum_));
+182    let mut edges = vec![];
+183
+184    for variant in enum_.variants(db).values() {
+185        match variant.kind(db) {
+186            Ok(EnumVariantKind::Unit) | Err(_) => {}
+187            Ok(EnumVariantKind::Tuple(elts)) => {
+188                for ty in elts {
+189                    let edge = match ty.typ(db) {
+190                        Type::Contract(id) => (
+191                            root,
+192                            Item::Type(TypeDef::Contract(id)),
+193                            DepLocality::External,
+194                        ),
+195
+196                        Type::Struct(id) => {
+197                            (root, Item::Type(TypeDef::Struct(id)), DepLocality::Local)
+198                        }
+199
+200                        Type::Enum(id) => (root, Item::Type(TypeDef::Enum(id)), DepLocality::Local),
+201
+202                        _ => continue,
+203                    };
+204                    edges.push(edge);
+205                }
+206            }
+207        }
+208    }
+209
+210    let mut graph = DepGraph::from_edges(edges.iter());
+211    for (_, item, _) in edges {
+212        if let Some(subgraph) = item.dependency_graph(db) {
+213            graph.extend(subgraph.all_edges())
+214        }
+215    }
+216
+217    Analysis::new(
+218        DepGraphWrapper(Rc::new(graph)),
+219        scope.diagnostics.take().into(),
+220    )
+221}
+222
+223pub fn enum_cycle(
+224    db: &dyn AnalyzerDb,
+225    _cycle: &[String],
+226    enum_: &EnumId,
+227) -> Analysis<DepGraphWrapper> {
+228    let scope = ItemScope::new(db, enum_.module(db));
+229    let enum_name = enum_.name(db);
+230    let enum_span = enum_.span(db);
+231    scope.error(
+232        &format!("recursive enum `{enum_name}`"),
+233        enum_span,
+234        &format!("enum `{enum_name}` has infinite size due to recursive definition",),
+235    );
+236
+237    Analysis::new(
+238        DepGraphWrapper(Rc::new(DepGraph::new())),
+239        scope.diagnostics.take().into(),
+240    )
+241}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/functions.rs.html b/compiler-docs/src/fe_analyzer/db/queries/functions.rs.html new file mode 100644 index 0000000000..9bec67e4fa --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/functions.rs.html @@ -0,0 +1,501 @@ +functions.rs - source

fe_analyzer/db/queries/
functions.rs

1use crate::context::{AnalyzerContext, CallType, FunctionBody};
+2use crate::db::{Analysis, AnalyzerDb};
+3use crate::display::Displayable;
+4use crate::errors::TypeError;
+5use crate::namespace::items::{
+6    DepGraph, DepGraphWrapper, DepLocality, FunctionId, FunctionSigId, Item, TypeDef,
+7};
+8use crate::namespace::scopes::{BlockScope, BlockScopeType, FunctionScope, ItemScope};
+9use crate::namespace::types::{self, CtxDecl, Generic, SelfDecl, Type, TypeId};
+10use crate::traversal::functions::traverse_statements;
+11use crate::traversal::types::{type_desc, type_desc_to_trait};
+12use fe_common::diagnostics::Label;
+13use fe_parser::ast::{self, GenericParameter};
+14use fe_parser::node::Node;
+15use if_chain::if_chain;
+16use smol_str::SmolStr;
+17use std::collections::HashMap;
+18use std::rc::Rc;
+19
+20/// Gather context information for a function definition and check for type
+21/// errors. Does not inspect the function body.
+22pub fn function_signature(
+23    db: &dyn AnalyzerDb,
+24    function: FunctionSigId,
+25) -> Analysis<Rc<types::FunctionSignature>> {
+26    let def = &function.data(db).ast;
+27
+28    let mut scope = ItemScope::new(db, function.module(db));
+29    let fn_parent = function.parent(db);
+30
+31    let mut self_decl = None;
+32    let mut ctx_decl = None;
+33    let mut names = HashMap::new();
+34    let mut labels = HashMap::new();
+35
+36    let sig_ast = &function.data(db).ast.kind;
+37    sig_ast.generic_params.kind.iter().fold(
+38        HashMap::<SmolStr, Node<_>>::new(),
+39        |mut accum, param| {
+40            if let Some(previous) = accum.get(&param.name()) {
+41                scope.duplicate_name_error(
+42                    "duplicate generic parameter",
+43                    &param.name(),
+44                    previous.span,
+45                    param.name_node().span,
+46                );
+47            } else {
+48                accum.insert(param.name(), param.name_node());
+49            };
+50
+51            accum
+52        },
+53    );
+54
+55    if !matches!(fn_parent, Item::Type(TypeDef::Struct(_))) && function.is_generic(db) {
+56        scope.fancy_error(
+57            "generic function parameters aren't yet supported outside of struct functions",
+58            vec![Label::primary(
+59                function.data(db).ast.kind.generic_params.span,
+60                "this cannot appear here",
+61            )],
+62            vec!["Hint: Struct functions can have generic parameters".into()],
+63        );
+64    }
+65
+66    if function.is_generic(db) {
+67        for param in function.data(db).ast.kind.generic_params.kind.iter() {
+68            if let GenericParameter::Unbounded(val) = param {
+69                scope.fancy_error(
+70                    "unbounded generic parameters aren't yet supported",
+71                    vec![Label::primary(
+72                        val.span,
+73                        format!("`{}` needs to be bound by some trait", val.kind),
+74                    )],
+75                    vec![format!(
+76                        "Hint: Change `{}` to `{}: SomeTrait`",
+77                        val.kind, val.kind
+78                    )],
+79                );
+80            }
+81        }
+82    }
+83
+84    let params = def
+85        .kind
+86        .args
+87        .iter()
+88        .enumerate()
+89        .filter_map(|(index, arg)| match &arg.kind {
+90            ast::FunctionArg::Self_ { mut_ }=> {
+91                if matches!(fn_parent, Item::Module(_)) {
+92                    scope.error(
+93                        "`self` can only be used in contract, struct, trait or impl functions",
+94                        arg.span,
+95                        "not allowed in functions defined directly in a module",
+96                    );
+97                } else {
+98                    self_decl = Some(SelfDecl { span: arg.span, mut_: *mut_ });
+99                    if index != 0 {
+100                        scope.error(
+101                            "`self` is not the first parameter",
+102                            arg.span,
+103                            "`self` may only be used as the first parameter",
+104                        );
+105                    }
+106                }
+107                None
+108            }
+109            ast::FunctionArg::Regular { mut_, label, name, typ: typedesc } => {
+110                let typ = resolve_function_param_type(db, function, &mut scope, typedesc).and_then(|typ| match typ {
+111                    typ if typ.has_fixed_size(db) => {
+112                        if let Some(mut_span) = mut_ {
+113                            if typ.is_primitive(db) {
+114                                Err(TypeError::new(scope.error(
+115                                    "primitive type function parameters cannot be `mut`",
+116                                    *mut_span + typedesc.span,
+117                                    &format!("`{}` type can't be used as a `mut` function parameter",
+118                                             typ.display(db)))))
+119                            } else {
+120                                Ok(Type::Mut(typ).id(db))
+121                            }
+122                        } else {
+123                            Ok(typ)
+124                        }
+125                    }
+126                    _ => Err(TypeError::new(scope.error(
+127                        "function parameter types must have fixed size",
+128                        typedesc.span,
+129                        &format!("`{}` type can't be used as a function parameter", typ.display(db)),
+130                    ))),
+131                });
+132
+133                if let Some(context_type) = scope.get_context_type() {
+134                    if arg.name() == "ctx" &&  typ.as_ref().map(|val| val.deref(db)) != Ok(context_type) {
+135                        scope.error(
+136                            "`ctx` is reserved for instances of `Context`",
+137                            arg.span,
+138                            "`ctx` must be an instance of `Context`",
+139                        );
+140                    };
+141
+142                    if typ.as_ref().map(|val| val.deref(db)) == Ok(context_type) {
+143                        if arg.name() != "ctx" {
+144                            scope.error(
+145                                "invalid `Context` instance name",
+146                                arg.span,
+147                                "instances of `Context` must be named `ctx`",
+148                            );
+149                        } else if self_decl.is_some() && index != 1 {
+150                            scope.error(
+151                                "invalid parameter order",
+152                                arg.span,
+153                                "`ctx: Context` must be placed after the `self` parameter",
+154                            );
+155                        } else if self_decl.is_none() && index != 0 {
+156                            scope.error(
+157                                "invalid parameter order",
+158                                arg.span,
+159                                "`ctx: Context` must be the first parameter",
+160                            );
+161                        }
+162                        else {
+163                            ctx_decl = Some(CtxDecl {span: arg.span,  mut_: *mut_})
+164                        }
+165                    }
+166                }
+167
+168                if let Some(label) = &label {
+169                    if_chain! {
+170                        if label.kind != "_";
+171                        if let Some(dup_idx) = labels.get(&label.kind);
+172                        then {
+173                            let dup_arg: &Node<ast::FunctionArg> = &def.kind.args[*dup_idx];
+174                            scope.fancy_error(
+175                                &format!("duplicate parameter labels in function `{}`", def.kind.name.kind),
+176                                vec![
+177                                    Label::primary(dup_arg.span, "the label `{}` was first used here"),
+178                                    Label::primary(label.span, "label `{}` used again here"),
+179                                ], vec![]);
+180                            return None;
+181                        } else {
+182                            labels.insert(&label.kind, index);
+183                        }
+184                    }
+185                }
+186
+187                if let Ok(Some(named_item)) = scope.resolve_name(&name.kind, name.span) {
+188                    scope.name_conflict_error(
+189                        "function parameter",
+190                        &name.kind,
+191                        &named_item,
+192                        named_item.name_span(db),
+193                        name.span,
+194                    );
+195                    None
+196                } else if let Some(dup_idx) = names.get(&name.kind) {
+197                    let dup_arg: &Node<ast::FunctionArg> = &def.kind.args[*dup_idx];
+198                    scope.duplicate_name_error(
+199                        &format!("duplicate parameter names in function `{}`", function.name(db)),
+200                        &name.kind,
+201                        dup_arg.span,
+202                        arg.span,
+203                    );
+204                    None
+205                } else {
+206                    names.insert(&name.kind, index);
+207
+208                    Some(types::FunctionParam::new(
+209                        label.as_ref().map(|s| s.kind.as_str()),
+210                        &name.kind,
+211                        typ,
+212                    ))
+213                }
+214            }
+215        })
+216        .collect();
+217
+218    let return_type = def
+219        .kind
+220        .return_type
+221        .as_ref()
+222        .map(|type_node| {
+223            let fn_name = &function.name(db);
+224            if fn_name == "__init__" || fn_name == "__call__" {
+225                // `__init__` and `__call__` must not return any type other than `()`.
+226                if type_node.kind != ast::TypeDesc::Unit {
+227                    scope.fancy_error(
+228                        &format!("`{fn_name}` function has incorrect return type"),
+229                        vec![Label::primary(type_node.span, "return type should be `()`")],
+230                        vec![
+231                            "Hint: Remove the return type specification.".to_string(),
+232                            format!("Example: `pub fn {fn_name}():`"),
+233                        ],
+234                    );
+235                }
+236                Ok(TypeId::unit(scope.db()))
+237            } else {
+238                let self_ty = match function.parent(db) {
+239                    Item::Trait(id) => Some(id.as_trait_or_type()),
+240                    _ => function.self_type(db).map(|ty| ty.as_trait_or_type()),
+241                };
+242
+243                match type_desc(&mut scope, type_node, self_ty)? {
+244                    typ if typ.has_fixed_size(scope.db()) => Ok(typ),
+245                    _ => Err(TypeError::new(scope.error(
+246                        "function return type must have a fixed size",
+247                        type_node.span,
+248                        "this can't be returned from a function",
+249                    ))),
+250                }
+251            }
+252        })
+253        .unwrap_or_else(|| Ok(TypeId::unit(db)));
+254
+255    Analysis {
+256        value: Rc::new(types::FunctionSignature {
+257            self_decl,
+258            ctx_decl,
+259            params,
+260            return_type,
+261        }),
+262        diagnostics: scope.diagnostics.take().into(),
+263    }
+264}
+265
+266fn resolve_function_param_type(
+267    db: &dyn AnalyzerDb,
+268    function: FunctionSigId,
+269    context: &mut dyn AnalyzerContext,
+270    desc: &Node<ast::TypeDesc>,
+271) -> Result<TypeId, TypeError> {
+272    // First check if the param type is a local generic of the function. This won't
+273    // hold when in the future generics can appear on the contract, struct or
+274    // module level but it could be good enough for now.
+275    if let ast::TypeDesc::Base { base } = &desc.kind {
+276        if let Some(val) = function.generic_param(db, base) {
+277            let bounds = match val {
+278                ast::GenericParameter::Unbounded(_) => vec![].into(),
+279                ast::GenericParameter::Bounded { bound, .. } => {
+280                    vec![type_desc_to_trait(context, &bound)?].into()
+281                }
+282            };
+283
+284            return Ok(db.intern_type(Type::Generic(Generic {
+285                name: base.clone(),
+286                bounds,
+287            })));
+288        }
+289    }
+290
+291    let self_ty = if let Item::Trait(id) = function.parent(db) {
+292        Some(id.as_trait_or_type())
+293    } else {
+294        function.self_type(db).map(|ty| ty.as_trait_or_type())
+295    };
+296
+297    type_desc(context, desc, self_ty)
+298}
+299
+300/// Gather context information for a function body and check for type errors.
+301pub fn function_body(db: &dyn AnalyzerDb, function: FunctionId) -> Analysis<Rc<FunctionBody>> {
+302    let def = &function.data(db).ast.kind;
+303    let scope = FunctionScope::new(db, function);
+304
+305    // If the return type is unit, explicit return or no return (implicit) is valid,
+306    // so no scanning is necessary.
+307    // If the return type is anything else, we need to ensure that all code paths
+308    // return or revert.
+309    if let Ok(return_type) = &function.signature(db).return_type {
+310        if !return_type.typ(db).is_unit() && !all_paths_return_or_revert(&def.body) {
+311            scope.fancy_error(
+312                "function body is missing a return or revert statement",
+313                vec![
+314                    Label::primary(
+315                        function.name_span(db),
+316                        "all paths of this function must `return` or `revert`",
+317                    ),
+318                    Label::secondary(
+319                        def.sig.kind.return_type.as_ref().unwrap().span,
+320                        format!("expected function to return `{}`", return_type.display(db)),
+321                    ),
+322                ],
+323                vec![],
+324            );
+325        }
+326    }
+327
+328    let mut block_scope = BlockScope::new(
+329        &scope,
+330        if function.is_unsafe(db) {
+331            BlockScopeType::Unsafe
+332        } else {
+333            BlockScopeType::Function
+334        },
+335    );
+336
+337    // If `traverse_statements` fails, we can be confident that a diagnostic
+338    // has been emitted, either while analyzing this fn body or while analyzing
+339    // a type or fn used in this fn body, because of the `DiagnosticVoucher`
+340    // system. (See the definition of `FatalError`)
+341    let _ = traverse_statements(&mut block_scope, &def.body);
+342    Analysis {
+343        value: Rc::new(scope.body.into_inner()),
+344        diagnostics: scope.diagnostics.into_inner().into(),
+345    }
+346}
+347
+348fn all_paths_return_or_revert(block: &[Node<ast::FuncStmt>]) -> bool {
+349    for statement in block.iter().rev() {
+350        match &statement.kind {
+351            ast::FuncStmt::Return { .. } | ast::FuncStmt::Revert { .. } => return true,
+352            ast::FuncStmt::If {
+353                test: _,
+354                body,
+355                or_else,
+356            } => {
+357                let body_returns = all_paths_return_or_revert(body);
+358                let or_else_returns = all_paths_return_or_revert(or_else);
+359                if body_returns && or_else_returns {
+360                    return true;
+361                }
+362            }
+363
+364            ast::FuncStmt::Match { arms, .. } => {
+365                return arms
+366                    .iter()
+367                    .all(|arm| all_paths_return_or_revert(&arm.kind.body));
+368            }
+369
+370            ast::FuncStmt::Unsafe(body) => {
+371                if all_paths_return_or_revert(body) {
+372                    return true;
+373                }
+374            }
+375            _ => {}
+376        }
+377    }
+378
+379    false
+380}
+381
+382pub fn function_dependency_graph(db: &dyn AnalyzerDb, function: FunctionId) -> DepGraphWrapper {
+383    let root = Item::Function(function);
+384
+385    // Edges to direct dependencies.
+386    let mut directs = vec![];
+387
+388    let sig = function.signature(db);
+389    directs.extend(
+390        sig.return_type
+391            .clone()
+392            .into_iter()
+393            .chain(sig.params.iter().filter_map(|param| param.typ.clone().ok()))
+394            .filter_map(|id| match id.typ(db) {
+395                Type::Contract(id) => {
+396                    // Contract types that are taken as (non-self) args or returned are "external",
+397                    // meaning that they're addresses of other contracts, so we don't have direct
+398                    // access to their fields, etc.
+399                    Some((
+400                        root,
+401                        Item::Type(TypeDef::Contract(id)),
+402                        DepLocality::External,
+403                    ))
+404                }
+405                Type::Struct(id) => {
+406                    Some((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local))
+407                }
+408                _ => None,
+409            }),
+410    );
+411    // A function that takes `self` depends on the type of `self`, so that any
+412    // relevant struct getters/setters are included when compiling.
+413    if !function.sig(db).is_module_fn(db) {
+414        directs.push((root, function.parent(db), DepLocality::Local));
+415    }
+416
+417    let body = function.body(db);
+418    for calltype in body.calls.values() {
+419        match calltype {
+420            CallType::Pure(function) | CallType::AssociatedFunction { function, .. } => {
+421                directs.push((root, Item::Function(*function), DepLocality::Local));
+422            }
+423            CallType::ValueMethod { method, .. } => {
+424                directs.push((root, Item::Function(*method), DepLocality::Local));
+425            }
+426            CallType::TraitValueMethod { trait_id, .. } => {
+427                directs.push((root, Item::Trait(*trait_id), DepLocality::Local));
+428            }
+429            CallType::External { contract, function } => {
+430                directs.push((root, Item::Function(*function), DepLocality::External));
+431                // Probably redundant:
+432                directs.push((
+433                    root,
+434                    Item::Type(TypeDef::Contract(*contract)),
+435                    DepLocality::External,
+436                ));
+437            }
+438            CallType::TypeConstructor(type_id) => match type_id.typ(db) {
+439                Type::Struct(id) => {
+440                    directs.push((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local))
+441                }
+442                Type::Contract(id) => directs.push((
+443                    root,
+444                    Item::Type(TypeDef::Contract(id)),
+445                    DepLocality::External,
+446                )),
+447                _ => {}
+448            },
+449            CallType::EnumConstructor(variant) => directs.push((
+450                root,
+451                Item::Type(TypeDef::Enum(variant.parent(db))),
+452                DepLocality::Local,
+453            )),
+454            CallType::BuiltinAssociatedFunction { contract, .. } => {
+455                // create/create2 call. The contract type is "external" for dependency graph
+456                // purposes.
+457                directs.push((
+458                    root,
+459                    Item::Type(TypeDef::Contract(*contract)),
+460                    DepLocality::External,
+461                ));
+462            }
+463            // Builtin functions aren't part of the dependency graph yet.
+464            CallType::BuiltinFunction(_)
+465            | CallType::Intrinsic(_)
+466            | CallType::BuiltinValueMethod { .. } => {}
+467        }
+468    }
+469
+470    directs.extend(
+471        body.var_types
+472            .values()
+473            .filter_map(|typid| match typid.typ(db) {
+474                Type::Contract(id) => Some((
+475                    root,
+476                    Item::Type(TypeDef::Contract(id)),
+477                    DepLocality::External,
+478                )),
+479                Type::Struct(id) => {
+480                    Some((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local))
+481                }
+482                _ => None,
+483            }),
+484    );
+485
+486    let mut graph = DepGraph::from_edges(directs.iter());
+487    for (_, item, _) in directs {
+488        if let Some(subgraph) = item.dependency_graph(db) {
+489            graph.extend(subgraph.all_edges())
+490        }
+491    }
+492    DepGraphWrapper(Rc::new(graph))
+493}
+494
+495pub fn function_dependency_graph_cycle(
+496    _db: &dyn AnalyzerDb,
+497    _cycle: &[String],
+498    _function: &FunctionId,
+499) -> DepGraphWrapper {
+500    DepGraphWrapper(Rc::new(DepGraph::new()))
+501}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/impls.rs.html b/compiler-docs/src/fe_analyzer/db/queries/impls.rs.html new file mode 100644 index 0000000000..fc5c410f87 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/impls.rs.html @@ -0,0 +1,54 @@ +impls.rs - source

fe_analyzer/db/queries/
impls.rs

1use indexmap::map::Entry;
+2use indexmap::IndexMap;
+3use smol_str::SmolStr;
+4
+5use crate::context::{Analysis, AnalyzerContext};
+6use crate::namespace::items::{Function, FunctionId, ImplId, Item};
+7use crate::namespace::scopes::ItemScope;
+8use crate::AnalyzerDb;
+9use std::rc::Rc;
+10
+11pub fn impl_all_functions(db: &dyn AnalyzerDb, impl_: ImplId) -> Rc<[FunctionId]> {
+12    let impl_data = impl_.data(db);
+13    impl_data
+14        .ast
+15        .kind
+16        .functions
+17        .iter()
+18        .map(|node| {
+19            db.intern_function(Rc::new(Function::new(
+20                db,
+21                node,
+22                Some(Item::Impl(impl_)),
+23                impl_data.module,
+24            )))
+25        })
+26        .collect()
+27}
+28
+29pub fn impl_function_map(
+30    db: &dyn AnalyzerDb,
+31    impl_: ImplId,
+32) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+33    let scope = ItemScope::new(db, impl_.module(db));
+34    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+35
+36    for func in db.impl_all_functions(impl_).iter() {
+37        let def_name = func.name(db);
+38
+39        match map.entry(def_name) {
+40            Entry::Occupied(entry) => {
+41                scope.duplicate_name_error(
+42                    "duplicate function names in `impl` block",
+43                    entry.key(),
+44                    entry.get().name_span(db),
+45                    func.name_span(db),
+46                );
+47            }
+48            Entry::Vacant(entry) => {
+49                entry.insert(*func);
+50            }
+51        }
+52    }
+53    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+54}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html b/compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html new file mode 100644 index 0000000000..e5e62e44bd --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html @@ -0,0 +1,83 @@ +ingots.rs - source

fe_analyzer/db/queries/
ingots.rs

1use crate::namespace::items::{IngotId, IngotMode, ModuleId, ModuleSource};
+2use crate::AnalyzerDb;
+3use fe_common::files::{SourceFileId, Utf8Path, Utf8PathBuf};
+4use indexmap::IndexSet;
+5use std::rc::Rc;
+6
+7pub fn ingot_modules(db: &dyn AnalyzerDb, ingot: IngotId) -> Rc<[ModuleId]> {
+8    let files: Vec<(SourceFileId, Rc<Utf8PathBuf>)> = db
+9        .ingot_files(ingot)
+10        .iter()
+11        .map(|f| (*f, f.path(db.upcast())))
+12        .collect();
+13
+14    // Create a module for every .fe source file.
+15    let file_mods = files
+16        .iter()
+17        .map(|(file, path)| {
+18            ModuleId::new(
+19                db,
+20                path.file_stem().unwrap(),
+21                ModuleSource::File(*file),
+22                ingot,
+23            )
+24        })
+25        .collect();
+26
+27    // We automatically build a module hierarchy that matches the directory
+28    // structure. We don't (yet?) require a .fe file for each directory like
+29    // rust does. (eg `a/b.fe` alongside `a/b/`), but we do allow it (the
+30    // module's items will be everything inside the .fe file, and the
+31    // submodules inside the dir).
+32    //
+33    // Collect the set of all directories in the file hierarchy
+34    // (after stripping the common prefix from all paths).
+35    // eg given ["src/lib.fe", "src/a/b/x.fe", "src/a/c/d/y.fe"],
+36    // the dir set is {"a", "a/b", "a/c", "a/c/d"}.
+37    let file_path_prefix = &ingot.data(db).src_dir;
+38    let dirs = files
+39        .iter()
+40        .flat_map(|(_file, path)| {
+41            path.strip_prefix(file_path_prefix.as_str())
+42                .unwrap_or(path)
+43                .ancestors()
+44                .skip(1) // first elem of .ancestors() is the path itself
+45        })
+46        .collect::<IndexSet<&Utf8Path>>();
+47
+48    let dir_mods = dirs
+49        // Skip the dirs that have an associated fe file; eg skip "a/b" if "a/b.fe" exists.
+50        .difference(
+51            &files
+52                .iter()
+53                .map(|(_file, path)| {
+54                    path.strip_prefix(file_path_prefix.as_str())
+55                        .unwrap_or(path)
+56                        .as_str()
+57                        .trim_end_matches(".fe")
+58                        .into()
+59                })
+60                .collect::<IndexSet<&Utf8Path>>(),
+61        )
+62        .filter_map(|dir| {
+63            dir.file_name()
+64                .map(|name| ModuleId::new(db, name, ModuleSource::Dir(dir.as_str().into()), ingot))
+65        })
+66        .collect::<Vec<_>>();
+67
+68    [file_mods, dir_mods].concat().into()
+69}
+70
+71pub fn ingot_root_module(db: &dyn AnalyzerDb, ingot: IngotId) -> Option<ModuleId> {
+72    let filename = match ingot.data(db).mode {
+73        IngotMode::Lib => "lib.fe",
+74        IngotMode::Main => "main.fe",
+75        IngotMode::StandaloneModule => return Some(ingot.all_modules(db)[0]),
+76    };
+77
+78    ingot
+79        .all_modules(db)
+80        .iter()
+81        .find(|modid| modid.file_path_relative_to_src_dir(db) == filename)
+82        .copied()
+83}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/module.rs.html b/compiler-docs/src/fe_analyzer/db/queries/module.rs.html new file mode 100644 index 0000000000..526c51505b --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/module.rs.html @@ -0,0 +1,762 @@ +module.rs - source

fe_analyzer/db/queries/
module.rs

1use crate::context::{Analysis, AnalyzerContext, Constant, NamedThing};
+2use crate::display::Displayable;
+3use crate::errors::{self, ConstEvalError, TypeError};
+4use crate::namespace::items::{
+5    Attribute, Contract, ContractId, Enum, Function, FunctionId, Impl, ImplId, Item,
+6    ModuleConstant, ModuleConstantId, ModuleId, ModuleSource, Struct, StructId, Trait, TraitId,
+7    TypeAlias, TypeDef,
+8};
+9use crate::namespace::scopes::ItemScope;
+10use crate::namespace::types::{self, TypeId};
+11use crate::traversal::{const_expr, expressions, types::type_desc};
+12use crate::AnalyzerDb;
+13use fe_common::diagnostics::Label;
+14use fe_common::files::Utf8Path;
+15use fe_common::Span;
+16use fe_parser::{ast, node::Node};
+17use indexmap::indexmap;
+18use indexmap::map::{Entry, IndexMap};
+19use smol_str::SmolStr;
+20use std::rc::Rc;
+21
+22pub fn module_file_path(db: &dyn AnalyzerDb, module: ModuleId) -> SmolStr {
+23    let full_path = match &module.data(db).source {
+24        ModuleSource::File(file) => file.path(db.upcast()).as_str().into(),
+25        ModuleSource::Dir(path) => path.clone(),
+26    };
+27
+28    let src_prefix = &module.ingot(db).data(db).src_dir;
+29
+30    Utf8Path::new(full_path.as_str())
+31        .strip_prefix(src_prefix.as_str())
+32        .map(|path| path.as_str().into())
+33        .unwrap_or(full_path)
+34}
+35
+36pub fn module_parse(db: &dyn AnalyzerDb, module: ModuleId) -> Analysis<Rc<ast::Module>> {
+37    let data = module.data(db);
+38    match data.source {
+39        ModuleSource::File(file) => {
+40            let (ast, diags) = fe_parser::parse_file(file, &file.content(db.upcast()));
+41            Analysis::new(ast.into(), diags.into())
+42        }
+43        ModuleSource::Dir(_) => {
+44            // Directory with no corresponding source file. Return empty ast.
+45            Analysis::new(ast::Module { body: vec![] }.into(), vec![].into())
+46        }
+47    }
+48}
+49
+50pub fn module_is_incomplete(db: &dyn AnalyzerDb, module: ModuleId) -> bool {
+51    if matches!(module.data(db).source, ModuleSource::File(_)) {
+52        let ast = module.ast(db);
+53        ast.body
+54            .last()
+55            .map(|stmt| matches!(stmt, ast::ModuleStmt::ParseError(_)))
+56            .unwrap_or(false)
+57    } else {
+58        false
+59    }
+60}
+61
+62pub fn module_all_items(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[Item]> {
+63    let body = &module.ast(db).body;
+64    body.iter()
+65        .filter_map(|stmt| match stmt {
+66            ast::ModuleStmt::TypeAlias(node) => Some(Item::Type(TypeDef::Alias(
+67                db.intern_type_alias(Rc::new(TypeAlias {
+68                    ast: node.clone(),
+69                    module,
+70                })),
+71            ))),
+72            ast::ModuleStmt::Contract(node) => Some(Item::Type(TypeDef::Contract(
+73                db.intern_contract(Rc::new(Contract {
+74                    name: node.name().into(),
+75                    ast: node.clone(),
+76                    module,
+77                })),
+78            ))),
+79            ast::ModuleStmt::Struct(node) => Some(Item::Type(TypeDef::Struct(db.intern_struct(
+80                Rc::new(Struct {
+81                    ast: node.clone(),
+82                    module,
+83                }),
+84            )))),
+85            ast::ModuleStmt::Enum(node) => {
+86                Some(Item::Type(TypeDef::Enum(db.intern_enum(Rc::new(Enum {
+87                    ast: node.clone(),
+88                    module,
+89                })))))
+90            }
+91            ast::ModuleStmt::Constant(node) => Some(Item::Constant(db.intern_module_const(
+92                Rc::new(ModuleConstant {
+93                    ast: node.clone(),
+94                    module,
+95                }),
+96            ))),
+97            ast::ModuleStmt::Function(node) => Some(Item::Function(
+98                db.intern_function(Rc::new(Function::new(db, node, None, module))),
+99            )),
+100            ast::ModuleStmt::Trait(node) => Some(Item::Trait(db.intern_trait(Rc::new(Trait {
+101                ast: node.clone(),
+102                module,
+103            })))),
+104            ast::ModuleStmt::Attribute(node) => {
+105                Some(Item::Attribute(db.intern_attribute(Rc::new(Attribute {
+106                    ast: node.clone(),
+107                    module,
+108                }))))
+109            }
+110            ast::ModuleStmt::Pragma(_) | ast::ModuleStmt::Use(_) | ast::ModuleStmt::Impl(_) => None,
+111            ast::ModuleStmt::ParseError(_) => None,
+112        })
+113        .collect()
+114}
+115
+116pub fn module_all_impls(db: &dyn AnalyzerDb, module: ModuleId) -> Analysis<Rc<[ImplId]>> {
+117    let body = &module.ast(db).body;
+118    let mut scope = ItemScope::new(db, module);
+119    let impls = body
+120        .iter()
+121        .filter_map(|stmt| match stmt {
+122            ast::ModuleStmt::Impl(impl_node) => {
+123                let treit = module
+124                    .items(db)
+125                    .get(&impl_node.kind.impl_trait.kind)
+126                    .cloned();
+127
+128                if let Ok(receiver_type) = type_desc(&mut scope, &impl_node.kind.receiver, None) {
+129                    if let Some(Item::Trait(val)) = treit {
+130                        Some(db.intern_impl(Rc::new(Impl {
+131                            trait_id: val,
+132                            receiver: receiver_type,
+133                            ast: impl_node.clone(),
+134                            module,
+135                        })))
+136                    } else {
+137                        None
+138                    }
+139                } else {
+140                    None
+141                }
+142            }
+143            _ => None,
+144        })
+145        .collect();
+146    Analysis {
+147        value: impls,
+148        diagnostics: scope.diagnostics.take().into(),
+149    }
+150}
+151
+152pub fn module_item_map(
+153    db: &dyn AnalyzerDb,
+154    module: ModuleId,
+155) -> Analysis<Rc<IndexMap<SmolStr, Item>>> {
+156    // we must check for conflicts with global item names
+157    let global_items = module.global_items(db);
+158
+159    // sub modules and used items are included in this map
+160    let submodules = module
+161        .submodules(db)
+162        .iter()
+163        .map(|id| (id.name(db), Item::Module(*id)))
+164        .collect::<IndexMap<_, _>>();
+165    let used_items = db.module_used_item_map(module);
+166
+167    let mut diagnostics = used_items.diagnostics.to_vec();
+168    let mut map = IndexMap::<SmolStr, Item>::new();
+169
+170    for item in module.all_items(db).iter() {
+171        if matches!(item, Item::Attribute(_)) {
+172            continue;
+173        }
+174
+175        if let Item::Function(function) = item {
+176            let sig_ast = &function.data(db).ast.kind.sig.kind;
+177            if function.is_test(db) {
+178                if !sig_ast.generic_params.kind.is_empty() {
+179                    diagnostics.push(errors::fancy_error(
+180                        "generic parameters are not supported on test functions",
+181                        vec![Label::primary(
+182                            sig_ast.generic_params.span,
+183                            "invalid generic parameters",
+184                        )],
+185                        vec!["Hint: remove the generic parameters".into()],
+186                    ));
+187                }
+188
+189                if let Some(arg) = sig_ast.args.first() {
+190                    if arg.name() != "ctx" {
+191                        diagnostics.push(errors::fancy_error(
+192                            "function parameters other than `ctx` are not supported on test functions",
+193                            vec![Label::primary(arg.span, "invalid function parameter")],
+194                            vec!["Hint: remove the parameter".into()],
+195                        ));
+196                    }
+197                }
+198
+199                for arg in sig_ast.args.iter().skip(1) {
+200                    if arg.name() != "ctx" {
+201                        diagnostics.push(errors::fancy_error(
+202                            "function parameters other than `ctx` are not supported on test functions",
+203                            vec![Label::primary(arg.span, "invalid function parameter")],
+204                            vec!["Hint: remove the parameter".into()],
+205                        ));
+206                    }
+207                }
+208            }
+209        }
+210
+211        let item_name = item.name(db);
+212        if let Some(global_item) = global_items.get(&item_name) {
+213            let kind = item.item_kind_display_name();
+214            let other_kind = global_item.item_kind_display_name();
+215            diagnostics.push(errors::error(
+216                format!("{kind} name conflicts with the {other_kind} named \"{item_name}\""),
+217                item.name_span(db)
+218                    .expect("user defined item is missing a name span"),
+219                format!("`{item_name}` is already defined"),
+220            ));
+221            continue;
+222        }
+223
+224        if let Some((used_item_name_span, used_item)) = used_items.value.get(&item_name) {
+225            diagnostics.push(errors::duplicate_name_error(
+226                &format!(
+227                    "a {} with the same name has already been imported",
+228                    used_item.item_kind_display_name()
+229                ),
+230                &item.name(db),
+231                *used_item_name_span,
+232                item.name_span(db).expect("missing name span"),
+233            ));
+234            continue;
+235        }
+236
+237        match map.entry(item_name.clone()) {
+238            Entry::Occupied(entry) => {
+239                if let Some(entry_name_span) = entry.get().name_span(db) {
+240                    diagnostics.push(errors::duplicate_name_error(
+241                        &format!(
+242                            "a {} named \"{}\" has already been defined",
+243                            entry.get().item_kind_display_name(),
+244                            item_name
+245                        ),
+246                        &item_name,
+247                        entry_name_span,
+248                        item.name_span(db)
+249                            .expect("used-defined item does not have name span"),
+250                    ));
+251                } else {
+252                    diagnostics.push(errors::fancy_error(
+253                        format!(
+254                            "a {} named \"{}\" has already been defined",
+255                            entry.get().item_kind_display_name(),
+256                            item_name
+257                        ),
+258                        vec![Label::primary(
+259                            item.name_span(db)
+260                                .expect("used-defined item does not have name span"),
+261                            format!("`{}` redefined here", entry.key()),
+262                        )],
+263                        vec![],
+264                    ));
+265                }
+266            }
+267            Entry::Vacant(entry) => {
+268                entry.insert(*item);
+269            }
+270        }
+271    }
+272    Analysis::new(
+273        map.into_iter()
+274            .chain(submodules)
+275            .chain(
+276                used_items
+277                    .value
+278                    .iter()
+279                    .map(|(name, (_, item))| (name.clone(), *item)),
+280            )
+281            .collect::<IndexMap<_, _>>()
+282            .into(),
+283        diagnostics.into(),
+284    )
+285}
+286
+287pub fn module_impl_map(
+288    db: &dyn AnalyzerDb,
+289    module: ModuleId,
+290) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>> {
+291    let scope = ItemScope::new(db, module);
+292    let mut map = IndexMap::<(TraitId, TypeId), ImplId>::new();
+293
+294    let module_all_impls = db.module_all_impls(module);
+295    for impl_ in module_all_impls.value.iter() {
+296        let key = &(impl_.trait_id(db), impl_.receiver(db));
+297
+298        match map.entry(*key) {
+299            Entry::Occupied(entry) => {
+300                scope.duplicate_name_error(
+301                    &format!(
+302                        "duplicate `impl` blocks for trait `{}` for type `{}`",
+303                        key.0.name(db),
+304                        key.1.display(db)
+305                    ),
+306                    "",
+307                    entry.get().ast(db).span,
+308                    impl_.ast(db).span,
+309                );
+310            }
+311            Entry::Vacant(entry) => {
+312                entry.insert(*impl_);
+313            }
+314        }
+315    }
+316
+317    Analysis::new(
+318        Rc::new(map),
+319        [
+320            module_all_impls.diagnostics,
+321            scope.diagnostics.take().into(),
+322        ]
+323        .concat()
+324        .into(),
+325    )
+326}
+327
+328pub fn module_contracts(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[ContractId]> {
+329    module
+330        .all_items(db)
+331        .iter()
+332        .filter_map(|item| match item {
+333            Item::Type(TypeDef::Contract(id)) => Some(*id),
+334            _ => None,
+335        })
+336        .collect()
+337}
+338
+339pub fn module_structs(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[StructId]> {
+340    module
+341        .all_items(db)
+342        .iter()
+343        .chain(module.used_items(db).values().map(|(_, item)| item))
+344        .filter_map(|item| match item {
+345            Item::Type(TypeDef::Struct(id)) => Some(*id),
+346            _ => None,
+347        })
+348        .collect()
+349}
+350
+351pub fn module_constants(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<Vec<ModuleConstantId>> {
+352    Rc::new(
+353        module
+354            .all_items(db)
+355            .iter()
+356            .filter_map(|item| match item {
+357                Item::Constant(id) => Some(*id),
+358                _ => None,
+359            })
+360            .collect(),
+361    )
+362}
+363
+364pub fn module_constant_type(
+365    db: &dyn AnalyzerDb,
+366    constant: ModuleConstantId,
+367) -> Analysis<Result<types::TypeId, TypeError>> {
+368    let constant_data = constant.data(db);
+369    let mut scope = ItemScope::new(db, constant.data(db).module);
+370    let typ = type_desc(&mut scope, &constant_data.ast.kind.typ, None);
+371
+372    match &typ {
+373        Ok(typ) if !typ.is_primitive(db) => {
+374            scope.error(
+375                "Non-primitive types not yet supported for constants",
+376                constant.data(db).ast.kind.typ.span,
+377                &format!(
+378                    "this has type `{}`; expected a primitive type",
+379                    typ.display(db)
+380                ),
+381            );
+382        }
+383        Ok(typ) => {
+384            if let Ok(expr_attr) =
+385                expressions::expr(&mut scope, &constant_data.ast.kind.value, Some(*typ))
+386            {
+387                if typ != &expr_attr.typ {
+388                    scope.type_error(
+389                        "type mismatch",
+390                        constant_data.ast.kind.value.span,
+391                        *typ,
+392                        expr_attr.typ,
+393                    );
+394                }
+395            }
+396        }
+397        _ => {}
+398    }
+399
+400    Analysis::new(typ, scope.diagnostics.take().into())
+401}
+402
+403pub fn module_constant_type_cycle(
+404    db: &dyn AnalyzerDb,
+405    _cycle: &[String],
+406    constant: &ModuleConstantId,
+407) -> Analysis<Result<TypeId, TypeError>> {
+408    let context = ItemScope::new(db, constant.data(db).module);
+409    let err = Err(TypeError::new(context.error(
+410        "recursive constant value definition",
+411        constant.data(db).ast.span,
+412        "",
+413    )));
+414
+415    Analysis {
+416        value: err,
+417        diagnostics: context.diagnostics.take().into(),
+418    }
+419}
+420
+421pub fn module_constant_value(
+422    db: &dyn AnalyzerDb,
+423    constant: ModuleConstantId,
+424) -> Analysis<Result<Constant, ConstEvalError>> {
+425    let constant_data = constant.data(db);
+426
+427    // Create `ItemScope` to collect expression types for constant evaluation.
+428    // TODO: Consider whether it's better to run semantic analysis twice(first
+429    // analysis is already done in `module_constant_type`) or cache expression
+430    // types in salsa.
+431    let mut scope = ItemScope::new(db, constant.data(db).module);
+432    let typ = match type_desc(&mut scope, &constant_data.ast.kind.typ, None) {
+433        Ok(typ) => typ,
+434        // No need to emit diagnostics, it's already emitted in `module_constant_type`.
+435        Err(err) => {
+436            return Analysis {
+437                value: Err(err.into()),
+438                diagnostics: vec![].into(),
+439            };
+440        }
+441    };
+442
+443    if let Err(err) = expressions::expr(&mut scope, &constant_data.ast.kind.value, Some(typ)) {
+444        // No need to emit diagnostics, it's already emitted in `module_constant_type`.
+445        return Analysis {
+446            value: Err(err.into()),
+447            diagnostics: vec![].into(),
+448        };
+449    }
+450
+451    // Clear diagnostics emitted from `module_constant_type`.
+452    scope.diagnostics.borrow_mut().clear();
+453
+454    // Perform constant evaluation.
+455    let value = const_expr::eval_expr(&mut scope, &constant_data.ast.kind.value);
+456
+457    Analysis {
+458        value,
+459        diagnostics: scope.diagnostics.take().into(),
+460    }
+461}
+462
+463pub fn module_constant_value_cycle(
+464    db: &dyn AnalyzerDb,
+465    _cycle: &[String],
+466    constant: &ModuleConstantId,
+467) -> Analysis<Result<Constant, ConstEvalError>> {
+468    let context = ItemScope::new(db, constant.data(db).module);
+469    let err = Err(ConstEvalError::new(context.error(
+470        "recursive constant value definition",
+471        constant.data(db).ast.span,
+472        "",
+473    )));
+474
+475    Analysis {
+476        value: err,
+477        diagnostics: context.diagnostics.take().into(),
+478    }
+479}
+480
+481pub fn module_used_item_map(
+482    db: &dyn AnalyzerDb,
+483    module: ModuleId,
+484) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>> {
+485    // we must check for conflicts with the global items map
+486    let global_items = module.global_items(db);
+487
+488    let mut diagnostics = vec![];
+489    let body = &module.ast(db).body;
+490
+491    let mut items = body
+492        .iter()
+493        .fold(indexmap! {}, |mut accum, stmt| {
+494            if let ast::ModuleStmt::Use(use_stmt) = stmt {
+495                let items = resolve_use_tree(db, module, &use_stmt.kind.tree, true);
+496                diagnostics.extend(items.diagnostics.iter().cloned());
+497
+498                for (name, (name_span, item)) in items.value.iter() {
+499                    if !item.is_public(db) {
+500                        diagnostics.push(errors::error(
+501                            format!("{} {} is private", item.item_kind_display_name(), name,),
+502                            *name_span,
+503                            name.as_str(),
+504                        ));
+505                    }
+506
+507                    if let Some((other_name_span, other_item)) =
+508                        accum.insert(name.clone(), (*name_span, *item))
+509                    {
+510                        diagnostics.push(errors::duplicate_name_error(
+511                            &format!(
+512                                "a {} with the same name has already been imported",
+513                                other_item.item_kind_display_name()
+514                            ),
+515                            name,
+516                            other_name_span,
+517                            *name_span,
+518                        ));
+519                    }
+520                }
+521            }
+522
+523            accum
+524        })
+525        .into_iter()
+526        .filter_map(|(name, (name_span, item))| {
+527            if let Some(global_item) = global_items.get(&name) {
+528                let other_kind = global_item.item_kind_display_name();
+529
+530                diagnostics.push(errors::error(
+531                    format!("import name conflicts with the {other_kind} named \"{name}\""),
+532                    name_span,
+533                    format!("`{name}` is already defined"),
+534                ));
+535
+536                None
+537            } else {
+538                Some((name, (name_span, item)))
+539            }
+540        })
+541        .collect::<IndexMap<_, _>>();
+542
+543    // Add `use std::prelude::*` to every module not in std
+544    if !module.is_in_std(db) {
+545        let prelude_items = resolve_use_tree(
+546            db,
+547            module,
+548            &Node::new(
+549                ast::UseTree::Glob {
+550                    prefix: ast::Path {
+551                        segments: vec![
+552                            Node::new("std".into(), Span::dummy()),
+553                            Node::new("prelude".into(), Span::dummy()),
+554                        ],
+555                    },
+556                },
+557                Span::dummy(),
+558            ),
+559            true,
+560        )
+561        .value;
+562
+563        items.extend(Rc::try_unwrap(prelude_items).unwrap());
+564    }
+565
+566    Analysis::new(Rc::new(items), diagnostics.into())
+567}
+568
+569pub fn module_parent_module(db: &dyn AnalyzerDb, module: ModuleId) -> Option<ModuleId> {
+570    module
+571        .ingot(db)
+572        .all_modules(db)
+573        .iter()
+574        .find(|&&id| id != module && id.submodules(db).iter().any(|&sub| sub == module))
+575        .copied()
+576}
+577
+578pub fn module_submodules(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[ModuleId]> {
+579    // The module tree is entirely based on the file hierarchy for now.
+580
+581    let ingot = module.ingot(db);
+582    if Some(module) == ingot.root_module(db) {
+583        ingot
+584            .all_modules(db)
+585            .iter()
+586            .copied()
+587            .filter(|&module_id| {
+588                module_id != module
+589                    && Utf8Path::new(module_id.file_path_relative_to_src_dir(db).as_str())
+590                        .components()
+591                        .take(2)
+592                        .count()
+593                        == 1
+594            })
+595            .collect()
+596    } else {
+597        let dir_path = match &module.data(db).source {
+598            ModuleSource::Dir(path) => path.as_str().into(),
+599            _ => {
+600                let file_path = module.file_path_relative_to_src_dir(db);
+601                let path = Utf8Path::new(file_path.as_str());
+602                path.parent()
+603                    .unwrap_or_else(|| Utf8Path::new(""))
+604                    .join(path.file_stem().expect("source file name with no stem"))
+605            }
+606        };
+607
+608        ingot
+609            .all_modules(db)
+610            .iter()
+611            .copied()
+612            .filter(|&module_id| {
+613                module_id != module
+614                    && Utf8Path::new(module_id.file_path_relative_to_src_dir(db).as_str())
+615                        .parent()
+616                        .unwrap_or_else(|| {
+617                            panic!(
+618                                "module file in ingot does not have parent path: `{}`",
+619                                module_id.file_path_relative_to_src_dir(db)
+620                            )
+621                        })
+622                        == dir_path
+623            })
+624            .collect()
+625    }
+626}
+627
+628/// Resolve a use tree entirely. We set internal to true if the first path item
+629/// is internal.
+630///
+631/// e.g. `foo::bar::{baz::bing}`
+632///       ---        ---
+633///        ^          ^ baz is not internal
+634///        foo is internal
+635fn resolve_use_tree(
+636    db: &dyn AnalyzerDb,
+637    module: ModuleId,
+638    tree: &Node<ast::UseTree>,
+639    internal: bool,
+640) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>> {
+641    let mut diagnostics = vec![];
+642
+643    // Again, the path resolution method we use depends on whether or not the first
+644    // item is internal.
+645    let resolve_path = |module: ModuleId, db: &dyn AnalyzerDb, path: &ast::Path| {
+646        if internal {
+647            module.resolve_path_non_used_internal(db, path)
+648        } else {
+649            module.resolve_path(db, path)
+650        }
+651    };
+652
+653    match &tree.kind {
+654        ast::UseTree::Glob { prefix } => {
+655            let prefix_module = resolve_path(module, db, prefix);
+656            diagnostics.extend(prefix_module.diagnostics.iter().cloned());
+657
+658            let items = match prefix_module.value {
+659                Some(NamedThing::Item(Item::Module(module))) => module
+660                    .items(db)
+661                    .iter()
+662                    .map(|(name, item)| (name.clone(), (tree.span, *item)))
+663                    .collect(),
+664                Some(named_thing) => {
+665                    diagnostics.push(errors::error(
+666                        format!(
+667                            "cannot glob import from {}",
+668                            named_thing.item_kind_display_name()
+669                        ),
+670                        prefix.segments.last().expect("path is empty").span,
+671                        "prefix item must be a module",
+672                    ));
+673                    indexmap! {}
+674                }
+675                None => indexmap! {},
+676            };
+677
+678            Analysis::new(items.into(), diagnostics.into())
+679        }
+680        ast::UseTree::Nested { prefix, children } => {
+681            let prefix_module = resolve_path(module, db, prefix);
+682            diagnostics.extend(prefix_module.diagnostics.iter().cloned());
+683
+684            let items = match prefix_module.value {
+685                Some(NamedThing::Item(Item::Module(module))) => {
+686                    children.iter().fold(indexmap! {}, |mut accum, node| {
+687                        let child_items = resolve_use_tree(db, module, node, false);
+688                        diagnostics.extend(child_items.diagnostics.iter().cloned());
+689
+690                        for (name, (name_span, item)) in child_items.value.iter() {
+691                            if let Some((other_name_span, other_item)) =
+692                                accum.insert(name.clone(), (*name_span, *item))
+693                            {
+694                                diagnostics.push(errors::duplicate_name_error(
+695                                    &format!(
+696                                        "a {} with the same name has already been imported",
+697                                        other_item.item_kind_display_name()
+698                                    ),
+699                                    name,
+700                                    other_name_span,
+701                                    *name_span,
+702                                ));
+703                            }
+704                        }
+705
+706                        accum
+707                    })
+708                }
+709                Some(item) => {
+710                    diagnostics.push(errors::error(
+711                        format!("cannot glob import from {}", item.item_kind_display_name()),
+712                        prefix.segments.last().unwrap().span,
+713                        "prefix item must be a module",
+714                    ));
+715                    indexmap! {}
+716                }
+717                None => indexmap! {},
+718            };
+719
+720            Analysis::new(items.into(), diagnostics.into())
+721        }
+722        ast::UseTree::Simple { path, rename } => {
+723            let item = resolve_path(module, db, path);
+724
+725            let items = match item.value {
+726                Some(NamedThing::Item(item)) => {
+727                    let (item_name, item_name_span) = if let Some(name) = rename {
+728                        (name.kind.clone(), name.span)
+729                    } else {
+730                        let name_segment_node = path.segments.last().expect("path is empty");
+731                        (name_segment_node.kind.clone(), name_segment_node.span)
+732                    };
+733
+734                    indexmap! { item_name => (item_name_span, item) }
+735                }
+736                Some(named_thing) => {
+737                    diagnostics.push(errors::error(
+738                        format!(
+739                            "cannot import non-item {}",
+740                            named_thing.item_kind_display_name(),
+741                        ),
+742                        tree.span,
+743                        format!("{} is not an item", named_thing.item_kind_display_name()),
+744                    ));
+745                    indexmap! {}
+746                }
+747                None => indexmap! {},
+748            };
+749
+750            Analysis::new(items.into(), item.diagnostics)
+751        }
+752    }
+753}
+754
+755pub fn module_tests(db: &dyn AnalyzerDb, ingot: ModuleId) -> Vec<FunctionId> {
+756    ingot
+757        .all_functions(db)
+758        .iter()
+759        .copied()
+760        .filter(|function| function.is_test(db))
+761        .collect()
+762}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/structs.rs.html b/compiler-docs/src/fe_analyzer/db/queries/structs.rs.html new file mode 100644 index 0000000000..b746dd2b3e --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/structs.rs.html @@ -0,0 +1,279 @@ +structs.rs - source

fe_analyzer/db/queries/
structs.rs

1use crate::builtins;
+2use crate::constants::MAX_INDEXED_EVENT_FIELDS;
+3use crate::context::AnalyzerContext;
+4use crate::db::Analysis;
+5use crate::errors::TypeError;
+6use crate::namespace::items::{
+7    self, DepGraph, DepGraphWrapper, DepLocality, FunctionId, Item, StructField, StructFieldId,
+8    StructId, TypeDef,
+9};
+10use crate::namespace::scopes::ItemScope;
+11use crate::namespace::types::{Type, TypeId};
+12use crate::traversal::types::type_desc;
+13use crate::AnalyzerDb;
+14use fe_common::utils::humanize::pluralize_conditionally;
+15use fe_parser::{ast, Label};
+16use indexmap::map::{Entry, IndexMap};
+17use smol_str::SmolStr;
+18use std::rc::Rc;
+19use std::str::FromStr;
+20
+21pub fn struct_all_fields(db: &dyn AnalyzerDb, struct_: StructId) -> Rc<[StructFieldId]> {
+22    struct_
+23        .data(db)
+24        .ast
+25        .kind
+26        .fields
+27        .iter()
+28        .map(|node| {
+29            db.intern_struct_field(Rc::new(StructField {
+30                ast: node.clone(),
+31                parent: struct_,
+32            }))
+33        })
+34        .collect()
+35}
+36
+37pub fn struct_field_map(
+38    db: &dyn AnalyzerDb,
+39    struct_: StructId,
+40) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>> {
+41    let scope = ItemScope::new(db, struct_.module(db));
+42    let mut fields = IndexMap::<SmolStr, StructFieldId>::new();
+43
+44    let mut indexed_count = 0;
+45    let struct_name = struct_.name(db);
+46    for field in db.struct_all_fields(struct_).iter() {
+47        let node = &field.data(db).ast;
+48
+49        if field.is_indexed(db) {
+50            indexed_count += 1;
+51        }
+52
+53        // Multiple attributes are currently still rejected by the parser so we only
+54        // need to check the name here
+55        if !field.attributes(db).is_empty() && !field.is_indexed(db) {
+56            let span = field.data(db).ast.kind.attributes.first().unwrap().span;
+57            scope.error(
+58                "Invalid attribute",
+59                span,
+60                "illegal name. Only `indexed` supported.",
+61            );
+62        }
+63
+64        match fields.entry(node.name().into()) {
+65            Entry::Occupied(entry) => {
+66                scope.duplicate_name_error(
+67                    &format!("duplicate field names in `struct {struct_name}`",),
+68                    entry.key(),
+69                    entry.get().data(db).ast.span,
+70                    node.span,
+71                );
+72            }
+73            Entry::Vacant(entry) => {
+74                entry.insert(*field);
+75            }
+76        }
+77    }
+78
+79    if indexed_count > MAX_INDEXED_EVENT_FIELDS {
+80        let excess_count = indexed_count - MAX_INDEXED_EVENT_FIELDS;
+81
+82        let mut labels = fields
+83            .iter()
+84            .filter(|(_, field)| field.is_indexed(db))
+85            .map(|(_, field)| Label::primary(field.span(db), String::new()))
+86            .collect::<Vec<Label>>();
+87        labels.last_mut().unwrap().message = format!("{indexed_count} indexed fields");
+88
+89        scope.fancy_error(
+90            &format!(
+91                "more than three indexed fields in `event {}`",
+92                struct_.name(db)
+93            ),
+94            labels,
+95            vec![format!(
+96                "Note: Remove the `indexed` attribute from at least {} {}.",
+97                excess_count,
+98                pluralize_conditionally("field", excess_count)
+99            )],
+100        );
+101    }
+102
+103    Analysis::new(Rc::new(fields), scope.diagnostics.take().into())
+104}
+105
+106pub fn struct_field_type(
+107    db: &dyn AnalyzerDb,
+108    field: StructFieldId,
+109) -> Analysis<Result<TypeId, TypeError>> {
+110    let field_data = field.data(db);
+111    let mut scope = ItemScope::new(db, field_data.parent.module(db));
+112
+113    let ast::Field {
+114        attributes: _,
+115        is_pub: _,
+116        is_const,
+117        name: _,
+118        typ,
+119        value,
+120    } = &field_data.ast.kind;
+121
+122    if *is_const {
+123        scope.not_yet_implemented("struct `const` fields", field_data.ast.span);
+124    }
+125    if let Some(_node) = value {
+126        scope.not_yet_implemented("struct field initial value assignment", field_data.ast.span);
+127    }
+128    let typ = match type_desc(&mut scope, typ, None) {
+129        Ok(typ) => match typ.typ(db) {
+130            Type::Contract(_) => {
+131                scope.not_yet_implemented(
+132                    "contract types aren't yet supported as struct fields",
+133                    field_data.ast.span,
+134                );
+135                Ok(typ)
+136            }
+137            t if t.has_fixed_size(db) => Ok(typ),
+138            _ => Err(TypeError::new(scope.error(
+139                "struct field type must have a fixed size",
+140                field_data.ast.span,
+141                "this can't be used as an struct field",
+142            ))),
+143        },
+144        Err(err) => Err(err),
+145    };
+146
+147    Analysis::new(typ, scope.diagnostics.take().into())
+148}
+149
+150pub fn struct_all_functions(db: &dyn AnalyzerDb, struct_: StructId) -> Rc<[FunctionId]> {
+151    let struct_data = struct_.data(db);
+152    struct_data
+153        .ast
+154        .kind
+155        .functions
+156        .iter()
+157        .map(|node| {
+158            db.intern_function(Rc::new(items::Function::new(
+159                db,
+160                node,
+161                Some(Item::Type(TypeDef::Struct(struct_))),
+162                struct_data.module,
+163            )))
+164        })
+165        .collect()
+166}
+167
+168pub fn struct_function_map(
+169    db: &dyn AnalyzerDb,
+170    struct_: StructId,
+171) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+172    let scope = ItemScope::new(db, struct_.module(db));
+173    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+174
+175    for func in db.struct_all_functions(struct_).iter() {
+176        let def = &func.data(db).ast;
+177        let def_name = def.name();
+178        if def_name == "__init__" {
+179            continue;
+180        }
+181
+182        if let Ok(Some(named_item)) = scope.resolve_name(def_name, func.name_span(db)) {
+183            scope.name_conflict_error(
+184                "function",
+185                def_name,
+186                &named_item,
+187                named_item.name_span(db),
+188                func.name_span(db),
+189            );
+190            continue;
+191        }
+192
+193        if builtins::ValueMethod::from_str(def_name).is_ok() {
+194            scope.error(
+195                &format!("function name `{def_name}` conflicts with built-in function"),
+196                func.name_span(db),
+197                &format!("`{def_name}` is a built-in function"),
+198            );
+199            continue;
+200        }
+201
+202        match map.entry(def_name.into()) {
+203            Entry::Occupied(entry) => {
+204                scope.duplicate_name_error(
+205                    &format!("duplicate function names in `struct {}`", struct_.name(db)),
+206                    entry.key(),
+207                    entry.get().data(db).ast.span,
+208                    def.span,
+209                );
+210            }
+211            Entry::Vacant(entry) => {
+212                entry.insert(*func);
+213            }
+214        }
+215    }
+216    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+217}
+218
+219pub fn struct_dependency_graph(
+220    db: &dyn AnalyzerDb,
+221    struct_: StructId,
+222) -> Analysis<DepGraphWrapper> {
+223    // A struct depends on the types of its fields and on everything they depend on.
+224    // It *does not* depend on its public functions; those will only be part of
+225    // the broader dependency graph if they're in the call graph of some public
+226    // contract function.
+227
+228    let scope = ItemScope::new(db, struct_.module(db));
+229    let root = Item::Type(TypeDef::Struct(struct_));
+230    let fields = struct_
+231        .fields(db)
+232        .values()
+233        .filter_map(|field| match field.typ(db).ok()?.typ(db) {
+234            Type::Contract(id) => Some((
+235                root,
+236                Item::Type(TypeDef::Contract(id)),
+237                DepLocality::External,
+238            )),
+239            // Not possible yet, but it will be soon
+240            Type::Struct(id) => Some((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local)),
+241            Type::Enum(id) => Some((root, Item::Type(TypeDef::Enum(id)), DepLocality::Local)),
+242            _ => None,
+243        })
+244        .collect::<Vec<_>>();
+245
+246    let mut graph = DepGraph::from_edges(fields.iter());
+247    for (_, item, _) in fields {
+248        if let Some(subgraph) = item.dependency_graph(db) {
+249            graph.extend(subgraph.all_edges())
+250        }
+251    }
+252
+253    Analysis::new(
+254        DepGraphWrapper(Rc::new(graph)),
+255        scope.diagnostics.take().into(),
+256    )
+257}
+258
+259pub fn struct_cycle(
+260    db: &dyn AnalyzerDb,
+261    _cycle: &[String],
+262    struct_: &StructId,
+263) -> Analysis<DepGraphWrapper> {
+264    let scope = ItemScope::new(db, struct_.module(db));
+265    let struct_data = &struct_.data(db).ast;
+266    scope.error(
+267        &format!("recursive struct `{}`", struct_data.name()),
+268        struct_data.kind.name.span,
+269        &format!(
+270            "struct `{}` has infinite size due to recursive definition",
+271            struct_data.name(),
+272        ),
+273    );
+274
+275    Analysis::new(
+276        DepGraphWrapper(Rc::new(DepGraph::new())),
+277        scope.diagnostics.take().into(),
+278    )
+279}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/traits.rs.html b/compiler-docs/src/fe_analyzer/db/queries/traits.rs.html new file mode 100644 index 0000000000..b05f5ba1b2 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/traits.rs.html @@ -0,0 +1,62 @@ +traits.rs - source

fe_analyzer/db/queries/
traits.rs

1use indexmap::map::Entry;
+2use indexmap::IndexMap;
+3use smol_str::SmolStr;
+4
+5use crate::context::{Analysis, AnalyzerContext};
+6use crate::namespace::items::{FunctionSig, FunctionSigId, Item, TraitId};
+7use crate::namespace::scopes::ItemScope;
+8use crate::namespace::types::TypeId;
+9use crate::AnalyzerDb;
+10use std::rc::Rc;
+11
+12pub fn trait_all_functions(db: &dyn AnalyzerDb, trait_: TraitId) -> Rc<[FunctionSigId]> {
+13    let trait_data = trait_.data(db);
+14    trait_data
+15        .ast
+16        .kind
+17        .functions
+18        .iter()
+19        .map(|node| {
+20            db.intern_function_sig(Rc::new(FunctionSig {
+21                ast: node.clone(),
+22                module: trait_.module(db),
+23                parent: Some(Item::Trait(trait_)),
+24            }))
+25        })
+26        .collect()
+27}
+28
+29pub fn trait_function_map(
+30    db: &dyn AnalyzerDb,
+31    trait_: TraitId,
+32) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>> {
+33    let scope = ItemScope::new(db, trait_.module(db));
+34    let mut map = IndexMap::<SmolStr, FunctionSigId>::new();
+35
+36    for func in db.trait_all_functions(trait_).iter() {
+37        let def_name = func.name(db);
+38
+39        match map.entry(def_name) {
+40            Entry::Occupied(entry) => {
+41                scope.duplicate_name_error(
+42                    &format!("duplicate function names in `trait {}`", trait_.name(db)),
+43                    entry.key(),
+44                    entry.get().name_span(db),
+45                    func.name_span(db),
+46                );
+47            }
+48            Entry::Vacant(entry) => {
+49                entry.insert(*func);
+50            }
+51        }
+52    }
+53    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+54}
+55
+56pub fn trait_is_implemented_for(db: &dyn AnalyzerDb, trait_: TraitId, ty: TypeId) -> bool {
+57    trait_
+58        .module(db)
+59        .all_impls(db)
+60        .iter()
+61        .any(|val| val.trait_id(db) == trait_ && val.receiver(db) == ty)
+62}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/types.rs.html b/compiler-docs/src/fe_analyzer/db/queries/types.rs.html new file mode 100644 index 0000000000..3e2ea0de85 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/types.rs.html @@ -0,0 +1,73 @@ +types.rs - source

fe_analyzer/db/queries/
types.rs

1use std::rc::Rc;
+2
+3use smol_str::SmolStr;
+4
+5use crate::context::{AnalyzerContext, TempContext};
+6use crate::db::Analysis;
+7use crate::errors::TypeError;
+8use crate::namespace::items::{FunctionSigId, ImplId, TraitId, TypeAliasId};
+9use crate::namespace::scopes::ItemScope;
+10use crate::namespace::types::{self, TypeId};
+11use crate::traversal::types::type_desc;
+12use crate::AnalyzerDb;
+13
+14/// Returns all `impl` for the given type from the current ingot as well as
+15/// dependency ingots
+16pub fn all_impls(db: &dyn AnalyzerDb, ty: TypeId) -> Rc<[ImplId]> {
+17    let ty = ty.deref(db);
+18
+19    let ingot_modules = db
+20        .root_ingot()
+21        .all_modules(db)
+22        .iter()
+23        .flat_map(|module_id| module_id.all_impls(db).to_vec())
+24        .collect::<Vec<_>>();
+25    db.ingot_external_ingots(db.root_ingot())
+26        .values()
+27        .flat_map(|ingot| ingot.all_modules(db).to_vec())
+28        .flat_map(|module_id| module_id.all_impls(db).to_vec())
+29        .chain(ingot_modules)
+30        .filter(|val| val.receiver(db) == ty)
+31        .collect()
+32}
+33
+34pub fn impl_for(db: &dyn AnalyzerDb, ty: TypeId, treit: TraitId) -> Option<ImplId> {
+35    db.all_impls(ty)
+36        .iter()
+37        .find(|impl_| impl_.trait_id(db) == treit)
+38        .cloned()
+39}
+40
+41pub fn function_sigs(db: &dyn AnalyzerDb, ty: TypeId, name: SmolStr) -> Rc<[FunctionSigId]> {
+42    db.all_impls(ty)
+43        .iter()
+44        .filter_map(|impl_| impl_.function(db, &name))
+45        .map(|fun| fun.sig(db))
+46        .chain(ty.function_sig(db, &name).map_or(vec![], |fun| vec![fun]))
+47        .collect()
+48}
+49
+50pub fn type_alias_type(
+51    db: &dyn AnalyzerDb,
+52    alias: TypeAliasId,
+53) -> Analysis<Result<types::TypeId, TypeError>> {
+54    let mut scope = ItemScope::new(db, alias.data(db).module);
+55    let typ = type_desc(&mut scope, &alias.data(db).ast.kind.typ, None);
+56
+57    Analysis::new(typ, scope.diagnostics.take().into())
+58}
+59
+60pub fn type_alias_type_cycle(
+61    db: &dyn AnalyzerDb,
+62    _cycle: &[String],
+63    alias: &TypeAliasId,
+64) -> Analysis<Result<types::TypeId, TypeError>> {
+65    let context = TempContext::default();
+66    let err = Err(TypeError::new(context.error(
+67        "recursive type definition",
+68        alias.data(db).ast.span,
+69        "",
+70    )));
+71
+72    Analysis::new(err, context.diagnostics.take().into())
+73}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/display.rs.html b/compiler-docs/src/fe_analyzer/display.rs.html new file mode 100644 index 0000000000..3bdbed1fde --- /dev/null +++ b/compiler-docs/src/fe_analyzer/display.rs.html @@ -0,0 +1,41 @@ +display.rs - source

fe_analyzer/
display.rs

1use crate::AnalyzerDb;
+2use std::fmt;
+3
+4pub trait Displayable: DisplayWithDb {
+5    fn display<'a, 'b>(&'a self, db: &'b dyn AnalyzerDb) -> DisplayableWrapper<'b, &'a Self> {
+6        DisplayableWrapper::new(db, self)
+7    }
+8}
+9impl<T: DisplayWithDb> Displayable for T {}
+10
+11pub trait DisplayWithDb {
+12    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result;
+13}
+14
+15impl<T: ?Sized> DisplayWithDb for &T
+16where
+17    T: DisplayWithDb,
+18{
+19    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+20        (*self).format(db, f)
+21    }
+22}
+23
+24pub struct DisplayableWrapper<'a, T> {
+25    db: &'a dyn AnalyzerDb,
+26    inner: T,
+27}
+28impl<'a, T> DisplayableWrapper<'a, T> {
+29    pub fn new(db: &'a dyn AnalyzerDb, inner: T) -> Self {
+30        Self { db, inner }
+31    }
+32    pub fn child(&self, inner: T) -> Self {
+33        Self { db: self.db, inner }
+34    }
+35}
+36
+37impl<T: DisplayWithDb> fmt::Display for DisplayableWrapper<'_, T> {
+38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+39        self.inner.format(self.db, f)
+40    }
+41}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/errors.rs.html b/compiler-docs/src/fe_analyzer/errors.rs.html new file mode 100644 index 0000000000..8f0c52d0e9 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/errors.rs.html @@ -0,0 +1,297 @@ +errors.rs - source

fe_analyzer/
errors.rs

1//! Semantic errors.
+2
+3use crate::context::{DiagnosticVoucher, NamedThing};
+4use fe_common::diagnostics::{Diagnostic, Label, Severity};
+5use fe_common::Span;
+6use std::fmt::Display;
+7
+8/// Error indicating that a type is invalid.
+9///
+10/// Note that the "type" of a thing (eg the type of a `FunctionParam`)
+11/// in [`crate::namespace::types`] is sometimes represented as a
+12/// `Result<Type, TypeError>`.
+13///
+14/// If, for example, a function parameter has an undefined type, we emit a [`Diagnostic`] message,
+15/// give that parameter a "type" of `Err(TypeError)`, and carry on. If/when that parameter is
+16/// used in the function body, we assume that a diagnostic message about the undefined type
+17/// has already been emitted, and halt the analysis of the function body.
+18///
+19/// To ensure that that assumption is sound, a diagnostic *must* be emitted before creating
+20/// a `TypeError`. So that the rust compiler can help us enforce this rule, a `TypeError`
+21/// cannot be constructed without providing a [`DiagnosticVoucher`]. A voucher can be obtained
+22/// by calling an error function on an [`AnalyzerContext`](crate::context::AnalyzerContext).
+23/// Please don't try to work around this restriction.
+24///
+25/// Example: `TypeError::new(context.error("something is wrong", some_span, "this thing"))`
+26#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+27pub struct TypeError(DiagnosticVoucher);
+28impl TypeError {
+29    // `Clone` is required because these are stored in a salsa db.
+30    // Please don't clone these manually.
+31    pub fn new(voucher: DiagnosticVoucher) -> Self {
+32        Self(voucher)
+33    }
+34}
+35
+36impl From<FatalError> for TypeError {
+37    fn from(err: FatalError) -> Self {
+38        Self(err.0)
+39    }
+40}
+41impl From<ConstEvalError> for TypeError {
+42    fn from(err: ConstEvalError) -> Self {
+43        Self(err.0)
+44    }
+45}
+46
+47/// Error to be returned when otherwise no meaningful information can be returned.
+48/// Can't be created unless a diagnostic has been emitted, and thus a [`DiagnosticVoucher`]
+49/// has been obtained. (See comment on [`TypeError`])
+50#[derive(Debug)]
+51pub struct FatalError(DiagnosticVoucher);
+52
+53impl FatalError {
+54    /// Create a `FatalError` instance, given a "voucher"
+55    /// obtained by emitting an error via an [`AnalyzerContext`](crate::context::AnalyzerContext).
+56    pub fn new(voucher: DiagnosticVoucher) -> Self {
+57        Self(voucher)
+58    }
+59}
+60
+61impl From<ConstEvalError> for FatalError {
+62    fn from(err: ConstEvalError) -> Self {
+63        Self(err.0)
+64    }
+65}
+66
+67impl From<AlreadyDefined> for FatalError {
+68    fn from(err: AlreadyDefined) -> Self {
+69        Self(err.0)
+70    }
+71}
+72
+73/// Error indicating constant evaluation failed.
+74///
+75/// This error emitted when
+76/// 1. an expression can't be evaluated in compilation time
+77/// 2. arithmetic overflow occurred during evaluation
+78/// 3. zero division is detected during evaluation
+79///
+80/// Can't be created unless a diagnostic has been emitted, and thus a [`DiagnosticVoucher`]
+81/// has been obtained. (See comment on [`TypeError`])
+82///
+83/// NOTE: `Clone` is required because these are stored in a salsa db.
+84/// Please don't clone these manually.
+85#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+86pub struct ConstEvalError(DiagnosticVoucher);
+87
+88impl ConstEvalError {
+89    pub fn new(voucher: DiagnosticVoucher) -> Self {
+90        Self(voucher)
+91    }
+92}
+93
+94impl From<TypeError> for ConstEvalError {
+95    fn from(err: TypeError) -> Self {
+96        Self(err.0)
+97    }
+98}
+99
+100impl From<FatalError> for ConstEvalError {
+101    fn from(err: FatalError) -> Self {
+102        Self(err.0)
+103    }
+104}
+105
+106impl From<IncompleteItem> for ConstEvalError {
+107    fn from(err: IncompleteItem) -> Self {
+108        Self(err.0)
+109    }
+110}
+111
+112/// Error returned by `ModuleId::resolve_name` if the name is not found, and parsing of the module
+113/// failed. In this case, emitting an error message about failure to resolve the name might be misleading,
+114/// because the file may in fact contain an item with the given name, somewhere after the syntax error that caused
+115/// parsing to fail.
+116#[derive(Debug)]
+117pub struct IncompleteItem(DiagnosticVoucher);
+118impl IncompleteItem {
+119    #[allow(clippy::new_without_default)]
+120    pub fn new() -> Self {
+121        Self(DiagnosticVoucher::assume_the_parser_handled_it())
+122    }
+123}
+124
+125/// Error to be returned from APIs that should reject duplicate definitions
+126#[derive(Debug)]
+127pub struct AlreadyDefined(DiagnosticVoucher);
+128impl AlreadyDefined {
+129    #[allow(clippy::new_without_default)]
+130    pub fn new(voucher: DiagnosticVoucher) -> Self {
+131        Self(voucher)
+132    }
+133}
+134
+135/// Errors that can result from indexing
+136#[derive(Debug, PartialEq, Eq)]
+137pub enum IndexingError {
+138    WrongIndexType,
+139    NotSubscriptable,
+140}
+141
+142/// Errors that can result from a binary operation
+143#[derive(Debug, PartialEq, Eq)]
+144pub enum BinaryOperationError {
+145    TypesNotCompatible,
+146    TypesNotNumeric,
+147    RightTooLarge,
+148    RightIsSigned,
+149    NotEqualAndUnsigned,
+150}
+151
+152/// Errors that can result from an implicit type coercion
+153#[derive(Debug, PartialEq, Eq)]
+154pub enum TypeCoercionError {
+155    /// Value is in storage and must be explicitly moved with .to_mem()
+156    RequiresToMem,
+157    /// Value type cannot be coerced to the expected type
+158    Incompatible,
+159    /// `self` contract used where an external contract value is expected
+160    SelfContractType,
+161}
+162
+163impl From<TypeError> for FatalError {
+164    fn from(err: TypeError) -> Self {
+165        Self::new(err.0)
+166    }
+167}
+168
+169impl From<IncompleteItem> for FatalError {
+170    fn from(err: IncompleteItem) -> Self {
+171        Self::new(err.0)
+172    }
+173}
+174
+175impl From<IncompleteItem> for TypeError {
+176    fn from(err: IncompleteItem) -> Self {
+177        Self::new(err.0)
+178    }
+179}
+180
+181pub fn error(message: impl Into<String>, label_span: Span, label: impl Into<String>) -> Diagnostic {
+182    fancy_error(message, vec![Label::primary(label_span, label)], vec![])
+183}
+184
+185pub fn fancy_error(
+186    message: impl Into<String>,
+187    labels: Vec<Label>,
+188    notes: Vec<String>,
+189) -> Diagnostic {
+190    Diagnostic {
+191        severity: Severity::Error,
+192        message: message.into(),
+193        labels,
+194        notes,
+195    }
+196}
+197
+198pub fn type_error(
+199    message: impl Into<String>,
+200    span: Span,
+201    expected: impl Display,
+202    actual: impl Display,
+203) -> Diagnostic {
+204    error(
+205        message,
+206        span,
+207        format!("this has type `{actual}`; expected type `{expected}`"),
+208    )
+209}
+210
+211pub fn not_yet_implemented(feature: impl Display, span: Span) -> Diagnostic {
+212    error(
+213        format!("feature not yet implemented: {feature}"),
+214        span,
+215        "not yet implemented",
+216    )
+217}
+218
+219pub fn duplicate_name_error(
+220    message: &str,
+221    name: &str,
+222    original: Span,
+223    duplicate: Span,
+224) -> Diagnostic {
+225    fancy_error(
+226        message,
+227        vec![
+228            Label::primary(original, format!("`{name}` first defined here")),
+229            Label::secondary(duplicate, format!("`{name}` redefined here")),
+230        ],
+231        vec![],
+232    )
+233}
+234
+235pub fn name_conflict_error(
+236    name_kind: &str, // Eg "function parameter" or "variable name"
+237    name: &str,
+238    original: &NamedThing,
+239    original_span: Option<Span>,
+240    duplicate_span: Span,
+241) -> Diagnostic {
+242    if let Some(original_span) = original_span {
+243        fancy_error(
+244            format!(
+245                "{} name `{}` conflicts with previously defined {}",
+246                name_kind,
+247                name,
+248                original.item_kind_display_name()
+249            ),
+250            vec![
+251                Label::primary(original_span, format!("`{name}` first defined here")),
+252                Label::secondary(duplicate_span, format!("`{name}` redefined here")),
+253            ],
+254            vec![],
+255        )
+256    } else {
+257        fancy_error(
+258            format!(
+259                "{} name `{}` conflicts with built-in {}",
+260                name_kind,
+261                name,
+262                original.item_kind_display_name()
+263            ),
+264            vec![Label::primary(
+265                duplicate_span,
+266                format!(
+267                    "`{}` is a built-in {}",
+268                    name,
+269                    original.item_kind_display_name()
+270                ),
+271            )],
+272            vec![],
+273        )
+274    }
+275}
+276
+277pub fn to_mem_error(span: Span) -> Diagnostic {
+278    fancy_error(
+279        "value must be copied to memory",
+280        vec![Label::primary(span, "this value is in storage")],
+281        vec![
+282            "Hint: values located in storage can be copied to memory using the `to_mem` function."
+283                .into(),
+284            "Example: `self.my_array.to_mem()`".into(),
+285        ],
+286    )
+287}
+288pub fn self_contract_type_error(span: Span, typ: &dyn Display) -> Diagnostic {
+289    fancy_error(
+290        format!("`self` can't be used where a contract of type `{typ}` is expected",),
+291        vec![Label::primary(span, "cannot use `self` here")],
+292        vec![format!(
+293            "Hint: Values of type `{typ}` represent external contracts.\n\
+294             To treat `self` as an external contract, use `{typ}(ctx.self_address())`."
+295        )],
+296    )
+297}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/lib.rs.html b/compiler-docs/src/fe_analyzer/lib.rs.html new file mode 100644 index 0000000000..0deca23be3 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/lib.rs.html @@ -0,0 +1,42 @@ +lib.rs - source

fe_analyzer/
lib.rs

1//! Fe semantic analysis.
+2//!
+3//! This library is used to analyze the semantics of a given Fe AST. It detects
+4//! any semantic errors within a given AST and produces a `Context` instance
+5//! that can be used to query contextual information attributed to AST nodes.
+6
+7pub mod builtins;
+8pub mod constants;
+9pub mod context;
+10pub mod db;
+11pub mod display;
+12pub mod errors;
+13pub mod namespace;
+14
+15mod operations;
+16mod traversal;
+17
+18pub use db::{AnalyzerDb, TestDb};
+19pub use traversal::pattern_analysis;
+20
+21use fe_common::diagnostics::Diagnostic;
+22use namespace::items::{IngotId, ModuleId};
+23
+24pub fn analyze_ingot(db: &dyn AnalyzerDb, ingot_id: IngotId) -> Result<(), Vec<Diagnostic>> {
+25    let diagnostics = ingot_id.diagnostics(db);
+26
+27    if diagnostics.is_empty() {
+28        Ok(())
+29    } else {
+30        Err(diagnostics)
+31    }
+32}
+33
+34pub fn analyze_module(db: &dyn AnalyzerDb, module_id: ModuleId) -> Result<(), Vec<Diagnostic>> {
+35    let diagnostics = module_id.diagnostics(db);
+36
+37    if diagnostics.is_empty() {
+38        Ok(())
+39    } else {
+40        Err(diagnostics)
+41    }
+42}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/items.rs.html b/compiler-docs/src/fe_analyzer/namespace/items.rs.html new file mode 100644 index 0000000000..e0c5c78d3f --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/items.rs.html @@ -0,0 +1,2167 @@ +items.rs - source

fe_analyzer/namespace/
items.rs

1use crate::constants::{EMITTABLE_TRAIT_NAME, INDEXED};
+2use crate::context::{self, Analysis, Constant, NamedThing};
+3use crate::display::{DisplayWithDb, Displayable};
+4use crate::errors::{self, IncompleteItem, TypeError};
+5use crate::namespace::types::{self, GenericType, Type, TypeId};
+6use crate::traversal::pragma::check_pragma_version;
+7use crate::AnalyzerDb;
+8use crate::{builtins, errors::ConstEvalError};
+9use fe_common::diagnostics::Diagnostic;
+10use fe_common::diagnostics::Label;
+11use fe_common::files::{common_prefix, Utf8Path};
+12use fe_common::utils::files::{BuildFiles, ProjectMode};
+13use fe_common::{impl_intern_key, FileKind, SourceFileId};
+14use fe_parser::ast::GenericParameter;
+15use fe_parser::node::{Node, Span};
+16use fe_parser::{ast, node::NodeId};
+17use indexmap::{indexmap, IndexMap};
+18use smallvec::SmallVec;
+19use smol_str::SmolStr;
+20use std::rc::Rc;
+21use std::{fmt, ops::Deref};
+22use strum::IntoEnumIterator;
+23
+24use super::types::TraitOrType;
+25
+26/// A named item. This does not include things inside of
+27/// a function body.
+28#[derive(Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone, Copy)]
+29pub enum Item {
+30    Ingot(IngotId),
+31    Module(ModuleId),
+32    Type(TypeDef),
+33    // GenericType probably shouldn't be a separate category.
+34    // Any of the items inside TypeDef (struct, alias, etc)
+35    // could be optionally generic.
+36    GenericType(GenericType),
+37    Trait(TraitId),
+38    Impl(ImplId),
+39    Function(FunctionId),
+40    Constant(ModuleConstantId),
+41    // Needed until we can represent keccak256 as a FunctionId.
+42    // We can't represent keccak256's arg type yet.
+43    BuiltinFunction(builtins::GlobalFunction),
+44    Intrinsic(builtins::Intrinsic),
+45    Attribute(AttributeId),
+46}
+47
+48impl Item {
+49    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+50        match self {
+51            Item::Type(id) => id.name(db),
+52            Item::Trait(id) => id.name(db),
+53            Item::Impl(id) => id.name(db),
+54            Item::GenericType(id) => id.name(),
+55            Item::Function(id) => id.name(db),
+56            Item::BuiltinFunction(id) => id.as_ref().into(),
+57            Item::Intrinsic(id) => id.as_ref().into(),
+58            Item::Constant(id) => id.name(db),
+59            Item::Ingot(id) => id.name(db),
+60            Item::Module(id) => id.name(db),
+61            Item::Attribute(id) => id.name(db),
+62        }
+63    }
+64
+65    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+66        match self {
+67            Item::Type(id) => id.name_span(db),
+68            Item::Trait(id) => Some(id.name_span(db)),
+69            Item::GenericType(_) => None,
+70            Item::Function(id) => Some(id.name_span(db)),
+71            Item::Constant(id) => Some(id.name_span(db)),
+72            Item::BuiltinFunction(_)
+73            | Item::Intrinsic(_)
+74            | Item::Ingot(_)
+75            | Item::Module(_)
+76            | Item::Impl(_)
+77            | Item::Attribute(_) => None,
+78        }
+79    }
+80
+81    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+82        match self {
+83            // TODO: Consider whether to allow `pub module`.
+84            Self::Ingot(_)
+85            | Self::Module(_)
+86            | Self::BuiltinFunction(_)
+87            | Self::Intrinsic(_)
+88            | Self::Impl(_)
+89            | Self::GenericType(_) => true,
+90            Self::Attribute(_) => false,
+91            Self::Type(id) => id.is_public(db),
+92            Self::Trait(id) => id.is_public(db),
+93            Self::Function(id) => id.is_public(db),
+94            Self::Constant(id) => id.is_public(db),
+95        }
+96    }
+97
+98    pub fn is_builtin(&self) -> bool {
+99        match self {
+100            Item::Type(TypeDef::Primitive(_))
+101            | Item::GenericType(_)
+102            | Item::BuiltinFunction(_)
+103            | Item::Intrinsic(_) => true,
+104            Item::Type(_)
+105            | Item::Trait(_)
+106            | Item::Impl(_)
+107            | Item::Function(_)
+108            | Item::Constant(_)
+109            | Item::Ingot(_)
+110            | Item::Attribute(_)
+111            | Item::Module(_) => false,
+112        }
+113    }
+114
+115    pub fn is_struct(&self, val: &StructId) -> bool {
+116        matches!(self, Item::Type(TypeDef::Struct(current)) if current == val)
+117    }
+118
+119    pub fn is_contract(&self) -> bool {
+120        matches!(self, Item::Type(TypeDef::Contract(_)))
+121    }
+122
+123    pub fn item_kind_display_name(&self) -> &'static str {
+124        match self {
+125            Item::Type(TypeDef::Struct(_)) => "struct",
+126            Item::Type(_) | Item::GenericType(_) => "type",
+127            Item::Trait(_) => "trait",
+128            Item::Impl(_) => "impl",
+129            Item::Function(_) | Item::BuiltinFunction(_) => "function",
+130            Item::Intrinsic(_) => "intrinsic function",
+131            Item::Constant(_) => "constant",
+132            Item::Ingot(_) => "ingot",
+133            Item::Module(_) => "module",
+134            Item::Attribute(_) => "attribute",
+135        }
+136    }
+137
+138    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+139        match self {
+140            Item::Ingot(ingot) => ingot.items(db),
+141            Item::Module(module) => module.items(db),
+142            Item::Type(val) => val.items(db),
+143            Item::GenericType(_)
+144            | Item::Trait(_)
+145            | Item::Impl(_)
+146            | Item::Function(_)
+147            | Item::Constant(_)
+148            | Item::BuiltinFunction(_)
+149            | Item::Attribute(_)
+150            | Item::Intrinsic(_) => Rc::new(indexmap! {}),
+151        }
+152    }
+153
+154    pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item> {
+155        match self {
+156            Item::Type(id) => id.parent(db),
+157            Item::Trait(id) => Some(id.parent(db)),
+158            Item::Impl(id) => Some(id.parent(db)),
+159            Item::GenericType(_) => None,
+160            Item::Function(id) => Some(id.parent(db)),
+161            Item::Constant(id) => Some(id.parent(db)),
+162            Item::Module(id) => Some(id.parent(db)),
+163            Item::Attribute(id) => Some(id.parent(db)),
+164            Item::BuiltinFunction(_) | Item::Intrinsic(_) | Item::Ingot(_) => None,
+165        }
+166    }
+167
+168    pub fn module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId> {
+169        if let Self::Module(id) = self {
+170            return Some(*id);
+171        }
+172
+173        let mut cur_item = *self;
+174        while let Some(item) = cur_item.parent(db) {
+175            if let Self::Module(id) = item {
+176                return Some(id);
+177            }
+178            cur_item = item;
+179        }
+180
+181        None
+182    }
+183
+184    pub fn path(&self, db: &dyn AnalyzerDb) -> Rc<[SmolStr]> {
+185        // The path is used to generate a yul identifier,
+186        // eg `foo::Bar::new` becomes `$$foo$Bar$new`.
+187        // Right now, the ingot name is the os path, so it could
+188        // be "my project/src".
+189        // For now, we'll just leave the ingot out of the path,
+190        // because we can only compile a single ingot anyway.
+191        match self.parent(db) {
+192            Some(Item::Ingot(_)) | None => [self.name(db)][..].into(),
+193            Some(parent) => {
+194                let mut path = parent.path(db).to_vec();
+195                path.push(self.name(db));
+196                path.into()
+197            }
+198        }
+199    }
+200
+201    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Option<Rc<DepGraph>> {
+202        match self {
+203            Item::Type(TypeDef::Contract(id)) => Some(id.dependency_graph(db)),
+204            Item::Type(TypeDef::Struct(id)) => Some(id.dependency_graph(db)),
+205            Item::Type(TypeDef::Enum(id)) => Some(id.dependency_graph(db)),
+206            Item::Function(id) => Some(id.dependency_graph(db)),
+207            _ => None,
+208        }
+209    }
+210
+211    pub fn resolve_path_segments(
+212        &self,
+213        db: &dyn AnalyzerDb,
+214        segments: &[Node<SmolStr>],
+215    ) -> Analysis<Option<NamedThing>> {
+216        let mut curr_item = NamedThing::Item(*self);
+217
+218        for node in segments {
+219            curr_item = match curr_item.resolve_path_segment(db, &node.kind) {
+220                Some(item) => item,
+221                None => {
+222                    return Analysis {
+223                        value: None,
+224                        diagnostics: Rc::new([errors::error(
+225                            "unresolved path item",
+226                            node.span,
+227                            "not found",
+228                        )]),
+229                    };
+230                }
+231            }
+232        }
+233
+234        Analysis {
+235            value: Some(curr_item),
+236            diagnostics: Rc::new([]),
+237        }
+238    }
+239
+240    pub fn function_sig(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+241        match self {
+242            Item::Type(TypeDef::Contract(id)) => id.function(db, name).map(|fun| fun.sig(db)),
+243            Item::Type(TypeDef::Struct(id)) => id.function(db, name).map(|fun| fun.sig(db)),
+244            Item::Impl(id) => id.function(db, name).map(|fun| fun.sig(db)),
+245            Item::Trait(id) => id.function(db, name),
+246            _ => None,
+247        }
+248    }
+249
+250    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+251        match self {
+252            Item::Type(id) => id.sink_diagnostics(db, sink),
+253            Item::Trait(id) => id.sink_diagnostics(db, sink),
+254            Item::Impl(id) => id.sink_diagnostics(db, sink),
+255            Item::Function(id) => id.sink_diagnostics(db, sink),
+256            Item::GenericType(_)
+257            | Item::BuiltinFunction(_)
+258            | Item::Intrinsic(_)
+259            | Item::Attribute(_) => {}
+260            Item::Constant(id) => id.sink_diagnostics(db, sink),
+261            Item::Ingot(id) => id.sink_diagnostics(db, sink),
+262            Item::Module(id) => id.sink_diagnostics(db, sink),
+263        }
+264    }
+265
+266    pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<AttributeId> {
+267        if let Some(Item::Module(module)) = self.parent(db) {
+268            let mut attributes = vec![];
+269            for item in module.all_items(db).iter() {
+270                if let Item::Attribute(attribute) = item {
+271                    attributes.push(*attribute);
+272                } else if item == self {
+273                    return attributes;
+274                } else {
+275                    attributes = vec![];
+276                }
+277            }
+278        }
+279
+280        vec![]
+281    }
+282}
+283
+284pub fn builtin_items() -> IndexMap<SmolStr, Item> {
+285    let mut items = indexmap! {
+286        SmolStr::new("bool") => Item::Type(TypeDef::Primitive(types::Base::Bool)),
+287        SmolStr::new("address") => Item::Type(TypeDef::Primitive(types::Base::Address)),
+288    };
+289    items.extend(types::Integer::iter().map(|typ| {
+290        (
+291            typ.as_ref().into(),
+292            Item::Type(TypeDef::Primitive(types::Base::Numeric(typ))),
+293        )
+294    }));
+295    items.extend(types::GenericType::iter().map(|typ| (typ.name(), Item::GenericType(typ))));
+296    items.extend(
+297        builtins::GlobalFunction::iter()
+298            .map(|fun| (fun.as_ref().into(), Item::BuiltinFunction(fun))),
+299    );
+300    items
+301        .extend(builtins::Intrinsic::iter().map(|fun| (fun.as_ref().into(), Item::Intrinsic(fun))));
+302    items
+303}
+304
+305#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
+306pub enum IngotMode {
+307    /// The target of compilation. Expected to have a main.fe file.
+308    Main,
+309    /// A library; expected to have a lib.fe file.
+310    Lib,
+311    /// A fake ingot, created to hold a single module with any filename.
+312    StandaloneModule,
+313}
+314
+315/// An `Ingot` is composed of a tree of `Module`s (set via
+316/// [`AnalyzerDb::set_ingot_module_tree`]), and doesn't have direct knowledge of
+317/// files.
+318#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+319pub struct Ingot {
+320    pub name: SmolStr,
+321    // pub version: SmolStr,
+322    pub mode: IngotMode,
+323    pub src_dir: SmolStr,
+324}
+325
+326#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+327pub struct IngotId(pub(crate) u32);
+328impl_intern_key!(IngotId);
+329impl IngotId {
+330    pub fn std_lib(db: &mut dyn AnalyzerDb) -> Self {
+331        let ingot = IngotId::from_files(
+332            db,
+333            "std",
+334            IngotMode::Lib,
+335            FileKind::Std,
+336            &fe_library::std_src_files(),
+337        );
+338        db.set_ingot_external_ingots(ingot, Rc::new(indexmap! {}));
+339        ingot
+340    }
+341
+342    pub fn from_build_files(db: &mut dyn AnalyzerDb, build_files: &BuildFiles) -> Self {
+343        let ingots: IndexMap<_, _> = build_files
+344            .project_files
+345            .iter()
+346            .map(|(project_path, project_files)| {
+347                let mode = match project_files.mode {
+348                    ProjectMode::Main => IngotMode::Main,
+349                    ProjectMode::Lib => IngotMode::Lib,
+350                };
+351                (
+352                    project_path,
+353                    IngotId::from_files(
+354                        db,
+355                        &project_files.name,
+356                        mode,
+357                        FileKind::Local,
+358                        &project_files.src,
+359                    ),
+360                )
+361            })
+362            .collect();
+363
+364        for (project_path, project_files) in &build_files.project_files {
+365            let mut deps = indexmap! {
+366                "std".into() => IngotId::std_lib(db)
+367            };
+368
+369            for dependency in &project_files.dependencies {
+370                deps.insert(
+371                    dependency.name.clone(),
+372                    ingots[&dependency.canonicalized_path],
+373                );
+374            }
+375
+376            db.set_ingot_external_ingots(ingots[&project_path], Rc::new(deps));
+377        }
+378
+379        let root_ingot = ingots[&build_files.root_project_path];
+380        db.set_root_ingot(root_ingot);
+381        root_ingot
+382    }
+383
+384    pub fn from_files(
+385        db: &mut dyn AnalyzerDb,
+386        name: &str,
+387        mode: IngotMode,
+388        file_kind: FileKind,
+389        files: &[(impl AsRef<str>, impl AsRef<str>)],
+390    ) -> Self {
+391        // The common prefix of all file paths will be stored as the ingot
+392        // src dir path, and all module file paths will be considered to be
+393        // relative to this prefix.
+394        let file_path_prefix = if files.len() == 1 {
+395            // If there's only one source file, the "common prefix" is everything
+396            // before the file name.
+397            Utf8Path::new(files[0].0.as_ref())
+398                .parent()
+399                .unwrap_or_else(|| "".into())
+400                .to_path_buf()
+401        } else {
+402            files
+403                .iter()
+404                .map(|(path, _)| Utf8Path::new(path).to_path_buf())
+405                .reduce(|pref, path| common_prefix(&pref, &path))
+406                .expect("`IngotId::from_files`: empty file list")
+407        };
+408
+409        let ingot = db.intern_ingot(Rc::new(Ingot {
+410            name: name.into(),
+411            mode,
+412            src_dir: file_path_prefix.as_str().into(),
+413        }));
+414
+415        // Intern the source files
+416        let file_ids = files
+417            .iter()
+418            .map(|(path, content)| {
+419                SourceFileId::new(
+420                    db.upcast_mut(),
+421                    file_kind,
+422                    path.as_ref(),
+423                    content.as_ref().into(),
+424                )
+425            })
+426            .collect();
+427
+428        db.set_ingot_files(ingot, file_ids);
+429        ingot
+430    }
+431
+432    pub fn external_ingots(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, IngotId>> {
+433        db.ingot_external_ingots(*self)
+434    }
+435
+436    pub fn all_modules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]> {
+437        db.ingot_modules(*self)
+438    }
+439
+440    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Ingot> {
+441        db.lookup_intern_ingot(*self)
+442    }
+443
+444    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+445        self.data(db).name.clone()
+446    }
+447
+448    /// Returns the `main.fe`, or `lib.fe` module, depending on the ingot "mode"
+449    /// (IngotMode).
+450    pub fn root_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId> {
+451        db.ingot_root_module(*self)
+452    }
+453
+454    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+455        self.root_module(db).expect("missing root module").items(db)
+456    }
+457
+458    pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic> {
+459        let mut diagnostics = vec![];
+460        self.sink_diagnostics(db, &mut diagnostics);
+461        diagnostics
+462    }
+463
+464    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+465        if self.root_module(db).is_none() {
+466            let file_name = match self.data(db).mode {
+467                IngotMode::Lib => "lib",
+468                IngotMode::Main => "main",
+469                IngotMode::StandaloneModule => unreachable!(), // always has a root module
+470            };
+471            sink.push(&Diagnostic::error(format!(
+472                "The ingot named \"{}\" is missing a `{}` module. \
+473                 \nPlease add a `src/{}.fe` file to the base directory.",
+474                self.name(db),
+475                file_name,
+476                file_name,
+477            )));
+478        }
+479        for module in self.all_modules(db).iter() {
+480            module.sink_diagnostics(db, sink)
+481        }
+482    }
+483
+484    pub fn sink_external_ingot_diagnostics(
+485        &self,
+486        db: &dyn AnalyzerDb,
+487        sink: &mut impl DiagnosticSink,
+488    ) {
+489        for ingot in self.external_ingots(db).values() {
+490            ingot.sink_diagnostics(db, sink)
+491        }
+492    }
+493}
+494
+495#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+496pub enum ModuleSource {
+497    File(SourceFileId),
+498    /// For directory modules without a corresponding source file
+499    /// (which will soon not be allowed, and this variant can go away).
+500    Dir(SmolStr),
+501}
+502
+503#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+504pub struct Module {
+505    pub name: SmolStr,
+506    pub ingot: IngotId,
+507    pub source: ModuleSource,
+508}
+509
+510/// Id of a [`Module`], which corresponds to a single Fe source file.
+511#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+512pub struct ModuleId(pub(crate) u32);
+513impl_intern_key!(ModuleId);
+514impl ModuleId {
+515    pub fn new_standalone(db: &mut dyn AnalyzerDb, path: &str, content: &str) -> Self {
+516        let std = IngotId::std_lib(db);
+517        let ingot = IngotId::from_files(
+518            db,
+519            "",
+520            IngotMode::StandaloneModule,
+521            FileKind::Local,
+522            &[(path, content)],
+523        );
+524
+525        let deps = indexmap! { "std".into() => std };
+526        db.set_ingot_external_ingots(ingot, Rc::new(deps));
+527        db.set_root_ingot(ingot);
+528
+529        ingot
+530            .root_module(db)
+531            .expect("ModuleId::new_standalone ingot has no root module")
+532    }
+533
+534    pub fn new(db: &dyn AnalyzerDb, name: &str, source: ModuleSource, ingot: IngotId) -> Self {
+535        db.intern_module(
+536            Module {
+537                name: name.into(),
+538                ingot,
+539                source,
+540            }
+541            .into(),
+542        )
+543    }
+544
+545    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Module> {
+546        db.lookup_intern_module(*self)
+547    }
+548
+549    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+550        self.data(db).name.clone()
+551    }
+552
+553    pub fn file_path_relative_to_src_dir(&self, db: &dyn AnalyzerDb) -> SmolStr {
+554        db.module_file_path(*self)
+555    }
+556
+557    pub fn ast(&self, db: &dyn AnalyzerDb) -> Rc<ast::Module> {
+558        db.module_parse(*self).value
+559    }
+560
+561    pub fn ingot(&self, db: &dyn AnalyzerDb) -> IngotId {
+562        self.data(db).ingot
+563    }
+564
+565    pub fn is_incomplete(&self, db: &dyn AnalyzerDb) -> bool {
+566        db.module_is_incomplete(*self)
+567    }
+568
+569    pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool {
+570        self.ingot(db).name(db) == "std"
+571    }
+572
+573    /// Includes duplicate names
+574    pub fn all_items(&self, db: &dyn AnalyzerDb) -> Rc<[Item]> {
+575        db.module_all_items(*self)
+576    }
+577
+578    /// Includes duplicate names
+579    pub fn all_impls(&self, db: &dyn AnalyzerDb) -> Rc<[ImplId]> {
+580        db.module_all_impls(*self).value
+581    }
+582
+583    pub fn impls(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<(TraitId, TypeId), ImplId>> {
+584        db.module_impl_map(*self).value
+585    }
+586
+587    /// Returns a map of the named items in the module
+588    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+589        db.module_item_map(*self).value
+590    }
+591
+592    /// Returns a `name -> (name_span, external_item)` map for all `use`
+593    /// statements in a module.
+594    pub fn used_items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, (Span, Item)>> {
+595        db.module_used_item_map(*self).value
+596    }
+597
+598    pub fn tests(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId> {
+599        db.module_tests(*self)
+600    }
+601
+602    /// Returns `true` if the `item` is in scope of the module.
+603    pub fn is_in_scope(&self, db: &dyn AnalyzerDb, item: Item) -> bool {
+604        if let Some(val) = item.module(db) {
+605            if val == *self {
+606                return true;
+607            }
+608        }
+609
+610        if let Some((_, val)) = self.used_items(db).get(&item.name(db)) {
+611            if *val == item {
+612                return true;
+613            }
+614        }
+615        false
+616    }
+617
+618    /// Returns all of the internal items, except for `use`d items. This is used
+619    /// when resolving `use` statements, as it does not create a query
+620    /// cycle.
+621    pub fn non_used_internal_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item> {
+622        let global_items = self.global_items(db);
+623
+624        self.submodules(db)
+625            .iter()
+626            .map(|module| (module.name(db), Item::Module(*module)))
+627            .chain(global_items)
+628            .collect()
+629    }
+630
+631    /// Returns all of the internal items. Internal items refers to the set of
+632    /// items visible when inside of a module.
+633    pub fn internal_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item> {
+634        let global_items = self.global_items(db);
+635        let defined_items = self.items(db);
+636        self.submodules(db)
+637            .iter()
+638            .map(|module| (module.name(db), Item::Module(*module)))
+639            .chain(global_items)
+640            .chain(defined_items.deref().clone())
+641            .collect()
+642    }
+643
+644    /// Resolve a path that starts with an item defined in the module.
+645    pub fn resolve_path(
+646        &self,
+647        db: &dyn AnalyzerDb,
+648        path: &ast::Path,
+649    ) -> Analysis<Option<NamedThing>> {
+650        Item::Module(*self).resolve_path_segments(db, &path.segments)
+651    }
+652
+653    /// Resolve a path that starts with an internal item. We omit used items to
+654    /// avoid a query cycle.
+655    pub fn resolve_path_non_used_internal(
+656        &self,
+657        db: &dyn AnalyzerDb,
+658        path: &ast::Path,
+659    ) -> Analysis<Option<NamedThing>> {
+660        let segments = &path.segments;
+661        let first_segment = &segments[0];
+662
+663        if let Some(curr_item) = self.non_used_internal_items(db).get(&first_segment.kind) {
+664            curr_item.resolve_path_segments(db, &segments[1..])
+665        } else {
+666            Analysis {
+667                value: None,
+668                diagnostics: Rc::new([errors::error(
+669                    "unresolved path item",
+670                    first_segment.span,
+671                    "not found",
+672                )]),
+673            }
+674        }
+675    }
+676
+677    /// Resolve a path that starts with an internal item.
+678    pub fn resolve_path_internal(
+679        &self,
+680        db: &dyn AnalyzerDb,
+681        path: &ast::Path,
+682    ) -> Analysis<Option<NamedThing>> {
+683        let segments = &path.segments;
+684        let first_segment = &segments[0];
+685
+686        if let Some(curr_item) = self.internal_items(db).get(&first_segment.kind) {
+687            curr_item.resolve_path_segments(db, &segments[1..])
+688        } else {
+689            Analysis {
+690                value: None,
+691                diagnostics: Rc::new([errors::error(
+692                    "unresolved path item",
+693                    first_segment.span,
+694                    "not found",
+695                )]),
+696            }
+697        }
+698    }
+699
+700    /// Returns `Err(IncompleteItem)` if the name could not be resolved, and the
+701    /// module was not completely parsed (due to a syntax error).
+702    pub fn resolve_name(
+703        &self,
+704        db: &dyn AnalyzerDb,
+705        name: &str,
+706    ) -> Result<Option<NamedThing>, IncompleteItem> {
+707        if let Some(thing) = self.internal_items(db).get(name) {
+708            Ok(Some(NamedThing::Item(*thing)))
+709        } else if self.is_incomplete(db) {
+710            Err(IncompleteItem::new())
+711        } else {
+712            Ok(None)
+713        }
+714    }
+715
+716    pub fn resolve_constant(
+717        &self,
+718        db: &dyn AnalyzerDb,
+719        name: &str,
+720    ) -> Result<Option<ModuleConstantId>, IncompleteItem> {
+721        if let Some(constant) = self
+722            .all_constants(db)
+723            .iter()
+724            .find(|id| id.name(db) == name)
+725            .copied()
+726        {
+727            Ok(Some(constant))
+728        } else if self.is_incomplete(db) {
+729            Err(IncompleteItem::new())
+730        } else {
+731            Ok(None)
+732        }
+733    }
+734    pub fn submodules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]> {
+735        db.module_submodules(*self)
+736    }
+737
+738    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+739        self.parent_module(db)
+740            .map(Item::Module)
+741            .unwrap_or_else(|| Item::Ingot(self.ingot(db)))
+742    }
+743
+744    pub fn parent_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId> {
+745        db.module_parent_module(*self)
+746    }
+747
+748    /// All contracts, including from submodules and including duplicates
+749    pub fn all_contracts(&self, db: &dyn AnalyzerDb) -> Vec<ContractId> {
+750        self.submodules(db)
+751            .iter()
+752            .flat_map(|module| module.all_contracts(db))
+753            .chain((*db.module_contracts(*self)).to_vec())
+754            .collect::<Vec<_>>()
+755    }
+756
+757    /// All functions, including from submodules and including duplicates
+758    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId> {
+759        self.items(db)
+760            .iter()
+761            .filter_map(|(_, item)| {
+762                if let Item::Function(function) = item {
+763                    Some(*function)
+764                } else {
+765                    None
+766                }
+767            })
+768            .collect()
+769    }
+770
+771    /// Returns the map of ingot deps, built-ins, and the ingot itself as
+772    /// "ingot".
+773    pub fn global_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item> {
+774        let ingot = self.ingot(db);
+775        let mut items = ingot
+776            .external_ingots(db)
+777            .iter()
+778            .map(|(name, ingot)| (name.clone(), Item::Ingot(*ingot)))
+779            .chain(builtin_items())
+780            .collect::<IndexMap<_, _>>();
+781
+782        if ingot.data(db).mode != IngotMode::StandaloneModule {
+783            items.insert("ingot".into(), Item::Ingot(ingot));
+784        }
+785        items
+786    }
+787
+788    /// All module constants.
+789    pub fn all_constants(&self, db: &dyn AnalyzerDb) -> Rc<Vec<ModuleConstantId>> {
+790        db.module_constants(*self)
+791    }
+792
+793    pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic> {
+794        let mut diagnostics = vec![];
+795        self.sink_diagnostics(db, &mut diagnostics);
+796        diagnostics
+797    }
+798
+799    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+800        let data = self.data(db);
+801        if let ModuleSource::File(_) = data.source {
+802            sink.push_all(db.module_parse(*self).diagnostics.iter())
+803        }
+804        let ast = self.ast(db);
+805        for stmt in &ast.body {
+806            if let ast::ModuleStmt::Pragma(inner) = stmt {
+807                if let Some(diag) = check_pragma_version(inner) {
+808                    sink.push(&diag)
+809                }
+810            }
+811        }
+812
+813        // duplicate item name errors
+814        sink.push_all(db.module_item_map(*self).diagnostics.iter());
+815
+816        // duplicate impl errors
+817        sink.push_all(db.module_impl_map(*self).diagnostics.iter());
+818
+819        // errors for each item
+820        self.all_items(db)
+821            .iter()
+822            .for_each(|id| id.sink_diagnostics(db, sink));
+823
+824        self.all_impls(db)
+825            .iter()
+826            .for_each(|id| id.sink_diagnostics(db, sink));
+827    }
+828
+829    #[doc(hidden)]
+830    // DO NOT USE THIS METHOD except for testing purpose.
+831    pub fn from_raw_internal(raw: u32) -> Self {
+832        Self(raw)
+833    }
+834}
+835
+836#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+837pub struct ModuleConstant {
+838    pub ast: Node<ast::ConstantDecl>,
+839    pub module: ModuleId,
+840}
+841
+842#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+843pub struct ModuleConstantId(pub(crate) u32);
+844impl_intern_key!(ModuleConstantId);
+845
+846impl ModuleConstantId {
+847    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ModuleConstant> {
+848        db.lookup_intern_module_const(*self)
+849    }
+850    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+851        self.data(db).ast.span
+852    }
+853    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+854        db.module_constant_type(*self).value
+855    }
+856
+857    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+858        self.data(db).ast.kind.name.kind.clone()
+859    }
+860
+861    pub fn constant_value(&self, db: &dyn AnalyzerDb) -> Result<Constant, ConstEvalError> {
+862        db.module_constant_value(*self).value
+863    }
+864
+865    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+866        self.data(db).ast.kind.name.span
+867    }
+868
+869    pub fn value(&self, db: &dyn AnalyzerDb) -> ast::Expr {
+870        self.data(db).ast.kind.value.kind.clone()
+871    }
+872
+873    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+874        Item::Module(self.data(db).module)
+875    }
+876
+877    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+878        self.data(db).ast.kind.pub_qual.is_some()
+879    }
+880
+881    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+882        self.data(db).module
+883    }
+884
+885    pub fn node_id(&self, db: &dyn AnalyzerDb) -> NodeId {
+886        self.data(db).ast.id
+887    }
+888
+889    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+890        db.module_constant_type(*self)
+891            .diagnostics
+892            .iter()
+893            .for_each(|d| sink.push(d));
+894    }
+895}
+896
+897#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+898pub enum TypeDef {
+899    Alias(TypeAliasId),
+900    Struct(StructId),
+901    Enum(EnumId),
+902    Contract(ContractId),
+903    Primitive(types::Base),
+904}
+905
+906impl TypeDef {
+907    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+908        match self {
+909            TypeDef::Struct(val) => {
+910                // In the future we probably want to resolve instance methods as well. But this
+911                // would require the caller to pass an instance as the first
+912                // argument e.g. `Rectangle::can_hold(self_instance, other)`.
+913                // This isn't yet supported so for now path access to functions is limited to
+914                // static functions only.
+915                val.pure_functions_as_items(db)
+916            }
+917            TypeDef::Enum(val) => val.pure_functions_as_items(db),
+918            TypeDef::Contract(val) => val.pure_functions_as_items(db),
+919            _ => Rc::new(indexmap! {}),
+920        }
+921    }
+922
+923    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+924        match self {
+925            TypeDef::Alias(id) => id.name(db),
+926            TypeDef::Struct(id) => id.name(db),
+927            TypeDef::Enum(id) => id.name(db),
+928            TypeDef::Contract(id) => id.name(db),
+929            TypeDef::Primitive(typ) => typ.name(),
+930        }
+931    }
+932
+933    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+934        match self {
+935            TypeDef::Alias(id) => Some(id.name_span(db)),
+936            TypeDef::Struct(id) => Some(id.name_span(db)),
+937            TypeDef::Enum(id) => Some(id.name_span(db)),
+938            TypeDef::Contract(id) => Some(id.name_span(db)),
+939            TypeDef::Primitive(_) => None,
+940        }
+941    }
+942
+943    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<Type, TypeError> {
+944        match self {
+945            TypeDef::Alias(id) => Ok(id.type_id(db)?.typ(db)),
+946            TypeDef::Struct(id) => Ok(Type::Struct(*id)),
+947            TypeDef::Enum(id) => Ok(Type::Enum(*id)),
+948            TypeDef::Contract(id) => Ok(Type::Contract(*id)),
+949            TypeDef::Primitive(base) => Ok(Type::Base(*base)),
+950        }
+951    }
+952
+953    pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError> {
+954        Ok(db.intern_type(self.typ(db)?))
+955    }
+956
+957    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+958        match self {
+959            Self::Alias(id) => id.is_public(db),
+960            Self::Struct(id) => id.is_public(db),
+961            Self::Enum(id) => id.is_public(db),
+962            Self::Contract(id) => id.is_public(db),
+963            Self::Primitive(_) => true,
+964        }
+965    }
+966
+967    pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item> {
+968        match self {
+969            TypeDef::Alias(id) => Some(id.parent(db)),
+970            TypeDef::Struct(id) => Some(id.parent(db)),
+971            TypeDef::Enum(id) => Some(id.parent(db)),
+972            TypeDef::Contract(id) => Some(id.parent(db)),
+973            TypeDef::Primitive(_) => None,
+974        }
+975    }
+976
+977    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+978        match self {
+979            TypeDef::Alias(id) => id.sink_diagnostics(db, sink),
+980            TypeDef::Struct(id) => id.sink_diagnostics(db, sink),
+981            TypeDef::Enum(id) => id.sink_diagnostics(db, sink),
+982            TypeDef::Contract(id) => id.sink_diagnostics(db, sink),
+983            TypeDef::Primitive(_) => {}
+984        }
+985    }
+986}
+987
+988#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+989pub struct TypeAlias {
+990    pub ast: Node<ast::TypeAlias>,
+991    pub module: ModuleId,
+992}
+993
+994#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+995pub struct TypeAliasId(pub(crate) u32);
+996impl_intern_key!(TypeAliasId);
+997
+998impl TypeAliasId {
+999    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<TypeAlias> {
+1000        db.lookup_intern_type_alias(*self)
+1001    }
+1002    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1003        self.data(db).ast.span
+1004    }
+1005    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1006        self.data(db).ast.name().into()
+1007    }
+1008    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1009        self.data(db).ast.kind.name.span
+1010    }
+1011    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1012        self.data(db).ast.kind.pub_qual.is_some()
+1013    }
+1014    pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+1015        db.type_alias_type(*self).value
+1016    }
+1017    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1018        Item::Module(self.data(db).module)
+1019    }
+1020    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1021        db.type_alias_type(*self)
+1022            .diagnostics
+1023            .iter()
+1024            .for_each(|d| sink.push(d))
+1025    }
+1026}
+1027
+1028#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1029pub struct Contract {
+1030    pub name: SmolStr,
+1031    pub ast: Node<ast::Contract>,
+1032    pub module: ModuleId,
+1033}
+1034
+1035#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1036pub struct ContractId(pub(crate) u32);
+1037impl_intern_key!(ContractId);
+1038impl ContractId {
+1039    pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId {
+1040        db.intern_type(Type::Contract(*self))
+1041    }
+1042    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Contract> {
+1043        db.lookup_intern_contract(*self)
+1044    }
+1045    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1046        self.data(db).ast.span
+1047    }
+1048    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1049        self.data(db).ast.name().into()
+1050    }
+1051    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1052        self.data(db).ast.kind.pub_qual.is_some()
+1053    }
+1054    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1055        self.data(db).ast.kind.name.span
+1056    }
+1057
+1058    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1059        self.data(db).module
+1060    }
+1061
+1062    pub fn fields(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, ContractFieldId>> {
+1063        db.contract_field_map(*self).value
+1064    }
+1065
+1066    pub fn field_type(
+1067        &self,
+1068        db: &dyn AnalyzerDb,
+1069        name: &str,
+1070    ) -> Option<Result<types::TypeId, TypeError>> {
+1071        // Note: contract field types are wrapped in SPtr in `fn expr_attribute`
+1072        let fields = db.contract_field_map(*self).value;
+1073        Some(fields.get(name)?.typ(db))
+1074    }
+1075
+1076    pub fn resolve_name(
+1077        &self,
+1078        db: &dyn AnalyzerDb,
+1079        name: &str,
+1080    ) -> Result<Option<NamedThing>, IncompleteItem> {
+1081        if let Some(item) = self
+1082            .function(db, name)
+1083            .filter(|f| !f.takes_self(db))
+1084            .map(Item::Function)
+1085        {
+1086            Ok(Some(NamedThing::Item(item)))
+1087        } else {
+1088            self.module(db).resolve_name(db, name)
+1089        }
+1090    }
+1091
+1092    pub fn init_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId> {
+1093        db.contract_init_function(*self).value
+1094    }
+1095
+1096    pub fn call_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId> {
+1097        db.contract_call_function(*self).value
+1098    }
+1099
+1100    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1101        db.contract_all_functions(*self)
+1102    }
+1103
+1104    /// User functions, public and not. Excludes `__init__` and `__call__`.
+1105    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1106        db.contract_function_map(*self).value
+1107    }
+1108
+1109    /// Lookup a function by name. Searches all user functions, private or not.
+1110    /// Excludes `__init__` and `__call__`.
+1111    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1112        self.functions(db).get(name).copied()
+1113    }
+1114
+1115    /// Excludes `__init__` and `__call__`.
+1116    pub fn public_functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1117        db.contract_public_function_map(*self)
+1118    }
+1119
+1120    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1121        Item::Module(self.data(db).module)
+1122    }
+1123
+1124    /// Dependency graph of the contract type, which consists of the field types
+1125    /// and the dependencies of those types.
+1126    ///
+1127    /// NOTE: Contract items should *only*
+1128    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1129        db.contract_dependency_graph(*self).0
+1130    }
+1131
+1132    /// Dependency graph of the (imaginary) `__call__` function, which
+1133    /// dispatches to the contract's public functions.
+1134    pub fn runtime_dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1135        db.contract_runtime_dependency_graph(*self).0
+1136    }
+1137
+1138    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1139        // fields
+1140        db.contract_field_map(*self).sink_diagnostics(sink);
+1141        db.contract_all_fields(*self)
+1142            .iter()
+1143            .for_each(|field| field.sink_diagnostics(db, sink));
+1144
+1145        // functions
+1146        db.contract_init_function(*self).sink_diagnostics(sink);
+1147        db.contract_call_function(*self).sink_diagnostics(sink);
+1148        db.contract_function_map(*self).sink_diagnostics(sink);
+1149        db.contract_all_functions(*self)
+1150            .iter()
+1151            .for_each(|id| id.sink_diagnostics(db, sink));
+1152    }
+1153}
+1154
+1155#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1156pub struct ContractField {
+1157    pub ast: Node<ast::Field>,
+1158    pub parent: ContractId,
+1159}
+1160
+1161#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1162pub struct ContractFieldId(pub(crate) u32);
+1163impl_intern_key!(ContractFieldId);
+1164impl ContractFieldId {
+1165    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1166        self.data(db).ast.name().into()
+1167    }
+1168    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ContractField> {
+1169        db.lookup_intern_contract_field(*self)
+1170    }
+1171    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+1172        db.contract_field_type(*self).value
+1173    }
+1174    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1175        sink.push_all(db.contract_field_type(*self).diagnostics.iter())
+1176    }
+1177}
+1178
+1179#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1180pub struct FunctionSig {
+1181    pub ast: Node<ast::FunctionSignature>,
+1182    pub parent: Option<Item>,
+1183    pub module: ModuleId,
+1184}
+1185
+1186#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1187pub struct FunctionSigId(pub(crate) u32);
+1188impl_intern_key!(FunctionSigId);
+1189
+1190impl FunctionSigId {
+1191    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSig> {
+1192        db.lookup_intern_function_sig(*self)
+1193    }
+1194
+1195    pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool {
+1196        self.signature(db).self_decl.is_some()
+1197    }
+1198
+1199    pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<types::TypeId> {
+1200        match self.parent(db) {
+1201            Item::Type(TypeDef::Contract(cid)) => Some(types::Type::SelfContract(cid).id(db)),
+1202            Item::Type(TypeDef::Struct(sid)) => Some(types::Type::Struct(sid).id(db)),
+1203            Item::Type(TypeDef::Enum(sid)) => Some(types::Type::Enum(sid).id(db)),
+1204            Item::Impl(id) => Some(id.receiver(db)),
+1205            Item::Type(TypeDef::Primitive(ty)) => Some(db.intern_type(Type::Base(ty))),
+1206            _ => None,
+1207        }
+1208    }
+1209    pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1210        Some(self.signature(db).self_decl?.span)
+1211    }
+1212    pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<types::FunctionSignature> {
+1213        db.function_signature(*self).value
+1214    }
+1215
+1216    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1217        self.is_trait_fn(db) || self.is_impl_fn(db) || self.pub_span(db).is_some()
+1218    }
+1219    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1220        self.data(db).ast.kind.name.kind.clone()
+1221    }
+1222    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1223        self.data(db).ast.kind.name.span
+1224    }
+1225    pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1226        self.data(db).ast.kind.unsafe_
+1227    }
+1228    pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool {
+1229        self.name(db) == "__init__"
+1230    }
+1231    pub fn pub_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1232        self.data(db).ast.kind.pub_
+1233    }
+1234
+1235    pub fn self_item(&self, db: &dyn AnalyzerDb) -> Option<Item> {
+1236        let data = self.data(db);
+1237        data.parent
+1238    }
+1239
+1240    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1241        self.self_item(db)
+1242            .unwrap_or_else(|| Item::Module(self.module(db)))
+1243    }
+1244
+1245    /// Looks up the `FunctionId` based on the parent of the function signature
+1246    pub fn function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId> {
+1247        match self.parent(db) {
+1248            Item::Type(TypeDef::Struct(id)) => id.function(db, &self.name(db)),
+1249            Item::Type(TypeDef::Enum(id)) => id.function(db, &self.name(db)),
+1250            Item::Impl(id) => id.function(db, &self.name(db)),
+1251            Item::Type(TypeDef::Contract(id)) => id.function(db, &self.name(db)),
+1252            _ => None,
+1253        }
+1254    }
+1255
+1256    pub fn is_trait_fn(&self, db: &dyn AnalyzerDb) -> bool {
+1257        matches!(self.parent(db), Item::Trait(_))
+1258    }
+1259
+1260    pub fn is_module_fn(&self, db: &dyn AnalyzerDb) -> bool {
+1261        matches!(self.parent(db), Item::Module(_))
+1262    }
+1263
+1264    pub fn is_impl_fn(&self, db: &dyn AnalyzerDb) -> bool {
+1265        matches!(self.parent(db), Item::Impl(_))
+1266    }
+1267
+1268    pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool {
+1269        !self.data(db).ast.kind.generic_params.kind.is_empty()
+1270    }
+1271
+1272    pub fn generic_params(&self, db: &dyn AnalyzerDb) -> Vec<GenericParameter> {
+1273        self.data(db).ast.kind.generic_params.kind.clone()
+1274    }
+1275
+1276    pub fn generic_param(&self, db: &dyn AnalyzerDb, param_name: &str) -> Option<GenericParameter> {
+1277        self.generic_params(db)
+1278            .iter()
+1279            .find(|param| match param {
+1280                GenericParameter::Unbounded(name) if name.kind == param_name => true,
+1281                GenericParameter::Bounded { name, .. } if name.kind == param_name => true,
+1282                _ => false,
+1283            })
+1284            .cloned()
+1285    }
+1286
+1287    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1288        self.data(db).module
+1289    }
+1290
+1291    pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool {
+1292        matches! {self.parent(db), Item::Type(TypeDef::Contract(_))}
+1293    }
+1294
+1295    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1296        sink.push_all(db.function_signature(*self).diagnostics.iter());
+1297    }
+1298}
+1299
+1300#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1301pub struct Function {
+1302    pub ast: Node<ast::Function>,
+1303    pub sig: FunctionSigId,
+1304}
+1305
+1306impl Function {
+1307    pub fn new(
+1308        db: &dyn AnalyzerDb,
+1309        ast: &Node<ast::Function>,
+1310        parent: Option<Item>,
+1311        module: ModuleId,
+1312    ) -> Self {
+1313        let sig = db.intern_function_sig(Rc::new(FunctionSig {
+1314            ast: ast.kind.sig.clone(),
+1315            parent,
+1316            module,
+1317        }));
+1318        Function {
+1319            sig,
+1320            ast: ast.clone(),
+1321        }
+1322    }
+1323}
+1324
+1325#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1326pub struct FunctionId(pub(crate) u32);
+1327impl_intern_key!(FunctionId);
+1328impl FunctionId {
+1329    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Function> {
+1330        db.lookup_intern_function(*self)
+1331    }
+1332    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1333        self.data(db).ast.span
+1334    }
+1335    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1336        self.sig(db).name(db)
+1337    }
+1338    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1339        self.sig(db).name_span(db)
+1340    }
+1341    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1342        self.sig(db).module(db)
+1343    }
+1344    pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<types::TypeId> {
+1345        self.sig(db).self_type(db)
+1346    }
+1347    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1348        self.sig(db).parent(db)
+1349    }
+1350
+1351    pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool {
+1352        self.sig(db).takes_self(db)
+1353    }
+1354    pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1355        self.sig(db).self_span(db)
+1356    }
+1357    pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool {
+1358        self.sig(db).is_generic(db)
+1359    }
+1360    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1361        self.sig(db).is_public(db)
+1362    }
+1363    pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool {
+1364        self.sig(db).is_constructor(db)
+1365    }
+1366    pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool {
+1367        self.unsafe_span(db).is_some()
+1368    }
+1369    pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1370        self.sig(db).unsafe_span(db)
+1371    }
+1372    pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<types::FunctionSignature> {
+1373        db.function_signature(self.data(db).sig).value
+1374    }
+1375    pub fn sig(&self, db: &dyn AnalyzerDb) -> FunctionSigId {
+1376        self.data(db).sig
+1377    }
+1378    pub fn body(&self, db: &dyn AnalyzerDb) -> Rc<context::FunctionBody> {
+1379        db.function_body(*self).value
+1380    }
+1381    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1382        db.function_dependency_graph(*self).0
+1383    }
+1384    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1385        sink.push_all(db.function_signature(self.data(db).sig).diagnostics.iter());
+1386        sink.push_all(db.function_body(*self).diagnostics.iter());
+1387    }
+1388    pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool {
+1389        self.sig(db).is_contract_func(db)
+1390    }
+1391
+1392    pub fn is_test(&self, db: &dyn AnalyzerDb) -> bool {
+1393        Item::Function(*self)
+1394            .attributes(db)
+1395            .iter()
+1396            .any(|attribute| attribute.name(db) == "test")
+1397    }
+1398}
+1399
+1400trait FunctionsAsItems {
+1401    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>>;
+1402
+1403    fn pure_functions_as_items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+1404        Rc::new(
+1405            self.functions(db)
+1406                .iter()
+1407                .filter_map(|(name, field)| {
+1408                    if field.takes_self(db) {
+1409                        None
+1410                    } else {
+1411                        Some((name.to_owned(), Item::Function(*field)))
+1412                    }
+1413                })
+1414                .collect(),
+1415        )
+1416    }
+1417}
+1418
+1419impl FunctionsAsItems for StructId {
+1420    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1421        self.functions(db)
+1422    }
+1423}
+1424
+1425impl FunctionsAsItems for EnumId {
+1426    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1427        self.functions(db)
+1428    }
+1429}
+1430
+1431impl FunctionsAsItems for ContractId {
+1432    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1433        self.functions(db)
+1434    }
+1435}
+1436
+1437#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1438pub struct Struct {
+1439    pub ast: Node<ast::Struct>,
+1440    pub module: ModuleId,
+1441}
+1442
+1443#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1444pub struct StructId(pub(crate) u32);
+1445impl_intern_key!(StructId);
+1446impl StructId {
+1447    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Struct> {
+1448        db.lookup_intern_struct(*self)
+1449    }
+1450    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1451        self.data(db).ast.span
+1452    }
+1453    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1454        self.data(db).ast.name().into()
+1455    }
+1456    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1457        self.data(db).ast.kind.name.span
+1458    }
+1459
+1460    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1461        self.data(db).ast.kind.pub_qual.is_some()
+1462    }
+1463
+1464    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1465        self.data(db).module
+1466    }
+1467
+1468    pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId {
+1469        db.intern_type(Type::Struct(*self))
+1470    }
+1471
+1472    pub fn has_private_field(&self, db: &dyn AnalyzerDb) -> bool {
+1473        self.fields(db).values().any(|field| !field.is_public(db))
+1474    }
+1475
+1476    pub fn field(&self, db: &dyn AnalyzerDb, name: &str) -> Option<StructFieldId> {
+1477        self.fields(db).get(name).copied()
+1478    }
+1479
+1480    pub fn fields(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, StructFieldId>> {
+1481        db.struct_field_map(*self).value
+1482    }
+1483
+1484    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1485        db.struct_all_functions(*self)
+1486    }
+1487
+1488    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1489        db.struct_function_map(*self).value
+1490    }
+1491    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1492        self.functions(db).get(name).copied()
+1493    }
+1494    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1495        Item::Module(self.data(db).module)
+1496    }
+1497    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1498        db.struct_dependency_graph(*self).value.0
+1499    }
+1500    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1501        sink.push_all(db.struct_field_map(*self).diagnostics.iter());
+1502        sink.push_all(db.struct_dependency_graph(*self).diagnostics.iter());
+1503
+1504        db.struct_all_fields(*self)
+1505            .iter()
+1506            .for_each(|id| id.sink_diagnostics(db, sink));
+1507
+1508        db.struct_function_map(*self).sink_diagnostics(sink);
+1509        db.struct_all_functions(*self)
+1510            .iter()
+1511            .for_each(|id| id.sink_diagnostics(db, sink));
+1512    }
+1513}
+1514
+1515#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1516pub struct StructField {
+1517    pub ast: Node<ast::Field>,
+1518    pub parent: StructId,
+1519}
+1520
+1521#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1522pub struct StructFieldId(pub(crate) u32);
+1523impl_intern_key!(StructFieldId);
+1524impl StructFieldId {
+1525    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1526        self.data(db).ast.name().into()
+1527    }
+1528    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1529        self.data(db).ast.span
+1530    }
+1531    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<StructField> {
+1532        db.lookup_intern_struct_field(*self)
+1533    }
+1534    pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<SmolStr> {
+1535        self.data(db)
+1536            .ast
+1537            .kind
+1538            .attributes
+1539            .iter()
+1540            .map(|node| node.kind.clone())
+1541            .collect()
+1542    }
+1543
+1544    pub fn is_indexed(&self, db: &dyn AnalyzerDb) -> bool {
+1545        self.attributes(db).contains(&INDEXED.into())
+1546    }
+1547
+1548    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+1549        db.struct_field_type(*self).value
+1550    }
+1551    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1552        self.data(db).ast.kind.is_pub
+1553    }
+1554
+1555    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1556        db.struct_field_type(*self).sink_diagnostics(sink)
+1557    }
+1558}
+1559
+1560#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1561pub struct Attribute {
+1562    pub ast: Node<SmolStr>,
+1563    pub module: ModuleId,
+1564}
+1565#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1566pub struct AttributeId(pub(crate) u32);
+1567impl_intern_key!(AttributeId);
+1568
+1569impl AttributeId {
+1570    pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Attribute> {
+1571        db.lookup_intern_attribute(self)
+1572    }
+1573    pub fn span(self, db: &dyn AnalyzerDb) -> Span {
+1574        self.data(db).ast.span
+1575    }
+1576    pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr {
+1577        self.data(db).ast.kind.to_owned()
+1578    }
+1579
+1580    pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId {
+1581        self.data(db).module
+1582    }
+1583
+1584    pub fn parent(self, db: &dyn AnalyzerDb) -> Item {
+1585        Item::Module(self.data(db).module)
+1586    }
+1587}
+1588
+1589#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1590pub struct Enum {
+1591    pub ast: Node<ast::Enum>,
+1592    pub module: ModuleId,
+1593}
+1594#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1595pub struct EnumId(pub(crate) u32);
+1596impl_intern_key!(EnumId);
+1597
+1598impl EnumId {
+1599    pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Enum> {
+1600        db.lookup_intern_enum(self)
+1601    }
+1602    pub fn span(self, db: &dyn AnalyzerDb) -> Span {
+1603        self.data(db).ast.span
+1604    }
+1605    pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr {
+1606        self.data(db).ast.name().into()
+1607    }
+1608    pub fn name_span(self, db: &dyn AnalyzerDb) -> Span {
+1609        self.data(db).ast.kind.name.span
+1610    }
+1611
+1612    pub fn as_type(self, db: &dyn AnalyzerDb) -> TypeId {
+1613        db.intern_type(Type::Enum(self))
+1614    }
+1615
+1616    pub fn is_public(self, db: &dyn AnalyzerDb) -> bool {
+1617        self.data(db).ast.kind.pub_qual.is_some()
+1618    }
+1619
+1620    pub fn variant(self, db: &dyn AnalyzerDb, name: &str) -> Option<EnumVariantId> {
+1621        self.variants(db).get(name).copied()
+1622    }
+1623
+1624    pub fn variants(self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, EnumVariantId>> {
+1625        db.enum_variant_map(self).value
+1626    }
+1627
+1628    pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId {
+1629        self.data(db).module
+1630    }
+1631
+1632    pub fn parent(self, db: &dyn AnalyzerDb) -> Item {
+1633        Item::Module(self.data(db).module)
+1634    }
+1635
+1636    pub fn dependency_graph(self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1637        db.enum_dependency_graph(self).value.0
+1638    }
+1639
+1640    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1641        db.enum_all_functions(*self)
+1642    }
+1643
+1644    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1645        db.enum_function_map(*self).value
+1646    }
+1647
+1648    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1649        self.functions(db).get(name).copied()
+1650    }
+1651
+1652    pub fn sink_diagnostics(self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1653        sink.push_all(db.enum_variant_map(self).diagnostics.iter());
+1654        sink.push_all(db.enum_dependency_graph(self).diagnostics.iter());
+1655
+1656        db.enum_all_variants(self)
+1657            .iter()
+1658            .for_each(|variant| variant.sink_diagnostics(db, sink));
+1659
+1660        db.enum_function_map(self).sink_diagnostics(sink);
+1661        db.enum_all_functions(self)
+1662            .iter()
+1663            .for_each(|id| id.sink_diagnostics(db, sink));
+1664    }
+1665}
+1666
+1667#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1668pub struct EnumVariant {
+1669    pub ast: Node<ast::Variant>,
+1670    pub tag: usize,
+1671    pub parent: EnumId,
+1672}
+1673
+1674#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1675pub struct EnumVariantId(pub(crate) u32);
+1676impl_intern_key!(EnumVariantId);
+1677impl EnumVariantId {
+1678    pub fn data(self, db: &dyn AnalyzerDb) -> Rc<EnumVariant> {
+1679        db.lookup_intern_enum_variant(self)
+1680    }
+1681    pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr {
+1682        self.data(db).ast.name().into()
+1683    }
+1684    pub fn span(self, db: &dyn AnalyzerDb) -> Span {
+1685        self.data(db).ast.span
+1686    }
+1687    pub fn name_with_parent(self, db: &dyn AnalyzerDb) -> SmolStr {
+1688        let parent = self.parent(db);
+1689        format!("{}::{}", parent.name(db), self.name(db)).into()
+1690    }
+1691
+1692    pub fn kind(self, db: &dyn AnalyzerDb) -> Result<EnumVariantKind, TypeError> {
+1693        db.enum_variant_kind(self).value
+1694    }
+1695
+1696    pub fn disc(self, db: &dyn AnalyzerDb) -> usize {
+1697        self.data(db).tag
+1698    }
+1699
+1700    pub fn sink_diagnostics(self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1701        db.enum_variant_kind(self).sink_diagnostics(sink)
+1702    }
+1703
+1704    pub fn parent(self, db: &dyn AnalyzerDb) -> EnumId {
+1705        self.data(db).parent
+1706    }
+1707}
+1708
+1709#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1710pub enum EnumVariantKind {
+1711    Unit,
+1712    Tuple(SmallVec<[TypeId; 4]>),
+1713}
+1714
+1715impl EnumVariantKind {
+1716    pub fn display_name(&self) -> &'static str {
+1717        match self {
+1718            Self::Unit => "unit variant",
+1719            Self::Tuple(..) => "tuple variant",
+1720        }
+1721    }
+1722
+1723    pub fn field_len(&self) -> usize {
+1724        match self {
+1725            Self::Unit => 0,
+1726            Self::Tuple(elts) => elts.len(),
+1727        }
+1728    }
+1729
+1730    pub fn is_unit(&self) -> bool {
+1731        matches!(self, Self::Unit)
+1732    }
+1733}
+1734
+1735impl DisplayWithDb for EnumVariantKind {
+1736    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter) -> fmt::Result {
+1737        match self {
+1738            Self::Unit => write!(f, "unit"),
+1739            Self::Tuple(elts) => {
+1740                write!(f, "(")?;
+1741                let mut delim = "";
+1742                for ty in elts {
+1743                    write!(f, "{delim}")?;
+1744                    ty.format(db, f)?;
+1745                    delim = ", ";
+1746                }
+1747                write!(f, ")")
+1748            }
+1749        }
+1750    }
+1751}
+1752
+1753#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1754pub struct Impl {
+1755    pub trait_id: TraitId,
+1756    pub receiver: TypeId,
+1757    pub module: ModuleId,
+1758    pub ast: Node<ast::Impl>,
+1759}
+1760
+1761#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1762pub struct ImplId(pub(crate) u32);
+1763impl_intern_key!(ImplId);
+1764impl ImplId {
+1765    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Impl> {
+1766        db.lookup_intern_impl(*self)
+1767    }
+1768    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1769        self.data(db).ast.span
+1770    }
+1771
+1772    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1773        self.data(db).module
+1774    }
+1775
+1776    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1777        db.impl_all_functions(*self)
+1778    }
+1779
+1780    pub fn trait_id(&self, db: &dyn AnalyzerDb) -> TraitId {
+1781        self.data(db).trait_id
+1782    }
+1783
+1784    pub fn receiver(&self, db: &dyn AnalyzerDb) -> TypeId {
+1785        self.data(db).receiver
+1786    }
+1787
+1788    /// Returns `true` if `other` either is `Self` or the type of the receiver
+1789    pub fn is_receiver_type(&self, other: TypeId, db: &dyn AnalyzerDb) -> bool {
+1790        other == self.receiver(db)
+1791            || other == Type::SelfType(TraitOrType::TypeId(self.receiver(db))).id(db)
+1792    }
+1793
+1794    /// Returns `true` if the `type_in_impl` can stand in for the `type_in_trait` as a type used
+1795    /// for a parameter or as a return type
+1796    pub fn can_stand_in_for(
+1797        &self,
+1798        db: &dyn AnalyzerDb,
+1799        type_in_impl: TypeId,
+1800        type_in_trait: TypeId,
+1801    ) -> bool {
+1802        if type_in_impl == type_in_trait {
+1803            true
+1804        } else {
+1805            self.is_receiver_type(type_in_impl, db)
+1806                && (type_in_trait.is_self_ty(db) || type_in_trait == self.receiver(db))
+1807        }
+1808    }
+1809
+1810    pub fn ast(&self, db: &dyn AnalyzerDb) -> Node<ast::Impl> {
+1811        self.data(db).ast.clone()
+1812    }
+1813
+1814    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1815        db.impl_function_map(*self).value
+1816    }
+1817    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1818        self.functions(db).get(name).copied()
+1819    }
+1820    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1821        Item::Module(self.data(db).module)
+1822    }
+1823    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1824        format!(
+1825            "{}_{}",
+1826            self.trait_id(db).name(db),
+1827            self.receiver(db).display(db)
+1828        )
+1829        .into()
+1830    }
+1831
+1832    fn validate_type_or_trait_is_in_ingot(
+1833        &self,
+1834        db: &dyn AnalyzerDb,
+1835        sink: &mut impl DiagnosticSink,
+1836        type_ingot: Option<IngotId>,
+1837    ) {
+1838        let impl_ingot = self.data(db).module.ingot(db);
+1839        let is_allowed = match type_ingot {
+1840            None => impl_ingot == self.data(db).trait_id.module(db).ingot(db),
+1841            Some(val) => {
+1842                val == impl_ingot || self.data(db).trait_id.module(db).ingot(db) == impl_ingot
+1843            }
+1844        };
+1845
+1846        if !is_allowed {
+1847            sink.push(&errors::fancy_error(
+1848                "illegal `impl`. Either type or trait must be in the same ingot as the `impl`",
+1849                vec![Label::primary(
+1850                    self.data(db).ast.span,
+1851                    format!(
+1852                        "Neither `{}` nor `{}` are in the ingot of the `impl` block",
+1853                        self.data(db).receiver.display(db),
+1854                        self.data(db).trait_id.name(db)
+1855                    ),
+1856                )],
+1857                vec![],
+1858            ))
+1859        }
+1860    }
+1861
+1862    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1863        match &self.data(db).receiver.typ(db) {
+1864            Type::Contract(_)
+1865            | Type::Map(_)
+1866            | Type::SelfContract(_)
+1867            | Type::Generic(_)
+1868            | Type::SelfType(_) => sink.push(&errors::fancy_error(
+1869                format!(
+1870                    "`impl` blocks aren't allowed for {}",
+1871                    self.data(db).receiver.display(db)
+1872                ),
+1873                vec![Label::primary(
+1874                    self.data(db).ast.span,
+1875                    "illegal `impl` block",
+1876                )],
+1877                vec![],
+1878            )),
+1879            Type::Struct(id) => {
+1880                self.validate_type_or_trait_is_in_ingot(db, sink, Some(id.module(db).ingot(db)))
+1881            }
+1882            Type::Enum(id) => {
+1883                self.validate_type_or_trait_is_in_ingot(db, sink, Some(id.module(db).ingot(db)))
+1884            }
+1885            Type::Base(_) | Type::Array(_) | Type::Tuple(_) | Type::String(_) => {
+1886                self.validate_type_or_trait_is_in_ingot(db, sink, None)
+1887            }
+1888            Type::SPtr(_) | Type::Mut(_) => unreachable!(),
+1889        }
+1890
+1891        if !self.trait_id(db).is_public(db) && self.trait_id(db).module(db) != self.module(db) {
+1892            let trait_module_name = self.trait_id(db).module(db).name(db);
+1893            let trait_name = self.trait_id(db).name(db);
+1894            sink.push(&errors::fancy_error(
+1895                     format!(
+1896                         "the trait `{trait_name}` is private",
+1897                     ),
+1898                     vec![
+1899                         Label::primary(self.trait_id(db).data(db).ast.kind.name.span, "this trait is not `pub`"),
+1900                     ],
+1901                     vec![
+1902                         format!("`{trait_name}` can only be used within `{trait_module_name}`"),
+1903                         format!("Hint: use `pub trait {trait_name}` to make `{trait_name}` visible from outside of `{trait_module_name}`"),
+1904                     ],
+1905                 ));
+1906        }
+1907
+1908        for impl_fn in self.all_functions(db).iter() {
+1909            impl_fn.sink_diagnostics(db, sink);
+1910
+1911            if let Some(trait_fn) = self.trait_id(db).function(db, &impl_fn.name(db)) {
+1912                for (impl_param, trait_param) in impl_fn
+1913                    .signature(db)
+1914                    .params
+1915                    .iter()
+1916                    .zip(trait_fn.signature(db).params.iter())
+1917                {
+1918                    let impl_param_ty = impl_param.typ.clone().unwrap();
+1919                    let trait_param_ty = trait_param.typ.clone().unwrap();
+1920                    if self.can_stand_in_for(db, impl_param_ty, trait_param_ty) {
+1921                        continue;
+1922                    } else {
+1923                        sink.push(&errors::fancy_error(
+1924                            format!(
+1925                                "method `{}` has incompatible parameters for `{}` of trait `{}`",
+1926                                impl_fn.name(db),
+1927                                trait_fn.name(db),
+1928                                self.trait_id(db).name(db)
+1929                            ),
+1930                            vec![
+1931                                Label::primary(
+1932                                    impl_fn.data(db).ast.kind.sig.span,
+1933                                    "signature of method in `impl` block",
+1934                                ),
+1935                                Label::primary(
+1936                                    trait_fn.data(db).ast.span,
+1937                                    format!(
+1938                                        "signature of method in trait `{}`",
+1939                                        self.trait_id(db).name(db)
+1940                                    ),
+1941                                ),
+1942                            ],
+1943                            vec![],
+1944                        ));
+1945                        break;
+1946                    }
+1947                }
+1948
+1949                let impl_fn_return_ty = impl_fn.signature(db).return_type.clone().unwrap();
+1950                let trait_fn_return_ty = trait_fn.signature(db).return_type.clone().unwrap();
+1951
+1952                if !self.can_stand_in_for(db, impl_fn_return_ty, trait_fn_return_ty) {
+1953                    // TODO: This could be a nicer, more detailed report
+1954                    sink.push(&errors::fancy_error(
+1955                        format!(
+1956                            "method `{}` has an incompatible return type for `{}` of trait `{}`",
+1957                            impl_fn.name(db),
+1958                            trait_fn.name(db),
+1959                            self.trait_id(db).name(db)
+1960                        ),
+1961                        vec![
+1962                            Label::primary(
+1963                                impl_fn.data(db).ast.kind.sig.span,
+1964                                "signature of method in `impl` block",
+1965                            ),
+1966                            Label::primary(
+1967                                trait_fn.data(db).ast.span,
+1968                                format!(
+1969                                    "signature of method in trait `{}`",
+1970                                    self.trait_id(db).name(db)
+1971                                ),
+1972                            ),
+1973                        ],
+1974                        vec![],
+1975                    ));
+1976                }
+1977
+1978                if impl_fn.takes_self(db) != trait_fn.takes_self(db) {
+1979                    let ((selfy_thing, selfy_span), (non_selfy_thing, non_selfy_span)) =
+1980                        if impl_fn.takes_self(db) {
+1981                            (
+1982                                ("impl", impl_fn.name_span(db)),
+1983                                ("trait", trait_fn.name_span(db)),
+1984                            )
+1985                        } else {
+1986                            (
+1987                                ("trait", trait_fn.name_span(db)),
+1988                                ("impl", impl_fn.name_span(db)),
+1989                            )
+1990                        };
+1991                    sink.push(&errors::fancy_error(
+1992                        format!(
+1993                            "method `{}` has a `self` declaration in the {}, but not in the `{}`",
+1994                            impl_fn.name(db),
+1995                            selfy_thing,
+1996                            non_selfy_thing
+1997                        ),
+1998                        vec![
+1999                            Label::primary(
+2000                                selfy_span,
+2001                                format!("`self` declared on the `{selfy_thing}`"),
+2002                            ),
+2003                            Label::primary(
+2004                                non_selfy_span,
+2005                                format!("no `self` declared on the `{non_selfy_thing}`"),
+2006                            ),
+2007                        ],
+2008                        vec![],
+2009                    ));
+2010                }
+2011            } else {
+2012                sink.push(&errors::fancy_error(
+2013                    format!(
+2014                        "method `{}` is not a member of trait `{}`",
+2015                        impl_fn.name(db),
+2016                        self.trait_id(db).name(db)
+2017                    ),
+2018                    vec![Label::primary(
+2019                        impl_fn.data(db).ast.span,
+2020                        format!("not a member of trait `{}`", self.trait_id(db).name(db)),
+2021                    )],
+2022                    vec![],
+2023                ))
+2024            }
+2025        }
+2026
+2027        for trait_fn in self.trait_id(db).all_functions(db).iter() {
+2028            if self.function(db, &trait_fn.name(db)).is_none() {
+2029                sink.push(&errors::fancy_error(
+2030                    format!(
+2031                        "not all members of trait `{}` implemented, missing: `{}`",
+2032                        self.trait_id(db).name(db),
+2033                        trait_fn.name(db)
+2034                    ),
+2035                    vec![Label::primary(
+2036                        trait_fn.data(db).ast.span,
+2037                        "this trait function is missing in `impl` block",
+2038                    )],
+2039                    vec![],
+2040                ))
+2041            }
+2042        }
+2043    }
+2044}
+2045
+2046#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+2047pub struct Trait {
+2048    pub ast: Node<ast::Trait>,
+2049    pub module: ModuleId,
+2050}
+2051
+2052#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+2053pub struct TraitId(pub(crate) u32);
+2054impl_intern_key!(TraitId);
+2055impl TraitId {
+2056    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Trait> {
+2057        db.lookup_intern_trait(*self)
+2058    }
+2059    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+2060        self.data(db).ast.span
+2061    }
+2062    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+2063        self.data(db).ast.name().into()
+2064    }
+2065    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+2066        self.data(db).ast.kind.name.span
+2067    }
+2068
+2069    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+2070        self.data(db).ast.kind.pub_qual.is_some()
+2071    }
+2072
+2073    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+2074        self.data(db).module
+2075    }
+2076    pub fn as_trait_or_type(&self) -> TraitOrType {
+2077        TraitOrType::TraitId(*self)
+2078    }
+2079    pub fn is_implemented_for(&self, db: &dyn AnalyzerDb, ty: TypeId) -> bool {
+2080        // All encodable structs automagically implement the Emittable trait
+2081        // TODO: Remove this when we have the `Encode / Decode` trait.
+2082        if self.is_std_trait(db, EMITTABLE_TRAIT_NAME) && ty.is_emittable(db) {
+2083            return true;
+2084        }
+2085
+2086        db.all_impls(ty).iter().any(|val| &val.trait_id(db) == self)
+2087    }
+2088
+2089    pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool {
+2090        self.module(db).is_in_std(db)
+2091    }
+2092
+2093    pub fn is_std_trait(&self, db: &dyn AnalyzerDb, name: &str) -> bool {
+2094        self.is_in_std(db) && self.name(db).to_lowercase() == name.to_lowercase()
+2095    }
+2096
+2097    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+2098        Item::Module(self.data(db).module)
+2099    }
+2100    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionSigId]> {
+2101        db.trait_all_functions(*self)
+2102    }
+2103
+2104    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionSigId>> {
+2105        db.trait_function_map(*self).value
+2106    }
+2107
+2108    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+2109        self.functions(db).get(name).copied()
+2110    }
+2111
+2112    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+2113        db.trait_all_functions(*self)
+2114            .iter()
+2115            .for_each(|id| id.sink_diagnostics(db, sink));
+2116    }
+2117}
+2118
+2119pub trait DiagnosticSink {
+2120    fn push(&mut self, diag: &Diagnostic);
+2121    fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>) {
+2122        iter.for_each(|diag| self.push(diag))
+2123    }
+2124}
+2125
+2126impl DiagnosticSink for Vec<Diagnostic> {
+2127    fn push(&mut self, diag: &Diagnostic) {
+2128        self.push(diag.clone())
+2129    }
+2130    fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>) {
+2131        self.extend(iter.cloned())
+2132    }
+2133}
+2134
+2135pub type DepGraph = petgraph::graphmap::DiGraphMap<Item, DepLocality>;
+2136#[derive(Debug, Clone)]
+2137pub struct DepGraphWrapper(pub Rc<DepGraph>);
+2138impl PartialEq for DepGraphWrapper {
+2139    fn eq(&self, other: &DepGraphWrapper) -> bool {
+2140        self.0.all_edges().eq(other.0.all_edges()) && self.0.nodes().eq(other.0.nodes())
+2141    }
+2142}
+2143impl Eq for DepGraphWrapper {}
+2144
+2145/// [`DepGraph`] edge label. "Locality" refers to the deployed state;
+2146/// `Local` dependencies are those that will be compiled together, while
+2147/// `External` dependencies will only be reachable via an evm CALL* op.
+2148#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+2149pub enum DepLocality {
+2150    Local,
+2151    External,
+2152}
+2153
+2154pub fn walk_local_dependencies<F>(graph: &DepGraph, root: Item, mut fun: F)
+2155where
+2156    F: FnMut(Item),
+2157{
+2158    use petgraph::visit::{Bfs, EdgeFiltered};
+2159
+2160    let mut bfs = Bfs::new(
+2161        &EdgeFiltered::from_fn(graph, |(_, _, loc)| *loc == DepLocality::Local),
+2162        root,
+2163    );
+2164    while let Some(node) = bfs.next(graph) {
+2165        fun(node)
+2166    }
+2167}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/mod.rs.html b/compiler-docs/src/fe_analyzer/namespace/mod.rs.html new file mode 100644 index 0000000000..8d6d0727f3 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/mod.rs.html @@ -0,0 +1,3 @@ +mod.rs - source

fe_analyzer/namespace/
mod.rs

1pub mod items;
+2pub mod scopes;
+3pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/scopes.rs.html b/compiler-docs/src/fe_analyzer/namespace/scopes.rs.html new file mode 100644 index 0000000000..e475da40f7 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/scopes.rs.html @@ -0,0 +1,700 @@ +scopes.rs - source

fe_analyzer/namespace/
scopes.rs

1#![allow(unstable_name_collisions)] // expect_none, which ain't gonna be stabilized
+2
+3use crate::context::{
+4    AnalyzerContext, CallType, Constant, ExpressionAttributes, FunctionBody, NamedThing,
+5};
+6use crate::errors::{AlreadyDefined, FatalError, IncompleteItem, TypeError};
+7use crate::namespace::items::{FunctionId, ModuleId};
+8use crate::namespace::items::{Item, TypeDef};
+9use crate::namespace::types::{Type, TypeId};
+10use crate::pattern_analysis::PatternMatrix;
+11use crate::AnalyzerDb;
+12use fe_common::diagnostics::Diagnostic;
+13use fe_common::Span;
+14use fe_parser::{ast, node::NodeId, Label};
+15use fe_parser::{ast::Expr, node::Node};
+16use indexmap::IndexMap;
+17use std::cell::RefCell;
+18use std::collections::BTreeMap;
+19
+20pub struct ItemScope<'a> {
+21    db: &'a dyn AnalyzerDb,
+22    module: ModuleId,
+23    expressions: RefCell<IndexMap<NodeId, ExpressionAttributes>>,
+24    pub diagnostics: RefCell<Vec<Diagnostic>>,
+25}
+26impl<'a> ItemScope<'a> {
+27    pub fn new(db: &'a dyn AnalyzerDb, module: ModuleId) -> Self {
+28        Self {
+29            db,
+30            module,
+31            expressions: RefCell::new(IndexMap::default()),
+32            diagnostics: RefCell::new(vec![]),
+33        }
+34    }
+35}
+36
+37impl<'a> AnalyzerContext for ItemScope<'a> {
+38    fn db(&self) -> &dyn AnalyzerDb {
+39        self.db
+40    }
+41
+42    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes) {
+43        self.expressions
+44            .borrow_mut()
+45            .insert(node.id, attributes)
+46            .expect_none("expression attributes already exist");
+47    }
+48
+49    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes)) {
+50        f(self.expressions.borrow_mut().get_mut(&node.id).unwrap())
+51    }
+52
+53    fn expr_typ(&self, expr: &Node<Expr>) -> Type {
+54        self.expressions
+55            .borrow()
+56            .get(&expr.id)
+57            .unwrap()
+58            .typ
+59            .typ(self.db())
+60    }
+61
+62    fn add_constant(
+63        &self,
+64        _name: &Node<ast::SmolStr>,
+65        _expr: &Node<ast::Expr>,
+66        _value: crate::context::Constant,
+67    ) {
+68        // We use salsa query to get constant. So no need to add constant
+69        // explicitly.
+70    }
+71
+72    fn constant_value_by_name(
+73        &self,
+74        name: &ast::SmolStr,
+75        _span: Span,
+76    ) -> Result<Option<Constant>, IncompleteItem> {
+77        if let Some(constant) = self.module.resolve_constant(self.db, name)? {
+78            // It's ok to ignore an error.
+79            // Diagnostics are already emitted when an error occurs.
+80            Ok(constant.constant_value(self.db).ok())
+81        } else {
+82            Ok(None)
+83        }
+84    }
+85
+86    fn parent(&self) -> Item {
+87        Item::Module(self.module)
+88    }
+89
+90    fn module(&self) -> ModuleId {
+91        self.module
+92    }
+93
+94    fn parent_function(&self) -> FunctionId {
+95        panic!("ItemContext has no parent function")
+96    }
+97
+98    fn add_call(&self, _node: &Node<ast::Expr>, _call_type: CallType) {
+99        unreachable!("Can't call function outside of function")
+100    }
+101    fn get_call(&self, _node: &Node<ast::Expr>) -> Option<CallType> {
+102        unreachable!("Can't call function outside of function")
+103    }
+104
+105    fn is_in_function(&self) -> bool {
+106        false
+107    }
+108
+109    fn inherits_type(&self, _typ: BlockScopeType) -> bool {
+110        false
+111    }
+112
+113    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+114        let resolved = self.module.resolve_name(self.db, name)?;
+115
+116        if let Some(named_thing) = &resolved {
+117            check_visibility(self, named_thing, span);
+118        }
+119
+120        Ok(resolved)
+121    }
+122
+123    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError> {
+124        let resolved = self.module.resolve_path_internal(self.db(), path);
+125
+126        let mut err = None;
+127        for diagnostic in resolved.diagnostics.iter() {
+128            err = Some(self.register_diag(diagnostic.clone()));
+129        }
+130
+131        if let Some(err) = err {
+132            return Err(FatalError::new(err));
+133        }
+134
+135        if let Some(named_thing) = resolved.value {
+136            check_visibility(self, &named_thing, span);
+137            Ok(named_thing)
+138        } else {
+139            let err = self.error("unresolved path item", span, "not found");
+140            Err(FatalError::new(err))
+141        }
+142    }
+143
+144    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing> {
+145        let resolved = self.module.resolve_path_internal(self.db(), path);
+146
+147        if resolved.diagnostics.len() > 0 {
+148            return None;
+149        }
+150
+151        let named_thing = resolved.value?;
+152        if is_visible(self, &named_thing) {
+153            Some(named_thing)
+154        } else {
+155            None
+156        }
+157    }
+158
+159    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing> {
+160        let resolved = self.module.resolve_path_internal(self.db(), path);
+161
+162        if resolved.diagnostics.len() > 0 {
+163            return None;
+164        }
+165
+166        resolved.value
+167    }
+168
+169    fn add_diagnostic(&self, diag: Diagnostic) {
+170        self.diagnostics.borrow_mut().push(diag)
+171    }
+172
+173    /// Gets `std::context::Context` if it exists
+174    fn get_context_type(&self) -> Option<TypeId> {
+175        if let Ok(Some(NamedThing::Item(Item::Type(TypeDef::Struct(id))))) =
+176            // `Context` is guaranteed to be public, so we can use `Span::dummy()` .
+177            self.resolve_name("Context", Span::dummy())
+178        {
+179            // we just assume that there is only one `Context` defined in `std`
+180            if id.module(self.db()).ingot(self.db()).name(self.db()) == "std" {
+181                return Some(self.db().intern_type(Type::Struct(id)));
+182            }
+183        }
+184
+185        None
+186    }
+187}
+188
+189pub struct FunctionScope<'a> {
+190    pub db: &'a dyn AnalyzerDb,
+191    pub function: FunctionId,
+192    pub body: RefCell<FunctionBody>,
+193    pub diagnostics: RefCell<Vec<Diagnostic>>,
+194}
+195
+196impl<'a> FunctionScope<'a> {
+197    pub fn new(db: &'a dyn AnalyzerDb, function: FunctionId) -> Self {
+198        Self {
+199            db,
+200            function,
+201            body: RefCell::new(FunctionBody::default()),
+202            diagnostics: RefCell::new(vec![]),
+203        }
+204    }
+205
+206    pub fn function_return_type(&self) -> Result<TypeId, TypeError> {
+207        self.function.signature(self.db).return_type.clone()
+208    }
+209
+210    pub fn map_variable_type<T>(&self, node: &Node<T>, typ: TypeId) {
+211        self.add_node(node);
+212        self.body
+213            .borrow_mut()
+214            .var_types
+215            .insert(node.id, typ)
+216            .expect_none("variable has already registered")
+217    }
+218
+219    pub fn map_pattern_matrix(&self, node: &Node<ast::FuncStmt>, matrix: PatternMatrix) {
+220        debug_assert!(matches!(node.kind, ast::FuncStmt::Match { .. }));
+221        self.body
+222            .borrow_mut()
+223            .matches
+224            .insert(node.id, matrix)
+225            .expect_none("match statement attributes already exists")
+226    }
+227
+228    fn add_node<T>(&self, node: &Node<T>) {
+229        self.body.borrow_mut().spans.insert(node.id, node.span);
+230    }
+231}
+232
+233impl<'a> AnalyzerContext for FunctionScope<'a> {
+234    fn db(&self) -> &dyn AnalyzerDb {
+235        self.db
+236    }
+237
+238    fn add_diagnostic(&self, diag: Diagnostic) {
+239        self.diagnostics.borrow_mut().push(diag)
+240    }
+241
+242    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes) {
+243        self.add_node(node);
+244        self.body
+245            .borrow_mut()
+246            .expressions
+247            .insert(node.id, attributes)
+248            .expect_none("expression attributes already exist");
+249    }
+250
+251    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes)) {
+252        f(self
+253            .body
+254            .borrow_mut()
+255            .expressions
+256            .get_mut(&node.id)
+257            .unwrap())
+258    }
+259
+260    fn expr_typ(&self, expr: &Node<Expr>) -> Type {
+261        self.body
+262            .borrow()
+263            .expressions
+264            .get(&expr.id)
+265            .unwrap()
+266            .typ
+267            .typ(self.db())
+268    }
+269
+270    fn add_constant(&self, _name: &Node<ast::SmolStr>, expr: &Node<ast::Expr>, value: Constant) {
+271        self.body
+272            .borrow_mut()
+273            .expressions
+274            .get_mut(&expr.id)
+275            .expect("expression attributes must exist before adding constant value")
+276            .const_value = Some(value);
+277    }
+278
+279    fn constant_value_by_name(
+280        &self,
+281        _name: &ast::SmolStr,
+282        _span: Span,
+283    ) -> Result<Option<Constant>, IncompleteItem> {
+284        Ok(None)
+285    }
+286
+287    fn parent(&self) -> Item {
+288        self.function.parent(self.db())
+289    }
+290
+291    fn module(&self) -> ModuleId {
+292        self.function.module(self.db())
+293    }
+294
+295    fn parent_function(&self) -> FunctionId {
+296        self.function
+297    }
+298
+299    fn add_call(&self, node: &Node<ast::Expr>, call_type: CallType) {
+300        // TODO: should probably take the Expr::Call node, rather than the function node
+301        self.add_node(node);
+302        self.body
+303            .borrow_mut()
+304            .calls
+305            .insert(node.id, call_type)
+306            .expect_none("call attributes already exist");
+307    }
+308    fn get_call(&self, node: &Node<ast::Expr>) -> Option<CallType> {
+309        self.body.borrow().calls.get(&node.id).cloned()
+310    }
+311
+312    fn is_in_function(&self) -> bool {
+313        true
+314    }
+315
+316    fn inherits_type(&self, _typ: BlockScopeType) -> bool {
+317        false
+318    }
+319
+320    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+321        let sig = self.function.signature(self.db);
+322
+323        if name == "self" {
+324            return Ok(Some(NamedThing::SelfValue {
+325                decl: sig.self_decl,
+326                parent: self.function.sig(self.db).self_item(self.db),
+327                span: self.function.self_span(self.db),
+328            }));
+329        }
+330
+331        // Getting param names and spans should be simpler
+332        let param = sig.params.iter().find_map(|param| {
+333            (param.name == name).then(|| {
+334                let span = self
+335                    .function
+336                    .data(self.db)
+337                    .ast
+338                    .kind
+339                    .sig
+340                    .kind
+341                    .args
+342                    .iter()
+343                    .find_map(|param| (param.name() == name).then(|| param.name_span()))
+344                    .expect("found param type but not span");
+345
+346                NamedThing::Variable {
+347                    name: name.into(),
+348                    typ: param.typ.clone(),
+349                    is_const: false,
+350                    span,
+351                }
+352            })
+353        });
+354
+355        if let Some(param) = param {
+356            Ok(Some(param))
+357        } else {
+358            let resolved =
+359                if let Item::Type(TypeDef::Contract(contract)) = self.function.parent(self.db) {
+360                    contract.resolve_name(self.db, name)
+361                } else {
+362                    self.function.module(self.db).resolve_name(self.db, name)
+363                }?;
+364
+365            if let Some(named_thing) = &resolved {
+366                check_visibility(self, named_thing, span);
+367            }
+368
+369            Ok(resolved)
+370        }
+371    }
+372
+373    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError> {
+374        let resolved = self
+375            .function
+376            .module(self.db())
+377            .resolve_path_internal(self.db(), path);
+378
+379        let mut err = None;
+380        for diagnostic in resolved.diagnostics.iter() {
+381            err = Some(self.register_diag(diagnostic.clone()));
+382        }
+383
+384        if let Some(err) = err {
+385            return Err(FatalError::new(err));
+386        }
+387
+388        if let Some(named_thing) = resolved.value {
+389            check_visibility(self, &named_thing, span);
+390            Ok(named_thing)
+391        } else {
+392            let err = self.error("unresolved path item", span, "not found");
+393            Err(FatalError::new(err))
+394        }
+395    }
+396
+397    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing> {
+398        let resolved = self
+399            .function
+400            .module(self.db())
+401            .resolve_path_internal(self.db(), path);
+402
+403        if resolved.diagnostics.len() > 0 {
+404            return None;
+405        }
+406
+407        let named_thing = resolved.value?;
+408        if is_visible(self, &named_thing) {
+409            Some(named_thing)
+410        } else {
+411            None
+412        }
+413    }
+414
+415    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing> {
+416        let resolved = self
+417            .function
+418            .module(self.db())
+419            .resolve_path_internal(self.db(), path);
+420
+421        if resolved.diagnostics.len() > 0 {
+422            return None;
+423        }
+424
+425        resolved.value
+426    }
+427
+428    fn get_context_type(&self) -> Option<TypeId> {
+429        if let Ok(Some(NamedThing::Item(Item::Type(TypeDef::Struct(id))))) =
+430            self.resolve_name("Context", Span::dummy())
+431        {
+432            if id.module(self.db()).ingot(self.db()).name(self.db()) == "std" {
+433                return Some(self.db().intern_type(Type::Struct(id)));
+434            }
+435        }
+436
+437        None
+438    }
+439}
+440
+441pub struct BlockScope<'a, 'b> {
+442    pub root: &'a FunctionScope<'b>,
+443    pub parent: Option<&'a BlockScope<'a, 'b>>,
+444    /// Maps Name -> (Type, is_const, span)
+445    pub variable_defs: BTreeMap<String, (TypeId, bool, Span)>,
+446    pub constant_defs: RefCell<BTreeMap<String, Constant>>,
+447    pub typ: BlockScopeType,
+448}
+449
+450#[derive(Clone, Debug, PartialEq, Eq)]
+451pub enum BlockScopeType {
+452    Function,
+453    IfElse,
+454    Match,
+455    MatchArm,
+456    Loop,
+457    Unsafe,
+458}
+459
+460impl AnalyzerContext for BlockScope<'_, '_> {
+461    fn db(&self) -> &dyn AnalyzerDb {
+462        self.root.db
+463    }
+464
+465    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+466        if let Some(var) =
+467            self.variable_defs
+468                .get(name)
+469                .map(|(typ, is_const, span)| NamedThing::Variable {
+470                    name: name.into(),
+471                    typ: Ok(*typ),
+472                    is_const: *is_const,
+473                    span: *span,
+474                })
+475        {
+476            Ok(Some(var))
+477        } else if let Some(parent) = self.parent {
+478            parent.resolve_name(name, span)
+479        } else {
+480            self.root.resolve_name(name, span)
+481        }
+482    }
+483
+484    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes) {
+485        self.root.add_expression(node, attributes)
+486    }
+487
+488    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes)) {
+489        self.root.update_expression(node, f)
+490    }
+491
+492    fn expr_typ(&self, expr: &Node<Expr>) -> Type {
+493        self.root.expr_typ(expr)
+494    }
+495
+496    fn add_constant(&self, name: &Node<ast::SmolStr>, expr: &Node<ast::Expr>, value: Constant) {
+497        self.constant_defs
+498            .borrow_mut()
+499            .insert(name.kind.clone().to_string(), value.clone())
+500            .expect_none("expression attributes already exist");
+501
+502        self.root.add_constant(name, expr, value)
+503    }
+504
+505    fn constant_value_by_name(
+506        &self,
+507        name: &ast::SmolStr,
+508        span: Span,
+509    ) -> Result<Option<Constant>, IncompleteItem> {
+510        if let Some(constant) = self.constant_defs.borrow().get(name.as_str()) {
+511            Ok(Some(constant.clone()))
+512        } else if let Some(parent) = self.parent {
+513            parent.constant_value_by_name(name, span)
+514        } else {
+515            match self.resolve_name(name, span)? {
+516                Some(NamedThing::Item(Item::Constant(constant))) => {
+517                    Ok(constant.constant_value(self.db()).ok())
+518                }
+519                _ => Ok(None),
+520            }
+521        }
+522    }
+523
+524    fn parent(&self) -> Item {
+525        Item::Function(self.root.function)
+526    }
+527
+528    fn module(&self) -> ModuleId {
+529        self.root.module()
+530    }
+531
+532    fn parent_function(&self) -> FunctionId {
+533        self.root.function
+534    }
+535
+536    fn add_call(&self, node: &Node<ast::Expr>, call_type: CallType) {
+537        self.root.add_call(node, call_type)
+538    }
+539
+540    fn get_call(&self, node: &Node<ast::Expr>) -> Option<CallType> {
+541        self.root.get_call(node)
+542    }
+543
+544    fn is_in_function(&self) -> bool {
+545        true
+546    }
+547
+548    fn inherits_type(&self, typ: BlockScopeType) -> bool {
+549        self.typ == typ || self.parent.map_or(false, |scope| scope.inherits_type(typ))
+550    }
+551
+552    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError> {
+553        self.root.resolve_path(path, span)
+554    }
+555
+556    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing> {
+557        self.root.resolve_visible_path(path)
+558    }
+559
+560    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing> {
+561        self.root.resolve_any_path(path)
+562    }
+563
+564    fn add_diagnostic(&self, diag: Diagnostic) {
+565        self.root.diagnostics.borrow_mut().push(diag)
+566    }
+567
+568    fn get_context_type(&self) -> Option<TypeId> {
+569        self.root.get_context_type()
+570    }
+571}
+572
+573impl<'a, 'b> BlockScope<'a, 'b> {
+574    pub fn new(root: &'a FunctionScope<'b>, typ: BlockScopeType) -> Self {
+575        BlockScope {
+576            root,
+577            parent: None,
+578            variable_defs: BTreeMap::new(),
+579            constant_defs: RefCell::new(BTreeMap::new()),
+580            typ,
+581        }
+582    }
+583
+584    pub fn new_child(&'a self, typ: BlockScopeType) -> Self {
+585        BlockScope {
+586            root: self.root,
+587            parent: Some(self),
+588            variable_defs: BTreeMap::new(),
+589            constant_defs: RefCell::new(BTreeMap::new()),
+590            typ,
+591        }
+592    }
+593
+594    /// Add a variable to the block scope.
+595    pub fn add_var(
+596        &mut self,
+597        name: &str,
+598        typ: TypeId,
+599        is_const: bool,
+600        span: Span,
+601    ) -> Result<(), AlreadyDefined> {
+602        match self.resolve_name(name, span) {
+603            Ok(Some(NamedThing::SelfValue { .. })) => {
+604                let err = self.error(
+605                    "`self` can't be used as a variable name",
+606                    span,
+607                    "expected a name, found keyword `self`",
+608                );
+609                Err(AlreadyDefined::new(err))
+610            }
+611
+612            Ok(Some(named_item)) => {
+613                if named_item.is_builtin() {
+614                    let err = self.error(
+615                        &format!(
+616                            "variable name conflicts with built-in {}",
+617                            named_item.item_kind_display_name(),
+618                        ),
+619                        span,
+620                        &format!(
+621                            "`{}` is a built-in {}",
+622                            name,
+623                            named_item.item_kind_display_name()
+624                        ),
+625                    );
+626                    Err(AlreadyDefined::new(err))
+627                } else {
+628                    // It's (currently) an error to shadow a variable in a nested scope
+629                    let err = self.duplicate_name_error(
+630                        &format!("duplicate definition of variable `{name}`"),
+631                        name,
+632                        named_item
+633                            .name_span(self.db())
+634                            .expect("missing name_span of non-builtin"),
+635                        span,
+636                    );
+637                    Err(AlreadyDefined::new(err))
+638                }
+639            }
+640            _ => {
+641                self.variable_defs
+642                    .insert(name.to_string(), (typ, is_const, span));
+643                Ok(())
+644            }
+645        }
+646    }
+647}
+648
+649/// temporary helper until `BTreeMap::try_insert` is stabilized
+650trait OptionExt {
+651    fn expect_none(self, msg: &str);
+652}
+653
+654impl<T> OptionExt for Option<T> {
+655    fn expect_none(self, msg: &str) {
+656        if self.is_some() {
+657            panic!("{}", msg)
+658        }
+659    }
+660}
+661
+662/// Check an item visibility and sink diagnostics if an item is invisible from
+663/// the scope.
+664pub fn check_visibility(context: &dyn AnalyzerContext, named_thing: &NamedThing, span: Span) {
+665    if let NamedThing::Item(item) = named_thing {
+666        let item_module = item
+667            .module(context.db())
+668            .unwrap_or_else(|| context.module());
+669        if !item.is_public(context.db()) && item_module != context.module() {
+670            let module_name = item_module.name(context.db());
+671            let item_name = item.name(context.db());
+672            let item_span = item.name_span(context.db()).unwrap_or(span);
+673            let item_kind_name = item.item_kind_display_name();
+674            context.fancy_error(
+675                &format!("the {item_kind_name} `{item_name}` is private",),
+676                vec![
+677                    Label::primary(span, format!("this {item_kind_name} is not `pub`")),
+678                    Label::secondary(item_span, format!("`{item_name}` is defined here")),
+679                ],
+680                vec![
+681                    format!("`{item_name}` can only be used within `{module_name}`"),
+682                    format!(
+683                        "Hint: use `pub` to make `{item_name}` visible from outside of `{module_name}`",
+684                    ),
+685                ],
+686            );
+687        }
+688    }
+689}
+690
+691fn is_visible(context: &dyn AnalyzerContext, named_thing: &NamedThing) -> bool {
+692    if let NamedThing::Item(item) = named_thing {
+693        let item_module = item
+694            .module(context.db())
+695            .unwrap_or_else(|| context.module());
+696        item.is_public(context.db()) || item_module == context.module()
+697    } else {
+698        true
+699    }
+700}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/types.rs.html b/compiler-docs/src/fe_analyzer/namespace/types.rs.html new file mode 100644 index 0000000000..bf82009d9c --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/types.rs.html @@ -0,0 +1,854 @@ +types.rs - source

fe_analyzer/namespace/
types.rs

1use crate::context::AnalyzerContext;
+2use crate::display::DisplayWithDb;
+3use crate::display::Displayable;
+4use crate::errors::TypeError;
+5use crate::namespace::items::{
+6    ContractId, EnumId, FunctionId, FunctionSigId, ImplId, Item, StructId, TraitId,
+7};
+8use crate::AnalyzerDb;
+9
+10use fe_common::impl_intern_key;
+11use fe_common::Span;
+12use num_bigint::BigInt;
+13use num_traits::ToPrimitive;
+14use smol_str::SmolStr;
+15use std::fmt;
+16use std::rc::Rc;
+17use std::str::FromStr;
+18use strum::{AsRefStr, EnumIter, EnumString};
+19
+20pub fn u256_min() -> BigInt {
+21    BigInt::from(0)
+22}
+23
+24pub fn u256_max() -> BigInt {
+25    BigInt::from(2).pow(256) - 1
+26}
+27
+28pub fn i256_max() -> BigInt {
+29    BigInt::from(2).pow(255) - 1
+30}
+31
+32pub fn i256_min() -> BigInt {
+33    BigInt::from(-2).pow(255)
+34}
+35
+36pub fn address_max() -> BigInt {
+37    BigInt::from(2).pow(160) - 1
+38}
+39
+40/// Names that can be used to build identifiers without collision.
+41pub trait SafeNames {
+42    /// Name in the lower snake format (e.g. lower_snake_case).
+43    fn lower_snake(&self) -> String;
+44}
+45
+46#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+47pub enum Type {
+48    Base(Base),
+49    Array(Array),
+50    Map(Map),
+51    Tuple(Tuple),
+52    String(FeString),
+53    /// An "external" contract. Effectively just a `newtype`d address.
+54    Contract(ContractId),
+55    /// The type of a contract while it's being executed. Ie. the type
+56    /// of `self` within a contract function.
+57    SelfContract(ContractId),
+58    // The type when `Self` is used within a trait or struct
+59    SelfType(TraitOrType),
+60    Struct(StructId),
+61    Enum(EnumId),
+62    Generic(Generic),
+63    SPtr(TypeId),
+64    Mut(TypeId),
+65}
+66
+67#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+68pub enum TraitOrType {
+69    TraitId(TraitId),
+70    TypeId(TypeId),
+71}
+72
+73type TraitFunctionLookup = (Vec<(FunctionId, ImplId)>, Vec<(FunctionId, ImplId)>);
+74
+75#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+76pub struct TypeId(pub(crate) u32);
+77impl_intern_key!(TypeId);
+78impl TypeId {
+79    pub fn unit(db: &dyn AnalyzerDb) -> Self {
+80        db.intern_type(Type::unit())
+81    }
+82    pub fn bool(db: &dyn AnalyzerDb) -> Self {
+83        db.intern_type(Type::bool())
+84    }
+85    pub fn int(db: &dyn AnalyzerDb, int: Integer) -> Self {
+86        db.intern_type(Type::int(int))
+87    }
+88    pub fn address(db: &dyn AnalyzerDb) -> Self {
+89        db.intern_type(Type::Base(Base::Address))
+90    }
+91    pub fn base(db: &dyn AnalyzerDb, t: Base) -> Self {
+92        db.intern_type(Type::Base(t))
+93    }
+94    pub fn tuple(db: &dyn AnalyzerDb, items: &[TypeId]) -> Self {
+95        db.intern_type(Type::Tuple(Tuple {
+96            items: items.into(),
+97        }))
+98    }
+99
+100    pub fn typ(&self, db: &dyn AnalyzerDb) -> Type {
+101        db.lookup_intern_type(*self)
+102    }
+103    pub fn deref_typ(&self, db: &dyn AnalyzerDb) -> Type {
+104        self.deref(db).typ(db)
+105    }
+106    pub fn deref(self, db: &dyn AnalyzerDb) -> TypeId {
+107        match self.typ(db) {
+108            Type::SPtr(inner) => inner,
+109            Type::Mut(inner) => inner.deref(db),
+110            Type::SelfType(TraitOrType::TypeId(inner)) => inner,
+111            _ => self,
+112        }
+113    }
+114    pub fn make_sptr(self, db: &dyn AnalyzerDb) -> TypeId {
+115        Type::SPtr(self).id(db)
+116    }
+117
+118    pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool {
+119        self.typ(db).has_fixed_size(db)
+120    }
+121
+122    /// `true` if Type::Base or Type::Contract (which is just an Address)
+123    pub fn is_primitive(&self, db: &dyn AnalyzerDb) -> bool {
+124        matches!(self.typ(db), Type::Base(_) | Type::Contract(_))
+125    }
+126    pub fn is_bool(&self, db: &dyn AnalyzerDb) -> bool {
+127        matches!(self.typ(db), Type::Base(Base::Bool))
+128    }
+129    pub fn is_contract(&self, db: &dyn AnalyzerDb) -> bool {
+130        matches!(self.typ(db), Type::Contract(_) | Type::SelfContract(_))
+131    }
+132    pub fn is_integer(&self, db: &dyn AnalyzerDb) -> bool {
+133        matches!(self.typ(db), Type::Base(Base::Numeric(_)))
+134    }
+135    pub fn is_map(&self, db: &dyn AnalyzerDb) -> bool {
+136        matches!(self.typ(db), Type::Map(_))
+137    }
+138    pub fn is_string(&self, db: &dyn AnalyzerDb) -> bool {
+139        matches!(self.typ(db), Type::String(_))
+140    }
+141    pub fn is_self_ty(&self, db: &dyn AnalyzerDb) -> bool {
+142        matches!(self.typ(db), Type::SelfType(_))
+143    }
+144    pub fn as_struct(&self, db: &dyn AnalyzerDb) -> Option<StructId> {
+145        if let Type::Struct(id) = self.typ(db) {
+146            Some(id)
+147        } else {
+148            None
+149        }
+150    }
+151    pub fn as_trait_or_type(&self) -> TraitOrType {
+152        TraitOrType::TypeId(*self)
+153    }
+154    pub fn is_struct(&self, db: &dyn AnalyzerDb) -> bool {
+155        matches!(self.typ(db), Type::Struct(_))
+156    }
+157    pub fn is_sptr(&self, db: &dyn AnalyzerDb) -> bool {
+158        match self.typ(db) {
+159            Type::SPtr(_) => true,
+160            Type::Mut(inner) => inner.is_sptr(db),
+161            _ => false,
+162        }
+163    }
+164    pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool {
+165        matches!(self.deref(db).typ(db), Type::Generic(_))
+166    }
+167
+168    pub fn is_mut(&self, db: &dyn AnalyzerDb) -> bool {
+169        matches!(self.typ(db), Type::Mut(_))
+170    }
+171
+172    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+173        self.typ(db).name(db)
+174    }
+175
+176    pub fn kind_display_name(&self, db: &dyn AnalyzerDb) -> &str {
+177        match self.typ(db) {
+178            Type::Contract(_) | Type::SelfContract(_) => "contract",
+179            Type::Struct(_) => "struct",
+180            Type::Array(_) => "array",
+181            Type::Tuple(_) => "tuple",
+182            _ => "type",
+183        }
+184    }
+185
+186    /// Return the `impl` for the given trait. There can only ever be a single
+187    /// implementation per concrete type and trait.
+188    pub fn get_impl_for(&self, db: &dyn AnalyzerDb, trait_: TraitId) -> Option<ImplId> {
+189        db.impl_for(*self, trait_)
+190    }
+191
+192    /// Looks up all possible candidates of the given function name that are implemented via traits.
+193    /// Groups results in two lists, the first contains all theoretical possible candidates and
+194    /// the second contains only those that are actually callable because the trait is in scope.
+195    pub fn trait_function_candidates(
+196        &self,
+197        context: &mut dyn AnalyzerContext,
+198        fn_name: &str,
+199    ) -> TraitFunctionLookup {
+200        let candidates = context
+201            .db()
+202            .all_impls(*self)
+203            .iter()
+204            .cloned()
+205            .filter_map(|_impl| {
+206                _impl
+207                    .function(context.db(), fn_name)
+208                    .map(|fun| (fun, _impl))
+209            })
+210            .collect::<Vec<_>>();
+211
+212        let in_scope_candidates = candidates
+213            .iter()
+214            .cloned()
+215            .filter(|(_, _impl)| {
+216                context
+217                    .module()
+218                    .is_in_scope(context.db(), Item::Trait(_impl.trait_id(context.db())))
+219            })
+220            .collect::<Vec<_>>();
+221
+222        (candidates, in_scope_candidates)
+223    }
+224
+225    /// Signature for the function with the given name defined directly on the type.
+226    /// Does not consider trait impls.
+227    pub fn function_sig(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+228        match self.typ(db) {
+229            Type::SPtr(inner) => inner.function_sig(db, name),
+230            Type::Contract(id) => id.function(db, name).map(|fun| fun.sig(db)),
+231            Type::SelfContract(id) => id.function(db, name).map(|fun| fun.sig(db)),
+232            Type::Struct(id) => id.function(db, name).map(|fun| fun.sig(db)),
+233            Type::Enum(id) => id.function(db, name).map(|fun| fun.sig(db)),
+234            // TODO: This won't hold when we support multiple bounds
+235            Type::Generic(inner) => inner
+236                .bounds
+237                .first()
+238                .and_then(|bound| bound.function(db, name)),
+239            _ => None,
+240        }
+241    }
+242
+243    /// Like `function_sig` but returns a `Vec<FunctionSigId>` which not only
+244    /// considers functions natively implemented on the type but also those
+245    /// that are provided by implemented traits on the type.
+246    pub fn function_sigs(&self, db: &dyn AnalyzerDb, name: &str) -> Rc<[FunctionSigId]> {
+247        db.function_sigs(*self, name.into())
+248    }
+249
+250    pub fn self_function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+251        let fun = self.function_sig(db, name)?;
+252        fun.takes_self(db).then_some(fun)
+253    }
+254
+255    /// Returns `true` if the type qualifies to implement the `Emittable` trait
+256    /// TODO: This function should be removed when we add `Encode / Decode`
+257    /// trait
+258    pub fn is_emittable(self, db: &dyn AnalyzerDb) -> bool {
+259        matches!(self.typ(db), Type::Struct(_)) && self.is_encodable(db).unwrap_or(false)
+260    }
+261
+262    /// Returns `true` if the type is encodable in Solidity ABI.
+263    /// TODO: This function must be removed when we add `Encode`/`Decode` trait.
+264    pub fn is_encodable(self, db: &dyn AnalyzerDb) -> Result<bool, TypeError> {
+265        match self.typ(db) {
+266            Type::Base(_) | Type::String(_) | Type::Contract(_) => Ok(true),
+267            Type::Array(arr) => arr.inner.is_encodable(db),
+268            Type::Struct(sid) => {
+269                // Returns `false` if diagnostics is not empty.
+270                // The diagnostics is properly emitted in struct definition site, so there is no
+271                // need to emit the diagnostics here.
+272                if !db.struct_dependency_graph(sid).diagnostics.is_empty() {
+273                    return Ok(false);
+274                };
+275                let mut res = true;
+276                // We have to continue the iteration even if an item is NOT encodable so that we
+277                // could propagate an error which returned from `item.is_encodable()` for
+278                // keeping consistency.
+279                for (_, &fid) in sid.fields(db).iter() {
+280                    res &= fid.typ(db)?.is_encodable(db)?;
+281                }
+282                Ok(res)
+283            }
+284            Type::Tuple(tup) => {
+285                let mut res = true;
+286                // We have to continue the iteration even if an item is NOT encodable so that we
+287                // could propagate an error which returned from `item.is_encodable()` for
+288                // keeping consistency.
+289                for item in tup.items.iter() {
+290                    res &= item.is_encodable(db)?;
+291                }
+292                Ok(res)
+293            }
+294            Type::Mut(inner) => inner.is_encodable(db),
+295            Type::SelfType(id) => match id {
+296                TraitOrType::TraitId(_) => Ok(false),
+297                TraitOrType::TypeId(id) => id.is_encodable(db),
+298            },
+299            Type::Map(_)
+300            | Type::SelfContract(_)
+301            | Type::Generic(_)
+302            | Type::Enum(_)
+303            | Type::SPtr(_) => Ok(false),
+304        }
+305    }
+306}
+307
+308#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+309pub enum Base {
+310    Numeric(Integer),
+311    Bool,
+312    Address,
+313    Unit,
+314}
+315
+316impl Base {
+317    pub fn name(&self) -> SmolStr {
+318        match self {
+319            Base::Numeric(num) => num.as_ref().into(),
+320            Base::Bool => "bool".into(),
+321            Base::Address => "address".into(),
+322            Base::Unit => "()".into(),
+323        }
+324    }
+325    pub fn u256() -> Base {
+326        Base::Numeric(Integer::U256)
+327    }
+328}
+329
+330#[derive(
+331    Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, AsRefStr, EnumString, EnumIter,
+332)]
+333#[strum(serialize_all = "snake_case")]
+334pub enum Integer {
+335    U256,
+336    U128,
+337    U64,
+338    U32,
+339    U16,
+340    U8,
+341    I256,
+342    I128,
+343    I64,
+344    I32,
+345    I16,
+346    I8,
+347}
+348
+349pub const U256: Base = Base::Numeric(Integer::U256);
+350
+351#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+352pub struct Array {
+353    pub size: usize,
+354    pub inner: TypeId,
+355}
+356
+357#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+358pub struct Map {
+359    pub key: TypeId,
+360    pub value: TypeId,
+361}
+362
+363#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
+364pub struct Generic {
+365    pub name: SmolStr,
+366    pub bounds: Rc<[TraitId]>,
+367}
+368
+369#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+370pub struct Tuple {
+371    pub items: Rc<[TypeId]>,
+372}
+373
+374#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)]
+375pub struct FeString {
+376    pub max_size: usize,
+377}
+378
+379#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+380pub struct FunctionSignature {
+381    pub self_decl: Option<SelfDecl>,
+382    pub ctx_decl: Option<CtxDecl>,
+383    pub params: Vec<FunctionParam>,
+384    pub return_type: Result<TypeId, TypeError>,
+385}
+386
+387#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+388pub struct SelfDecl {
+389    pub span: Span,
+390    pub mut_: Option<Span>,
+391}
+392
+393impl SelfDecl {
+394    pub fn is_mut(&self) -> bool {
+395        self.mut_.is_some()
+396    }
+397}
+398
+399#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+400pub struct CtxDecl {
+401    pub span: Span,
+402    pub mut_: Option<Span>,
+403}
+404
+405#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+406pub struct FunctionParam {
+407    label: Option<SmolStr>,
+408    pub name: SmolStr,
+409    pub typ: Result<TypeId, TypeError>,
+410}
+411impl FunctionParam {
+412    pub fn new(label: Option<&str>, name: &str, typ: Result<TypeId, TypeError>) -> Self {
+413        Self {
+414            label: label.map(SmolStr::new),
+415            name: name.into(),
+416            typ,
+417        }
+418    }
+419    pub fn label(&self) -> Option<&str> {
+420        match &self.label {
+421            Some(label) if label == "_" => None,
+422            Some(label) => Some(label),
+423            None => Some(&self.name),
+424        }
+425    }
+426}
+427
+428#[derive(
+429    Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, EnumString, AsRefStr, EnumIter,
+430)]
+431pub enum GenericType {
+432    Array,
+433    String,
+434    Map,
+435}
+436
+437impl GenericType {
+438    pub fn name(&self) -> SmolStr {
+439        self.as_ref().into()
+440    }
+441    pub fn params(&self) -> Vec<GenericParam> {
+442        match self {
+443            GenericType::String => vec![GenericParam {
+444                name: "max size".into(),
+445                kind: GenericParamKind::Int,
+446            }],
+447            GenericType::Map => vec![
+448                GenericParam {
+449                    name: "key".into(),
+450                    kind: GenericParamKind::PrimitiveType,
+451                },
+452                GenericParam {
+453                    name: "value".into(),
+454                    kind: GenericParamKind::AnyType,
+455                },
+456            ],
+457            GenericType::Array => vec![
+458                GenericParam {
+459                    name: "element type".into(),
+460                    kind: GenericParamKind::AnyType,
+461                },
+462                GenericParam {
+463                    name: "size".into(),
+464                    kind: GenericParamKind::Int,
+465                },
+466            ],
+467        }
+468    }
+469
+470    // see traversal::types::apply_generic_type_args for error checking
+471    pub fn apply(&self, db: &dyn AnalyzerDb, args: &[GenericArg]) -> Option<TypeId> {
+472        let typ = match self {
+473            GenericType::String => match args {
+474                [GenericArg::Int(max_size)] => Some(Type::String(FeString {
+475                    max_size: *max_size,
+476                })),
+477                _ => None,
+478            },
+479            GenericType::Map => match args {
+480                [GenericArg::Type(key), GenericArg::Type(value)] => Some(Type::Map(Map {
+481                    key: *key,
+482                    value: *value,
+483                })),
+484                _ => None,
+485            },
+486            GenericType::Array => match args {
+487                [GenericArg::Type(element), GenericArg::Int(size)] => Some(Type::Array(Array {
+488                    size: *size,
+489                    inner: *element,
+490                })),
+491                _ => None,
+492            },
+493        }?;
+494        Some(db.intern_type(typ))
+495    }
+496}
+497
+498pub struct GenericParam {
+499    pub name: SmolStr,
+500    pub kind: GenericParamKind,
+501}
+502
+503#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+504pub enum GenericParamKind {
+505    Int,
+506
+507    // Ideally these would be represented as trait constraints.
+508    PrimitiveType,
+509    // FixedSizeType, // not needed yet
+510    AnyType,
+511}
+512
+513#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+514pub enum GenericArg {
+515    Int(usize),
+516    Type(TypeId),
+517}
+518
+519impl Integer {
+520    /// Returns `true` if the integer is signed, otherwise `false`
+521    pub fn is_signed(&self) -> bool {
+522        matches!(
+523            self,
+524            Integer::I256
+525                | Integer::I128
+526                | Integer::I64
+527                | Integer::I32
+528                | Integer::I16
+529                | Integer::I8
+530        )
+531    }
+532
+533    pub fn size(&self) -> usize {
+534        match self {
+535            Integer::U256 | Integer::I256 => 32,
+536            Integer::U128 | Integer::I128 => 16,
+537            Integer::U64 | Integer::I64 => 8,
+538            Integer::U32 | Integer::I32 => 4,
+539            Integer::U16 | Integer::I16 => 2,
+540            Integer::U8 | Integer::I8 => 1,
+541        }
+542    }
+543
+544    /// Returns size of integer type in bits.
+545    pub fn bits(&self) -> usize {
+546        self.size() * 8
+547    }
+548
+549    /// Returns `true` if the integer is at least the same size (or larger) than
+550    /// `other`
+551    pub fn can_hold(&self, other: Integer) -> bool {
+552        self.size() >= other.size()
+553    }
+554
+555    /// Returns `true` if `num` represents a number that fits the type
+556    pub fn fits(&self, num: BigInt) -> bool {
+557        match self {
+558            Integer::U8 => num.to_u8().is_some(),
+559            Integer::U16 => num.to_u16().is_some(),
+560            Integer::U32 => num.to_u32().is_some(),
+561            Integer::U64 => num.to_u64().is_some(),
+562            Integer::U128 => num.to_u128().is_some(),
+563            Integer::I8 => num.to_i8().is_some(),
+564            Integer::I16 => num.to_i16().is_some(),
+565            Integer::I32 => num.to_i32().is_some(),
+566            Integer::I64 => num.to_i64().is_some(),
+567            Integer::I128 => num.to_i128().is_some(),
+568            Integer::U256 => num >= u256_min() && num <= u256_max(),
+569            Integer::I256 => num >= i256_min() && num <= i256_max(),
+570        }
+571    }
+572
+573    /// Returns max value of the integer type.
+574    pub fn max_value(&self) -> BigInt {
+575        match self {
+576            Integer::U256 => u256_max(),
+577            Integer::U128 => u128::MAX.into(),
+578            Integer::U64 => u64::MAX.into(),
+579            Integer::U32 => u32::MAX.into(),
+580            Integer::U16 => u16::MAX.into(),
+581            Integer::U8 => u8::MAX.into(),
+582            Integer::I256 => i256_max(),
+583            Integer::I128 => i128::MAX.into(),
+584            Integer::I64 => i64::MAX.into(),
+585            Integer::I32 => i32::MAX.into(),
+586            Integer::I16 => i16::MAX.into(),
+587            Integer::I8 => i8::MAX.into(),
+588        }
+589    }
+590
+591    /// Returns min value of the integer type.
+592    pub fn min_value(&self) -> BigInt {
+593        match self {
+594            Integer::U256 => u256_min(),
+595            Integer::U128 => u128::MIN.into(),
+596            Integer::U64 => u64::MIN.into(),
+597            Integer::U32 => u32::MIN.into(),
+598            Integer::U16 => u16::MIN.into(),
+599            Integer::U8 => u8::MIN.into(),
+600            Integer::I256 => i256_min(),
+601            Integer::I128 => i128::MIN.into(),
+602            Integer::I64 => i64::MIN.into(),
+603            Integer::I32 => i32::MIN.into(),
+604            Integer::I16 => i16::MIN.into(),
+605            Integer::I8 => i8::MIN.into(),
+606        }
+607    }
+608}
+609
+610impl Type {
+611    pub fn id(&self, db: &dyn AnalyzerDb) -> TypeId {
+612        db.intern_type(self.clone())
+613    }
+614
+615    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+616        match self {
+617            Type::Base(inner) => inner.name(),
+618            _ => self.display(db).to_string().into(),
+619        }
+620    }
+621
+622    pub fn def_span(&self, context: &dyn AnalyzerContext) -> Option<Span> {
+623        match self {
+624            Self::Struct(id) => Some(id.span(context.db())),
+625            Self::Contract(id) | Self::SelfContract(id) => Some(id.span(context.db())),
+626            _ => None,
+627        }
+628    }
+629
+630    /// Creates an instance of bool.
+631    pub fn bool() -> Self {
+632        Type::Base(Base::Bool)
+633    }
+634
+635    /// Creates an instance of address.
+636    pub fn address() -> Self {
+637        Type::Base(Base::Address)
+638    }
+639
+640    /// Creates an instance of u256.
+641    pub fn u256() -> Self {
+642        Type::Base(Base::Numeric(Integer::U256))
+643    }
+644
+645    /// Creates an instance of u8.
+646    pub fn u8() -> Self {
+647        Type::Base(Base::Numeric(Integer::U8))
+648    }
+649
+650    /// Creates an instance of `()`.
+651    pub fn unit() -> Self {
+652        Type::Base(Base::Unit)
+653    }
+654
+655    pub fn is_unit(&self) -> bool {
+656        *self == Type::Base(Base::Unit)
+657    }
+658
+659    pub fn int(int_type: Integer) -> Self {
+660        Type::Base(Base::Numeric(int_type))
+661    }
+662
+663    pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool {
+664        match self {
+665            Type::Base(_)
+666            | Type::Array(_)
+667            | Type::Tuple(_)
+668            | Type::String(_)
+669            | Type::Struct(_)
+670            | Type::Enum(_)
+671            | Type::Generic(_)
+672            | Type::Contract(_) => true,
+673            Type::Map(_) | Type::SelfContract(_) => false,
+674            Type::SelfType(inner) => match inner {
+675                TraitOrType::TraitId(_) => true,
+676                TraitOrType::TypeId(id) => id.has_fixed_size(db),
+677            },
+678            Type::SPtr(inner) | Type::Mut(inner) => inner.has_fixed_size(db),
+679        }
+680    }
+681}
+682
+683pub trait TypeDowncast {
+684    fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>;
+685    fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>;
+686    fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>;
+687    fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>;
+688    fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>;
+689}
+690
+691impl TypeDowncast for TypeId {
+692    fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array> {
+693        match self.typ(db) {
+694            Type::Array(inner) => Some(inner),
+695            _ => None,
+696        }
+697    }
+698    fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple> {
+699        match self.typ(db) {
+700            Type::Tuple(inner) => Some(inner),
+701            _ => None,
+702        }
+703    }
+704    fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString> {
+705        match self.typ(db) {
+706            Type::String(inner) => Some(inner),
+707            _ => None,
+708        }
+709    }
+710    fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map> {
+711        match self.typ(db) {
+712            Type::Map(inner) => Some(inner),
+713            _ => None,
+714        }
+715    }
+716    fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer> {
+717        match self.typ(db) {
+718            Type::Base(Base::Numeric(int)) => Some(int),
+719            _ => None,
+720        }
+721    }
+722}
+723
+724impl From<Base> for Type {
+725    fn from(value: Base) -> Self {
+726        Type::Base(value)
+727    }
+728}
+729
+730impl DisplayWithDb for Type {
+731    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+732        use std::fmt::Display;
+733        match self {
+734            Type::Base(inner) => inner.fmt(f),
+735            Type::String(inner) => inner.fmt(f),
+736            Type::Array(arr) => {
+737                write!(f, "Array<{}, {}>", arr.inner.display(db), arr.size)
+738            }
+739            Type::Map(map) => {
+740                let Map { key, value } = map;
+741                write!(f, "Map<{}, {}>", key.display(db), value.display(db),)
+742            }
+743            Type::Tuple(id) => {
+744                write!(f, "(")?;
+745                let mut delim = "";
+746                for item in id.items.iter() {
+747                    write!(f, "{}{}", delim, item.display(db))?;
+748                    delim = ", ";
+749                }
+750                write!(f, ")")
+751            }
+752            Type::Contract(id) | Type::SelfContract(id) => write!(f, "{}", id.name(db)),
+753            Type::Struct(id) => write!(f, "{}", id.name(db)),
+754            Type::Enum(id) => write!(f, "{}", id.name(db)),
+755            Type::Generic(inner) => inner.fmt(f),
+756            Type::SPtr(inner) => write!(f, "SPtr<{}>", inner.display(db)),
+757            Type::Mut(inner) => write!(f, "mut {}", inner.display(db)),
+758            Type::SelfType(_) => write!(f, "Self"),
+759        }
+760    }
+761}
+762impl DisplayWithDb for TypeId {
+763    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+764        self.typ(db).format(db, f)
+765    }
+766}
+767
+768impl fmt::Display for Base {
+769    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+770        let name = match self {
+771            Base::Numeric(int) => return int.fmt(f),
+772            Base::Bool => "bool",
+773            Base::Address => "address",
+774            Base::Unit => "()",
+775        };
+776        write!(f, "{name}")
+777    }
+778}
+779
+780impl fmt::Display for Integer {
+781    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+782        let name = match self {
+783            Integer::U256 => "u256",
+784            Integer::U128 => "u128",
+785            Integer::U64 => "u64",
+786            Integer::U32 => "u32",
+787            Integer::U16 => "u16",
+788            Integer::U8 => "u8",
+789            Integer::I256 => "i256",
+790            Integer::I128 => "i128",
+791            Integer::I64 => "i64",
+792            Integer::I32 => "i32",
+793            Integer::I16 => "i16",
+794            Integer::I8 => "i8",
+795        };
+796        write!(f, "{name}")
+797    }
+798}
+799
+800impl fmt::Display for FeString {
+801    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+802        write!(f, "String<{}>", self.max_size)
+803    }
+804}
+805
+806impl DisplayWithDb for FunctionSignature {
+807    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+808        let FunctionSignature {
+809            self_decl,
+810            ctx_decl: _,
+811            params,
+812            return_type,
+813        } = self;
+814
+815        write!(f, "params: [")?;
+816        let mut delim = "";
+817        if let Some(s) = self_decl {
+818            write!(f, "{}self", if s.mut_.is_some() { "mut " } else { "" },)?;
+819            delim = ", ";
+820        }
+821
+822        for p in params {
+823            write!(
+824                f,
+825                "{}{{ label: {:?}, name: {}, typ: {} }}",
+826                delim,
+827                p.label,
+828                p.name,
+829                p.typ.as_ref().unwrap().display(db),
+830            )?;
+831            delim = ", ";
+832        }
+833        write!(f, "] -> {}", return_type.as_ref().unwrap().display(db))
+834    }
+835}
+836
+837impl fmt::Display for Generic {
+838    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+839        write!(f, "{}", self.name)
+840    }
+841}
+842
+843impl FromStr for Base {
+844    type Err = strum::ParseError;
+845
+846    fn from_str(s: &str) -> Result<Self, Self::Err> {
+847        match s {
+848            "bool" => Ok(Base::Bool),
+849            "address" => Ok(Base::Address),
+850            "()" => Ok(Base::Unit),
+851            _ => Ok(Base::Numeric(Integer::from_str(s)?)),
+852        }
+853    }
+854}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/operations.rs.html b/compiler-docs/src/fe_analyzer/operations.rs.html new file mode 100644 index 0000000000..0364a07575 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/operations.rs.html @@ -0,0 +1,179 @@ +operations.rs - source

fe_analyzer/
operations.rs

1use crate::context::AnalyzerContext;
+2use crate::errors::{BinaryOperationError, IndexingError};
+3use crate::namespace::types::{Array, Integer, Map, TraitOrType, Type, TypeDowncast, TypeId};
+4
+5use crate::traversal::types::{deref_type, try_coerce_type};
+6use fe_parser::{ast as fe, node::Node};
+7
+8/// Finds the type of an index operation and checks types.
+9///
+10/// e.g. `foo[42]`
+11pub fn index(
+12    context: &mut dyn AnalyzerContext,
+13    value: TypeId,
+14    indext: TypeId,
+15    index_expr: &Node<fe::Expr>,
+16) -> Result<TypeId, IndexingError> {
+17    match value.typ(context.db()) {
+18        Type::Array(array) => index_array(context, &array, indext, index_expr),
+19        Type::Map(map) => index_map(context, &map, indext, index_expr),
+20        Type::SPtr(inner) => {
+21            Ok(Type::SPtr(index(context, inner, indext, index_expr)?).id(context.db()))
+22        }
+23        Type::Mut(inner) => {
+24            Ok(Type::Mut(index(context, inner, indext, index_expr)?).id(context.db()))
+25        }
+26        Type::SelfType(id) => match id {
+27            TraitOrType::TypeId(inner) => index(context, inner, indext, index_expr),
+28            TraitOrType::TraitId(_) => Err(IndexingError::NotSubscriptable),
+29        },
+30        Type::Base(_)
+31        | Type::Tuple(_)
+32        | Type::String(_)
+33        | Type::Contract(_)
+34        | Type::SelfContract(_)
+35        | Type::Generic(_)
+36        | Type::Struct(_)
+37        | Type::Enum(_) => Err(IndexingError::NotSubscriptable),
+38    }
+39}
+40
+41pub fn expected_index_type(context: &mut dyn AnalyzerContext, obj: TypeId) -> Option<TypeId> {
+42    match obj.typ(context.db()) {
+43        Type::Array(_) => Some(Type::u256().id(context.db())),
+44        Type::Map(Map { key, .. }) => Some(key),
+45        Type::SPtr(inner) | Type::Mut(inner) => expected_index_type(context, inner),
+46        Type::SelfType(inner) => match inner {
+47            TraitOrType::TraitId(_) => None,
+48            TraitOrType::TypeId(id) => expected_index_type(context, id),
+49        },
+50        Type::Base(_)
+51        | Type::Tuple(_)
+52        | Type::String(_)
+53        | Type::Contract(_)
+54        | Type::SelfContract(_)
+55        | Type::Generic(_)
+56        | Type::Enum(_)
+57        | Type::Struct(_) => None,
+58    }
+59}
+60
+61fn index_array(
+62    context: &mut dyn AnalyzerContext,
+63    array: &Array,
+64    index: TypeId,
+65    index_expr: &Node<fe::Expr>,
+66) -> Result<TypeId, IndexingError> {
+67    let u256 = Type::u256().id(context.db());
+68    if try_coerce_type(context, Some(index_expr), index, u256, false).is_err() {
+69        return Err(IndexingError::WrongIndexType);
+70    }
+71
+72    Ok(array.inner)
+73}
+74
+75fn index_map(
+76    context: &mut dyn AnalyzerContext,
+77    map: &Map,
+78    index: TypeId,
+79    index_expr: &Node<fe::Expr>,
+80) -> Result<TypeId, IndexingError> {
+81    let Map { key, value } = map;
+82
+83    if try_coerce_type(context, Some(index_expr), index, *key, false).is_err() {
+84        return Err(IndexingError::WrongIndexType);
+85    }
+86    Ok(*value)
+87}
+88
+89/// Finds the type of a binary operation and checks types.
+90pub fn bin(
+91    context: &mut dyn AnalyzerContext,
+92    left: TypeId,
+93    left_expr: &Node<fe::Expr>,
+94    op: fe::BinOperator,
+95    right: TypeId,
+96    right_expr: &Node<fe::Expr>,
+97) -> Result<TypeId, BinaryOperationError> {
+98    // Add deref coercions, if necessary (this should always succeed).
+99    let left = deref_type(context, left_expr, left);
+100    let right = deref_type(context, right_expr, right);
+101
+102    if let (Some(left_int), Some(right_int)) =
+103        (left.as_int(context.db()), right.as_int(context.db()))
+104    {
+105        let int = match op {
+106            fe::BinOperator::Add
+107            | fe::BinOperator::Sub
+108            | fe::BinOperator::Mult
+109            | fe::BinOperator::Div
+110            | fe::BinOperator::Mod => {
+111                return bin_arithmetic(context, left, right, right_expr);
+112            }
+113            fe::BinOperator::Pow => bin_pow(left_int, right_int),
+114            fe::BinOperator::LShift | fe::BinOperator::RShift => bin_bit_shift(left_int, right_int),
+115            fe::BinOperator::BitOr | fe::BinOperator::BitXor | fe::BinOperator::BitAnd => {
+116                bin_bit(left_int, right_int)
+117            }
+118        }?;
+119        Ok(TypeId::int(context.db(), int))
+120    } else {
+121        Err(BinaryOperationError::TypesNotNumeric)
+122    }
+123}
+124
+125fn bin_arithmetic(
+126    context: &mut dyn AnalyzerContext,
+127    left: TypeId,
+128    right: TypeId,
+129    right_expr: &Node<fe::Expr>,
+130) -> Result<TypeId, BinaryOperationError> {
+131    // For now, we require that the types be numeric, have the same signedness,
+132    // and that left.size() >= right.size(). (The rules imposed by try_coerce_type)
+133    if try_coerce_type(context, Some(right_expr), right, left, false).is_ok() {
+134        // TODO: loosen up arightmetic type rules.
+135        // The rules should be:
+136        // - Any combination of numeric types can be operated on.
+137        // - If either number is signed, we return a signed type.
+138        // - The larger type is returned.
+139        Ok(left)
+140    } else {
+141        // The types are not equal. Again, there is no need to be this strict.
+142        Err(BinaryOperationError::TypesNotCompatible)
+143    }
+144}
+145
+146fn bin_pow(left: Integer, right: Integer) -> Result<Integer, BinaryOperationError> {
+147    // The exponent is not allowed to be a signed integer. To allow calculations
+148    // such as -2 ** 3 we allow the right hand side to be an unsigned integer
+149    // even if the left side is a signed integer. It is allowed as long as the
+150    // right side is the same size or smaller than the left side (e.g. i16 ** u16
+151    // but not i16 ** u32). The type of the result will be the type of the left
+152    // side and under/overflow checks are based on that type.
+153
+154    if right.is_signed() {
+155        Err(BinaryOperationError::RightIsSigned)
+156    } else if left.can_hold(right) {
+157        Ok(left)
+158    } else {
+159        Err(BinaryOperationError::RightTooLarge)
+160    }
+161}
+162
+163fn bin_bit_shift(left: Integer, right: Integer) -> Result<Integer, BinaryOperationError> {
+164    // The right side must be unsigned.
+165    if right.is_signed() {
+166        Err(BinaryOperationError::RightIsSigned)
+167    } else {
+168        Ok(left)
+169    }
+170}
+171
+172fn bin_bit(left: Integer, right: Integer) -> Result<Integer, BinaryOperationError> {
+173    // We require that both numbers be unsigned and equal in size.
+174    if !left.is_signed() && left == right {
+175        Ok(left)
+176    } else {
+177        Err(BinaryOperationError::NotEqualAndUnsigned)
+178    }
+179}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/assignments.rs.html b/compiler-docs/src/fe_analyzer/traversal/assignments.rs.html new file mode 100644 index 0000000000..fddc5afb45 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/assignments.rs.html @@ -0,0 +1,143 @@ +assignments.rs - source

fe_analyzer/traversal/
assignments.rs

1use crate::context::{AnalyzerContext, DiagnosticVoucher, NamedThing};
+2use crate::errors::FatalError;
+3use crate::namespace::scopes::BlockScope;
+4use crate::namespace::types::{Type, TypeId};
+5use crate::operations;
+6use crate::traversal::expressions;
+7use crate::traversal::utils::add_bin_operations_errors;
+8use fe_common::diagnostics::Label;
+9use fe_parser::ast as fe;
+10use fe_parser::node::{Node, Span};
+11use smol_str::SmolStr;
+12
+13/// Gather context information for assignments and check for type errors.
+14///
+15/// e.g. `foo[42] = "bar"`, `self.foo[42] = "bar"`, `foo = 42`
+16pub fn assign(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+17    let (target, value) = match &stmt.kind {
+18        fe::FuncStmt::Assign { target, value } => (target, value),
+19        _ => unreachable!(),
+20    };
+21    if is_valid_assign_target(scope, target)? {
+22        let lhs_type = assignment_lhs_type(scope, target)?;
+23        expressions::expect_expr_type(scope, value, lhs_type, true)?;
+24    }
+25    Ok(())
+26}
+27
+28/// Logs error if `target` type is not `Mut`.
+29/// Returns `target` type, with `Mut` stripped off.
+30fn assignment_lhs_type(
+31    scope: &mut BlockScope,
+32    target: &Node<fe::Expr>,
+33) -> Result<TypeId, FatalError> {
+34    let ty = expressions::expr_type(scope, target)?;
+35    match ty.typ(scope.db()) {
+36        Type::Mut(inner) => Ok(inner),
+37        _ => {
+38            let mut labels = vec![Label::primary(target.span, "not mutable")];
+39            if let Some((name, span)) = name_def_span(scope, target) {
+40                labels.push(Label::secondary(
+41                    span,
+42                    format!("consider changing this to be mutable: `mut {name}`"),
+43                ));
+44            }
+45            scope.fancy_error(
+46                &format!("cannot modify `{}`, as it is not mutable", &target.kind),
+47                labels,
+48                vec![],
+49            );
+50            Ok(ty)
+51        }
+52    }
+53}
+54
+55fn name_def_span(scope: &BlockScope, expr: &Node<fe::Expr>) -> Option<(SmolStr, Span)> {
+56    match &expr.kind {
+57        fe::Expr::Attribute { value, .. } | fe::Expr::Subscript { value, .. } => {
+58            name_def_span(scope, value)
+59        }
+60        fe::Expr::Name(name) => {
+61            let thing = scope.resolve_name(name, expr.span).ok()??;
+62            thing.name_span(scope.db()).map(|span| (name.clone(), span))
+63        }
+64        _ => None,
+65    }
+66}
+67
+68fn is_valid_assign_target(
+69    scope: &mut BlockScope,
+70    expr: &Node<fe::Expr>,
+71) -> Result<bool, FatalError> {
+72    use fe::Expr::*;
+73
+74    match &expr.kind {
+75        Attribute { .. } | Subscript { .. } => Ok(true),
+76        Tuple { elts } => {
+77            for elt in elts {
+78                if !is_valid_assign_target(scope, elt)? {
+79                    return Ok(false);
+80                }
+81            }
+82            Ok(true)
+83        }
+84
+85        Name(name) => match scope.resolve_name(name, expr.span) {
+86            Ok(Some(NamedThing::SelfValue { .. })) => Ok(true),
+87            Ok(Some(NamedThing::Item(_)) | Some(NamedThing::EnumVariant(_)) | None) => {
+88                bad_assign_target_error(scope, expr, "invalid assignment target");
+89                Ok(false)
+90            }
+91            Ok(Some(NamedThing::Variable { is_const, .. })) => {
+92                if is_const {
+93                    bad_assign_target_error(scope, expr, "cannot assign to a constant value");
+94                }
+95                Ok(!is_const)
+96            }
+97            Err(e) => Err(e.into()),
+98        },
+99        _ => {
+100            bad_assign_target_error(scope, expr, "invalid assignment target");
+101            Ok(false)
+102        }
+103    }
+104}
+105
+106fn bad_assign_target_error(
+107    scope: &mut BlockScope,
+108    expr: &Node<fe::Expr>,
+109    msg: &str,
+110) -> DiagnosticVoucher {
+111    scope.fancy_error(
+112        msg,
+113        vec![Label::primary(expr.span, "")],
+114        vec!["The left side of an assignment can be a variable name, attribute, subscript, or tuple.".into()]
+115    )
+116}
+117
+118/// Gather context information for assignments and check for type errors.
+119pub fn aug_assign(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+120    let (target, op, value) = match &stmt.kind {
+121        fe::FuncStmt::AugAssign { target, op, value } => (target, op, value),
+122        _ => unreachable!(),
+123    };
+124
+125    if is_valid_assign_target(scope, target)? {
+126        let lhs_ty = assignment_lhs_type(scope, target)?;
+127        let rhs = expressions::expr(scope, value, Some(lhs_ty))?;
+128
+129        if let Err(err) = operations::bin(scope, lhs_ty, target, op.kind, rhs.typ, value) {
+130            add_bin_operations_errors(
+131                scope,
+132                &op.kind,
+133                target.span,
+134                lhs_ty,
+135                value.span,
+136                rhs.typ,
+137                err,
+138            );
+139        }
+140    }
+141
+142    Ok(())
+143}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html b/compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html new file mode 100644 index 0000000000..51ef265d96 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html @@ -0,0 +1,110 @@ +borrowck.rs - source

fe_analyzer/traversal/
borrowck.rs

1use super::call_args::LabeledParameter;
+2use crate::context::{AnalyzerContext, NamedThing};
+3use crate::namespace::types::{Type, TypeId};
+4use fe_common::diagnostics::Label;
+5use fe_parser::ast;
+6use fe_parser::node::{Node, Span};
+7use smallvec::{smallvec, SmallVec};
+8
+9// NOTE: This is a temporary solution to the only borrowing bug that's possible
+10// in the current semantics of Fe, namely passing a mutable reference to a
+11// non-primitive object into a fn call, and another reference to that same
+12// object (mutable or otherwise).
+13// This is an ugly brute force solution that will definitely not scale
+14// beyond this simple case, and doesn't do anything smart like allow
+15// disjoint partial borrows.
+16// This should be replaced with a proper borrow checker (presumably operating
+17// on MIR) when Fe gains some kind of reference/projection type.
+18pub fn check_fn_call_arg_borrows(
+19    context: &mut dyn AnalyzerContext,
+20    fn_name: &str,
+21    method_self: Option<(&Node<ast::Expr>, TypeId)>,
+22    args: &[Node<ast::CallArg>],
+23    params: &[impl LabeledParameter],
+24) {
+25    // Return early if there are no mut params.
+26    // This function doesn't attempt to be efficient.
+27    let mut_self = method_self
+28        .map(|(_, ty)| ty.is_mut(context.db()))
+29        .unwrap_or(false);
+30    if !mut_self
+31        && !params
+32            .iter()
+33            .any(|p| p.typ().map(|t| t.is_mut(context.db())).unwrap_or(false))
+34    {
+35        return;
+36    }
+37
+38    // Allocate a new Vec<(arg, ty)> including the method target (if present)
+39    let param_ty = params
+40        .iter()
+41        .map(|p| p.typ().unwrap_or_else(|_| Type::unit().id(context.db())));
+42    let mut args = args
+43        .iter()
+44        .map(|arg| &arg.kind.value)
+45        .zip(param_ty)
+46        .collect::<Vec<_>>();
+47    if let Some((target_expr, ty)) = method_self {
+48        args.insert(0, (target_expr, ty));
+49    }
+50
+51    for (idx, (arg, _)) in args
+52        .iter()
+53        .enumerate()
+54        .filter(|(_, (_, ty))| ty.is_mut(context.db()))
+55    {
+56        // Find the "root" var of the mut arg expr. Eg the root of a.b.c is `a`.
+57        // In the case of a ternary expr, there may be more than one.
+58        // Eg foo(a if x else (b if y else c))
+59        let vars = resolve_expr_root_vars(context, arg);
+60
+61        // Check all other non-primitive args for the same root var.
+62        for (_, (other, _)) in args
+63            .iter()
+64            .enumerate()
+65            .filter(|(i, (_, ty))| *i != idx && !ty.is_primitive(context.db()))
+66        {
+67            let other_vars = resolve_expr_root_vars(context, other);
+68            for (var, var_span) in &vars {
+69                if let Some((_, other_span)) = other_vars.iter().find(|(nt, _)| nt == var) {
+70                    let name = var.name(context.db());
+71                    context.fancy_error(
+72                        &format!("borrow conflict in call to fn `{fn_name}`"),
+73                        vec![
+74                            Label::primary(*var_span, format!("`{name}` is used mutably here")),
+75                            Label::secondary(*other_span, format!("`{name}` is used again here")),
+76                        ],
+77                        vec![],
+78                    );
+79                    return;
+80                }
+81            }
+82        }
+83    }
+84}
+85
+86fn resolve_expr_root_vars(
+87    context: &dyn AnalyzerContext,
+88    expr: &Node<ast::Expr>,
+89) -> SmallVec<[(NamedThing, Span); 2]> {
+90    match &expr.kind {
+91        ast::Expr::Name(name) => match context.resolve_name(name, expr.span) {
+92            Ok(
+93                Some(nt @ NamedThing::Variable { .. }) | Some(nt @ NamedThing::SelfValue { .. }),
+94            ) => smallvec![(nt, expr.span)],
+95            _ => smallvec![],
+96        },
+97
+98        ast::Expr::Attribute { value, .. } | ast::Expr::Subscript { value, .. } => {
+99            resolve_expr_root_vars(context, value)
+100        }
+101        ast::Expr::Ternary {
+102            if_expr, else_expr, ..
+103        } => {
+104            let mut left = resolve_expr_root_vars(context, if_expr);
+105            left.append(&mut resolve_expr_root_vars(context, else_expr));
+106            left
+107        }
+108        _ => smallvec![],
+109    }
+110}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/call_args.rs.html b/compiler-docs/src/fe_analyzer/traversal/call_args.rs.html new file mode 100644 index 0000000000..1761651d20 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/call_args.rs.html @@ -0,0 +1,228 @@ +call_args.rs - source

fe_analyzer/traversal/
call_args.rs

1use super::expressions::{expr, expr_type};
+2use super::types::try_coerce_type;
+3use crate::context::{AnalyzerContext, DiagnosticVoucher};
+4use crate::display::Displayable;
+5use crate::errors::{self, FatalError, TypeCoercionError, TypeError};
+6use crate::namespace::types::{FunctionParam, Generic, Type, TypeId};
+7use fe_common::{diagnostics::Label, utils::humanize::pluralize_conditionally};
+8use fe_common::{Span, Spanned};
+9use fe_parser::ast as fe;
+10use fe_parser::node::Node;
+11use smol_str::SmolStr;
+12
+13pub trait LabeledParameter {
+14    fn label(&self) -> Option<&str>;
+15    fn typ(&self) -> Result<TypeId, TypeError>;
+16    fn is_sink(&self) -> bool;
+17}
+18
+19impl LabeledParameter for FunctionParam {
+20    fn label(&self) -> Option<&str> {
+21        self.label()
+22    }
+23    fn typ(&self) -> Result<TypeId, TypeError> {
+24        self.typ.clone()
+25    }
+26    fn is_sink(&self) -> bool {
+27        false
+28    }
+29}
+30
+31impl LabeledParameter for (SmolStr, Result<TypeId, TypeError>, bool) {
+32    fn label(&self) -> Option<&str> {
+33        Some(&self.0)
+34    }
+35    fn typ(&self) -> Result<TypeId, TypeError> {
+36        self.1.clone()
+37    }
+38    fn is_sink(&self) -> bool {
+39        self.2
+40    }
+41}
+42
+43impl LabeledParameter for (Option<SmolStr>, Result<TypeId, TypeError>, bool) {
+44    fn label(&self) -> Option<&str> {
+45        self.0.as_ref().map(smol_str::SmolStr::as_str)
+46    }
+47    fn typ(&self) -> Result<TypeId, TypeError> {
+48        self.1.clone()
+49    }
+50    fn is_sink(&self) -> bool {
+51        self.2
+52    }
+53}
+54
+55pub fn validate_arg_count(
+56    context: &dyn AnalyzerContext,
+57    name: &str,
+58    name_span: Span,
+59    args: &Node<Vec<impl Spanned>>,
+60    param_count: usize,
+61    argument_word: &str,
+62) -> Option<DiagnosticVoucher> {
+63    if args.kind.len() == param_count {
+64        None
+65    } else {
+66        let mut labels = vec![Label::primary(
+67            name_span,
+68            format!(
+69                "expects {} {}",
+70                param_count,
+71                pluralize_conditionally(argument_word, param_count)
+72            ),
+73        )];
+74        if args.kind.is_empty() {
+75            labels.push(Label::secondary(args.span, "supplied 0 arguments"));
+76        } else {
+77            for arg in &args.kind {
+78                labels.push(Label::secondary(arg.span(), ""));
+79            }
+80            labels.last_mut().unwrap().message = format!(
+81                "supplied {} {}",
+82                args.kind.len(),
+83                pluralize_conditionally(argument_word, args.kind.len())
+84            );
+85        }
+86
+87        Some(context.fancy_error(
+88            &format!(
+89                "`{}` expects {} {}, but {} {} provided",
+90                name,
+91                param_count,
+92                pluralize_conditionally(argument_word, param_count),
+93                args.kind.len(),
+94                pluralize_conditionally(("was", "were"), args.kind.len())
+95            ),
+96            labels,
+97            vec![],
+98        ))
+99        // TODO: add `defined here` label (need span for definition)
+100    }
+101}
+102
+103// TODO: missing label error should suggest adding `_` to fn def
+104pub fn validate_named_args(
+105    context: &mut dyn AnalyzerContext,
+106    name: &str,
+107    name_span: Span,
+108    args: &Node<Vec<Node<fe::CallArg>>>,
+109    params: &[impl LabeledParameter],
+110) -> Result<(), FatalError> {
+111    validate_arg_count(context, name, name_span, args, params.len(), "argument");
+112    // TODO: if the first arg is missing, every other arg will get a label and type
+113    // error
+114
+115    for (index, (param, arg)) in params.iter().zip(args.kind.iter()).enumerate() {
+116        let expected_label = param.label();
+117        let arg_val = &arg.kind.value;
+118        match (expected_label, &arg.kind.label) {
+119            (Some(expected_label), Some(actual_label)) => {
+120                if expected_label != actual_label.kind {
+121                    let notes = if params
+122                        .iter()
+123                        .any(|param| param.label() == Some(actual_label.kind.as_str()))
+124                    {
+125                        vec!["Note: arguments must be provided in order.".into()]
+126                    } else {
+127                        vec![]
+128                    };
+129                    context.fancy_error(
+130                        "argument label mismatch",
+131                        vec![Label::primary(
+132                            actual_label.span,
+133                            format!("expected `{expected_label}`"),
+134                        )],
+135                        notes,
+136                    );
+137                }
+138            }
+139            (Some(expected_label), None) => match &arg_val.kind {
+140                fe::Expr::Name(var_name) if var_name == expected_label => {}
+141                _ => {
+142                    context.fancy_error(
+143                            "missing argument label",
+144                            vec![Label::primary(
+145                                Span::new(arg_val.span.file_id, arg_val.span.start, arg_val.span.start),
+146                                format!("add `{expected_label}:` here"),
+147                            )],
+148                            vec![format!(
+149                                "Note: this label is optional if the argument is a variable named `{expected_label}`."
+150                            )],
+151                        );
+152                }
+153            },
+154            (None, Some(actual_label)) => {
+155                context.error(
+156                    "argument should not be labeled",
+157                    actual_label.span,
+158                    "remove this label",
+159                );
+160            }
+161            (None, None) => {}
+162        }
+163
+164        let param_type = param.typ()?;
+165        // Check arg type
+166        let arg_type =
+167            if let Type::Generic(Generic { bounds, .. }) = param_type.deref_typ(context.db()) {
+168                let arg_type = expr_type(context, &arg.kind.value)?;
+169                for bound in bounds.iter() {
+170                    if !bound.is_implemented_for(context.db(), arg_type) {
+171                        context.error(
+172                            &format!(
+173                                "the trait bound `{}: {}` is not satisfied",
+174                                arg_type.display(context.db()),
+175                                bound.name(context.db())
+176                            ),
+177                            arg.span,
+178                            &format!(
+179                                "the trait `{}` is not implemented for `{}`",
+180                                bound.name(context.db()),
+181                                arg_type.display(context.db()),
+182                            ),
+183                        );
+184                    }
+185                }
+186                arg_type
+187            } else {
+188                let arg_attr = expr(context, &arg.kind.value, Some(param_type))?;
+189                match try_coerce_type(
+190                    context,
+191                    Some(&arg.kind.value),
+192                    arg_attr.typ,
+193                    param_type,
+194                    param.is_sink(),
+195                ) {
+196                    Err(TypeCoercionError::Incompatible) => {
+197                        let msg = if let Some(label) = param.label() {
+198                            format!("incorrect type for `{name}` argument `{label}`")
+199                        } else {
+200                            format!("incorrect type for `{name}` argument at position {index}")
+201                        };
+202                        context.type_error(&msg, arg.kind.value.span, param_type, arg_attr.typ);
+203                    }
+204                    Err(TypeCoercionError::RequiresToMem) => {
+205                        context.add_diagnostic(errors::to_mem_error(arg.span));
+206                    }
+207                    Err(TypeCoercionError::SelfContractType) => {
+208                        context.add_diagnostic(errors::self_contract_type_error(
+209                            arg.span,
+210                            &param_type.display(context.db()),
+211                        ));
+212                    }
+213                    Ok(_) => {}
+214                }
+215                arg_attr.typ
+216            };
+217
+218        if param_type.is_mut(context.db()) && !arg_type.is_mut(context.db()) {
+219            let msg = if let Some(label) = param.label() {
+220                format!("`{name}` argument `{label}` must be mutable")
+221            } else {
+222                format!("`{name}` argument at position {index} must be mutable")
+223            };
+224            context.error(&msg, arg.kind.value.span, "is not `mut`");
+225        }
+226    }
+227    Ok(())
+228}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html b/compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html new file mode 100644 index 0000000000..4ebabe1c64 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html @@ -0,0 +1,370 @@ +const_expr.rs - source

fe_analyzer/traversal/
const_expr.rs

1//! This module provides evaluator for constant expression to resolve const
+2//! generics.
+3
+4use num_bigint::BigInt;
+5use num_traits::{One, ToPrimitive, Zero};
+6
+7use crate::{
+8    context::{AnalyzerContext, Constant},
+9    errors::ConstEvalError,
+10    namespace::types::{self, Base, Type},
+11};
+12
+13use fe_common::{numeric, Span};
+14use fe_parser::{
+15    ast::{self, BinOperator, BoolOperator, CompOperator, UnaryOperator},
+16    node::Node,
+17};
+18
+19/// Evaluate expression.
+20///
+21/// # Panics
+22///
+23/// 1. Panics if type analysis on an `expr` is not performed beforehand.
+24/// 2. Panics if an `expr` has an invalid type.
+25pub(crate) fn eval_expr(
+26    context: &mut dyn AnalyzerContext,
+27    expr: &Node<ast::Expr>,
+28) -> Result<Constant, ConstEvalError> {
+29    let typ = context.expr_typ(expr);
+30
+31    match &expr.kind {
+32        ast::Expr::Ternary {
+33            if_expr,
+34            test,
+35            else_expr,
+36        } => eval_ternary(context, if_expr, test, else_expr),
+37        ast::Expr::BoolOperation { left, op, right } => eval_bool_op(context, left, op, right),
+38        ast::Expr::BinOperation { left, op, right } => eval_bin_op(context, left, op, right, &typ),
+39        ast::Expr::UnaryOperation { op, operand } => eval_unary_op(context, op, operand),
+40        ast::Expr::CompOperation { left, op, right } => eval_comp_op(context, left, op, right),
+41        ast::Expr::Bool(val) => Ok(Constant::Bool(*val)),
+42        ast::Expr::Name(name) => match context.constant_value_by_name(name, expr.span)? {
+43            Some(const_value) => Ok(const_value),
+44            _ => Err(not_const_error(context, expr.span)),
+45        },
+46
+47        ast::Expr::Num(num) => {
+48            // We don't validate the string representing number here,
+49            // because we assume the string has been already validate in type analysis.
+50            let span = expr.span;
+51            Constant::from_num_str(context, num, &typ, span)
+52        }
+53
+54        ast::Expr::Str(s) => Ok(Constant::Str(s.clone())),
+55
+56        // TODO: Need to evaluate attribute getter, constant constructor and const fn call.
+57        ast::Expr::Subscript { .. }
+58        | ast::Expr::Path(_)
+59        | ast::Expr::Attribute { .. }
+60        | ast::Expr::Call { .. }
+61        | ast::Expr::List { .. }
+62        | ast::Expr::Repeat { .. }
+63        | ast::Expr::Tuple { .. }
+64        | ast::Expr::Unit => Err(not_const_error(context, expr.span)),
+65    }
+66}
+67
+68/// Evaluates ternary expression.
+69fn eval_ternary(
+70    context: &mut dyn AnalyzerContext,
+71    then_expr: &Node<ast::Expr>,
+72    cond: &Node<ast::Expr>,
+73    else_expr: &Node<ast::Expr>,
+74) -> Result<Constant, ConstEvalError> {
+75    // In constant evaluation, we don't apply short circuit property for safety.
+76    let then = eval_expr(context, then_expr)?;
+77    let cond = eval_expr(context, cond)?;
+78    let else_ = eval_expr(context, else_expr)?;
+79
+80    match cond {
+81        Constant::Bool(cond) => {
+82            if cond {
+83                Ok(then)
+84            } else {
+85                Ok(else_)
+86            }
+87        }
+88        _ => panic!("ternary condition is not a bool type"),
+89    }
+90}
+91
+92/// Evaluates logical expressions.
+93fn eval_bool_op(
+94    context: &mut dyn AnalyzerContext,
+95    lhs: &Node<ast::Expr>,
+96    op: &Node<ast::BoolOperator>,
+97    rhs: &Node<ast::Expr>,
+98) -> Result<Constant, ConstEvalError> {
+99    // In constant evaluation, we don't apply short circuit property for safety.
+100    let (lhs, rhs) = (eval_expr(context, lhs)?, eval_expr(context, rhs)?);
+101    let (lhs, rhs) = match (lhs, rhs) {
+102        (Constant::Bool(lhs), Constant::Bool(rhs)) => (lhs, rhs),
+103        _ => panic!("an argument of a logical expression is not bool type"),
+104    };
+105
+106    match op.kind {
+107        BoolOperator::And => Ok(Constant::Bool(lhs && rhs)),
+108        BoolOperator::Or => Ok(Constant::Bool(lhs || rhs)),
+109    }
+110}
+111
+112/// Evaluates binary expressions.
+113fn eval_bin_op(
+114    context: &mut dyn AnalyzerContext,
+115    lhs: &Node<ast::Expr>,
+116    op: &Node<ast::BinOperator>,
+117    rhs: &Node<ast::Expr>,
+118    typ: &Type,
+119) -> Result<Constant, ConstEvalError> {
+120    let span = lhs.span + rhs.span;
+121    let lhs_ty = extract_int_typ(&context.expr_typ(lhs));
+122
+123    let (lhs, rhs) = (eval_expr(context, lhs)?, eval_expr(context, rhs)?);
+124    let (lhs, rhs) = (lhs.extract_numeric(), rhs.extract_numeric());
+125
+126    let result = match op.kind {
+127        BinOperator::Add => lhs + rhs,
+128        BinOperator::Sub => lhs - rhs,
+129        BinOperator::Mult => lhs * rhs,
+130
+131        BinOperator::Div => {
+132            if rhs.is_zero() {
+133                return Err(zero_division_error(context, span));
+134            } else if lhs_ty.is_signed() && lhs == &(lhs_ty.min_value()) && rhs == &(-BigInt::one())
+135            {
+136                return Err(overflow_error(context, span));
+137            } else {
+138                lhs / rhs
+139            }
+140        }
+141
+142        BinOperator::Mod => {
+143            if rhs.is_zero() {
+144                return Err(zero_division_error(context, span));
+145            }
+146            lhs % rhs
+147        }
+148
+149        BinOperator::Pow => {
+150            // We assume `rhs` type is unsigned numeric.
+151            if let Some(exponent) = rhs.to_u32() {
+152                lhs.pow(exponent)
+153            } else if lhs.is_zero() {
+154                BigInt::zero()
+155            } else if lhs.is_one() {
+156                BigInt::one()
+157            } else {
+158                // Exponent is larger than u32::MAX and lhs is not zero nor one,
+159                // then this trivially causes overflow.
+160                return Err(overflow_error(context, span));
+161            }
+162        }
+163
+164        BinOperator::LShift => {
+165            if let Some(exponent) = rhs.to_usize() {
+166                let type_bits = lhs_ty.bits();
+167                // If rhs is larger than or equal to lhs type bits, then we emits overflow
+168                // error.
+169                if exponent >= type_bits {
+170                    return Err(overflow_error(context, span));
+171                } else {
+172                    let mask = make_mask(typ);
+173                    (lhs * BigInt::from(2_u8).pow(exponent as u32)) & mask
+174                }
+175            } else {
+176                // If exponent is larger than usize::MAX, it causes trivially overflow.
+177                return Err(overflow_error(context, span));
+178            }
+179        }
+180
+181        BinOperator::RShift => {
+182            if let Some(exponent) = rhs.to_usize() {
+183                let type_bits = lhs_ty.bits();
+184                // If rhs is larger than or equal to lhs type bits, then we emits overflow
+185                // error.
+186                if exponent >= type_bits {
+187                    return Err(overflow_error(context, span));
+188                } else {
+189                    let mask = make_mask(typ);
+190                    (lhs / BigInt::from(2_u8).pow(exponent as u32)) & mask
+191                }
+192            } else {
+193                // If exponent is larger than usize::MAX, it causes trivially overflow.
+194                return Err(overflow_error(context, span));
+195            }
+196        }
+197
+198        BinOperator::BitOr => lhs | rhs,
+199        BinOperator::BitXor => lhs ^ rhs,
+200        BinOperator::BitAnd => lhs & rhs,
+201    };
+202
+203    Constant::make_const_numeric_with_ty(context, result, typ, span)
+204}
+205
+206fn eval_unary_op(
+207    context: &mut dyn AnalyzerContext,
+208    op: &Node<ast::UnaryOperator>,
+209    arg: &Node<ast::Expr>,
+210) -> Result<Constant, ConstEvalError> {
+211    let arg = eval_expr(context, arg)?;
+212
+213    match op.kind {
+214        UnaryOperator::Invert => Ok(Constant::Int(!arg.extract_numeric())),
+215        UnaryOperator::Not => Ok(Constant::Bool(!arg.extract_bool())),
+216        UnaryOperator::USub => Ok(Constant::Int(-arg.extract_numeric())),
+217    }
+218}
+219
+220/// Evaluates comp operation.
+221fn eval_comp_op(
+222    context: &mut dyn AnalyzerContext,
+223    lhs: &Node<ast::Expr>,
+224    op: &Node<ast::CompOperator>,
+225    rhs: &Node<ast::Expr>,
+226) -> Result<Constant, ConstEvalError> {
+227    let (lhs, rhs) = (eval_expr(context, lhs)?, eval_expr(context, rhs)?);
+228
+229    let res = match (lhs, rhs) {
+230        (Constant::Int(lhs), Constant::Int(rhs)) => match op.kind {
+231            CompOperator::Eq => lhs == rhs,
+232            CompOperator::NotEq => lhs != rhs,
+233            CompOperator::Lt => lhs < rhs,
+234            CompOperator::LtE => lhs <= rhs,
+235            CompOperator::Gt => lhs > rhs,
+236            CompOperator::GtE => lhs >= rhs,
+237        },
+238
+239        (Constant::Bool(lhs), Constant::Bool(rhs)) => match op.kind {
+240            CompOperator::Eq => lhs == rhs,
+241            CompOperator::NotEq => lhs != rhs,
+242            CompOperator::Lt => !lhs & rhs,
+243            CompOperator::LtE => lhs <= rhs,
+244            CompOperator::Gt => lhs & !rhs,
+245            CompOperator::GtE => lhs >= rhs,
+246        },
+247
+248        _ => panic!("arguments of comp op have invalid type"),
+249    };
+250
+251    Ok(Constant::Bool(res))
+252}
+253
+254impl Constant {
+255    /// Returns constant from numeric literal represented by string.
+256    ///
+257    /// # Panics
+258    /// Panics if `s` is invalid string for numeric literal.
+259    pub fn from_num_str(
+260        context: &mut dyn AnalyzerContext,
+261        s: &str,
+262        typ: &Type,
+263        span: Span,
+264    ) -> Result<Self, ConstEvalError> {
+265        let literal = numeric::Literal::new(s);
+266        let num = literal.parse::<BigInt>().unwrap();
+267        match typ {
+268            Type::Base(Base::Numeric(_)) => {
+269                Self::make_const_numeric_with_ty(context, num, typ, span)
+270            }
+271            Type::Base(Base::Address) => {
+272                if num >= BigInt::zero() && num <= types::address_max() {
+273                    Ok(Constant::Address(num))
+274                } else {
+275                    Err(overflow_error(context, span))
+276                }
+277            }
+278            _ => unreachable!(),
+279        }
+280    }
+281
+282    /// Returns constant from numeric literal that fits type bits.
+283    /// If `val` doesn't fit type bits, then return `Err`.
+284    ///
+285    /// # Panics
+286    /// Panics if `typ` is invalid string for numeric literal.
+287    fn make_const_numeric_with_ty(
+288        context: &mut dyn AnalyzerContext,
+289        val: BigInt,
+290        typ: &Type,
+291        span: Span,
+292    ) -> Result<Self, ConstEvalError> {
+293        // Overflowing check.
+294        if extract_int_typ(typ).fits(val.clone()) {
+295            Ok(Constant::Int(val))
+296        } else {
+297            Err(overflow_error(context, span))
+298        }
+299    }
+300
+301    /// Extracts numeric value from a `Constant`.
+302    ///
+303    /// # Panics
+304    /// Panics if a `self` variant is not a numeric.
+305    fn extract_numeric(&self) -> &BigInt {
+306        match self {
+307            Constant::Int(val) => val,
+308            _ => panic!("can't extract numeric value from {self:?}"),
+309        }
+310    }
+311
+312    /// Extracts bool value from a `Constant`.
+313    ///
+314    /// # Panics
+315    /// Panics if a `self` variant is not a bool.
+316    fn extract_bool(&self) -> bool {
+317        match self {
+318            Constant::Bool(val) => *val,
+319            _ => panic!("can't extract bool value from {self:?}"),
+320        }
+321    }
+322}
+323
+324fn not_const_error(context: &mut dyn AnalyzerContext, span: Span) -> ConstEvalError {
+325    ConstEvalError::new(context.error(
+326        "expression is not a constant",
+327        span,
+328        "expression is required to be constant here",
+329    ))
+330}
+331
+332fn overflow_error(context: &mut dyn AnalyzerContext, span: Span) -> ConstEvalError {
+333    ConstEvalError::new(context.error(
+334        "overflow error",
+335        span,
+336        "overflow occurred during constant evaluation",
+337    ))
+338}
+339
+340fn zero_division_error(context: &mut dyn AnalyzerContext, span: Span) -> ConstEvalError {
+341    ConstEvalError::new(context.error(
+342        "zero division error",
+343        span,
+344        "zero division occurred during constant evaluation",
+345    ))
+346}
+347
+348/// Returns integer types embedded in `typ`.
+349///
+350/// # Panic
+351/// Panics if `typ` is not a numeric type.
+352fn extract_int_typ(typ: &Type) -> types::Integer {
+353    match typ {
+354        Type::Base(Base::Numeric(int_ty)) => *int_ty,
+355        _ => {
+356            panic!("invalid binop expression type")
+357        }
+358    }
+359}
+360
+361/// Returns bit mask corresponding to typ.
+362/// e.g. If type is `Type::Base(Base::Numeric(Integer::I32))`, then returns
+363/// `0xffff_ffff`.
+364///
+365/// # Panic
+366/// Panics if `typ` is not a numeric type.
+367fn make_mask(typ: &Type) -> BigInt {
+368    let bits = extract_int_typ(typ).bits();
+369    (BigInt::one() << bits) - 1
+370}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/declarations.rs.html b/compiler-docs/src/fe_analyzer/traversal/declarations.rs.html new file mode 100644 index 0000000000..614c4db1fc --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/declarations.rs.html @@ -0,0 +1,174 @@ +declarations.rs - source

fe_analyzer/traversal/
declarations.rs

1use crate::context::AnalyzerContext;
+2use crate::display::Displayable;
+3use crate::errors::{self, FatalError, TypeCoercionError};
+4use crate::namespace::scopes::BlockScope;
+5use crate::namespace::types::{Type, TypeId};
+6use crate::traversal::{const_expr, expressions, types};
+7use fe_common::{diagnostics::Label, utils::humanize::pluralize_conditionally};
+8use fe_parser::ast as fe;
+9use fe_parser::node::Node;
+10
+11/// Gather context information for var declarations and check for type errors.
+12pub fn var_decl(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+13    let (target, typ, value, mut_) = match &stmt.kind {
+14        fe::FuncStmt::VarDecl {
+15            target,
+16            typ,
+17            value,
+18            mut_,
+19        } => (target, typ, value, mut_),
+20        _ => unreachable!(),
+21    };
+22
+23    let self_ty = scope
+24        .parent_function()
+25        .clone()
+26        .self_type(scope.db())
+27        .map(|val| val.as_trait_or_type());
+28    let declared_type = types::type_desc(scope, typ, self_ty)?;
+29    if let Type::Map(_) = declared_type.typ(scope.db()) {
+30        return Err(FatalError::new(scope.error(
+31            "invalid variable type",
+32            typ.span,
+33            "`Map` type can only be used as a contract field",
+34        )));
+35    }
+36
+37    if let Some(value) = value {
+38        let rhs = expressions::expr(scope, value, Some(declared_type))?;
+39        let should_copy = mut_.is_some() || rhs.typ.is_mut(scope.db());
+40        match types::try_coerce_type(scope, Some(value), rhs.typ, declared_type, should_copy) {
+41            Err(TypeCoercionError::RequiresToMem) => {
+42                scope.add_diagnostic(errors::to_mem_error(value.span));
+43            }
+44            Err(TypeCoercionError::Incompatible) => {
+45                scope.type_error(
+46                    "type mismatch",
+47                    value.span,
+48                    declared_type,
+49                    rhs.typ.deref(scope.db()),
+50                );
+51            }
+52            Err(TypeCoercionError::SelfContractType) => {
+53                scope.add_diagnostic(errors::self_contract_type_error(
+54                    value.span,
+55                    &rhs.typ.display(scope.db()),
+56                ));
+57            }
+58            Ok(_) => {}
+59        }
+60    } else if matches!(
+61        declared_type.typ(scope.db()),
+62        Type::Array(_) | Type::Struct(_) | Type::Tuple(_)
+63    ) {
+64        scope.error(
+65            "uninitialized variable",
+66            target.span,
+67            &format!(
+68                "{} types must be initialized at declaration site",
+69                declared_type.kind_display_name(scope.db())
+70            ),
+71        );
+72    }
+73
+74    if mut_.is_some() {
+75        add_var(scope, target, Type::Mut(declared_type).id(scope.db()))?;
+76    } else {
+77        add_var(scope, target, declared_type)?;
+78    }
+79    Ok(())
+80}
+81
+82pub fn const_decl(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+83    if let fe::FuncStmt::ConstantDecl { name, typ, value } = &stmt.kind {
+84        let self_ty = scope
+85            .parent_function()
+86            .clone()
+87            .self_type(scope.db())
+88            .map(|val| val.as_trait_or_type());
+89
+90        let declared_type = match types::type_desc(scope, typ, self_ty) {
+91            Ok(typ) if typ.has_fixed_size(scope.db()) => typ,
+92            _ => {
+93                // If this conversion fails, the type must be a map (for now at least)
+94                return Err(FatalError::new(scope.error(
+95                    "invalid constant type",
+96                    typ.span,
+97                    "`Map` type can only be used as a contract field",
+98                )));
+99            }
+100        };
+101
+102        // Perform semantic analysis before const evaluation.
+103        let value_attributes = expressions::expr(scope, value, Some(declared_type))?;
+104
+105        if declared_type != value_attributes.typ {
+106            scope.type_error(
+107                "type mismatch",
+108                value.span,
+109                declared_type,
+110                value_attributes.typ,
+111            );
+112        }
+113
+114        // Perform constant evaluation.
+115        let const_value = const_expr::eval_expr(scope, value)?;
+116
+117        scope.root.map_variable_type(name, declared_type);
+118        // this logs a message on err, so it's safe to ignore here.
+119        let _ = scope.add_var(name.kind.as_str(), declared_type, true, name.span);
+120        scope.add_constant(name, value, const_value);
+121        return Ok(());
+122    }
+123
+124    unreachable!()
+125}
+126
+127/// Add declared variables to the scope.
+128fn add_var(
+129    scope: &mut BlockScope,
+130    target: &Node<fe::VarDeclTarget>,
+131    typ: TypeId,
+132) -> Result<(), FatalError> {
+133    match &target.kind {
+134        fe::VarDeclTarget::Name(name) => {
+135            scope.root.map_variable_type(target, typ);
+136            // this logs a message on err, so it's safe to ignore here.
+137            let _ = scope.add_var(name, typ, false, target.span);
+138            Ok(())
+139        }
+140        fe::VarDeclTarget::Tuple(items) => {
+141            match typ.typ(scope.db()) {
+142                Type::Tuple(items_ty) => {
+143                    let items_ty = items_ty.items;
+144                    let items_ty_len = items_ty.len();
+145                    if items.len() != items_ty_len {
+146                        return Err(FatalError::new(scope.fancy_error(
+147                            "invalid declaration",
+148                            vec![Label::primary(target.span, "")],
+149                            vec![format!(
+150                                "Tuple declaration has {} {} but the specified tuple type has {} {}",
+151                                items.len(),
+152                                pluralize_conditionally("item", items.len()),
+153                                items_ty_len,
+154                                pluralize_conditionally("item", items_ty_len),
+155                            )],
+156                        )));
+157                    }
+158                    for (item, item_ty) in items.iter().zip(items_ty.iter()) {
+159                        add_var(scope, item, *item_ty)?;
+160                    }
+161                    Ok(())
+162                }
+163                _ => Err(FatalError::new(scope.fancy_error(
+164                    "invalid declaration",
+165                    vec![Label::primary(target.span, "")],
+166                    vec![format!(
+167                        "Tuple declaration targets need to be declared with the tuple type but here the type is {}",
+168                        typ.display(scope.db())
+169                    )]
+170                )))
+171            }
+172        }
+173    }
+174}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/expressions.rs.html b/compiler-docs/src/fe_analyzer/traversal/expressions.rs.html new file mode 100644 index 0000000000..7e0f04f5d8 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/expressions.rs.html @@ -0,0 +1,2214 @@ +expressions.rs - source

fe_analyzer/traversal/
expressions.rs

1use super::borrowck;
+2use crate::builtins::{ContractTypeMethod, GlobalFunction, Intrinsic, ValueMethod};
+3use crate::context::{AnalyzerContext, CallType, Constant, ExpressionAttributes, NamedThing};
+4use crate::display::Displayable;
+5use crate::errors::{self, FatalError, IndexingError, TypeCoercionError};
+6use crate::namespace::items::{
+7    EnumVariantId, EnumVariantKind, FunctionId, FunctionSigId, ImplId, Item, StructId, TypeDef,
+8};
+9use crate::namespace::scopes::{check_visibility, BlockScopeType};
+10use crate::namespace::types::{
+11    self, Array, Base, FeString, Integer, TraitOrType, Tuple, Type, TypeDowncast, TypeId,
+12};
+13use crate::operations;
+14use crate::traversal::call_args::{validate_arg_count, validate_named_args};
+15use crate::traversal::const_expr::eval_expr;
+16use crate::traversal::types::{
+17    apply_generic_type_args, deref_type, try_cast_type, try_coerce_type,
+18};
+19use crate::traversal::utils::add_bin_operations_errors;
+20
+21use fe_common::diagnostics::Label;
+22use fe_common::{numeric, Span};
+23use fe_parser::ast as fe;
+24use fe_parser::ast::GenericArg;
+25use fe_parser::node::Node;
+26use num_bigint::BigInt;
+27use num_traits::{ToPrimitive, Zero};
+28use smol_str::SmolStr;
+29use std::ops::RangeInclusive;
+30use std::str::FromStr;
+31
+32// TODO: don't fail fatally if expected type is provided
+33
+34pub fn expr_type(
+35    context: &mut dyn AnalyzerContext,
+36    exp: &Node<fe::Expr>,
+37) -> Result<TypeId, FatalError> {
+38    expr(context, exp, None).map(|attr| attr.typ)
+39}
+40
+41pub fn expect_expr_type(
+42    context: &mut dyn AnalyzerContext,
+43    exp: &Node<fe::Expr>,
+44    expected: TypeId,
+45    sink: bool,
+46) -> Result<ExpressionAttributes, FatalError> {
+47    let attr = expr(context, exp, Some(expected))?;
+48
+49    match try_coerce_type(context, Some(exp), attr.typ, expected, sink) {
+50        Err(TypeCoercionError::RequiresToMem) => {
+51            context.add_diagnostic(errors::to_mem_error(exp.span));
+52        }
+53        Err(TypeCoercionError::Incompatible) => {
+54            context.type_error(
+55                "type mismatch",
+56                exp.span,
+57                expected.deref(context.db()),
+58                attr.typ.deref(context.db()),
+59            );
+60        }
+61        Err(TypeCoercionError::SelfContractType) => {
+62            context.add_diagnostic(errors::self_contract_type_error(
+63                exp.span,
+64                &attr.typ.display(context.db()),
+65            ));
+66        }
+67        Ok(_) => {}
+68    }
+69    Ok(attr)
+70}
+71
+72pub fn value_expr_type(
+73    context: &mut dyn AnalyzerContext,
+74    exp: &Node<fe::Expr>,
+75    expected: Option<TypeId>,
+76) -> Result<TypeId, FatalError> {
+77    let attr = expr(context, exp, expected)?;
+78    Ok(deref_type(context, exp, attr.typ))
+79}
+80
+81/// Gather context information for expressions and check for type errors.
+82pub fn expr(
+83    context: &mut dyn AnalyzerContext,
+84    exp: &Node<fe::Expr>,
+85    expected: Option<TypeId>,
+86) -> Result<ExpressionAttributes, FatalError> {
+87    let attr = match &exp.kind {
+88        fe::Expr::Name(_) => expr_name(context, exp, expected),
+89        fe::Expr::Path(_) => expr_path(context, exp, expected),
+90        fe::Expr::Num(_) => Ok(expr_num(context, exp, expected)),
+91
+92        fe::Expr::Subscript { .. } => expr_subscript(context, exp, expected),
+93        fe::Expr::Attribute { .. } => expr_attribute(context, exp, expected),
+94        fe::Expr::Ternary { .. } => expr_ternary(context, exp, expected),
+95        fe::Expr::BoolOperation { .. } => expr_bool_operation(context, exp),
+96        fe::Expr::BinOperation { .. } => expr_bin_operation(context, exp, expected),
+97        fe::Expr::UnaryOperation { .. } => expr_unary_operation(context, exp, expected),
+98        fe::Expr::CompOperation { .. } => expr_comp_operation(context, exp),
+99        fe::Expr::Call {
+100            func,
+101            generic_args,
+102            args,
+103        } => expr_call(context, func, generic_args, args, expected),
+104        fe::Expr::List { elts } => expr_list(context, elts, expected),
+105        fe::Expr::Repeat { .. } => expr_repeat(context, exp, expected),
+106        fe::Expr::Tuple { .. } => expr_tuple(context, exp, expected),
+107        fe::Expr::Str(_) => expr_str(context, exp, expected),
+108        fe::Expr::Bool(_) => Ok(ExpressionAttributes::new(TypeId::bool(context.db()))),
+109        fe::Expr::Unit => Ok(ExpressionAttributes::new(TypeId::unit(context.db()))),
+110    }?;
+111    context.add_expression(exp, attr.clone());
+112    Ok(attr)
+113}
+114
+115pub fn error_if_not_bool(
+116    context: &mut dyn AnalyzerContext,
+117    exp: &Node<fe::Expr>,
+118    msg: &str,
+119) -> Result<(), FatalError> {
+120    let bool_type = TypeId::bool(context.db());
+121    let attr = expr(context, exp, Some(bool_type))?;
+122    if try_coerce_type(context, Some(exp), attr.typ, bool_type, false).is_err() {
+123        context.type_error(msg, exp.span, bool_type, attr.typ);
+124    }
+125    Ok(())
+126}
+127
+128fn expr_list(
+129    context: &mut dyn AnalyzerContext,
+130    elts: &[Node<fe::Expr>],
+131    expected_type: Option<TypeId>,
+132) -> Result<ExpressionAttributes, FatalError> {
+133    let expected_inner = expected_type
+134        .and_then(|id| id.deref(context.db()).as_array(context.db()))
+135        .map(|arr| arr.inner);
+136
+137    if elts.is_empty() {
+138        return Ok(ExpressionAttributes::new(context.db().intern_type(
+139            Type::Array(Array {
+140                size: 0,
+141                inner: expected_inner.unwrap_or_else(|| TypeId::unit(context.db())),
+142            }),
+143        )));
+144    }
+145
+146    let inner_type = if let Some(inner) = expected_inner {
+147        for elt in elts {
+148            expect_expr_type(context, elt, inner, true)?;
+149        }
+150        inner
+151    } else {
+152        let first_attr = expr(context, &elts[0], None)?;
+153
+154        // Assuming every element attribute should match the attribute of 0th element
+155        // of list.
+156        for elt in &elts[1..] {
+157            let element_attributes = expr(context, elt, Some(first_attr.typ))?;
+158
+159            match try_coerce_type(
+160                context,
+161                Some(elt),
+162                element_attributes.typ,
+163                first_attr.typ,
+164                true,
+165            ) {
+166                Err(TypeCoercionError::RequiresToMem) => {
+167                    context.add_diagnostic(errors::to_mem_error(elt.span));
+168                }
+169                Err(TypeCoercionError::Incompatible) => {
+170                    context.fancy_error(
+171                        "array elements must have same type",
+172                        vec![
+173                            Label::primary(
+174                                elts[0].span,
+175                                format!("this has type `{}`", first_attr.typ.display(context.db())),
+176                            ),
+177                            Label::secondary(
+178                                elt.span,
+179                                format!(
+180                                    "this has type `{}`",
+181                                    element_attributes.typ.display(context.db())
+182                                ),
+183                            ),
+184                        ],
+185                        vec![],
+186                    );
+187                }
+188                Err(TypeCoercionError::SelfContractType) => {
+189                    context.add_diagnostic(errors::self_contract_type_error(
+190                        elt.span,
+191                        &first_attr.typ.display(context.db()),
+192                    ));
+193                }
+194                Ok(_) => {}
+195            }
+196        }
+197        first_attr.typ
+198    };
+199
+200    Ok(ExpressionAttributes::new(
+201        Type::Array(Array {
+202            size: elts.len(),
+203            inner: inner_type,
+204        })
+205        .id(context.db()),
+206    ))
+207}
+208
+209fn expr_repeat(
+210    context: &mut dyn AnalyzerContext,
+211    exp: &Node<fe::Expr>,
+212    expected_type: Option<TypeId>,
+213) -> Result<ExpressionAttributes, FatalError> {
+214    let (value, len) = match &exp.kind {
+215        fe::Expr::Repeat { value, len } => (value, len),
+216        _ => unreachable!(),
+217    };
+218
+219    let expected_inner = expected_type
+220        .and_then(|id| id.deref(context.db()).as_array(context.db()))
+221        .map(|arr| arr.inner);
+222
+223    let value = expr(context, value, expected_inner)?;
+224
+225    let size = match &len.kind {
+226        GenericArg::Int(size) => Ok(size.kind),
+227        GenericArg::TypeDesc(_) => Err(context.fancy_error(
+228            "expected a constant u256 value",
+229            vec![Label::primary(len.span, "Array length")],
+230            vec!["Note: Array length must be a constant u256".to_string()],
+231        )),
+232        GenericArg::ConstExpr(exp) => {
+233            expr(context, exp, None)?;
+234            if let Constant::Int(len) = eval_expr(context, exp)? {
+235                Ok(len.to_usize().unwrap())
+236            } else {
+237                Err(context.fancy_error(
+238                    "expected a constant u256 value",
+239                    vec![Label::primary(len.span, "Array length")],
+240                    vec!["Note: Array length must be a constant u256".to_string()],
+241                ))
+242            }
+243        }
+244    };
+245
+246    match size {
+247        Ok(size) => Ok(ExpressionAttributes::new(
+248            Type::Array(Array {
+249                size,
+250                inner: value.typ,
+251            })
+252            .id(context.db()),
+253        )),
+254
+255        Err(diag) => {
+256            if let Some(expected) = expected_type {
+257                Ok(ExpressionAttributes::new(expected))
+258            } else {
+259                Err(FatalError::new(diag))
+260            }
+261        }
+262    }
+263}
+264
+265fn expr_tuple(
+266    context: &mut dyn AnalyzerContext,
+267    exp: &Node<fe::Expr>,
+268    expected_type: Option<TypeId>,
+269) -> Result<ExpressionAttributes, FatalError> {
+270    let expected_items = expected_type.and_then(|id| {
+271        id.deref(context.db())
+272            .as_tuple(context.db())
+273            .map(|tup| tup.items)
+274    });
+275
+276    if let fe::Expr::Tuple { elts } = &exp.kind {
+277        let types = elts
+278            .iter()
+279            .enumerate()
+280            .map(|(idx, elt)| {
+281                let exp_type = expected_items
+282                    .as_ref()
+283                    .and_then(|items| items.get(idx).copied());
+284
+285                expr(context, elt, exp_type).map(|attributes| attributes.typ)
+286            })
+287            .collect::<Result<Vec<_>, _>>()?;
+288
+289        if !&types.iter().all(|id| id.has_fixed_size(context.db())) {
+290            // TODO: doesn't need to be fatal if expected.is_some()
+291            return Err(FatalError::new(context.error(
+292                "variable size types can not be part of tuples",
+293                exp.span,
+294                "",
+295            )));
+296        }
+297
+298        Ok(ExpressionAttributes::new(context.db().intern_type(
+299            Type::Tuple(Tuple {
+300                items: types.to_vec().into(),
+301            }),
+302        )))
+303    } else {
+304        unreachable!()
+305    }
+306}
+307
+308fn expr_name(
+309    context: &mut dyn AnalyzerContext,
+310    exp: &Node<fe::Expr>,
+311    expected_type: Option<TypeId>,
+312) -> Result<ExpressionAttributes, FatalError> {
+313    let name = match &exp.kind {
+314        fe::Expr::Name(name) => name,
+315        _ => unreachable!(),
+316    };
+317
+318    let name_thing = context.resolve_name(name, exp.span)?;
+319    expr_named_thing(context, exp, name_thing, expected_type)
+320}
+321
+322fn expr_path(
+323    context: &mut dyn AnalyzerContext,
+324    exp: &Node<fe::Expr>,
+325    expected_type: Option<TypeId>,
+326) -> Result<ExpressionAttributes, FatalError> {
+327    let path = match &exp.kind {
+328        fe::Expr::Path(path) => path,
+329        _ => unreachable!(),
+330    };
+331
+332    let named_thing = context.resolve_path(path, exp.span)?;
+333    expr_named_thing(context, exp, Some(named_thing), expected_type)
+334}
+335
+336fn expr_named_thing(
+337    context: &mut dyn AnalyzerContext,
+338    exp: &Node<fe::Expr>,
+339    named_thing: Option<NamedThing>,
+340    expected_type: Option<TypeId>,
+341) -> Result<ExpressionAttributes, FatalError> {
+342    let ty = match named_thing {
+343        Some(NamedThing::Variable { typ, .. }) => Ok(typ?),
+344        Some(NamedThing::SelfValue { decl, parent, .. }) => {
+345            if let Some(target) = parent {
+346                if decl.is_none() {
+347                    context.fancy_error(
+348                        "`self` is not defined",
+349                        vec![Label::primary(exp.span, "undefined value")],
+350                        if let Item::Function(func_id) = context.parent() {
+351                            vec![
+352                                "add `self` to the scope by including it in the function signature"
+353                                    .to_string(),
+354                                format!(
+355                                    "Example: `fn {}(self, foo: bool)`",
+356                                    func_id.name(context.db())
+357                                ),
+358                            ]
+359                        } else {
+360                            vec!["can't use `self` outside of function".to_string()]
+361                        },
+362                    );
+363                }
+364
+365                let mut self_typ = match target {
+366                    Item::Type(TypeDef::Struct(s)) => Type::Struct(s).id(context.db()),
+367                    Item::Type(TypeDef::Enum(e)) => Type::Enum(e).id(context.db()),
+368                    Item::Impl(id) => id.receiver(context.db()),
+369
+370                    // This can only happen when trait methods can implement a default body
+371                    Item::Trait(id) => {
+372                        return Err(FatalError::new(context.fancy_error(
+373                            &format!(
+374                                "`{}` is a trait, and can't be used as an expression",
+375                                exp.kind
+376                            ),
+377                            vec![
+378                                Label::primary(
+379                                    id.name_span(context.db()),
+380                                    format!("`{}` is defined here as a trait", exp.kind),
+381                                ),
+382                                Label::primary(
+383                                    exp.span,
+384                                    format!("`{}` is used here as a value", exp.kind),
+385                                ),
+386                            ],
+387                            vec![],
+388                        )))
+389                    }
+390                    Item::Type(TypeDef::Contract(c)) => Type::SelfContract(c).id(context.db()),
+391                    _ => unreachable!(),
+392                };
+393                // If there's no `self` param, let it be mut to avoid confusing errors
+394                if decl.map(|d| d.mut_.is_some()).unwrap_or(true) {
+395                    self_typ = Type::Mut(self_typ).id(context.db());
+396                }
+397                Ok(self_typ)
+398            } else {
+399                Err(context.fancy_error(
+400                    "`self` can only be used in contract, struct, trait or impl functions",
+401                    vec![Label::primary(
+402                        exp.span,
+403                        "not allowed in functions defined directly in a module",
+404                    )],
+405                    vec![],
+406                ))
+407            }
+408        }
+409        Some(NamedThing::Item(Item::Constant(id))) => {
+410            let typ = id.typ(context.db())?;
+411
+412            if !typ.has_fixed_size(context.db()) {
+413                panic!("const type must be fixed size")
+414            }
+415
+416            Ok(typ)
+417        }
+418        Some(NamedThing::EnumVariant(variant)) => {
+419            if let Ok(EnumVariantKind::Tuple(_)) = variant.kind(context.db()) {
+420                let name = variant.name_with_parent(context.db());
+421                context.fancy_error(
+422                    &format!(
+423                        "`{}` is not a unit variant",
+424                        variant.name_with_parent(context.db()),
+425                    ),
+426                    vec![
+427                        Label::primary(exp.span, format! {"`{name}` is not a unit variant"}),
+428                        Label::secondary(
+429                            variant.data(context.db()).ast.span,
+430                            format!("`{}` is defined here", variant.name(context.db())),
+431                        ),
+432                    ],
+433                    vec![],
+434                );
+435            }
+436
+437            Ok(variant.parent(context.db()).as_type(context.db()))
+438        }
+439
+440        Some(item) => {
+441            let item_kind = item.item_kind_display_name();
+442            let diag = if let Some(def_span) = item.name_span(context.db()) {
+443                context.fancy_error(
+444                    &format!(
+445                        "`{}` is a {} name, and can't be used as an expression",
+446                        exp.kind, item_kind
+447                    ),
+448                    vec![
+449                        Label::primary(
+450                            def_span,
+451                            format!("`{}` is defined here as a {}", exp.kind, item_kind),
+452                        ),
+453                        Label::primary(exp.span, format!("`{}` is used here as a value", exp.kind)),
+454                    ],
+455                    vec![],
+456                )
+457            } else {
+458                context.error(
+459                    &format!(
+460                        "`{}` is a built-in {} name, and can't be used as an expression",
+461                        exp.kind, item_kind
+462                    ),
+463                    exp.span,
+464                    &format!("`{}` is used here as a value", exp.kind),
+465                )
+466            };
+467            Err(diag)
+468        }
+469        None => Err(context.error(
+470            &format!("cannot find value `{}` in this scope", exp.kind),
+471            exp.span,
+472            "undefined",
+473        )),
+474    };
+475    match ty {
+476        Ok(ty) => Ok(ExpressionAttributes::new(ty)),
+477        Err(diag) => {
+478            if let Some(expected) = expected_type {
+479                Ok(ExpressionAttributes::new(expected))
+480            } else {
+481                Err(FatalError::new(diag))
+482            }
+483        }
+484    }
+485}
+486
+487fn expr_str(
+488    context: &mut dyn AnalyzerContext,
+489    exp: &Node<fe::Expr>,
+490    expected_type: Option<TypeId>,
+491) -> Result<ExpressionAttributes, FatalError> {
+492    if let fe::Expr::Str(string) = &exp.kind {
+493        if !is_valid_string(string) {
+494            context.error("String contains invalid byte sequence", exp.span, "");
+495        };
+496
+497        if !context.is_in_function() {
+498            context.fancy_error(
+499                "string literal can't be used outside function",
+500                vec![Label::primary(exp.span, "string type is used here")],
+501                vec!["Note: string literal can be used only inside function".into()],
+502            );
+503        }
+504
+505        let str_len = string.len();
+506        let expected_str_len = expected_type
+507            .and_then(|id| id.deref(context.db()).as_string(context.db()))
+508            .map(|s| s.max_size)
+509            .unwrap_or(str_len);
+510        // Use an expected string length if an expected length is larger than an actual
+511        // length.
+512        let max_size = if expected_str_len > str_len {
+513            expected_str_len
+514        } else {
+515            str_len
+516        };
+517
+518        return Ok(ExpressionAttributes::new(
+519            Type::String(FeString { max_size }).id(context.db()),
+520        ));
+521    }
+522
+523    unreachable!()
+524}
+525
+526fn is_valid_string(val: &str) -> bool {
+527    const ALLOWED_SPECIAL_CHARS: [u8; 3] = [
+528        9_u8,  // Tab
+529        10_u8, // Newline
+530        13_u8, // Carriage return
+531    ];
+532
+533    const PRINTABLE_ASCII: RangeInclusive<u8> = 32_u8..=126_u8;
+534
+535    for x in val.as_bytes() {
+536        if ALLOWED_SPECIAL_CHARS.contains(x) || PRINTABLE_ASCII.contains(x) {
+537            continue;
+538        } else {
+539            return false;
+540        }
+541    }
+542    true
+543}
+544
+545fn expr_num(
+546    context: &mut dyn AnalyzerContext,
+547    exp: &Node<fe::Expr>,
+548    expected_type: Option<TypeId>,
+549) -> ExpressionAttributes {
+550    let num = match &exp.kind {
+551        fe::Expr::Num(num) => num,
+552        _ => unreachable!(),
+553    };
+554
+555    let literal = numeric::Literal::new(num);
+556    let num = literal
+557        .parse::<BigInt>()
+558        .expect("the numeric literal contains a invalid digit");
+559
+560    if expected_type == Some(TypeId::address(context.db())) {
+561        if num < BigInt::zero() && num > types::address_max() {
+562            context.error(
+563                "literal out of range for `address` type",
+564                exp.span,
+565                "does not fit into type `address`",
+566            );
+567        }
+568        // TODO: error if literal.radix != Radix::Hexadecimal ?
+569        return ExpressionAttributes::new(TypeId::address(context.db()));
+570    }
+571
+572    let int_typ = expected_type
+573        .and_then(|id| id.deref(context.db()).as_int(context.db()))
+574        .unwrap_or(Integer::U256);
+575    validate_numeric_literal_fits_type(context, num, exp.span, int_typ);
+576    return ExpressionAttributes::new(TypeId::int(context.db(), int_typ));
+577}
+578
+579fn expr_subscript(
+580    context: &mut dyn AnalyzerContext,
+581    exp: &Node<fe::Expr>,
+582    expected_type: Option<TypeId>,
+583) -> Result<ExpressionAttributes, FatalError> {
+584    if let fe::Expr::Subscript { value, index } = &exp.kind {
+585        let value_ty = expr_type(context, value)?;
+586        let expected_index_ty = operations::expected_index_type(context, value_ty);
+587        let index_ty = expr(context, index, expected_index_ty)?.typ;
+588
+589        // performs type checking
+590        let typ = match operations::index(context, value_ty, index_ty, index) {
+591            Err(err) => {
+592                let diag = match err {
+593                    IndexingError::NotSubscriptable => context.fancy_error(
+594                        &format!(
+595                            "`{}` type is not subscriptable",
+596                            value_ty.display(context.db())
+597                        ),
+598                        vec![Label::primary(value.span, "unsubscriptable type")],
+599                        vec!["Note: Only arrays and maps are subscriptable".into()],
+600                    ),
+601                    IndexingError::WrongIndexType => context.fancy_error(
+602                        &format!(
+603                            "can not subscript {} with type {}",
+604                            value_ty.display(context.db()),
+605                            index_ty.display(context.db())
+606                        ),
+607                        vec![Label::primary(index.span, "wrong index type")],
+608                        vec![],
+609                    ),
+610                };
+611                if let Some(expected) = expected_type {
+612                    expected
+613                } else {
+614                    return Err(FatalError::new(diag));
+615                }
+616            }
+617            Ok(t) => t,
+618        };
+619
+620        return Ok(ExpressionAttributes::new(typ));
+621    }
+622
+623    unreachable!()
+624}
+625
+626fn expr_attribute(
+627    context: &mut dyn AnalyzerContext,
+628    exp: &Node<fe::Expr>,
+629    expected_type: Option<TypeId>,
+630) -> Result<ExpressionAttributes, FatalError> {
+631    let (target, field) = match &exp.kind {
+632        fe::Expr::Attribute { value, attr } => (value, attr),
+633        _ => unreachable!(),
+634    };
+635
+636    let attrs = expr(context, target, None)?;
+637    let typ = match field_type(context, attrs.typ, &field.kind, field.span) {
+638        Ok(t) => t,
+639        Err(err) => {
+640            if let Some(expected) = expected_type {
+641                expected
+642            } else {
+643                return Err(err);
+644            }
+645        }
+646    };
+647    Ok(ExpressionAttributes::new(typ))
+648}
+649
+650fn field_type(
+651    context: &mut dyn AnalyzerContext,
+652    obj: TypeId,
+653    field_name: &str,
+654    field_span: Span,
+655) -> Result<TypeId, FatalError> {
+656    match obj.typ(context.db()) {
+657        Type::Mut(inner) => {
+658            Ok(Type::Mut(field_type(context, inner, field_name, field_span)?).id(context.db()))
+659        }
+660        Type::SPtr(inner) => {
+661            Ok(Type::SPtr(field_type(context, inner, field_name, field_span)?).id(context.db()))
+662        }
+663        Type::SelfType(TraitOrType::TypeId(inner)) => Ok(Type::SelfType(TraitOrType::TypeId(
+664            field_type(context, inner, field_name, field_span)?,
+665        ))
+666        .id(context.db())),
+667        Type::SelfContract(id) => match id.field_type(context.db(), field_name) {
+668            Some(typ) => Ok(typ?.make_sptr(context.db())),
+669            None => Err(FatalError::new(context.fancy_error(
+670                &format!("No field `{field_name}` exists on this contract"),
+671                vec![Label::primary(field_span, "undefined field")],
+672                vec![],
+673            ))),
+674        },
+675
+676        Type::Struct(struct_) => {
+677            if let Some(struct_field) = struct_.field(context.db(), field_name) {
+678                if !context.root_item().is_struct(&struct_) && !struct_field.is_public(context.db())
+679                {
+680                    context.fancy_error(
+681                        &format!(
+682                            "Can not access private field `{}` on struct `{}`",
+683                            field_name,
+684                            struct_.name(context.db())
+685                        ),
+686                        vec![Label::primary(field_span, "private field")],
+687                        vec![],
+688                    );
+689                }
+690                Ok(struct_field.typ(context.db())?)
+691            } else {
+692                Err(FatalError::new(context.fancy_error(
+693                    &format!(
+694                        "No field `{}` exists on struct `{}`",
+695                        field_name,
+696                        struct_.name(context.db())
+697                    ),
+698                    vec![Label::primary(field_span, "undefined field")],
+699                    vec![],
+700                )))
+701            }
+702        }
+703        Type::Tuple(tuple) => {
+704            let item_index = tuple_item_index(field_name).ok_or_else(||
+705                    FatalError::new(context.fancy_error(
+706                        &format!("No field `{field_name}` exists on this tuple"),
+707                        vec![
+708                            Label::primary(
+709                                field_span,
+710                                "undefined field",
+711                            )
+712                        ],
+713                        vec!["Note: Tuple values are accessed via `itemN` properties such as `item0` or `item1`".into()],
+714                    )))?;
+715
+716            tuple.items.get(item_index).copied().ok_or_else(|| {
+717                FatalError::new(context.fancy_error(
+718                    &format!("No field `item{item_index}` exists on this tuple"),
+719                    vec![Label::primary(field_span, "unknown field")],
+720                    vec![format!(
+721                        "Note: The highest possible field for this tuple is `item{}`",
+722                        tuple.items.len() - 1
+723                    )],
+724                ))
+725            })
+726        }
+727        _ => Err(FatalError::new(context.fancy_error(
+728            &format!(
+729                "No field `{}` exists on type {}",
+730                field_name,
+731                obj.display(context.db())
+732            ),
+733            vec![Label::primary(field_span, "unknown field")],
+734            vec![],
+735        ))),
+736    }
+737}
+738
+739/// Pull the item index from the attribute string (e.g. "item4" -> "4").
+740fn tuple_item_index(item: &str) -> Option<usize> {
+741    if item.len() < 5 || &item[..4] != "item" || (item.len() > 5 && &item[4..5] == "0") {
+742        None
+743    } else {
+744        item[4..].parse::<usize>().ok()
+745    }
+746}
+747
+748fn expr_bin_operation(
+749    context: &mut dyn AnalyzerContext,
+750    exp: &Node<fe::Expr>,
+751    expected_type: Option<TypeId>,
+752) -> Result<ExpressionAttributes, FatalError> {
+753    let (left, op, right) = match &exp.kind {
+754        fe::Expr::BinOperation { left, op, right } => (left, op, right),
+755        _ => unreachable!(),
+756    };
+757
+758    let (left_expected, right_expected) = match &op.kind {
+759        // In shift operations, the right hand side may have a different type than the left hand
+760        // side because the right hand side needs to be unsigned. The type of the
+761        // entire expression is determined by the left hand side anyway so we don't
+762        // try to coerce the right hand side in this case.
+763        fe::BinOperator::LShift | fe::BinOperator::RShift => (expected_type, None),
+764        _ => (expected_type, expected_type),
+765    };
+766
+767    let left_attributes = expr(context, left, left_expected)?;
+768    let right_attributes = expr(context, right, right_expected)?;
+769
+770    match operations::bin(
+771        context,
+772        left_attributes.typ,
+773        left,
+774        op.kind,
+775        right_attributes.typ,
+776        right,
+777    ) {
+778        Err(err) => {
+779            let diag = add_bin_operations_errors(
+780                context,
+781                &op.kind,
+782                left.span,
+783                left_attributes.typ,
+784                right.span,
+785                right_attributes.typ,
+786                err,
+787            );
+788            if let Some(expected) = expected_type {
+789                Ok(ExpressionAttributes::new(expected))
+790            } else {
+791                Err(FatalError::new(diag))
+792            }
+793        }
+794        Ok(typ) => Ok(ExpressionAttributes::new(typ)),
+795    }
+796}
+797
+798fn expr_unary_operation(
+799    context: &mut dyn AnalyzerContext,
+800    exp: &Node<fe::Expr>,
+801    expected_type: Option<TypeId>,
+802) -> Result<ExpressionAttributes, FatalError> {
+803    let (op, operand) = match &exp.kind {
+804        fe::Expr::UnaryOperation { op, operand } => (op, operand),
+805        _ => unreachable!(),
+806    };
+807
+808    let operand_ty = value_expr_type(context, operand, None)?;
+809
+810    let emit_err = |context: &mut dyn AnalyzerContext, expected| {
+811        context.error(
+812            &format!(
+813                "cannot apply unary operator `{}` to type `{}`",
+814                op.kind,
+815                operand_ty.display(context.db())
+816            ),
+817            operand.span,
+818            &format!(
+819                "this has type `{}`; expected {}",
+820                operand_ty.display(context.db()),
+821                expected
+822            ),
+823        );
+824    };
+825
+826    return match op.kind {
+827        fe::UnaryOperator::USub => {
+828            let expected_int_type = expected_type
+829                .and_then(|id| id.as_int(context.db()))
+830                .unwrap_or(Integer::I256);
+831
+832            if operand_ty.is_integer(context.db()) {
+833                if let fe::Expr::Num(num_str) = &operand.kind {
+834                    let num = -to_bigint(num_str);
+835                    validate_numeric_literal_fits_type(context, num, exp.span, expected_int_type);
+836                }
+837                if !expected_int_type.is_signed() {
+838                    context.error(
+839                        "Can not apply unary operator",
+840                        op.span + operand.span,
+841                        &format!(
+842                            "Expected unsigned type `{expected_int_type}`. Unary operator `-` can not be used here.",
+843                        ),
+844                    );
+845                }
+846            } else {
+847                emit_err(context, "a numeric type")
+848            }
+849            Ok(ExpressionAttributes::new(TypeId::int(
+850                context.db(),
+851                expected_int_type,
+852            )))
+853        }
+854        fe::UnaryOperator::Not => {
+855            if !operand_ty.is_bool(context.db()) {
+856                emit_err(context, "type `bool`");
+857            }
+858            Ok(ExpressionAttributes::new(TypeId::bool(context.db())))
+859        }
+860        fe::UnaryOperator::Invert => {
+861            if !operand_ty.is_integer(context.db()) {
+862                emit_err(context, "a numeric type")
+863            }
+864
+865            Ok(ExpressionAttributes::new(operand_ty))
+866        }
+867    };
+868}
+869
+870fn expr_call(
+871    context: &mut dyn AnalyzerContext,
+872    func: &Node<fe::Expr>,
+873    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+874    args: &Node<Vec<Node<fe::CallArg>>>,
+875    expected_type: Option<TypeId>,
+876) -> Result<ExpressionAttributes, FatalError> {
+877    let (attributes, call_type) = match &func.kind {
+878        fe::Expr::Name(name) => expr_call_name(context, name, func, generic_args, args)?,
+879        fe::Expr::Path(path) => expr_call_path(context, path, func, generic_args, args)?,
+880        fe::Expr::Attribute { value, attr } => {
+881            // TODO: err if there are generic args
+882            expr_call_method(context, value, attr, generic_args, args)?
+883        }
+884        _ => {
+885            let expression = expr(context, func, None)?;
+886            let diag = context.fancy_error(
+887                &format!(
+888                    "`{}` type is not callable",
+889                    expression.typ.display(context.db())
+890                ),
+891                vec![Label::primary(
+892                    func.span,
+893                    format!("this has type `{}`", expression.typ.display(context.db())),
+894                )],
+895                vec![],
+896            );
+897            return if let Some(expected) = expected_type {
+898                Ok(ExpressionAttributes::new(expected))
+899            } else {
+900                Err(FatalError::new(diag))
+901            };
+902        }
+903    };
+904
+905    if !context.inherits_type(BlockScopeType::Unsafe) && call_type.is_unsafe(context.db()) {
+906        let mut labels = vec![Label::primary(func.span, "call to unsafe function")];
+907        let fn_name = call_type.function_name(context.db());
+908        if let Some(function) = call_type.function() {
+909            let def_name_span = function.name_span(context.db());
+910            let unsafe_span = function.unsafe_span(context.db());
+911            labels.push(Label::secondary(
+912                def_name_span + unsafe_span,
+913                format!("`{}` is defined here as unsafe", &fn_name),
+914            ))
+915        }
+916        context.fancy_error(
+917            &format!("unsafe function `{}` can only be called in an unsafe function or block",
+918                     &fn_name),
+919            labels,
+920            vec!["Hint: put this call in an `unsafe` block if you're confident that it's safe to use here".into()],
+921        );
+922    }
+923
+924    if context.is_in_function() {
+925        context.add_call(func, call_type);
+926    } else {
+927        context.error(
+928            "calling function outside function",
+929            func.span,
+930            "function can only be called inside function",
+931        );
+932    }
+933
+934    Ok(attributes)
+935}
+936
+937fn expr_call_name<T: std::fmt::Display>(
+938    context: &mut dyn AnalyzerContext,
+939    name: &str,
+940    func: &Node<T>,
+941    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+942    args: &Node<Vec<Node<fe::CallArg>>>,
+943) -> Result<(ExpressionAttributes, CallType), FatalError> {
+944    check_for_call_to_special_fns(context, name, func.span)?;
+945
+946    let named_thing = context.resolve_name(name, func.span)?.ok_or_else(|| {
+947        // Check for call to a fn in the current class that takes self.
+948        if context.is_in_function() {
+949            let func_id = context.parent_function();
+950            if let Some(function) = func_id
+951                .sig(context.db())
+952                .self_item(context.db())
+953                .and_then(|target| target.function_sig(context.db(), name))
+954                .filter(|fun| fun.takes_self(context.db()))
+955            {
+956                // TODO: this doesn't have to be fatal
+957                FatalError::new(context.fancy_error(
+958                    &format!("`{name}` must be called via `self`"),
+959                    vec![
+960                        Label::primary(
+961                            function.name_span(context.db()),
+962                            format!("`{name}` is defined here as a function that takes `self`"),
+963                        ),
+964                        Label::primary(
+965                            func.span,
+966                            format!("`{name}` is called here as a standalone function"),
+967                        ),
+968                    ],
+969                    vec![format!(
+970                        "Suggestion: use `self.{name}(...)` instead of `{name}(...)`"
+971                    )],
+972                ))
+973            } else {
+974                FatalError::new(context.error(
+975                    &format!("`{name}` is not defined"),
+976                    func.span,
+977                    &format!("`{name}` has not been defined in this context"),
+978                ))
+979            }
+980        } else {
+981            FatalError::new(context.error(
+982                "calling function outside function",
+983                func.span,
+984                "function can only be called inside function",
+985            ))
+986        }
+987    })?;
+988
+989    expr_call_named_thing(context, named_thing, func, generic_args, args)
+990}
+991
+992fn expr_call_path<T: std::fmt::Display>(
+993    context: &mut dyn AnalyzerContext,
+994    path: &fe::Path,
+995    func: &Node<T>,
+996    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+997    args: &Node<Vec<Node<fe::CallArg>>>,
+998) -> Result<(ExpressionAttributes, CallType), FatalError> {
+999    match context.resolve_visible_path(path) {
+1000        Some(named_thing) => {
+1001            check_visibility(context, &named_thing, func.span);
+1002            validate_has_no_conflicting_trait_in_scope(context, &named_thing, path, func)?;
+1003            expr_call_named_thing(context, named_thing, func, generic_args, args)
+1004        }
+1005        // If we we can't resolve a call to a path e.g. `foo::Bar::do_thing()` there is a chance that `do_thing`
+1006        // still exists as as a trait associated function for `foo::Bar`.
+1007        None => expr_call_trait_associated_function(context, path, func, generic_args, args),
+1008    }
+1009}
+1010
+1011fn validate_has_no_conflicting_trait_in_scope<T: std::fmt::Display>(
+1012    context: &mut dyn AnalyzerContext,
+1013    named_thing: &NamedThing,
+1014    path: &fe::Path,
+1015    func: &Node<T>,
+1016) -> Result<(), FatalError> {
+1017    let fn_name = &path.segments.last().unwrap().kind;
+1018    let parent_path = path.remove_last();
+1019    let parent_thing = context.resolve_path(&parent_path, func.span)?;
+1020
+1021    if let NamedThing::Item(Item::Type(val)) = parent_thing {
+1022        let type_id = val.type_id(context.db())?;
+1023        let (_, in_scope_candidates) = type_id.trait_function_candidates(context, fn_name);
+1024
+1025        if !in_scope_candidates.is_empty() {
+1026            let labels = vec![Label::primary(
+1027                named_thing.name_span(context.db()).unwrap(),
+1028                format!(
+1029                    "candidate 1 is defined here on the {}",
+1030                    parent_thing.item_kind_display_name(),
+1031                ),
+1032            )]
+1033            .into_iter()
+1034            .chain(
+1035                in_scope_candidates
+1036                    .iter()
+1037                    .enumerate()
+1038                    .map(|(idx, (fun, _impl))| {
+1039                        Label::primary(
+1040                            fun.name_span(context.db()),
+1041                            format!(
+1042                                "candidate #{} is defined here on trait `{}`",
+1043                                idx + 2,
+1044                                _impl.trait_id(context.db()).name(context.db())
+1045                            ),
+1046                        )
+1047                    }),
+1048            )
+1049            .collect::<Vec<_>>();
+1050
+1051            return Err(FatalError::new(context.fancy_error(
+1052                "multiple applicable items in scope",
+1053                labels,
+1054                vec![
+1055                    "Hint: Rename one of the methods or make sure only one of them is in scope"
+1056                        .into(),
+1057                ],
+1058            )));
+1059        }
+1060    }
+1061
+1062    Ok(())
+1063}
+1064
+1065fn expr_call_trait_associated_function<T: std::fmt::Display>(
+1066    context: &mut dyn AnalyzerContext,
+1067    path: &fe::Path,
+1068    func: &Node<T>,
+1069    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1070    args: &Node<Vec<Node<fe::CallArg>>>,
+1071) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1072    let fn_name = &path.segments.last().unwrap().kind;
+1073    let parent_path = path.remove_last();
+1074    let parent_thing = context.resolve_path(&parent_path, func.span)?;
+1075
+1076    if let NamedThing::Item(Item::Type(val)) = parent_thing {
+1077        let type_id = val.type_id(context.db())?;
+1078
+1079        let (candidates, in_scope_candidates) = type_id.trait_function_candidates(context, fn_name);
+1080
+1081        if in_scope_candidates.len() > 1 {
+1082            context.fancy_error(
+1083                "multiple applicable items in scope",
+1084                in_scope_candidates
+1085                    .iter()
+1086                    .enumerate()
+1087                    .map(|(idx, (fun, _impl))| {
+1088                        Label::primary(
+1089                            fun.name_span(context.db()),
+1090                            format!(
+1091                                "candidate #{} is defined here on trait `{}`",
+1092                                idx + 1,
+1093                                _impl.trait_id(context.db()).name(context.db())
+1094                            ),
+1095                        )
+1096                    })
+1097                    .collect(),
+1098                vec![
+1099                    "Hint: Rename one of the methods or make sure only one of them is in scope"
+1100                        .into(),
+1101                ],
+1102            );
+1103            // We arbitrarily carry on with the first candidate since the error doesn't need to be fatal
+1104            let (fun, _) = in_scope_candidates[0];
+1105            return expr_call_pure(context, fun, func.span, generic_args, args);
+1106        } else if in_scope_candidates.is_empty() && !candidates.is_empty() {
+1107            context.fancy_error(
+1108                "Applicable items exist but are not in scope",
+1109                candidates.iter().enumerate().map(|(idx, (fun, _impl ))| {
+1110                    Label::primary(fun.name_span(context.db()), format!(
+1111                        "candidate #{} is defined here on trait `{}`",
+1112                        idx + 1,
+1113                        _impl.trait_id(context.db()).name(context.db())
+1114                    ))
+1115                }).collect(),
+1116                vec!["Hint: Bring one of these candidates in scope via `use module_name::trait_name`".into()],
+1117            );
+1118            // We arbitrarily carry on with an applicable candidate since the error doesn't need to be fatal
+1119            let (fun, _) = candidates[0];
+1120            return expr_call_pure(context, fun, func.span, generic_args, args);
+1121        } else if in_scope_candidates.len() == 1 {
+1122            let (fun, _) = in_scope_candidates[0];
+1123            return expr_call_pure(context, fun, func.span, generic_args, args);
+1124        }
+1125    }
+1126
+1127    // At this point, we will have an error so we run `resolve_path` to register any errors that we
+1128    // did not report yet
+1129    context.resolve_path(path, func.span)?;
+1130
+1131    Err(FatalError::new(context.error(
+1132        "unresolved path item",
+1133        func.span,
+1134        "not found",
+1135    )))
+1136}
+1137
+1138fn expr_call_named_thing<T: std::fmt::Display>(
+1139    context: &mut dyn AnalyzerContext,
+1140    named_thing: NamedThing,
+1141    func: &Node<T>,
+1142    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1143    args: &Node<Vec<Node<fe::CallArg>>>,
+1144) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1145    match named_thing {
+1146        NamedThing::Item(Item::BuiltinFunction(function)) => {
+1147            expr_call_builtin_function(context, function, func.span, generic_args, args)
+1148        }
+1149        NamedThing::Item(Item::Intrinsic(function)) => {
+1150            expr_call_intrinsic(context, function, func.span, generic_args, args)
+1151        }
+1152        NamedThing::Item(Item::Function(function)) => {
+1153            expr_call_pure(context, function, func.span, generic_args, args)
+1154        }
+1155        NamedThing::Item(Item::Type(def)) => {
+1156            if let Some(args) = generic_args {
+1157                context.fancy_error(
+1158                    &format!("`{}` type is not generic", func.kind),
+1159                    vec![Label::primary(
+1160                        args.span,
+1161                        "unexpected generic argument list",
+1162                    )],
+1163                    vec![],
+1164                );
+1165            }
+1166            let typ = def.type_id(context.db())?;
+1167            expr_call_type_constructor(context, typ, func.span, args)
+1168        }
+1169        NamedThing::Item(Item::GenericType(generic)) => {
+1170            let concrete_type =
+1171                apply_generic_type_args(context, generic, func.span, generic_args.as_ref())?;
+1172            expr_call_type_constructor(context, concrete_type, func.span, args)
+1173        }
+1174        NamedThing::Item(Item::Constant(id)) => Err(FatalError::new(context.error(
+1175            &format!("`{}` is not callable", func.kind),
+1176            func.span,
+1177            &format!(
+1178                "`{}` is a constant of type `{}`, and can't be used as a function",
+1179                func.kind,
+1180                id.typ(context.db())?.display(context.db()),
+1181            ),
+1182        ))),
+1183        NamedThing::Item(Item::Trait(_)) => Err(FatalError::new(context.error(
+1184            &format!("`{}` is not callable", func.kind),
+1185            func.span,
+1186            &format!(
+1187                "`{}` is a trait, and can't be used as a function",
+1188                func.kind
+1189            ),
+1190        ))),
+1191        NamedThing::Item(Item::Impl(_)) => unreachable!(),
+1192        NamedThing::Item(Item::Attribute(_)) => unreachable!(),
+1193        NamedThing::Item(Item::Ingot(_)) => Err(FatalError::new(context.error(
+1194            &format!("`{}` is not callable", func.kind),
+1195            func.span,
+1196            &format!(
+1197                "`{}` is an ingot, and can't be used as a function",
+1198                func.kind
+1199            ),
+1200        ))),
+1201        NamedThing::Item(Item::Module(_)) => Err(FatalError::new(context.error(
+1202            &format!("`{}` is not callable", func.kind),
+1203            func.span,
+1204            &format!(
+1205                "`{}` is a module, and can't be used as a function",
+1206                func.kind
+1207            ),
+1208        ))),
+1209
+1210        NamedThing::EnumVariant(variant) => {
+1211            expr_call_enum_constructor(context, func.span, variant, args)
+1212        }
+1213
+1214        // Nothing else is callable (for now at least)
+1215        NamedThing::SelfValue { .. } => Err(FatalError::new(context.error(
+1216            "`self` is not callable",
+1217            func.span,
+1218            "can't be used as a function",
+1219        ))),
+1220
+1221        NamedThing::Variable { typ, span, .. } => Err(FatalError::new(context.fancy_error(
+1222            &format!("`{}` is not callable", func.kind),
+1223            vec![
+1224                Label::secondary(
+1225                    span,
+1226                    format!("`{}` has type `{}`", func.kind, typ?.display(context.db())),
+1227                ),
+1228                Label::primary(
+1229                    func.span,
+1230                    format!("`{}` can't be used as a function", func.kind),
+1231                ),
+1232            ],
+1233            vec![],
+1234        ))),
+1235    }
+1236}
+1237
+1238fn expr_call_builtin_function(
+1239    context: &mut dyn AnalyzerContext,
+1240    function: GlobalFunction,
+1241    name_span: Span,
+1242    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1243    args: &Node<Vec<Node<fe::CallArg>>>,
+1244) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1245    if let Some(args) = generic_args {
+1246        context.error(
+1247            &format!(
+1248                "`{}` function does not expect generic arguments",
+1249                function.as_ref()
+1250            ),
+1251            args.span,
+1252            "unexpected generic argument list",
+1253        );
+1254    }
+1255
+1256    let argument_attributes = expr_call_args(context, args)?;
+1257
+1258    let attrs = match function {
+1259        GlobalFunction::Keccak256 => {
+1260            validate_arg_count(context, function.as_ref(), name_span, args, 1, "argument");
+1261            expect_no_label_on_arg(context, args, 0);
+1262
+1263            if let Some(arg_typ) = argument_attributes.first().map(|attr| &attr.typ) {
+1264                match arg_typ.typ(context.db()) {
+1265                    Type::Array(Array { inner, .. }) if inner.typ(context.db()) == Type::u8() => {}
+1266                    _ => {
+1267                        context.fancy_error(
+1268                            &format!(
+1269                                "`{}` can not be used as an argument to `{}`",
+1270                                arg_typ.display(context.db()),
+1271                                function.as_ref(),
+1272                            ),
+1273                            vec![Label::primary(args.span, "wrong type")],
+1274                            vec![format!(
+1275                                "Note: `{}` expects a byte array argument",
+1276                                function.as_ref()
+1277                            )],
+1278                        );
+1279                    }
+1280                }
+1281            };
+1282            ExpressionAttributes::new(TypeId::int(context.db(), Integer::U256))
+1283        }
+1284    };
+1285    Ok((attrs, CallType::BuiltinFunction(function)))
+1286}
+1287
+1288fn expr_call_intrinsic(
+1289    context: &mut dyn AnalyzerContext,
+1290    function: Intrinsic,
+1291    name_span: Span,
+1292    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1293    args: &Node<Vec<Node<fe::CallArg>>>,
+1294) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1295    if let Some(args) = generic_args {
+1296        context.error(
+1297            &format!(
+1298                "`{}` function does not expect generic arguments",
+1299                function.as_ref()
+1300            ),
+1301            args.span,
+1302            "unexpected generic argument list",
+1303        );
+1304    }
+1305
+1306    let argument_attributes = expr_call_args(context, args)?;
+1307
+1308    validate_arg_count(
+1309        context,
+1310        function.as_ref(),
+1311        name_span,
+1312        args,
+1313        function.arg_count(),
+1314        "arguments",
+1315    );
+1316    for (idx, arg_attr) in argument_attributes.iter().enumerate() {
+1317        if arg_attr.typ.typ(context.db()) != Type::Base(Base::Numeric(Integer::U256)) {
+1318            context.type_error(
+1319                "arguments to intrinsic functions must be u256",
+1320                args.kind[idx].kind.value.span,
+1321                TypeId::int(context.db(), Integer::U256),
+1322                arg_attr.typ,
+1323            );
+1324        }
+1325    }
+1326
+1327    Ok((
+1328        ExpressionAttributes::new(TypeId::base(context.db(), function.return_type())),
+1329        CallType::Intrinsic(function),
+1330    ))
+1331}
+1332
+1333fn validate_visibility_of_called_fn(
+1334    context: &mut dyn AnalyzerContext,
+1335    call_span: Span,
+1336    called_fn: FunctionSigId,
+1337) {
+1338    let fn_parent = called_fn.parent(context.db());
+1339
+1340    // We don't need to validate `pub` if the called function is a module function
+1341    if let Item::Module(_) = fn_parent {
+1342        return;
+1343    }
+1344
+1345    let name = called_fn.name(context.db());
+1346    let parent_name = fn_parent.name(context.db());
+1347
+1348    let is_called_from_same_item = fn_parent == context.parent_function().parent(context.db());
+1349    if !called_fn.is_public(context.db()) && !is_called_from_same_item {
+1350        context.fancy_error(
+1351            &format!(
+1352                "the function `{}` on `{} {}` is private",
+1353                name,
+1354                fn_parent.item_kind_display_name(),
+1355                fn_parent.name(context.db())
+1356            ),
+1357            vec![
+1358                Label::primary(call_span, "this function is not `pub`"),
+1359                Label::secondary(
+1360                    called_fn.name_span(context.db()),
+1361                    format!("`{name}` is defined here"),
+1362                ),
+1363            ],
+1364            vec![
+1365                format!(
+1366                    "`{name}` can only be called from other functions within `{parent_name}`"
+1367                ),
+1368                format!(
+1369                    "Hint: use `pub fn {name}(..)` to make `{name}` callable from outside of `{parent_name}`"
+1370                ),
+1371            ],
+1372        );
+1373    }
+1374}
+1375
+1376fn expr_call_pure(
+1377    context: &mut dyn AnalyzerContext,
+1378    function: FunctionId,
+1379    call_span: Span,
+1380    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1381    args: &Node<Vec<Node<fe::CallArg>>>,
+1382) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1383    let sig = function.sig(context.db());
+1384    validate_visibility_of_called_fn(context, call_span, sig);
+1385
+1386    let fn_name = function.name(context.db());
+1387    if let Some(args) = generic_args {
+1388        context.fancy_error(
+1389            &format!("`{fn_name}` function is not generic"),
+1390            vec![Label::primary(
+1391                args.span,
+1392                "unexpected generic argument list",
+1393            )],
+1394            vec![],
+1395        );
+1396    }
+1397
+1398    if function.is_test(context.db()) {
+1399        context.fancy_error(
+1400            &format!("`{fn_name}` is a test function"),
+1401            vec![Label::primary(call_span, "test functions are not callable")],
+1402            vec![],
+1403        );
+1404    }
+1405
+1406    let sig = function.signature(context.db());
+1407    let name_span = function.name_span(context.db());
+1408    validate_named_args(context, &fn_name, name_span, args, &sig.params)?;
+1409    borrowck::check_fn_call_arg_borrows(context, &fn_name, None, &args.kind, &sig.params);
+1410
+1411    let return_type = sig.return_type.clone()?;
+1412    Ok((
+1413        ExpressionAttributes::new(return_type),
+1414        CallType::Pure(function),
+1415    ))
+1416}
+1417
+1418fn expr_call_type_constructor(
+1419    context: &mut dyn AnalyzerContext,
+1420    into_type: TypeId,
+1421    into_span: Span,
+1422    args: &Node<Vec<Node<fe::CallArg>>>,
+1423) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1424    let typ = into_type.typ(context.db());
+1425    match typ {
+1426        Type::Struct(struct_type) => {
+1427            return expr_call_struct_constructor(context, into_span, struct_type, args)
+1428        }
+1429        Type::Base(Base::Bool)
+1430        | Type::Enum(_)
+1431        | Type::Array(_)
+1432        | Type::Map(_)
+1433        | Type::Generic(_) => {
+1434            return Err(FatalError::new(context.error(
+1435                &format!("`{}` type is not callable", typ.display(context.db())),
+1436                into_span,
+1437                "",
+1438            )))
+1439        }
+1440        Type::SPtr(_) => unreachable!(), // unnameable
+1441        _ => {}
+1442    }
+1443
+1444    // These all expect 1 arg, for now.
+1445    let type_name = typ.name(context.db());
+1446    validate_arg_count(context, &type_name, into_span, args, 1, "argument");
+1447    expect_no_label_on_arg(context, args, 0);
+1448
+1449    if let Some(arg) = args.kind.first() {
+1450        let expected = into_type.is_integer(context.db()).then_some(into_type);
+1451        let from_type = expr(context, &arg.kind.value, expected)?.typ;
+1452        try_cast_type(context, from_type, &arg.kind.value, into_type, into_span);
+1453    }
+1454    Ok((
+1455        ExpressionAttributes::new(into_type),
+1456        CallType::TypeConstructor(into_type),
+1457    ))
+1458}
+1459
+1460fn expr_call_struct_constructor(
+1461    context: &mut dyn AnalyzerContext,
+1462    name_span: Span,
+1463    struct_: StructId,
+1464    args: &Node<Vec<Node<fe::CallArg>>>,
+1465) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1466    let name = &struct_.name(context.db());
+1467    // Check visibility of struct.
+1468
+1469    if struct_.has_private_field(context.db()) && !context.root_item().is_struct(&struct_) {
+1470        let labels = struct_
+1471            .fields(context.db())
+1472            .iter()
+1473            .filter_map(|(name, field)| {
+1474                if !field.is_public(context.db()) {
+1475                    Some(Label::primary(
+1476                        field.span(context.db()),
+1477                        format!("Field `{name}` is private"),
+1478                    ))
+1479                } else {
+1480                    None
+1481                }
+1482            })
+1483            .collect();
+1484
+1485        context.fancy_error(
+1486            &format!(
+1487                "Can not call private constructor of struct `{name}` "
+1488            ),
+1489            labels,
+1490            vec![format!(
+1491                "Suggestion: implement a method `new(...)` on struct `{name}` to call the constructor and return the struct"
+1492            )],
+1493        );
+1494    }
+1495
+1496    let db = context.db();
+1497    let fields = struct_
+1498        .fields(db)
+1499        .iter()
+1500        .map(|(name, field)| (name.clone(), field.typ(db), true))
+1501        .collect::<Vec<_>>();
+1502
+1503    validate_named_args(context, name, name_span, args, &fields)?;
+1504
+1505    let struct_type = struct_.as_type(context.db());
+1506    Ok((
+1507        ExpressionAttributes::new(struct_type),
+1508        CallType::TypeConstructor(struct_type),
+1509    ))
+1510}
+1511
+1512fn expr_call_enum_constructor(
+1513    context: &mut dyn AnalyzerContext,
+1514    name_span: Span,
+1515    variant: EnumVariantId,
+1516    args: &Node<Vec<Node<fe::CallArg>>>,
+1517) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1518    let name = &variant.name_with_parent(context.db());
+1519    match variant.kind(context.db())? {
+1520        EnumVariantKind::Unit => {
+1521            let name = variant.name_with_parent(context.db());
+1522            let label = Label::primary(name_span, format! {"`{name}` is a unit variant"});
+1523            context.fancy_error(
+1524                &format!("Can not call a unit variant `{name}`",),
+1525                vec![label],
+1526                vec![format!(
+1527                    "Suggestion: remove the parentheses to construct the unit variant `{name}`",
+1528                )],
+1529            );
+1530        }
+1531        EnumVariantKind::Tuple(elts) => {
+1532            let params: Vec<_> = elts.iter().map(|ty| (None, Ok(*ty), true)).collect();
+1533            validate_named_args(context, name, name_span, args, &params)?;
+1534        }
+1535    }
+1536
+1537    Ok((
+1538        ExpressionAttributes::new(variant.parent(context.db()).as_type(context.db())),
+1539        CallType::EnumConstructor(variant),
+1540    ))
+1541}
+1542
+1543fn expr_call_method(
+1544    context: &mut dyn AnalyzerContext,
+1545    target: &Node<fe::Expr>,
+1546    field: &Node<SmolStr>,
+1547    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1548    args: &Node<Vec<Node<fe::CallArg>>>,
+1549) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1550    // We need to check if the target is a type or a global object before calling
+1551    // `expr()`. When the type method call syntax is changed to `MyType::foo()`
+1552    // and the global objects are replaced by `Context`, we can remove this.
+1553    // All other `NamedThing`s will be handled correctly by `expr()`.
+1554    if let fe::Expr::Name(name) = &target.kind {
+1555        if let Ok(Some(NamedThing::Item(Item::Type(def)))) = context.resolve_name(name, target.span)
+1556        {
+1557            let typ = def.typ(context.db())?;
+1558            return expr_call_type_attribute(context, typ, target.span, field, generic_args, args);
+1559        }
+1560    }
+1561
+1562    let target_attributes = expr(context, target, None)?;
+1563
+1564    // Check built-in methods.
+1565    if let Ok(method) = ValueMethod::from_str(&field.kind) {
+1566        return expr_call_builtin_value_method(
+1567            context,
+1568            target_attributes,
+1569            target,
+1570            method,
+1571            field,
+1572            args,
+1573        );
+1574    }
+1575
+1576    let obj_type = target_attributes.typ.deref(context.db());
+1577    if obj_type.is_contract(context.db()) {
+1578        check_for_call_to_special_fns(context, &field.kind, field.span)?;
+1579    }
+1580
+1581    match obj_type.function_sigs(context.db(), &field.kind).as_ref() {
+1582        [] => Err(FatalError::new(context.fancy_error(
+1583            &format!(
+1584                "No function `{}` exists on type `{}`",
+1585                &field.kind,
+1586                obj_type.display(context.db())
+1587            ),
+1588            vec![Label::primary(field.span, "undefined function")],
+1589            vec![],
+1590        ))),
+1591        [method] => {
+1592            validate_visibility_of_called_fn(context, field.span, *method);
+1593
+1594            if !method.takes_self(context.db()) {
+1595                let prefix = if method.is_module_fn(context.db())
+1596                    && context.module() == method.module(context.db())
+1597                {
+1598                    "".into()
+1599                } else {
+1600                    format!("{}::", method.parent(context.db()).name(context.db()))
+1601                };
+1602
+1603                context.fancy_error(
+1604                    &format!("`{}` must be called without `self`", &field.kind),
+1605                    vec![Label::primary(field.span, "function does not take self")],
+1606                    vec![format!(
+1607                        "Suggestion: try `{}{}(...)` instead of `self.{}(...)`",
+1608                        prefix, &field.kind, &field.kind
+1609                    )],
+1610                );
+1611            }
+1612
+1613            let sig = method.signature(context.db());
+1614            let mut_self = matches!(sig.self_decl.map(|d| d.is_mut()), Some(true));
+1615            if mut_self && !target_attributes.typ.is_mut(context.db()) {
+1616                context.error(
+1617                    &format!("`{}` takes `mut self`", &field.kind),
+1618                    target.span,
+1619                    "this is not mutable",
+1620                );
+1621            }
+1622
+1623            validate_named_args(context, &field.kind, field.span, args, &sig.params)?;
+1624            borrowck::check_fn_call_arg_borrows(
+1625                context,
+1626                &field.kind,
+1627                Some((target, target_attributes.typ)),
+1628                &args.kind,
+1629                &sig.params,
+1630            );
+1631
+1632            let calltype = match obj_type.typ(context.db()) {
+1633                Type::Contract(contract) | Type::SelfContract(contract) => {
+1634                    let method = contract
+1635                        .function(context.db(), &method.name(context.db()))
+1636                        .unwrap();
+1637
+1638                    if is_self_value(target) {
+1639                        CallType::ValueMethod {
+1640                            typ: obj_type,
+1641                            method,
+1642                        }
+1643                    } else {
+1644                        // Contract address needs to be on the stack
+1645                        deref_type(context, target, target_attributes.typ);
+1646                        CallType::External {
+1647                            contract,
+1648                            function: method,
+1649                        }
+1650                    }
+1651                }
+1652                Type::Generic(inner) => CallType::TraitValueMethod {
+1653                    trait_id: *inner.bounds.first().expect("expected trait bound"),
+1654                    method: *method,
+1655                    generic_type: inner,
+1656                },
+1657                _ => {
+1658                    let method = method.function(context.db()).unwrap();
+1659                    if let Type::SPtr(inner) = target_attributes.typ.typ(context.db()) {
+1660                        if matches!(
+1661                            inner.typ(context.db()),
+1662                            Type::Struct(_) | Type::Tuple(_) | Type::Array(_)
+1663                        ) {
+1664                            let kind = obj_type.kind_display_name(context.db());
+1665                            context.fancy_error(
+1666                                &format!("{kind} functions can only be called on {kind} in memory"),
+1667                                vec![
+1668                                    Label::primary(target.span, "this value is in storage"),
+1669                                    Label::secondary(
+1670                                        field.span,
+1671                                        format!("hint: copy the {kind} to memory with `.to_mem()`"),
+1672                                    ),
+1673                                ],
+1674                                vec![],
+1675                            );
+1676                        }
+1677                    }
+1678
+1679                    if let Item::Impl(id) = method.parent(context.db()) {
+1680                        validate_trait_in_scope(context, field.span, method, id);
+1681                    }
+1682
+1683                    CallType::ValueMethod {
+1684                        typ: obj_type,
+1685                        method,
+1686                    }
+1687                }
+1688            };
+1689
+1690            let return_type = sig.return_type.clone()?;
+1691            Ok((ExpressionAttributes::new(return_type), calltype))
+1692        }
+1693        [first, second, ..] => {
+1694            context.fancy_error(
+1695                "multiple applicable items in scope",
+1696                vec![
+1697                    Label::primary(
+1698                        first.name_span(context.db()),
+1699                        format!(
+1700                            "candidate #1 is defined here on the `{}`",
+1701                            first.parent(context.db()).item_kind_display_name()
+1702                        ),
+1703                    ),
+1704                    Label::primary(
+1705                        second.name_span(context.db()),
+1706                        format!(
+1707                            "candidate #2 is defined here on the `{}`",
+1708                            second.parent(context.db()).item_kind_display_name()
+1709                        ),
+1710                    ),
+1711                ],
+1712                vec!["Hint: rename one of the methods to disambiguate".into()],
+1713            );
+1714            let return_type = first.signature(context.db()).return_type.clone()?;
+1715            return Ok((
+1716                ExpressionAttributes::new(return_type),
+1717                CallType::ValueMethod {
+1718                    typ: obj_type,
+1719                    method: first.function(context.db()).unwrap(),
+1720                },
+1721            ));
+1722        }
+1723    }
+1724}
+1725
+1726fn validate_trait_in_scope(
+1727    context: &mut dyn AnalyzerContext,
+1728    name_span: Span,
+1729    called_fn: FunctionId,
+1730    impl_: ImplId,
+1731) {
+1732    let treit = impl_.trait_id(context.db());
+1733    let type_name = impl_.receiver(context.db()).name(context.db());
+1734
+1735    if !context
+1736        .module()
+1737        .is_in_scope(context.db(), Item::Trait(treit))
+1738    {
+1739        context.fancy_error(
+1740            &format!(
+1741                "No method named `{}` found for type `{}` in the current scope",
+1742                called_fn.name(context.db()),
+1743                type_name
+1744            ),
+1745            vec![
+1746                Label::primary(name_span, format!("method not found in `{type_name}`")),
+1747                Label::secondary(called_fn.name_span(context.db()), format!("the method is available for `{type_name}` here"))
+1748            ],
+1749            vec![
+1750                "Hint: items from traits can only be used if the trait is in scope".into(),
+1751                format!("Hint: the following trait is implemented but not in scope; perhaps add a `use` for it: `trait {}`", treit.name(context.db()))
+1752            ],
+1753        );
+1754    }
+1755}
+1756
+1757fn expr_call_builtin_value_method(
+1758    context: &mut dyn AnalyzerContext,
+1759    mut value_attrs: ExpressionAttributes,
+1760    value: &Node<fe::Expr>,
+1761    method: ValueMethod,
+1762    method_name: &Node<SmolStr>,
+1763    args: &Node<Vec<Node<fe::CallArg>>>,
+1764) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1765    // for now all of these functions expect 0 arguments
+1766    validate_arg_count(
+1767        context,
+1768        &method_name.kind,
+1769        method_name.span,
+1770        args,
+1771        0,
+1772        "argument",
+1773    );
+1774
+1775    let ty = value_attrs.typ;
+1776    let calltype = CallType::BuiltinValueMethod {
+1777        method,
+1778        typ: value_attrs.typ,
+1779    };
+1780    match method {
+1781        ValueMethod::ToMem => {
+1782            if ty.is_sptr(context.db()) {
+1783                let inner = ty.deref(context.db());
+1784                if inner.is_primitive(context.db()) {
+1785                    context.fancy_error(
+1786                        "`to_mem()` called on primitive type",
+1787                        vec![
+1788                            Label::primary(
+1789                                value.span,
+1790                                "this value does not need to be explicitly copied to memory",
+1791                            ),
+1792                            Label::secondary(method_name.span, "hint: remove `.to_mem()`"),
+1793                        ],
+1794                        vec![],
+1795                    );
+1796                } else if inner.is_map(context.db()) {
+1797                    context.fancy_error(
+1798                        "`to_mem()` called on a Map",
+1799                        vec![
+1800                            Label::primary(value.span, "Maps can not be copied to memory"),
+1801                            Label::secondary(method_name.span, "hint: remove `.to_mem()`"),
+1802                        ],
+1803                        vec![],
+1804                    );
+1805
+1806                    // TODO: this restriction should be removed
+1807                } else if ty.is_generic(context.db()) {
+1808                    context.fancy_error(
+1809                        "`to_mem()` called on generic type",
+1810                        vec![
+1811                            Label::primary(value.span, "this value can not be copied to memory"),
+1812                            Label::secondary(method_name.span, "hint: remove `.to_mem()`"),
+1813                        ],
+1814                        vec![],
+1815                    );
+1816                }
+1817
+1818                value_attrs.typ = inner;
+1819                return Ok((value_attrs, calltype));
+1820            } else {
+1821                context.fancy_error(
+1822                    "`to_mem()` called on value in memory",
+1823                    vec![
+1824                        Label::primary(value.span, "this value is already in memory"),
+1825                        Label::secondary(
+1826                            method_name.span,
+1827                            "hint: to make a copy, use `.clone()` here",
+1828                        ),
+1829                    ],
+1830                    vec![],
+1831                );
+1832            }
+1833            Ok((value_attrs, calltype))
+1834        }
+1835        ValueMethod::AbiEncode => {
+1836            abi_encoded_type(context, value_attrs.typ, value.span).map(|attr| (attr, calltype))
+1837        }
+1838    }
+1839}
+1840
+1841fn abi_encoded_type(
+1842    context: &mut dyn AnalyzerContext,
+1843    ty: TypeId,
+1844    span: Span,
+1845) -> Result<ExpressionAttributes, FatalError> {
+1846    match ty.typ(context.db()) {
+1847        Type::SPtr(inner) => {
+1848            let res = abi_encoded_type(context, inner, span);
+1849            if res.is_ok() {
+1850                context.add_diagnostic(errors::to_mem_error(span));
+1851            }
+1852            res
+1853        }
+1854        Type::Struct(struct_) => Ok(ExpressionAttributes::new(
+1855            Type::Array(Array {
+1856                inner: Type::u8().id(context.db()),
+1857                size: struct_.fields(context.db()).len() * 32,
+1858            })
+1859            .id(context.db()),
+1860        )),
+1861        Type::Tuple(tuple) => Ok(ExpressionAttributes::new(
+1862            Type::Array(Array {
+1863                inner: context.db().intern_type(Type::u8()),
+1864                size: tuple.items.len() * 32,
+1865            })
+1866            .id(context.db()),
+1867        )),
+1868        _ => Err(FatalError::new(context.fancy_error(
+1869            &format!(
+1870                "value of type `{}` does not support `abi_encode()`",
+1871                ty.display(context.db())
+1872            ),
+1873            vec![Label::primary(
+1874                span,
+1875                "this value cannot be encoded using `abi_encode()`",
+1876            )],
+1877            vec![
+1878                "Hint: struct and tuple values can be encoded.".into(),
+1879                "Example: `(42,).abi_encode()`".into(),
+1880            ],
+1881        ))),
+1882    }
+1883}
+1884
+1885fn expr_call_type_attribute(
+1886    context: &mut dyn AnalyzerContext,
+1887    typ: Type,
+1888    target_span: Span,
+1889    field: &Node<SmolStr>,
+1890    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1891    args: &Node<Vec<Node<fe::CallArg>>>,
+1892) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1893    if let Some(generic_args) = generic_args {
+1894        context.error(
+1895            "unexpected generic argument list",
+1896            generic_args.span,
+1897            "unexpected",
+1898        );
+1899    }
+1900
+1901    let arg_attributes = expr_call_args(context, args)?;
+1902
+1903    let target_type = typ.id(context.db());
+1904    let target_name = typ.name(context.db());
+1905
+1906    if let Type::Contract(contract) = typ {
+1907        // Check for Foo.create/create2 (this will go away when the context object is
+1908        // ready)
+1909        if let Ok(function) = ContractTypeMethod::from_str(&field.kind) {
+1910            if context.root_item() == Item::Type(TypeDef::Contract(contract)) {
+1911                context.fancy_error(
+1912                        &format!("`{contract}.{}(...)` called within `{contract}` creates an illegal circular dependency", function.as_ref(), contract=&target_name),
+1913                        vec![Label::primary(field.span, "Contract creation")],
+1914                        vec![format!("Note: Consider using a dedicated factory contract to create instances of `{}`", &target_name)]);
+1915            }
+1916            let arg_count = function.arg_count();
+1917            validate_arg_count(
+1918                context,
+1919                &field.kind,
+1920                field.span,
+1921                args,
+1922                arg_count,
+1923                "argument",
+1924            );
+1925
+1926            for i in 0..arg_count {
+1927                if let Some(attrs) = arg_attributes.get(i) {
+1928                    if i == 0 {
+1929                        if let Some(ctx_type) = context.get_context_type() {
+1930                            if attrs.typ != Type::Mut(ctx_type).id(context.db()) {
+1931                                context.fancy_error(
+1932                                    &format!(
+1933                                        "incorrect type for argument to `{}.{}`",
+1934                                        &target_name,
+1935                                        function.as_ref()
+1936                                    ),
+1937                                    vec![Label::primary(
+1938                                        args.kind[i].span,
+1939                                        format!(
+1940                                            "this has type `{}`; expected `mut Context`",
+1941                                            &attrs.typ.display(context.db())
+1942                                        ),
+1943                                    )],
+1944                                    vec![],
+1945                                );
+1946                            }
+1947                        } else {
+1948                            context.fancy_error(
+1949                                "`Context` is not defined",
+1950                                vec![
+1951                                    Label::primary(
+1952                                        args.span,
+1953                                        "`ctx` must be passed into the function",
+1954                                    ),
+1955                                    Label::secondary(
+1956                                        context.parent_function().name_span(context.db()),
+1957                                        "Note: declare `ctx` in this function signature",
+1958                                    ),
+1959                                    Label::secondary(
+1960                                        context.parent_function().name_span(context.db()),
+1961                                        "Example: `pub fn foo(ctx: Context, ...)`",
+1962                                    ),
+1963                                ],
+1964                                vec!["Example: `MyContract.create(ctx, 0)`".into()],
+1965                            );
+1966                        }
+1967                    } else if !attrs.typ.is_integer(context.db()) {
+1968                        context.fancy_error(
+1969                            &format!(
+1970                                "incorrect type for argument to `{}.{}`",
+1971                                &target_name,
+1972                                function.as_ref()
+1973                            ),
+1974                            vec![Label::primary(
+1975                                args.kind[i].span,
+1976                                format!(
+1977                                    "this has type `{}`; expected a number",
+1978                                    &attrs.typ.display(context.db())
+1979                                ),
+1980                            )],
+1981                            vec![],
+1982                        );
+1983                    }
+1984                }
+1985            }
+1986            return Ok((
+1987                ExpressionAttributes::new(context.db().intern_type(typ)),
+1988                CallType::BuiltinAssociatedFunction { contract, function },
+1989            ));
+1990        }
+1991    }
+1992
+1993    if let Some(sig) = target_type.function_sig(context.db(), &field.kind) {
+1994        if sig.takes_self(context.db()) {
+1995            return Err(FatalError::new(context.fancy_error(
+1996                &format!(
+1997                    "`{}` function `{}` must be called on an instance of `{}`",
+1998                    &target_name, &field.kind, &target_name,
+1999                ),
+2000                vec![Label::primary(
+2001                    target_span,
+2002                    format!(
+2003                        "expected a value of type `{}`, found type name",
+2004                        &target_name
+2005                    ),
+2006                )],
+2007                vec![],
+2008            )));
+2009        } else {
+2010            context.fancy_error(
+2011                "Static functions need to be called with `::` not `.`",
+2012                vec![Label::primary(
+2013                    field.span,
+2014                    "This is a static function (doesn't take a `self` parameter)",
+2015                )],
+2016                vec![format!(
+2017                    "Try `{}::{}(...)` instead",
+2018                    &target_name, &field.kind
+2019                )],
+2020            );
+2021        }
+2022
+2023        validate_visibility_of_called_fn(context, field.span, sig);
+2024
+2025        let ret_type = sig.signature(context.db()).return_type.clone()?;
+2026
+2027        return Ok((
+2028            ExpressionAttributes::new(ret_type),
+2029            CallType::AssociatedFunction {
+2030                typ: target_type,
+2031                function: sig
+2032                    .function(context.db())
+2033                    .expect("expected function signature to have body"),
+2034            },
+2035        ));
+2036    }
+2037
+2038    Err(FatalError::new(context.fancy_error(
+2039        &format!(
+2040            "No function `{}` exists on type `{}`",
+2041            &field.kind,
+2042            typ.display(context.db())
+2043        ),
+2044        vec![Label::primary(field.span, "undefined function")],
+2045        vec![],
+2046    )))
+2047}
+2048
+2049fn expr_call_args(
+2050    context: &mut dyn AnalyzerContext,
+2051    args: &Node<Vec<Node<fe::CallArg>>>,
+2052) -> Result<Vec<ExpressionAttributes>, FatalError> {
+2053    args.kind
+2054        .iter()
+2055        .map(|arg| expr(context, &arg.kind.value, None))
+2056        .collect::<Result<Vec<_>, _>>()
+2057}
+2058
+2059fn expect_no_label_on_arg(
+2060    context: &mut dyn AnalyzerContext,
+2061    args: &Node<Vec<Node<fe::CallArg>>>,
+2062    arg_index: usize,
+2063) {
+2064    if let Some(label) = args
+2065        .kind
+2066        .get(arg_index)
+2067        .and_then(|arg| arg.kind.label.as_ref())
+2068    {
+2069        context.error(
+2070            "argument should not be labeled",
+2071            label.span,
+2072            "remove this label",
+2073        );
+2074    }
+2075}
+2076
+2077fn check_for_call_to_special_fns(
+2078    context: &mut dyn AnalyzerContext,
+2079    name: &str,
+2080    span: Span,
+2081) -> Result<(), FatalError> {
+2082    if name == "__init__" || name == "__call__" {
+2083        let label = if name == "__init__" {
+2084            "Note: `__init__` is the constructor function, and can't be called at runtime."
+2085        } else {
+2086            // TODO: add a hint label explaining how to call contracts directly
+2087            // with `Context` (not yet supported).
+2088            "Note: `__call__` is not part of the contract's interface, and can't be called."
+2089        };
+2090        Err(FatalError::new(context.fancy_error(
+2091            &format!("`{name}()` is not directly callable"),
+2092            vec![Label::primary(span, "")],
+2093            vec![label.into()],
+2094        )))
+2095    } else {
+2096        Ok(())
+2097    }
+2098}
+2099
+2100fn validate_numeric_literal_fits_type(
+2101    context: &mut dyn AnalyzerContext,
+2102    num: BigInt,
+2103    span: Span,
+2104    int_type: Integer,
+2105) {
+2106    if !int_type.fits(num) {
+2107        context.error(
+2108            &format!("literal out of range for `{int_type}`"),
+2109            span,
+2110            &format!("does not fit into type `{int_type}`"),
+2111        );
+2112    }
+2113}
+2114
+2115fn expr_comp_operation(
+2116    context: &mut dyn AnalyzerContext,
+2117    exp: &Node<fe::Expr>,
+2118) -> Result<ExpressionAttributes, FatalError> {
+2119    if let fe::Expr::CompOperation { left, op, right } = &exp.kind {
+2120        // comparison operands should be moved to the stack
+2121        let left_ty = value_expr_type(context, left, None)?;
+2122        if left_ty.is_primitive(context.db()) {
+2123            expect_expr_type(context, right, left_ty, false)?;
+2124        } else {
+2125            context.error(
+2126                &format!(
+2127                    "`{}` type can't be compared with the `{}` operator",
+2128                    left_ty.display(context.db()),
+2129                    op.kind
+2130                ),
+2131                exp.span,
+2132                "invalid comparison",
+2133            );
+2134        }
+2135        return Ok(ExpressionAttributes::new(TypeId::bool(context.db())));
+2136    }
+2137
+2138    unreachable!()
+2139}
+2140
+2141fn expr_ternary(
+2142    context: &mut dyn AnalyzerContext,
+2143    exp: &Node<fe::Expr>,
+2144    expected_type: Option<TypeId>,
+2145) -> Result<ExpressionAttributes, FatalError> {
+2146    if let fe::Expr::Ternary {
+2147        if_expr,
+2148        test,
+2149        else_expr,
+2150    } = &exp.kind
+2151    {
+2152        error_if_not_bool(context, test, "`if` test expression must be a `bool`")?;
+2153        let if_attr = expr(context, if_expr, expected_type)?;
+2154        let else_attr = expr(context, else_expr, expected_type.or(Some(if_attr.typ)))?;
+2155
+2156        // Should have the same return Type
+2157        if if_attr.typ != else_attr.typ {
+2158            let if_expr_ty = deref_type(context, exp, if_attr.typ);
+2159
+2160            if try_coerce_type(context, Some(else_expr), else_attr.typ, if_expr_ty, false).is_err()
+2161            {
+2162                context.fancy_error(
+2163                    "`if` and `else` values must have same type",
+2164                    vec![
+2165                        Label::primary(
+2166                            if_expr.span,
+2167                            format!("this has type `{}`", if_attr.typ.display(context.db())),
+2168                        ),
+2169                        Label::secondary(
+2170                            else_expr.span,
+2171                            format!("this has type `{}`", else_attr.typ.display(context.db())),
+2172                        ),
+2173                    ],
+2174                    vec![],
+2175                );
+2176            }
+2177        }
+2178
+2179        return Ok(ExpressionAttributes::new(if_attr.typ));
+2180    }
+2181    unreachable!()
+2182}
+2183
+2184fn expr_bool_operation(
+2185    context: &mut dyn AnalyzerContext,
+2186    exp: &Node<fe::Expr>,
+2187) -> Result<ExpressionAttributes, FatalError> {
+2188    if let fe::Expr::BoolOperation { left, op: _, right } = &exp.kind {
+2189        let bool_ty = TypeId::bool(context.db());
+2190        expect_expr_type(context, left, bool_ty, false)?;
+2191        expect_expr_type(context, right, bool_ty, false)?;
+2192        return Ok(ExpressionAttributes::new(bool_ty));
+2193    }
+2194
+2195    unreachable!()
+2196}
+2197
+2198/// Converts a input string to `BigInt`.
+2199///
+2200/// # Panics
+2201/// Panics if `num` contains invalid digit.
+2202fn to_bigint(num: &str) -> BigInt {
+2203    numeric::Literal::new(num)
+2204        .parse::<BigInt>()
+2205        .expect("the numeric literal contains a invalid digit")
+2206}
+2207
+2208fn is_self_value(expr: &Node<fe::Expr>) -> bool {
+2209    if let fe::Expr::Name(name) = &expr.kind {
+2210        name == "self"
+2211    } else {
+2212        false
+2213    }
+2214}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/functions.rs.html b/compiler-docs/src/fe_analyzer/traversal/functions.rs.html new file mode 100644 index 0000000000..1496c8e86d --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/functions.rs.html @@ -0,0 +1,753 @@ +functions.rs - source

fe_analyzer/traversal/
functions.rs

1use crate::context::{AnalyzerContext, ExpressionAttributes, NamedThing};
+2use crate::display::Displayable;
+3use crate::errors::{self, FatalError, TypeCoercionError};
+4use crate::namespace::items::{EnumVariantId, EnumVariantKind, Item, StructId, TypeDef};
+5use crate::namespace::scopes::{BlockScope, BlockScopeType};
+6use crate::namespace::types::{Type, TypeId};
+7use crate::pattern_analysis::PatternMatrix;
+8use crate::traversal::{assignments, declarations, expressions, types};
+9use fe_common::diagnostics::Label;
+10use fe_parser::ast::{self as fe, LiteralPattern, Pattern};
+11use fe_parser::node::{Node, Span};
+12use indexmap::map::Entry;
+13use indexmap::{IndexMap, IndexSet};
+14use smol_str::SmolStr;
+15
+16use super::matching_anomaly;
+17
+18pub fn traverse_statements(
+19    scope: &mut BlockScope,
+20    body: &[Node<fe::FuncStmt>],
+21) -> Result<(), FatalError> {
+22    for stmt in body.iter() {
+23        func_stmt(scope, stmt)?
+24    }
+25    Ok(())
+26}
+27
+28fn func_stmt(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+29    use fe::FuncStmt::*;
+30    match &stmt.kind {
+31        Return { .. } => func_return(scope, stmt),
+32        VarDecl { .. } => declarations::var_decl(scope, stmt),
+33        ConstantDecl { .. } => declarations::const_decl(scope, stmt),
+34        Assign { .. } => assignments::assign(scope, stmt),
+35        AugAssign { .. } => assignments::aug_assign(scope, stmt),
+36        For { .. } => for_loop(scope, stmt),
+37        While { .. } => while_loop(scope, stmt),
+38        If { .. } => if_statement(scope, stmt),
+39        Match { .. } => match_statement(scope, stmt),
+40        Unsafe { .. } => unsafe_block(scope, stmt),
+41        Assert { .. } => assert(scope, stmt),
+42        Expr { value } => expressions::expr(scope, value, None).map(|_| ()),
+43        Revert { .. } => revert(scope, stmt),
+44        Break | Continue => {
+45            loop_flow_statement(scope, stmt);
+46            Ok(())
+47        }
+48    }
+49}
+50
+51fn for_loop(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+52    match &stmt.kind {
+53        fe::FuncStmt::For { target, iter, body } => {
+54            // Make sure iter is in the function scope & it should be an array.
+55            let iter_type = expressions::expr(scope, iter, None)?.typ;
+56
+57            let target_type = match iter_type.deref(scope.db()).typ(scope.db()) {
+58                Type::Array(array) => {
+59                    if iter_type.is_sptr(scope.db()) {
+60                        scope.add_diagnostic(errors::to_mem_error(iter.span));
+61                    }
+62                    array.inner
+63                }
+64                _ => {
+65                    return Err(FatalError::new(scope.register_diag(errors::type_error(
+66                        "invalid `for` loop iterator type",
+67                        iter.span,
+68                        "array",
+69                        iter_type.display(scope.db()),
+70                    ))))
+71                }
+72            };
+73            scope.root.map_variable_type(target, target_type);
+74
+75            let mut body_scope = scope.new_child(BlockScopeType::Loop);
+76            // add_var emits a msg on err; we can ignore the Result.
+77            let _ = body_scope.add_var(&target.kind, target_type, false, target.span);
+78
+79            // Traverse the statements within the `for loop` body scope.
+80            traverse_statements(&mut body_scope, body)
+81        }
+82        _ => unreachable!(),
+83    }
+84}
+85
+86fn loop_flow_statement(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) {
+87    if !scope.inherits_type(BlockScopeType::Loop) {
+88        let stmt_name = match stmt.kind {
+89            fe::FuncStmt::Continue => "continue",
+90            fe::FuncStmt::Break => "break",
+91            _ => unreachable!(),
+92        };
+93        scope.error(
+94            &format!("`{stmt_name}` outside of a loop"),
+95            stmt.span,
+96            &format!("`{stmt_name}` can only be used inside of a `for` or `while` loop"),
+97        );
+98    }
+99}
+100
+101fn if_statement(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+102    match &stmt.kind {
+103        fe::FuncStmt::If {
+104            test,
+105            body,
+106            or_else,
+107        } => {
+108            expressions::error_if_not_bool(scope, test, "`if` statement condition is not bool")?;
+109            traverse_statements(&mut scope.new_child(BlockScopeType::IfElse), body)?;
+110            traverse_statements(&mut scope.new_child(BlockScopeType::IfElse), or_else)?;
+111            Ok(())
+112        }
+113        _ => unreachable!(),
+114    }
+115}
+116
+117fn match_statement(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+118    match &stmt.kind {
+119        fe::FuncStmt::Match { expr, arms } => {
+120            let expr_type = expressions::expr(scope, expr, None)?.typ.deref(scope.db());
+121
+122            let match_scope = scope.new_child(BlockScopeType::Match);
+123
+124            // Do type check on pattern, then do analysis on arm body.
+125            let mut err_in_pat_check = Ok(());
+126            for arm in arms {
+127                let mut arm_scope = match_scope.new_child(BlockScopeType::MatchArm);
+128
+129                // Collect binds in the pattern.
+130                let binds = match match_pattern(&mut arm_scope, &arm.kind.pat, expr_type) {
+131                    Ok(binds) => binds,
+132                    Err(err) => {
+133                        err_in_pat_check = Err(err);
+134                        continue;
+135                    }
+136                };
+137
+138                // Introduce binds into arm body scope.
+139                let mut is_add_var_ok = true;
+140                for (name, bind) in binds {
+141                    // We use a first bind span in `add_var` here if multiple binds appear in the
+142                    // same pattern.
+143                    is_add_var_ok &= arm_scope
+144                        .add_var(&name, bind.ty, false, bind.spans[0])
+145                        .is_ok();
+146                }
+147
+148                if is_add_var_ok {
+149                    traverse_statements(&mut arm_scope, &arm.kind.body).ok();
+150                }
+151            }
+152
+153            err_in_pat_check?;
+154            matching_anomaly::check_match_exhaustiveness(scope, arms, stmt.span, expr_type)?;
+155            matching_anomaly::check_unreachable_pattern(scope, arms, stmt.span, expr_type)?;
+156            let pattern_matrix = PatternMatrix::from_arms(scope, arms, expr_type);
+157            scope.root.map_pattern_matrix(stmt, pattern_matrix);
+158            Ok(())
+159        }
+160        _ => unreachable!(),
+161    }
+162}
+163
+164fn match_pattern(
+165    scope: &mut BlockScope,
+166    pat: &Node<Pattern>,
+167    expected_type: TypeId,
+168) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+169    match &pat.kind {
+170        Pattern::WildCard => Ok(IndexMap::new()),
+171
+172        Pattern::Rest => Err(FatalError::new(scope.error(
+173            "`..` is not allowed here",
+174            pat.span,
+175            "rest pattern is only allowed in tuple pattern",
+176        ))),
+177
+178        Pattern::Literal(lit_pat) => {
+179            let lit_ty = match lit_pat.kind {
+180                LiteralPattern::Bool(_) => TypeId::bool(scope.db()),
+181            };
+182            if expected_type == lit_ty {
+183                Ok(IndexMap::new())
+184            } else {
+185                let err = scope.type_error("", pat.span, expected_type, lit_ty);
+186                Err(FatalError::new(err))
+187            }
+188        }
+189
+190        Pattern::Tuple(elts) => {
+191            let expected_elts = if let Type::Tuple(tup) = expected_type.typ(scope.db()) {
+192                tup.items
+193            } else {
+194                let label_msg = format!(
+195                    "expected {}, but found tuple`",
+196                    expected_type.display(scope.db())
+197                );
+198                return Err(FatalError::new(scope.fancy_error(
+199                    "mismatched types",
+200                    vec![Label::primary(pat.span, label_msg)],
+201                    vec![],
+202                )));
+203            };
+204
+205            tuple_pattern(scope, elts, &expected_elts, pat.span, None)
+206        }
+207
+208        Pattern::Path(path) => match scope.resolve_visible_path(&path.kind) {
+209            Some(NamedThing::EnumVariant(variant)) => {
+210                let db = scope.db();
+211                let parent_type = variant.parent(db).as_type(db);
+212                let kind = variant.kind(db)?;
+213                if kind != EnumVariantKind::Unit {
+214                    let variant_kind_name = kind.display_name();
+215                    let err = scope.fancy_error(
+216                        "expected an unit variant",
+217                        vec![
+218                            Label::primary(
+219                                path.span,
+220                                format!("the variant is defined as {variant_kind_name}"),
+221                            ),
+222                            Label::secondary(
+223                                variant.span(scope.db()),
+224                                format! {"{} is defined here", variant.name(scope.db())},
+225                            ),
+226                        ],
+227                        vec![],
+228                    );
+229                    return Err(FatalError::new(err));
+230                }
+231
+232                if parent_type != expected_type {
+233                    let err = scope.type_error("", pat.span, expected_type, parent_type);
+234                    Err(FatalError::new(err))
+235                } else {
+236                    Ok(IndexMap::new())
+237                }
+238            }
+239
+240            Some(NamedThing::Variable { name, span, .. }) => {
+241                let err = scope.duplicate_name_error(
+242                    &format!("`{name}` is already defined"),
+243                    &name,
+244                    span,
+245                    pat.span,
+246                );
+247                Err(FatalError::new(err))
+248            }
+249
+250            None if path.kind.segments.len() == 1 => {
+251                let name = path.kind.segments[0].kind.clone();
+252                let bind = Bind::new(name.clone(), expected_type, pat.span);
+253                let mut binds = IndexMap::new();
+254                binds.insert(name, bind);
+255                Ok(binds)
+256            }
+257
+258            None => {
+259                let path = &path.kind;
+260                let err = scope.fancy_error(
+261                    &format! {"failed to resolve `{path}`"},
+262                    vec![Label::primary(
+263                        pat.span,
+264                        format!("use of undeclared type `{path}`"),
+265                    )],
+266                    vec![],
+267                );
+268                Err(FatalError::new(err))
+269            }
+270
+271            _ => {
+272                let err = scope.fancy_error(
+273                    "expected enum variant or variable",
+274                    vec![Label::primary(
+275                        pat.span,
+276                        format!("`{}` is not a enum variant or variable", path.kind),
+277                    )],
+278                    vec![],
+279                );
+280                Err(FatalError::new(err))
+281            }
+282        },
+283
+284        Pattern::PathTuple(path, pat_elts) => {
+285            let variant = match scope.resolve_path(&path.kind, path.span)? {
+286                NamedThing::EnumVariant(variant) => variant,
+287                _ => {
+288                    let err = scope.fancy_error(
+289                        "expected enum variant",
+290                        vec![Label::primary(path.span, "expected enum variant here")],
+291                        vec![],
+292                    );
+293                    return Err(FatalError::new(err));
+294                }
+295            };
+296
+297            let parent_type = variant.parent(scope.db()).as_type(scope.db());
+298            if parent_type != expected_type {
+299                let err = scope.type_error("", pat.span, expected_type, parent_type);
+300                return Err(FatalError::new(err));
+301            }
+302
+303            let variant_kind = variant.kind(scope.db())?;
+304            let ty_elts = match variant_kind {
+305                EnumVariantKind::Tuple(types) => types,
+306                EnumVariantKind::Unit => {
+307                    let variant_kind_name = variant_kind.display_name();
+308                    let err = scope.fancy_error(
+309                        "expected a tuple variant",
+310                        vec![
+311                            Label::primary(
+312                                path.span,
+313                                format!("the variant is defined as {variant_kind_name}"),
+314                            ),
+315                            Label::secondary(
+316                                variant.span(scope.db()),
+317                                format! {"{} is defined here", variant.name(scope.db())},
+318                            ),
+319                        ],
+320                        vec![],
+321                    );
+322                    return Err(FatalError::new(err));
+323                }
+324            };
+325
+326            tuple_pattern(scope, pat_elts, &ty_elts, pat.span, Some(variant))
+327        }
+328
+329        Pattern::PathStruct {
+330            path,
+331            fields,
+332            has_rest,
+333        } => {
+334            let (sid, ty) = match scope.resolve_path(&path.kind, path.span)? {
+335                NamedThing::Item(Item::Type(TypeDef::Struct(sid))) => {
+336                    (sid, sid.as_type(scope.db()))
+337                }
+338                _ => {
+339                    let err = scope.fancy_error(
+340                        "expected struct type",
+341                        vec![Label::primary(
+342                            pat.span,
+343                            format!("`{}` is not a struct name", path.kind),
+344                        )],
+345                        vec![],
+346                    );
+347                    return Err(FatalError::new(err));
+348                }
+349            };
+350
+351            if ty != expected_type {
+352                let err = scope.type_error("", pat.span, expected_type, ty);
+353                return Err(FatalError::new(err));
+354            }
+355
+356            struct_pattern(scope, fields, *has_rest, sid, pat.span)
+357        }
+358
+359        Pattern::Or(sub_pats) => {
+360            let mut subpat_binds = vec![];
+361            let mut all_variables = IndexSet::new();
+362
+363            // Collect binds and variable names in the all sub patterns.
+364            for sub_pat in sub_pats {
+365                let pattern = match_pattern(scope, sub_pat, expected_type)?;
+366                for var in pattern.keys() {
+367                    all_variables.insert(var.clone());
+368                }
+369
+370                subpat_binds.push((sub_pat, pattern));
+371            }
+372
+373            // Check all variables are defined in the all sub patterns.
+374            let mut err = None;
+375            for var in all_variables.iter() {
+376                for (subpat, binds) in subpat_binds.iter() {
+377                    if !binds.contains_key(var) {
+378                        err = Some(scope.fancy_error(
+379                            &format!("variable `{var}` is not bound in all sub patterns"),
+380                            vec![Label::primary(
+381                                subpat.span,
+382                                format!("variable `{var}` is not bound here"),
+383                            )],
+384                            vec![],
+385                        ));
+386                    }
+387                }
+388            }
+389            if let Some(err) = err {
+390                return Err(FatalError::new(err));
+391            }
+392
+393            // Check all variables has the same type.
+394            err = None;
+395            for var in all_variables.iter() {
+396                let first_bind = &subpat_binds.first().unwrap().1[var];
+397                let ty = first_bind.ty;
+398                for (_, binds) in subpat_binds.iter().skip(1) {
+399                    let bind = &binds[var];
+400                    if bind.ty != ty {
+401                        bind.spans.iter().for_each(|span| {
+402                            err = Some(scope.type_error(
+403                                &format! {"mismatched type for `{var}` between sub patterns"},
+404                                *span,
+405                                ty,
+406                                bind.ty,
+407                            ));
+408                        });
+409                    }
+410                }
+411            }
+412            if let Some(err) = err {
+413                return Err(FatalError::new(err));
+414            }
+415
+416            // Merge subpat binds.
+417            let mut result: IndexMap<SmolStr, Bind> = IndexMap::new();
+418            for (_, binds) in subpat_binds {
+419                for (name, bind) in binds {
+420                    result
+421                        .entry(name)
+422                        .and_modify(|entry| entry.spans.extend_from_slice(&bind.spans))
+423                        .or_insert(bind);
+424                }
+425            }
+426            Ok(result)
+427        }
+428    }
+429}
+430
+431fn struct_pattern(
+432    scope: &mut BlockScope,
+433    fields: &[(Node<SmolStr>, Node<Pattern>)],
+434    has_rest: bool,
+435    sid: StructId,
+436    pat_span: Span,
+437) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+438    let mut pat_fields: IndexMap<SmolStr, (Node<Pattern>, Span)> = IndexMap::new();
+439    let mut maybe_err = Ok(());
+440    for (name, pat) in fields.iter() {
+441        match pat_fields.entry(name.kind.clone()) {
+442            Entry::Occupied(entry) => {
+443                let err = scope.fancy_error(
+444                    &format!("duplicate field `{}` bound in the pattern", name.kind),
+445                    vec![
+446                        Label::primary(name.span, "multiple uses here"),
+447                        Label::secondary(entry.get().1, "first binding of the field"),
+448                    ],
+449                    vec![],
+450                );
+451                maybe_err = Err(FatalError::new(err));
+452            }
+453            Entry::Vacant(entry) => {
+454                entry.insert((pat.clone(), name.span));
+455            }
+456        }
+457    }
+458
+459    maybe_err?;
+460    let mut maybe_err = Ok(());
+461
+462    let fields_def = sid.fields(scope.db());
+463    let mut ordered_patterns = Vec::with_capacity(fields_def.len());
+464    let mut expected_types = Vec::with_capacity(fields_def.len());
+465
+466    for (f_name, field) in sid.fields(scope.db()).iter() {
+467        let ty = match field.typ(scope.db()) {
+468            Ok(ty) => ty,
+469            Err(err) => {
+470                maybe_err = Err(err.into());
+471                continue;
+472            }
+473        };
+474
+475        let pat = match pat_fields.remove(f_name) {
+476            Some((_, span)) if !field.is_public(scope.db()) => {
+477                let err = scope.fancy_error(
+478                    &format!("field `{f_name}` is not public field"),
+479                    vec![
+480                        Label::primary(span, format!("`{f_name}` is not public")),
+481                        Label::secondary(field.span(scope.db()), "field is defined here"),
+482                    ],
+483                    vec![],
+484                );
+485                maybe_err = Err(FatalError::new(err));
+486                continue;
+487            }
+488            Some((pat, _)) => pat,
+489            None => {
+490                if has_rest {
+491                    let dummy_span = Span::dummy();
+492                    Node::new(Pattern::WildCard, dummy_span)
+493                } else {
+494                    let err = scope.fancy_error(
+495                        &format!("missing field `{f_name}` in the pattern"),
+496                        vec![Label::primary(pat_span, "missing field")],
+497                        vec![],
+498                    );
+499                    maybe_err = Err(FatalError::new(err));
+500                    continue;
+501                }
+502            }
+503        };
+504
+505        ordered_patterns.push(pat);
+506        expected_types.push(ty);
+507    }
+508
+509    maybe_err?;
+510
+511    collect_binds_from_pat_vec(scope, &ordered_patterns, &expected_types)
+512}
+513
+514fn tuple_pattern(
+515    scope: &mut BlockScope,
+516    tuple_elts: &[Node<Pattern>],
+517    expected_tys: &[TypeId],
+518    pat_span: Span,
+519    variant: Option<EnumVariantId>,
+520) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+521    let mut rest_pat_pos: Option<(usize, Span)> = None;
+522    for (i, pat) in tuple_elts.iter().enumerate() {
+523        if pat.kind.is_rest() {
+524            if rest_pat_pos.is_some() {
+525                let err = scope.fancy_error(
+526                    "multiple rest patterns are not allowed",
+527                    vec![
+528                        Label::primary(pat.span, "multiple rest patterns are not allowed"),
+529                        Label::secondary(rest_pat_pos.unwrap().1, "first rest pattern is here"),
+530                    ],
+531                    vec![],
+532                );
+533                return Err(FatalError::new(err));
+534            } else {
+535                rest_pat_pos = Some((i, pat.span));
+536            }
+537        }
+538    }
+539
+540    let emit_len_error = |actual, expected| {
+541        let mut labels = vec![Label::primary(
+542            pat_span,
+543            format! {"expected {expected} elements, but {actual}"},
+544        )];
+545        if let Some(variant) = variant {
+546            labels.push(Label::secondary(
+547                variant.span(scope.db()),
+548                format! {"{} is defined here", variant.name(scope.db())},
+549            ));
+550        }
+551
+552        let err = scope.fancy_error("the number of tuple variant mismatch", labels, vec![]);
+553        Err(FatalError::new(err))
+554    };
+555
+556    if rest_pat_pos.is_some() && tuple_elts.len() - 1 > expected_tys.len() {
+557        return emit_len_error(tuple_elts.len() - 1, expected_tys.len());
+558    } else if rest_pat_pos.is_none() && tuple_elts.len() != expected_tys.len() {
+559        return emit_len_error(tuple_elts.len(), expected_tys.len());
+560    };
+561
+562    collect_binds_from_pat_vec(scope, tuple_elts, expected_tys)
+563}
+564
+565fn collect_binds_from_pat_vec(
+566    scope: &mut BlockScope,
+567    pats: &[Node<Pattern>],
+568    expected_types: &[TypeId],
+569) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+570    let mut binds: IndexMap<SmolStr, Bind> = IndexMap::new();
+571    let mut types_iter = expected_types.iter();
+572    for pat in pats.iter() {
+573        if pat.kind.is_rest() {
+574            let pat_num_in_rest = expected_types.len() - (pats.len() - 1);
+575            for _ in 0..pat_num_in_rest {
+576                types_iter.next();
+577            }
+578            continue;
+579        }
+580
+581        for (name, bind) in match_pattern(scope, pat, *types_iter.next().unwrap())?.into_iter() {
+582            match binds.entry(name) {
+583                Entry::Occupied(entry) => {
+584                    let original = entry.get();
+585                    let err = scope.fancy_error(
+586                        "same variable appears in the same pattern",
+587                        vec![
+588                            Label::primary(
+589                                bind.spans[0],
+590                                format! {"{} is already defined", bind.name },
+591                            ),
+592                            Label::secondary(
+593                                original.spans[0],
+594                                format! {"{} is originally defined here", original.name },
+595                            ),
+596                        ],
+597                        vec![],
+598                    );
+599                    return Err(FatalError::new(err));
+600                }
+601                Entry::Vacant(entry) => {
+602                    entry.insert(bind);
+603                }
+604            }
+605        }
+606    }
+607
+608    Ok(binds)
+609}
+610
+611#[derive(Clone, PartialEq, Eq, Hash)]
+612struct Bind {
+613    name: SmolStr,
+614    ty: TypeId,
+615    spans: Vec<Span>,
+616}
+617
+618impl Bind {
+619    fn new(name: SmolStr, ty: TypeId, span: Span) -> Self {
+620        Self {
+621            name,
+622            ty,
+623            spans: vec![span],
+624        }
+625    }
+626}
+627
+628fn unsafe_block(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+629    match &stmt.kind {
+630        fe::FuncStmt::Unsafe(body) => {
+631            if scope.inherits_type(BlockScopeType::Unsafe) {
+632                scope.error(
+633                    "unnecessary `unsafe` block",
+634                    stmt.span,
+635                    "this `unsafe` block is nested inside another `unsafe` context",
+636                );
+637            }
+638            traverse_statements(&mut scope.new_child(BlockScopeType::Unsafe), body)
+639        }
+640        _ => unreachable!(),
+641    }
+642}
+643
+644fn while_loop(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+645    match &stmt.kind {
+646        fe::FuncStmt::While { test, body } => {
+647            expressions::error_if_not_bool(scope, test, "`while` loop condition is not bool")?;
+648            traverse_statements(&mut scope.new_child(BlockScopeType::Loop), body)?;
+649            Ok(())
+650        }
+651        _ => unreachable!(),
+652    }
+653}
+654
+655fn assert(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+656    if let fe::FuncStmt::Assert { test, msg } = &stmt.kind {
+657        expressions::error_if_not_bool(scope, test, "`assert` condition is not bool")?;
+658
+659        if let Some(msg) = msg {
+660            let msg_attributes = expressions::expr(scope, msg, None)?;
+661            match msg_attributes.typ.typ(scope.db()) {
+662                Type::String(_) => {}
+663                Type::SPtr(inner) if matches!(inner.typ(scope.db()), Type::String(_)) => {
+664                    scope.add_diagnostic(errors::to_mem_error(msg.span));
+665                }
+666                _ => {
+667                    scope.error(
+668                        "`assert` reason must be a string",
+669                        msg.span,
+670                        &format!(
+671                            "this has type `{}`; expected a string",
+672                            msg_attributes.typ.display(scope.db())
+673                        ),
+674                    );
+675                }
+676            }
+677        }
+678
+679        return Ok(());
+680    }
+681
+682    unreachable!()
+683}
+684
+685fn revert(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+686    if let fe::FuncStmt::Revert { error } = &stmt.kind {
+687        if let Some(error_expr) = error {
+688            let error_attr = expressions::expr(scope, error_expr, None)?;
+689            if !error_attr.typ.deref(scope.db()).is_struct(scope.db()) {
+690                scope.error(
+691                    "`revert` error must be a struct",
+692                    error_expr.span,
+693                    &format!(
+694                        "this has type `{}`; expected a struct",
+695                        error_attr.typ.deref(scope.db()).display(scope.db())
+696                    ),
+697                );
+698            } else if error_attr.typ.is_sptr(scope.db()) {
+699                scope.fancy_error(
+700                    "`revert` value must be copied to memory",
+701                    vec![Label::primary(error_expr.span, "this value is in storage")],
+702                    vec!["Hint: values located in storage can be copied to memory using the `to_mem` function.".into(),
+703                         format!("Example: `{}.to_mem()`", error_expr.kind),
+704                    ],
+705                );
+706            }
+707        }
+708
+709        return Ok(());
+710    }
+711
+712    unreachable!()
+713}
+714
+715fn func_return(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+716    if let fe::FuncStmt::Return { value } = &stmt.kind {
+717        let expected_type = scope.root.function_return_type()?.deref(scope.db());
+718
+719        let value_attr = match value {
+720            Some(val) => expressions::expr(scope, val, Some(expected_type))?,
+721            None => ExpressionAttributes::new(TypeId::unit(scope.db())),
+722        };
+723
+724        match types::try_coerce_type(scope, value.as_ref(), value_attr.typ, expected_type, true) {
+725            Err(TypeCoercionError::RequiresToMem) => {
+726                let value = value.clone().expect("to_mem required on unit type?");
+727                scope.add_diagnostic(errors::to_mem_error(value.span));
+728            }
+729            Err(TypeCoercionError::Incompatible) => {
+730                scope.error(
+731                    &format!(
+732                        "expected function to return `{}` but was `{}`",
+733                        expected_type.display(scope.db()),
+734                        value_attr.typ.deref(scope.db()).display(scope.db())
+735                    ),
+736                    stmt.span,
+737                    "",
+738                );
+739            }
+740            Err(TypeCoercionError::SelfContractType) => {
+741                scope.add_diagnostic(errors::self_contract_type_error(
+742                    value.as_ref().unwrap().span,
+743                    &expected_type.display(scope.db()),
+744                ));
+745            }
+746            Ok(_) => {}
+747        }
+748
+749        return Ok(());
+750    }
+751
+752    unreachable!()
+753}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html b/compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html new file mode 100644 index 0000000000..5a280b16d0 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html @@ -0,0 +1,101 @@ +matching_anomaly.rs - source

fe_analyzer/traversal/
matching_anomaly.rs

1use std::fmt::Write;
+2
+3use fe_common::Span;
+4use fe_parser::{ast::MatchArm, node::Node, Label};
+5
+6use crate::{
+7    context::AnalyzerContext,
+8    display::Displayable,
+9    errors::FatalError,
+10    namespace::{scopes::BlockScope, types::TypeId},
+11    AnalyzerDb,
+12};
+13
+14use super::pattern_analysis::{PatternMatrix, SimplifiedPattern};
+15
+16pub(super) fn check_match_exhaustiveness(
+17    scope: &mut BlockScope,
+18    arms: &[Node<MatchArm>],
+19    match_span: Span,
+20    ty: TypeId,
+21) -> Result<(), FatalError> {
+22    if arms.is_empty() {
+23        let err = scope.fancy_error(
+24            "patterns is not exhaustive",
+25            vec![Label::primary(
+26                match_span,
+27                "expected at least one match arm here",
+28            )],
+29            vec![],
+30        );
+31        return Err(FatalError::new(err));
+32    }
+33
+34    let pattern_matrix = PatternMatrix::from_arms(scope, arms, ty);
+35    match pattern_matrix.find_non_exhaustiveness(scope.db()) {
+36        Some(pats) => {
+37            let err = scope.fancy_error(
+38                "patterns is not exhaustive",
+39                vec![Label::primary(
+40                    match_span,
+41                    format! {"`{}` not covered", display_non_exhaustive_patterns(scope.db(), &pats)},
+42                )],
+43                vec![],
+44            );
+45            Err(FatalError::new(err))
+46        }
+47        None => Ok(()),
+48    }
+49}
+50
+51pub(super) fn check_unreachable_pattern(
+52    scope: &mut BlockScope,
+53    arms: &[Node<MatchArm>],
+54    match_span: Span,
+55    ty: TypeId,
+56) -> Result<(), FatalError> {
+57    if arms.is_empty() {
+58        let err = scope.fancy_error(
+59            "patterns is not exhaustive",
+60            vec![Label::primary(
+61                match_span,
+62                "expected at least one match arm here",
+63            )],
+64            vec![],
+65        );
+66        return Err(FatalError::new(err));
+67    }
+68
+69    let pattern_matrix = PatternMatrix::from_arms(scope, arms, ty);
+70    let mut res = Ok(());
+71    for (i, arms) in arms.iter().enumerate() {
+72        if !pattern_matrix.is_row_useful(scope.db(), i) {
+73            let err = scope.fancy_error(
+74                "unreachable pattern ",
+75                vec![Label::primary(
+76                    arms.kind.pat.span,
+77                    "this arm is unreachable",
+78                )],
+79                vec![],
+80            );
+81            res = Err(FatalError::new(err));
+82        }
+83    }
+84    res
+85}
+86
+87fn display_non_exhaustive_patterns(db: &dyn AnalyzerDb, pats: &[SimplifiedPattern]) -> String {
+88    if pats.len() == 1 {
+89        format!("{}", pats[0].display(db))
+90    } else {
+91        let mut s = "(".to_string();
+92        let mut delim = "";
+93        for pat in pats {
+94            let pat = pat.display(db);
+95            write!(s, "{delim}{pat}").unwrap();
+96            delim = ", ";
+97        }
+98        s.push(')');
+99        s
+100    }
+101}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/mod.rs.html b/compiler-docs/src/fe_analyzer/traversal/mod.rs.html new file mode 100644 index 0000000000..440379c090 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/mod.rs.html @@ -0,0 +1,14 @@ +mod.rs - source

fe_analyzer/traversal/
mod.rs

1pub mod functions;
+2pub mod pattern_analysis;
+3pub mod pragma;
+4pub mod types;
+5
+6pub(crate) mod const_expr;
+7pub(crate) mod expressions;
+8
+9mod assignments;
+10mod borrowck;
+11mod call_args;
+12mod declarations;
+13mod matching_anomaly;
+14mod utils;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html b/compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html new file mode 100644 index 0000000000..842bce7c47 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html @@ -0,0 +1,753 @@ +pattern_analysis.rs - source

fe_analyzer/traversal/
pattern_analysis.rs

1//! This module includes utility structs and its functions for pattern matching
+2//! analysis. The algorithm here is based on [Warnings for pattern matching](https://www.cambridge.org/core/journals/journal-of-functional-programming/article/warnings-for-pattern-matching/3165B75113781E2431E3856972940347)
+3//!
+4//! In this module, we assume all types are well-typed, so we can rely on the
+5//! type information without checking it.
+6
+7use std::fmt;
+8
+9use fe_parser::{
+10    ast::{LiteralPattern, MatchArm, Pattern},
+11    node::Node,
+12};
+13use indexmap::{IndexMap, IndexSet};
+14use smol_str::SmolStr;
+15
+16use crate::{
+17    context::{AnalyzerContext, NamedThing},
+18    display::{DisplayWithDb, Displayable},
+19    namespace::{
+20        items::{EnumVariantId, EnumVariantKind, Item, StructId, TypeDef},
+21        scopes::BlockScope,
+22        types::{Base, Type, TypeId},
+23    },
+24    AnalyzerDb,
+25};
+26
+27#[derive(Clone, Debug, PartialEq, Eq)]
+28pub struct PatternMatrix {
+29    rows: Vec<PatternRowVec>,
+30}
+31
+32impl PatternMatrix {
+33    pub fn new(rows: Vec<PatternRowVec>) -> Self {
+34        Self { rows }
+35    }
+36
+37    pub fn from_arms<'db>(
+38        scope: &'db BlockScope<'db, 'db>,
+39        arms: &[Node<MatchArm>],
+40        ty: TypeId,
+41    ) -> Self {
+42        let mut rows = Vec::with_capacity(arms.len());
+43        for (i, arm) in arms.iter().enumerate() {
+44            rows.push(PatternRowVec::new(vec![simplify_pattern(
+45                scope,
+46                &arm.kind.pat.kind,
+47                ty,
+48                i,
+49            )]));
+50        }
+51
+52        Self { rows }
+53    }
+54
+55    pub fn rows(&self) -> &[PatternRowVec] {
+56        &self.rows
+57    }
+58
+59    pub fn into_rows(self) -> Vec<PatternRowVec> {
+60        self.rows
+61    }
+62
+63    pub fn find_non_exhaustiveness(&self, db: &dyn AnalyzerDb) -> Option<Vec<SimplifiedPattern>> {
+64        if self.nrows() == 0 {
+65            // Non Exhaustive!
+66            return Some(vec![]);
+67        }
+68        if self.ncols() == 0 {
+69            return None;
+70        }
+71
+72        let ty = self.first_column_ty();
+73        let sigma_set = self.sigma_set();
+74        if sigma_set.is_complete(db) {
+75            for ctor in sigma_set.into_iter() {
+76                match self.phi_specialize(db, ctor).find_non_exhaustiveness(db) {
+77                    Some(vec) if vec.is_empty() => {
+78                        let pat_kind = SimplifiedPatternKind::Constructor {
+79                            kind: ctor,
+80                            fields: vec![],
+81                        };
+82                        let pat = SimplifiedPattern::new(pat_kind, ty);
+83
+84                        return Some(vec![pat]);
+85                    }
+86
+87                    Some(mut vec) => {
+88                        let field_num = ctor.arity(db);
+89                        debug_assert!(vec.len() >= field_num);
+90                        let rem = vec.split_off(field_num);
+91                        let pat_kind = SimplifiedPatternKind::Constructor {
+92                            kind: ctor,
+93                            fields: vec,
+94                        };
+95                        let pat = SimplifiedPattern::new(pat_kind, ty);
+96
+97                        let mut result = vec![pat];
+98                        result.extend_from_slice(&rem);
+99                        return Some(result);
+100                    }
+101
+102                    None => {}
+103                }
+104            }
+105
+106            None
+107        } else {
+108            self.d_specialize(db)
+109                .find_non_exhaustiveness(db)
+110                .map(|vec| {
+111                    let sigma_set = self.sigma_set();
+112                    let kind = if sigma_set.is_empty() {
+113                        SimplifiedPatternKind::WildCard(None)
+114                    } else {
+115                        let complete_sigma = SigmaSet::complete_sigma(db, ty);
+116                        SimplifiedPatternKind::Or(
+117                            complete_sigma
+118                                .difference(&sigma_set)
+119                                .into_iter()
+120                                .map(|ctor| {
+121                                    let kind =
+122                                        SimplifiedPatternKind::ctor_with_wild_card_fields(db, ctor);
+123                                    SimplifiedPattern::new(kind, ty)
+124                                })
+125                                .collect(),
+126                        )
+127                    };
+128
+129                    let mut result = vec![SimplifiedPattern::new(kind, ty)];
+130                    result.extend_from_slice(&vec);
+131
+132                    result
+133                })
+134        }
+135    }
+136
+137    pub fn is_row_useful(&self, db: &dyn AnalyzerDb, row: usize) -> bool {
+138        debug_assert!(self.nrows() > row);
+139
+140        Self {
+141            rows: self.rows[0..row].to_vec(),
+142        }
+143        .is_pattern_useful(db, &self.rows[row])
+144    }
+145
+146    pub fn nrows(&self) -> usize {
+147        self.rows.len()
+148    }
+149
+150    pub fn ncols(&self) -> usize {
+151        debug_assert_ne!(self.nrows(), 0);
+152        let ncols = self.rows[0].len();
+153        debug_assert!(self.rows.iter().all(|row| row.len() == ncols));
+154        ncols
+155    }
+156
+157    pub fn swap_col(&mut self, col1: usize, col2: usize) {
+158        for row in &mut self.rows {
+159            row.swap(col1, col2);
+160        }
+161    }
+162
+163    pub fn sigma_set(&self) -> SigmaSet {
+164        SigmaSet::from_rows(self.rows.iter(), 0)
+165    }
+166
+167    pub fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Self {
+168        let mut new_cols = Vec::new();
+169        for col in &self.rows {
+170            new_cols.extend_from_slice(&col.phi_specialize(db, ctor));
+171        }
+172        Self { rows: new_cols }
+173    }
+174
+175    pub fn d_specialize(&self, db: &dyn AnalyzerDb) -> Self {
+176        let mut new_cols = Vec::new();
+177        for col in &self.rows {
+178            new_cols.extend_from_slice(&col.d_specialize(db));
+179        }
+180        Self { rows: new_cols }
+181    }
+182
+183    fn first_column_ty(&self) -> TypeId {
+184        debug_assert_ne!(self.ncols(), 0);
+185        self.rows[0].first_column_ty()
+186    }
+187
+188    fn is_pattern_useful(&self, db: &dyn AnalyzerDb, pat_vec: &PatternRowVec) -> bool {
+189        if self.nrows() == 0 {
+190            return true;
+191        }
+192
+193        if self.ncols() == 0 {
+194            return false;
+195        }
+196
+197        match &pat_vec.head().unwrap().kind {
+198            SimplifiedPatternKind::WildCard(_) => self
+199                .d_specialize(db)
+200                .is_pattern_useful(db, &pat_vec.d_specialize(db)[0]),
+201
+202            SimplifiedPatternKind::Constructor { kind, .. } => self
+203                .phi_specialize(db, *kind)
+204                .is_pattern_useful(db, &pat_vec.phi_specialize(db, *kind)[0]),
+205
+206            SimplifiedPatternKind::Or(pats) => {
+207                for pat in pats {
+208                    if self.is_pattern_useful(db, &PatternRowVec::new(vec![pat.clone()])) {
+209                        return true;
+210                    }
+211                }
+212                false
+213            }
+214        }
+215    }
+216}
+217
+218#[derive(Clone, Debug, PartialEq, Eq)]
+219pub struct SimplifiedPattern {
+220    pub kind: SimplifiedPatternKind,
+221    pub ty: TypeId,
+222}
+223
+224impl SimplifiedPattern {
+225    pub fn new(kind: SimplifiedPatternKind, ty: TypeId) -> Self {
+226        Self { kind, ty }
+227    }
+228
+229    pub fn wildcard(bind: Option<(SmolStr, usize)>, ty: TypeId) -> Self {
+230        Self::new(SimplifiedPatternKind::WildCard(bind), ty)
+231    }
+232
+233    pub fn is_wildcard(&self) -> bool {
+234        matches!(self.kind, SimplifiedPatternKind::WildCard(_))
+235    }
+236}
+237
+238impl DisplayWithDb for SimplifiedPattern {
+239    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+240        match &self.kind {
+241            SimplifiedPatternKind::WildCard(None) => write!(f, "_"),
+242            SimplifiedPatternKind::WildCard(Some((name, _))) => write!(f, "{name}"),
+243
+244            SimplifiedPatternKind::Constructor {
+245                kind: ConstructorKind::Enum(id),
+246                fields,
+247            } => {
+248                let ctor_name = id.name_with_parent(db);
+249                write!(f, "{ctor_name}")?;
+250                if !id.kind(db).unwrap().is_unit() {
+251                    write!(f, "(")?;
+252                    let mut delim = "";
+253                    for field in fields {
+254                        let displayable = field.display(db);
+255                        write!(f, "{delim}{displayable}")?;
+256                        delim = ", ";
+257                    }
+258                    write!(f, ")")
+259                } else {
+260                    Ok(())
+261                }
+262            }
+263
+264            SimplifiedPatternKind::Constructor {
+265                kind: ConstructorKind::Tuple(_),
+266                fields,
+267            } => {
+268                write!(f, "(")?;
+269                let mut delim = "";
+270                for field in fields {
+271                    let displayable = field.display(db);
+272                    write!(f, "{delim}{displayable}")?;
+273                    delim = ", ";
+274                }
+275                write!(f, ")")
+276            }
+277
+278            SimplifiedPatternKind::Constructor {
+279                kind: ConstructorKind::Struct(sid),
+280                fields,
+281            } => {
+282                let struct_name = sid.name(db);
+283                write!(f, "{struct_name} {{ ")?;
+284                let mut delim = "";
+285
+286                for (field_name, field_pat) in sid
+287                    .fields(db)
+288                    .iter()
+289                    .map(|(field_name, _)| field_name)
+290                    .zip(fields.iter())
+291                {
+292                    let displayable = field_pat.display(db);
+293                    write!(f, "{delim}{field_name}: {displayable}")?;
+294                    delim = ", ";
+295                }
+296                write!(f, "}}")
+297            }
+298
+299            SimplifiedPatternKind::Constructor {
+300                kind: ConstructorKind::Literal((lit, _)),
+301                ..
+302            } => {
+303                write!(f, "{lit}")
+304            }
+305
+306            SimplifiedPatternKind::Or(pats) => {
+307                let mut delim = "";
+308                for pat in pats {
+309                    let pat = pat.display(db);
+310                    write!(f, "{delim}{pat}")?;
+311                    delim = " | ";
+312                }
+313                Ok(())
+314            }
+315        }
+316    }
+317}
+318
+319#[derive(Clone, Debug, PartialEq, Eq)]
+320pub enum SimplifiedPatternKind {
+321    WildCard(Option<(SmolStr, usize)>),
+322    Constructor {
+323        kind: ConstructorKind,
+324        fields: Vec<SimplifiedPattern>,
+325    },
+326    Or(Vec<SimplifiedPattern>),
+327}
+328
+329impl SimplifiedPatternKind {
+330    pub fn collect_ctors(&self) -> Vec<ConstructorKind> {
+331        match self {
+332            Self::WildCard(_) => vec![],
+333            Self::Constructor { kind, .. } => vec![*kind],
+334            Self::Or(pats) => {
+335                let mut ctors = vec![];
+336                for pat in pats {
+337                    ctors.extend_from_slice(&pat.kind.collect_ctors());
+338                }
+339                ctors
+340            }
+341        }
+342    }
+343
+344    pub fn ctor_with_wild_card_fields(db: &dyn AnalyzerDb, kind: ConstructorKind) -> Self {
+345        let fields = kind
+346            .field_types(db)
+347            .into_iter()
+348            .map(|ty| SimplifiedPattern::wildcard(None, ty))
+349            .collect();
+350        Self::Constructor { kind, fields }
+351    }
+352}
+353
+354#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+355pub enum ConstructorKind {
+356    Enum(EnumVariantId),
+357    Tuple(TypeId),
+358    Struct(StructId),
+359    Literal((LiteralPattern, TypeId)),
+360}
+361
+362#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+363pub enum LiteralConstructor {
+364    Bool(bool),
+365}
+366
+367impl ConstructorKind {
+368    pub fn field_types(&self, db: &dyn AnalyzerDb) -> Vec<TypeId> {
+369        match self {
+370            Self::Enum(id) => match id.kind(db).unwrap() {
+371                EnumVariantKind::Unit => vec![],
+372                EnumVariantKind::Tuple(types) => types.to_vec(),
+373            },
+374            Self::Tuple(ty) => ty.tuple_elts(db),
+375            Self::Struct(sid) => sid
+376                .fields(db)
+377                .iter()
+378                .map(|(_, fid)| fid.typ(db).unwrap())
+379                .collect(),
+380            Self::Literal(_) => vec![],
+381        }
+382    }
+383
+384    pub fn arity(&self, db: &dyn AnalyzerDb) -> usize {
+385        match self {
+386            Self::Enum(id) => match id.kind(db).unwrap() {
+387                EnumVariantKind::Unit => 0,
+388                EnumVariantKind::Tuple(types) => types.len(),
+389            },
+390            Self::Tuple(ty) => ty.tuple_elts(db).len(),
+391            Self::Struct(sid) => sid.fields(db).len(),
+392            Self::Literal(_) => 0,
+393        }
+394    }
+395
+396    pub fn ty(&self, db: &dyn AnalyzerDb) -> TypeId {
+397        match self {
+398            Self::Enum(id) => id.parent(db).as_type(db),
+399            Self::Tuple(ty) => *ty,
+400            Self::Struct(sid) => sid.as_type(db),
+401            Self::Literal((_, ty)) => *ty,
+402        }
+403    }
+404}
+405
+406#[derive(Clone, Debug, PartialEq, Eq)]
+407pub struct SigmaSet(IndexSet<ConstructorKind>);
+408
+409impl SigmaSet {
+410    pub fn from_rows<'a>(rows: impl Iterator<Item = &'a PatternRowVec>, column: usize) -> Self {
+411        let mut ctor_set = IndexSet::new();
+412        for row in rows {
+413            for ctor in row.collect_column_ctors(column) {
+414                ctor_set.insert(ctor);
+415            }
+416        }
+417        Self(ctor_set)
+418    }
+419
+420    pub fn complete_sigma(db: &dyn AnalyzerDb, ty: TypeId) -> Self {
+421        let inner = match ty.typ(db) {
+422            Type::Enum(id) => id
+423                .variants(db)
+424                .values()
+425                .map(|id| ConstructorKind::Enum(*id))
+426                .collect(),
+427
+428            Type::Tuple(_) => [ConstructorKind::Tuple(ty)].into_iter().collect(),
+429
+430            Type::Base(Base::Bool) => [
+431                ConstructorKind::Literal((LiteralPattern::Bool(true), ty)),
+432                ConstructorKind::Literal((LiteralPattern::Bool(false), ty)),
+433            ]
+434            .into_iter()
+435            .collect(),
+436
+437            _ => {
+438                unimplemented!()
+439            }
+440        };
+441
+442        Self(inner)
+443    }
+444
+445    pub fn is_complete(&self, db: &dyn AnalyzerDb) -> bool {
+446        match self.0.first() {
+447            Some(ctor) => {
+448                let expected = ctor_variant_num(db, *ctor);
+449                debug_assert!(self.len() <= expected);
+450                self.len() == expected
+451            }
+452            None => false,
+453        }
+454    }
+455
+456    pub fn len(&self) -> usize {
+457        self.0.len()
+458    }
+459
+460    pub fn is_empty(&self) -> bool {
+461        self.0.is_empty()
+462    }
+463
+464    pub fn iter(&self) -> impl Iterator<Item = &ConstructorKind> {
+465        self.0.iter()
+466    }
+467
+468    pub fn difference(&self, other: &Self) -> Self {
+469        Self(self.0.difference(&other.0).cloned().collect())
+470    }
+471}
+472
+473impl IntoIterator for SigmaSet {
+474    type Item = ConstructorKind;
+475    type IntoIter = <IndexSet<ConstructorKind> as IntoIterator>::IntoIter;
+476
+477    fn into_iter(self) -> Self::IntoIter {
+478        self.0.into_iter()
+479    }
+480}
+481
+482#[derive(Clone, Debug, PartialEq, Eq)]
+483pub struct PatternRowVec {
+484    pub inner: Vec<SimplifiedPattern>,
+485}
+486
+487impl PatternRowVec {
+488    pub fn new(inner: Vec<SimplifiedPattern>) -> Self {
+489        Self { inner }
+490    }
+491
+492    pub fn len(&self) -> usize {
+493        self.inner.len()
+494    }
+495
+496    pub fn is_empty(&self) -> bool {
+497        self.inner.is_empty()
+498    }
+499
+500    pub fn pats(&self) -> &[SimplifiedPattern] {
+501        &self.inner
+502    }
+503
+504    pub fn head(&self) -> Option<&SimplifiedPattern> {
+505        self.inner.first()
+506    }
+507
+508    pub fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Vec<Self> {
+509        debug_assert!(!self.inner.is_empty());
+510
+511        let first_pat = &self.inner[0];
+512        let ctor_fields = ctor.field_types(db);
+513        match &first_pat.kind {
+514            SimplifiedPatternKind::WildCard(bind) => {
+515                let mut inner = Vec::with_capacity(self.inner.len() + ctor_fields.len() - 1);
+516                for field_ty in ctor_fields {
+517                    inner.push(SimplifiedPattern::wildcard(bind.clone(), field_ty));
+518                }
+519                inner.extend_from_slice(&self.inner[1..]);
+520                vec![Self::new(inner)]
+521            }
+522
+523            SimplifiedPatternKind::Constructor { kind, fields } => {
+524                if *kind == ctor {
+525                    let mut inner = Vec::with_capacity(self.inner.len() + ctor_fields.len() - 1);
+526                    inner.extend_from_slice(fields);
+527                    inner.extend_from_slice(&self.inner[1..]);
+528                    vec![Self::new(inner)]
+529                } else {
+530                    vec![]
+531                }
+532            }
+533
+534            SimplifiedPatternKind::Or(pats) => {
+535                let mut result = vec![];
+536                for pat in pats {
+537                    let mut tmp_inner = Vec::with_capacity(self.inner.len());
+538                    tmp_inner.push(pat.clone());
+539                    tmp_inner.extend_from_slice(&self.inner[1..]);
+540                    let tmp = PatternRowVec::new(tmp_inner);
+541                    for v in tmp.phi_specialize(db, ctor) {
+542                        result.push(v);
+543                    }
+544                }
+545                result
+546            }
+547        }
+548    }
+549
+550    pub fn swap(&mut self, a: usize, b: usize) {
+551        self.inner.swap(a, b);
+552    }
+553
+554    pub fn d_specialize(&self, _db: &dyn AnalyzerDb) -> Vec<Self> {
+555        debug_assert!(!self.inner.is_empty());
+556
+557        let first_pat = &self.inner[0];
+558        match &first_pat.kind {
+559            SimplifiedPatternKind::WildCard(_) => {
+560                let inner = self.inner[1..].to_vec();
+561                vec![Self::new(inner)]
+562            }
+563
+564            SimplifiedPatternKind::Constructor { .. } => {
+565                vec![]
+566            }
+567
+568            SimplifiedPatternKind::Or(pats) => {
+569                let mut result = vec![];
+570                for pat in pats {
+571                    let mut tmp_inner = Vec::with_capacity(self.inner.len());
+572                    tmp_inner.push(pat.clone());
+573                    tmp_inner.extend_from_slice(&self.inner[1..]);
+574                    let tmp = PatternRowVec::new(tmp_inner);
+575                    for v in tmp.d_specialize(_db) {
+576                        result.push(v);
+577                    }
+578                }
+579                result
+580            }
+581        }
+582    }
+583
+584    pub fn collect_column_ctors(&self, column: usize) -> Vec<ConstructorKind> {
+585        debug_assert!(!self.inner.is_empty());
+586
+587        let first_pat = &self.inner[column];
+588        first_pat.kind.collect_ctors()
+589    }
+590
+591    fn first_column_ty(&self) -> TypeId {
+592        debug_assert!(!self.inner.is_empty());
+593
+594        self.inner[0].ty
+595    }
+596}
+597
+598fn ctor_variant_num(db: &dyn AnalyzerDb, ctor: ConstructorKind) -> usize {
+599    match ctor {
+600        ConstructorKind::Enum(variant) => {
+601            let enum_id = variant.parent(db);
+602            enum_id.variants(db).len()
+603        }
+604        ConstructorKind::Tuple(_) | ConstructorKind::Struct(_) => 1,
+605        ConstructorKind::Literal((LiteralPattern::Bool(_), _)) => 2,
+606    }
+607}
+608
+609fn simplify_pattern(
+610    scope: &BlockScope,
+611    pat: &Pattern,
+612    ty: TypeId,
+613    arm_idx: usize,
+614) -> SimplifiedPattern {
+615    let kind = match pat {
+616        Pattern::WildCard => SimplifiedPatternKind::WildCard(None),
+617
+618        Pattern::Rest => {
+619            // Rest is only allowed in the tuple pattern.
+620            unreachable!()
+621        }
+622
+623        Pattern::Literal(lit) => {
+624            let ctor_kind = ConstructorKind::Literal((lit.kind, ty));
+625            SimplifiedPatternKind::Constructor {
+626                kind: ctor_kind,
+627                fields: vec![],
+628            }
+629        }
+630
+631        Pattern::Tuple(elts) => {
+632            let ctor_kind = ConstructorKind::Tuple(ty);
+633            let elts_tys = ty.tuple_elts(scope.db());
+634
+635            SimplifiedPatternKind::Constructor {
+636                kind: ctor_kind,
+637                fields: simplify_tuple_pattern(scope, elts, &elts_tys, arm_idx),
+638            }
+639        }
+640
+641        Pattern::Path(path) => match scope.resolve_visible_path(&path.kind) {
+642            Some(NamedThing::EnumVariant(variant)) => SimplifiedPatternKind::Constructor {
+643                kind: ConstructorKind::Enum(variant),
+644                fields: vec![],
+645            },
+646            _ => {
+647                debug_assert!(path.kind.segments.len() == 1);
+648                SimplifiedPatternKind::WildCard(Some((path.kind.segments[0].kind.clone(), arm_idx)))
+649            }
+650        },
+651
+652        Pattern::PathTuple(path, elts) => {
+653            let variant = match scope.resolve_visible_path(&path.kind).unwrap() {
+654                NamedThing::EnumVariant(variant) => variant,
+655                _ => unreachable!(),
+656            };
+657            let ctor_kind = ConstructorKind::Enum(variant);
+658            let elts_tys = ctor_kind.field_types(scope.db());
+659
+660            SimplifiedPatternKind::Constructor {
+661                kind: ctor_kind,
+662                fields: simplify_tuple_pattern(scope, elts, &elts_tys, arm_idx),
+663            }
+664        }
+665
+666        Pattern::PathStruct {
+667            path,
+668            fields: pat_fields,
+669            ..
+670        } => {
+671            let (sid, ctor_kind) = match scope.resolve_visible_path(&path.kind).unwrap() {
+672                NamedThing::Item(Item::Type(TypeDef::Struct(sid))) => {
+673                    (sid, ConstructorKind::Struct(sid))
+674                }
+675                // Implement this when struct variant is supported.
+676                NamedThing::EnumVariant(_) => todo!(),
+677                _ => unreachable!(),
+678            };
+679
+680            // Canonicalize the fields order so that the order is the same as the
+681            // struct fields.
+682            let pat_fields: IndexMap<_, _> = pat_fields
+683                .iter()
+684                .map(|field_pat| (field_pat.0.kind.clone(), field_pat.1.clone()))
+685                .collect();
+686            let fields_def = sid.fields(scope.db());
+687            let mut canonicalized_fields = Vec::with_capacity(fields_def.len());
+688            for (field_name, fid) in fields_def.iter() {
+689                let field_ty = fid.typ(scope.db()).unwrap();
+690                if let Some(pat) = pat_fields.get(field_name) {
+691                    let pat = simplify_pattern(scope, &pat.kind, field_ty, arm_idx);
+692                    canonicalized_fields.push(pat);
+693                } else {
+694                    canonicalized_fields.push(SimplifiedPattern::wildcard(None, field_ty));
+695                }
+696            }
+697
+698            SimplifiedPatternKind::Constructor {
+699                kind: ctor_kind,
+700                fields: canonicalized_fields,
+701            }
+702        }
+703
+704        Pattern::Or(pats) => SimplifiedPatternKind::Or(
+705            pats.iter()
+706                .map(|pat| simplify_pattern(scope, &pat.kind, ty, arm_idx))
+707                .collect(),
+708        ),
+709    };
+710
+711    SimplifiedPattern::new(kind, ty)
+712}
+713
+714fn simplify_tuple_pattern(
+715    scope: &BlockScope,
+716    elts: &[Node<Pattern>],
+717    elts_tys: &[TypeId],
+718    arm_idx: usize,
+719) -> Vec<SimplifiedPattern> {
+720    let mut simplified_elts = vec![];
+721    let mut tys_iter = elts_tys.iter();
+722
+723    for pat in elts {
+724        if pat.kind.is_rest() {
+725            for _ in 0..(elts_tys.len() - (elts.len() - 1)) {
+726                let ty = tys_iter.next().unwrap();
+727                simplified_elts.push(SimplifiedPattern::new(
+728                    SimplifiedPatternKind::WildCard(None),
+729                    *ty,
+730                ));
+731            }
+732        } else {
+733            simplified_elts.push(simplify_pattern(
+734                scope,
+735                &pat.kind,
+736                *tys_iter.next().unwrap(),
+737                arm_idx,
+738            ));
+739        }
+740    }
+741
+742    debug_assert!(tys_iter.next().is_none());
+743    simplified_elts
+744}
+745
+746impl TypeId {
+747    fn tuple_elts(self, db: &dyn AnalyzerDb) -> Vec<TypeId> {
+748        match self.typ(db) {
+749            Type::Tuple(tup) => tup.items.to_vec(),
+750            _ => unreachable!(),
+751        }
+752    }
+753}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/pragma.rs.html b/compiler-docs/src/fe_analyzer/traversal/pragma.rs.html new file mode 100644 index 0000000000..989a7fd3c5 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/pragma.rs.html @@ -0,0 +1,31 @@ +pragma.rs - source

fe_analyzer/traversal/
pragma.rs

1use crate::errors;
+2use fe_common::diagnostics::{Diagnostic, Label};
+3use fe_parser::ast;
+4use fe_parser::node::Node;
+5use semver::{Version, VersionReq};
+6
+7pub fn check_pragma_version(stmt: &Node<ast::Pragma>) -> Option<Diagnostic> {
+8    let version_requirement = &stmt.kind.version_requirement;
+9    // This can't fail because the parser already validated it
+10    let requirement =
+11        VersionReq::parse(&version_requirement.kind).expect("Invalid version requirement");
+12    let actual_version =
+13        Version::parse(env!("CARGO_PKG_VERSION")).expect("Missing package version");
+14
+15    if requirement.matches(&actual_version) {
+16        None
+17    } else {
+18        Some(errors::fancy_error(
+19            format!(
+20                "The current compiler version {actual_version} doesn't match the specified requirement"
+21            ),
+22            vec![Label::primary(
+23                version_requirement.span,
+24                "The specified version requirement",
+25            )],
+26            vec![format!(
+27                "Note: Use `pragma {actual_version}` to make the code compile"
+28            )],
+29        ))
+30    }
+31}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/types.rs.html b/compiler-docs/src/fe_analyzer/traversal/types.rs.html new file mode 100644 index 0000000000..dd9d147804 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/types.rs.html @@ -0,0 +1,654 @@ +types.rs - source

fe_analyzer/traversal/
types.rs

1use crate::builtins::ValueMethod;
+2use crate::context::{
+3    Adjustment, AdjustmentKind, AnalyzerContext, CallType, Constant, ExpressionAttributes,
+4    NamedThing,
+5};
+6use crate::display::Displayable;
+7use crate::errors::{TypeCoercionError, TypeError};
+8use crate::namespace::items::{Item, TraitId};
+9use crate::namespace::types::{
+10    Base, FeString, GenericArg, GenericParamKind, GenericType, Integer, TraitOrType, Tuple, Type,
+11    TypeId,
+12};
+13use crate::traversal::call_args::validate_arg_count;
+14use fe_common::diagnostics::Label;
+15use fe_common::utils::humanize::pluralize_conditionally;
+16use fe_common::Spanned;
+17use fe_parser::ast;
+18use fe_parser::node::{Node, Span};
+19use std::cmp::Ordering;
+20
+21/// Try to perform an explicit type cast, eg `u256(my_address)` or `address(my_contract)`.
+22/// Returns nothing. Emits an error if the cast fails; explicit cast failures are not fatal.
+23pub fn try_cast_type(
+24    context: &mut dyn AnalyzerContext,
+25    from: TypeId,
+26    from_expr: &Node<ast::Expr>,
+27    into: TypeId,
+28    into_span: Span,
+29) {
+30    if into == from {
+31        return;
+32    }
+33    match (from.typ(context.db()), into.typ(context.db())) {
+34        (Type::SPtr(inner), _) => {
+35            adjust_type(context, from_expr, inner, AdjustmentKind::Load);
+36            try_cast_type(context, inner, from_expr, into, into_span)
+37        }
+38
+39        (Type::Mut(inner), _) => try_cast_type(context, inner, from_expr, into, into_span),
+40        (Type::SelfType(TraitOrType::TypeId(inner)), _) => {
+41            try_cast_type(context, inner, from_expr, into, into_span)
+42        }
+43
+44        (Type::String(from_str), Type::String(into_str)) => {
+45            if from_str.max_size > into_str.max_size {
+46                context.error(
+47                    "string capacity exceeded",
+48                    from_expr.span,
+49                    &format!(
+50                        "this string has length {}; expected length <= {}",
+51                        from_str.max_size, into_str.max_size
+52                    ),
+53                );
+54            } else {
+55                adjust_type(context, from_expr, into, AdjustmentKind::StringSizeIncrease);
+56            }
+57        }
+58
+59        (Type::Base(Base::Address), Type::Contract(_)) => {}
+60        (Type::Contract(_), Type::Base(Base::Address)) => {}
+61
+62        (Type::Base(Base::Numeric(from_int)), Type::Base(Base::Numeric(into_int))) => {
+63            let sign_differs = from_int.is_signed() != into_int.is_signed();
+64            let size_differs = from_int.size() != into_int.size();
+65
+66            if sign_differs && size_differs {
+67                context.error(
+68                        "Casting between numeric values can change the sign or size but not both at once",
+69                        from_expr.span,
+70                        &format!("can not cast from `{}` to `{}` in a single step",
+71                                 from.display(context.db()),
+72                                 into.display(context.db())));
+73            }
+74        }
+75        (Type::Base(Base::Numeric(_)), Type::Base(Base::Address)) => {}
+76        (Type::Base(Base::Address), Type::Base(Base::Numeric(into))) => {
+77            if into != Integer::U256 {
+78                context.error(
+79                    &format!("can't cast `address` to `{into}`"),
+80                    into_span,
+81                    "try `u256` here",
+82                );
+83            }
+84        }
+85        (Type::SelfContract(_), Type::Base(Base::Address)) => {
+86            context.error(
+87                "`self` address must be retrieved via `Context` object",
+88                into_span + from_expr.span,
+89                "use `ctx.self_address()` here",
+90            );
+91        }
+92
+93        (_, Type::Base(Base::Unit)) => unreachable!(), // rejected in expr_call_type
+94        (_, Type::Base(Base::Bool)) => unreachable!(), // handled in expr_call_type_constructor
+95        (_, Type::Tuple(_)) => unreachable!(),         // rejected in expr_call_type
+96        (_, Type::Struct(_)) => unreachable!(),        // handled in expr_call_type_constructor
+97        (_, Type::Map(_)) => unreachable!(),           // handled in expr_call_type_constructor
+98        (_, Type::Array(_)) => unreachable!(),         // handled in expr_call_type_constructor
+99        (_, Type::Generic(_)) => unreachable!(),       // handled in expr_call_type_constructor
+100        (_, Type::SelfContract(_)) => unreachable!(),  // contract names become Contract
+101
+102        _ => {
+103            context.error(
+104                &format!(
+105                    "incorrect type for argument to `{}`",
+106                    into.display(context.db())
+107                ),
+108                from_expr.span,
+109                &format!(
+110                    "cannot cast type `{}` to type `{}`",
+111                    from.display(context.db()),
+112                    into.display(context.db()),
+113                ),
+114            );
+115        }
+116    };
+117}
+118
+119pub fn deref_type(context: &mut dyn AnalyzerContext, expr: &Node<ast::Expr>, ty: TypeId) -> TypeId {
+120    match ty.typ(context.db()) {
+121        Type::SPtr(inner) => adjust_type(context, expr, inner, AdjustmentKind::Load),
+122        Type::Mut(inner) => deref_type(context, expr, inner),
+123        Type::SelfType(TraitOrType::TypeId(inner)) => deref_type(context, expr, inner),
+124        _ => ty,
+125    }
+126}
+127
+128pub fn adjust_type(
+129    context: &mut dyn AnalyzerContext,
+130    expr: &Node<ast::Expr>,
+131    into: TypeId,
+132    kind: AdjustmentKind,
+133) -> TypeId {
+134    context.update_expression(expr, &|attr: &mut ExpressionAttributes| {
+135        attr.type_adjustments.push(Adjustment { into, kind });
+136    });
+137    into
+138}
+139
+140pub fn try_coerce_type(
+141    context: &mut dyn AnalyzerContext,
+142    from_expr: Option<&Node<ast::Expr>>,
+143    from: TypeId,
+144    into: TypeId,
+145    should_copy: bool,
+146) -> Result<TypeId, TypeCoercionError> {
+147    let chain = coerce(context, from_expr, from, into, should_copy, vec![])?;
+148    if let Some(expr) = from_expr {
+149        context.update_expression(expr, &|attr: &mut ExpressionAttributes| {
+150            attr.type_adjustments.extend(chain.iter())
+151        });
+152    }
+153    Ok(into)
+154}
+155
+156fn coerce(
+157    context: &mut dyn AnalyzerContext,
+158    from_expr: Option<&Node<ast::Expr>>,
+159    from: TypeId,
+160    into: TypeId,
+161    should_copy: bool,
+162    chain: Vec<Adjustment>,
+163) -> Result<Vec<Adjustment>, TypeCoercionError> {
+164    // Cut down on some obviously unnecessary copy operations,
+165    // because we don't currently optimize MIR.
+166    let should_copy = should_copy
+167        && !into.is_sptr(context.db())
+168        && !into.deref(context.db()).is_primitive(context.db())
+169        && !from_expr.map(|e| is_temporary(context, e)).unwrap_or(false);
+170
+171    if from == into {
+172        let chain = add_adjustment_if(
+173            should_copy,
+174            chain,
+175            from.deref(context.db()),
+176            AdjustmentKind::Copy,
+177        );
+178        return Ok(chain);
+179    }
+180
+181    match (from.typ(context.db()), into.typ(context.db())) {
+182        (Type::SPtr(from), Type::SPtr(into)) => {
+183            coerce(context, from_expr, from, into, false, chain)
+184        }
+185        // Strip off any `mut`s.
+186        // Fn call `mut` is checked in `fn validate_arg_type`.
+187        (Type::Mut(from), Type::Mut(into)) => {
+188            let chain = add_adjustment_if(should_copy, chain, into, AdjustmentKind::Copy);
+189            coerce(context, from_expr, from, into, false, chain)
+190        }
+191        (Type::Mut(from), _) => {
+192            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+193            coerce(context, from_expr, from, into, false, chain)
+194        }
+195        (_, Type::Mut(into)) => {
+196            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+197            coerce(context, from_expr, from, into, false, chain)
+198        }
+199        (Type::SelfType(TraitOrType::TypeId(from)), _) => {
+200            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+201            coerce(context, from_expr, from, into, false, chain)
+202        }
+203        (_, Type::SelfType(TraitOrType::TypeId(into))) => {
+204            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+205            coerce(context, from_expr, from, into, false, chain)
+206        }
+207
+208        // Primitive types can be moved from storage implicitly.
+209        // Contract type is also a primitive.
+210        (Type::SPtr(from_inner), Type::Base(_) | Type::Contract(_)) => coerce(
+211            context,
+212            from_expr,
+213            from_inner,
+214            into,
+215            false,
+216            add_adjustment(chain, from_inner, AdjustmentKind::Load),
+217        ),
+218
+219        // complex types require .to_mem()
+220        (Type::SPtr(from), _) => {
+221            // If the inner types are incompatible, report that error instead
+222            try_coerce_type(context, from_expr, from, into, false)?;
+223            Err(TypeCoercionError::RequiresToMem)
+224        }
+225
+226        // All types can be moved into storage implicitly.
+227        // Note that no `Adjustment` is added here.
+228        (_, Type::SPtr(into)) => coerce(context, from_expr, from, into, false, chain),
+229
+230        (
+231            Type::String(FeString { max_size: from_sz }),
+232            Type::String(FeString { max_size: into_sz }),
+233        ) => match into_sz.cmp(&from_sz) {
+234            Ordering::Equal => Ok(chain),
+235            Ordering::Greater => Ok(add_adjustment(
+236                chain,
+237                into,
+238                AdjustmentKind::StringSizeIncrease,
+239            )),
+240            Ordering::Less => Err(TypeCoercionError::Incompatible),
+241        },
+242        (Type::SelfContract(from), Type::Contract(into)) => {
+243            if from == into {
+244                Err(TypeCoercionError::SelfContractType)
+245            } else {
+246                Err(TypeCoercionError::Incompatible)
+247            }
+248        }
+249
+250        (Type::Tuple(ftup), Type::Tuple(itup)) => {
+251            // If the rhs is a tuple expr, each element gets its own coercion chain.
+252            // Else, we don't allow coercion (for now, at least).
+253            if let Some(Node {
+254                kind: ast::Expr::Tuple { elts },
+255                ..
+256            }) = &from_expr
+257            {
+258                if ftup.items.len() == itup.items.len()
+259                    && elts
+260                        .iter()
+261                        .zip(ftup.items.iter().zip(itup.items.iter()))
+262                        .map(|(elt, (from, into))| {
+263                            try_coerce_type(context, Some(elt), *from, *into, should_copy).is_ok()
+264                        })
+265                        .all(|x| x)
+266                {
+267                    // Update the type of the rhs tuple, because its elements
+268                    // have been coerced into the lhs element types.
+269                    context.update_expression(from_expr.unwrap(), &|attr| attr.typ = into);
+270                    return Ok(chain);
+271                }
+272            }
+273            Err(TypeCoercionError::Incompatible)
+274        }
+275
+276        (Type::Base(Base::Numeric(f)), Type::Base(Base::Numeric(i))) => {
+277            if f.is_signed() == i.is_signed() && i.size() > f.size() {
+278                Ok(add_adjustment(chain, into, AdjustmentKind::IntSizeIncrease))
+279            } else {
+280                Err(TypeCoercionError::Incompatible)
+281            }
+282        }
+283        (_, _) => Err(TypeCoercionError::Incompatible),
+284    }
+285}
+286
+287#[must_use]
+288fn add_adjustment(
+289    mut chain: Vec<Adjustment>,
+290    into: TypeId,
+291    kind: AdjustmentKind,
+292) -> Vec<Adjustment> {
+293    chain.push(Adjustment { into, kind });
+294    chain
+295}
+296
+297#[must_use]
+298fn add_adjustment_if(
+299    test: bool,
+300    mut chain: Vec<Adjustment>,
+301    into: TypeId,
+302    kind: AdjustmentKind,
+303) -> Vec<Adjustment> {
+304    if test {
+305        chain.push(Adjustment { into, kind });
+306    }
+307    chain
+308}
+309
+310fn is_temporary(context: &dyn AnalyzerContext, expr: &Node<ast::Expr>) -> bool {
+311    match &expr.kind {
+312        ast::Expr::Tuple { .. } | ast::Expr::List { .. } | ast::Expr::Repeat { .. } => true,
+313        ast::Expr::Path(path) => {
+314            matches!(
+315                context.resolve_path(path, expr.span),
+316                Ok(NamedThing::EnumVariant(_))
+317            )
+318        }
+319        ast::Expr::Call { func, .. } => matches!(
+320            context.get_call(func),
+321            Some(CallType::TypeConstructor(_))
+322                | Some(CallType::EnumConstructor(_))
+323                | Some(CallType::BuiltinValueMethod {
+324                    method: ValueMethod::ToMem | ValueMethod::AbiEncode,
+325                    ..
+326                })
+327        ),
+328        _ => false,
+329    }
+330}
+331
+332pub fn apply_generic_type_args(
+333    context: &mut dyn AnalyzerContext,
+334    generic: GenericType,
+335    name_span: Span,
+336    args: Option<&Node<Vec<ast::GenericArg>>>,
+337) -> Result<TypeId, TypeError> {
+338    let params = generic.params();
+339
+340    let args = args.ok_or_else(|| {
+341        TypeError::new(context.fancy_error(
+342            &format!(
+343                "missing generic {} for type `{}`",
+344                pluralize_conditionally("argument", params.len()),
+345                generic.name()
+346            ),
+347            vec![Label::primary(
+348                name_span,
+349                format!(
+350                    "expected {} generic {}",
+351                    params.len(),
+352                    pluralize_conditionally("argument", params.len())
+353                ),
+354            )],
+355            vec![friendly_generic_arg_example_string(generic)],
+356        ))
+357    })?;
+358
+359    if let Some(diag) = validate_arg_count(
+360        context,
+361        &generic.name(),
+362        name_span,
+363        args,
+364        params.len(),
+365        "generic argument",
+366    ) {
+367        return Err(TypeError::new(diag));
+368    }
+369
+370    let concrete_args = params
+371        .iter()
+372        .zip(args.kind.iter())
+373        .map(|(param, arg)| match (param.kind, arg) {
+374            (GenericParamKind::Int, ast::GenericArg::Int(int_node)) => {
+375                Ok(GenericArg::Int(int_node.kind))
+376            }
+377
+378            (GenericParamKind::Int, ast::GenericArg::TypeDesc(_)) => {
+379                Err(TypeError::new(context.fancy_error(
+380                    &format!("`{}` {} must be an integer", generic.name(), param.name),
+381                    vec![Label::primary(arg.span(), "expected an integer")],
+382                    vec![],
+383                )))
+384            }
+385
+386            (GenericParamKind::Int, ast::GenericArg::ConstExpr(expr)) => {
+387                // Performs semantic analysis on `expr`.
+388                super::expressions::expr(context, expr, None)?;
+389
+390                // Evaluates expression.
+391                let const_value = super::const_expr::eval_expr(context, expr)?;
+392
+393                // TODO: Fix me when `GenericArg` can represent literals not only `Int`.
+394                match const_value {
+395                    Constant::Int(val) => Ok(GenericArg::Int(val.try_into().unwrap())),
+396                    Constant::Address(_) | Constant::Bool(_) | Constant::Str(_) => {
+397                        Err(TypeError::new(context.not_yet_implemented(
+398                            "non numeric type const generics",
+399                            expr.span,
+400                        )))
+401                    }
+402                }
+403            }
+404
+405            (GenericParamKind::PrimitiveType, ast::GenericArg::TypeDesc(type_node)) => {
+406                let typ = type_desc(context, type_node, None)?;
+407                if typ.is_primitive(context.db()) {
+408                    Ok(GenericArg::Type(typ))
+409                } else {
+410                    Err(TypeError::new(context.error(
+411                        &format!(
+412                            "`{}` {} must be a primitive type",
+413                            generic.name(),
+414                            param.name
+415                        ),
+416                        type_node.span,
+417                        &format!(
+418                            "this has type `{}`; expected a primitive type",
+419                            typ.display(context.db())
+420                        ),
+421                    )))
+422                }
+423            }
+424
+425            (GenericParamKind::AnyType, ast::GenericArg::TypeDesc(type_node)) => {
+426                Ok(GenericArg::Type(type_desc(context, type_node, None)?))
+427            }
+428
+429            (
+430                GenericParamKind::PrimitiveType | GenericParamKind::AnyType,
+431                ast::GenericArg::Int(_) | ast::GenericArg::ConstExpr(_),
+432            ) => Err(TypeError::new(context.fancy_error(
+433                &format!("`{}` {} must be a type", generic.name(), param.name),
+434                vec![Label::primary(arg.span(), "expected a type name")],
+435                vec![],
+436            ))),
+437        })
+438        .collect::<Result<Vec<_>, _>>()?;
+439    Ok(generic
+440        .apply(context.db(), &concrete_args)
+441        .expect("failed to construct generic type after checking args"))
+442}
+443
+444fn friendly_generic_arg_example_string(generic: GenericType) -> String {
+445    let example_args = generic
+446        .params()
+447        .iter()
+448        .map(|param| match param.kind {
+449            GenericParamKind::Int => "32",
+450            GenericParamKind::PrimitiveType => "u64",
+451            GenericParamKind::AnyType => "String<32>",
+452        })
+453        .collect::<Vec<&'static str>>();
+454
+455    format!("Example: `{}<{}>`", generic.name(), example_args.join(", "))
+456}
+457
+458pub fn resolve_concrete_type_name<T: std::fmt::Display>(
+459    context: &mut dyn AnalyzerContext,
+460    name: &str,
+461    base_desc: &Node<T>,
+462    generic_args: Option<&Node<Vec<ast::GenericArg>>>,
+463) -> Result<TypeId, TypeError> {
+464    let named_thing = context.resolve_name(name, base_desc.span)?;
+465    resolve_concrete_type_named_thing(context, named_thing, base_desc, generic_args)
+466}
+467
+468pub fn resolve_concrete_type_path<T: std::fmt::Display>(
+469    context: &mut dyn AnalyzerContext,
+470    path: &ast::Path,
+471    base_desc: &Node<T>,
+472    generic_args: Option<&Node<Vec<ast::GenericArg>>>,
+473) -> Result<TypeId, TypeError> {
+474    let named_thing = context.resolve_path(path, base_desc.span)?;
+475    resolve_concrete_type_named_thing(context, Some(named_thing), base_desc, generic_args)
+476}
+477
+478pub fn resolve_concrete_type_named_thing<T: std::fmt::Display>(
+479    context: &mut dyn AnalyzerContext,
+480    named_thing: Option<NamedThing>,
+481    base_desc: &Node<T>,
+482    generic_args: Option<&Node<Vec<ast::GenericArg>>>,
+483) -> Result<TypeId, TypeError> {
+484    match named_thing {
+485        Some(NamedThing::Item(Item::Type(id))) => {
+486            if let Some(args) = generic_args {
+487                context.fancy_error(
+488                    &format!("`{}` type is not generic", base_desc.kind),
+489                    vec![Label::primary(
+490                        args.span,
+491                        "unexpected generic argument list",
+492                    )],
+493                    vec![],
+494                );
+495            }
+496            id.type_id(context.db())
+497        }
+498        Some(NamedThing::Item(Item::GenericType(generic))) => {
+499            apply_generic_type_args(context, generic, base_desc.span, generic_args)
+500        }
+501        Some(named_thing) => Err(TypeError::new(context.fancy_error(
+502            &format!("`{}` is not a type name", base_desc.kind),
+503            if let Some(def_span) = named_thing.name_span(context.db()) {
+504                vec![
+505                    Label::primary(
+506                        def_span,
+507                        format!(
+508                            "`{}` is defined here as a {}",
+509                            base_desc.kind,
+510                            named_thing.item_kind_display_name()
+511                        ),
+512                    ),
+513                    Label::primary(
+514                        base_desc.span,
+515                        format!("`{}` is used here as a type", base_desc.kind),
+516                    ),
+517                ]
+518            } else {
+519                vec![Label::primary(
+520                    base_desc.span,
+521                    format!(
+522                        "`{}` is a {}",
+523                        base_desc.kind,
+524                        named_thing.item_kind_display_name()
+525                    ),
+526                )]
+527            },
+528            vec![],
+529        ))),
+530        None => Err(TypeError::new(context.error(
+531            "undefined type",
+532            base_desc.span,
+533            &format!("`{}` has not been defined", base_desc.kind),
+534        ))),
+535    }
+536}
+537
+538/// Maps a type description node to an enum type.
+539pub fn type_desc(
+540    context: &mut dyn AnalyzerContext,
+541    desc: &Node<ast::TypeDesc>,
+542    self_type: Option<TraitOrType>,
+543) -> Result<TypeId, TypeError> {
+544    match &desc.kind {
+545        ast::TypeDesc::Base { base } => resolve_concrete_type_name(context, base, desc, None),
+546        ast::TypeDesc::Path(path) => resolve_concrete_type_path(context, path, desc, None),
+547        // generic will need to allow for paths too
+548        ast::TypeDesc::Generic { base, args } => {
+549            resolve_concrete_type_name(context, &base.kind, base, Some(args))
+550        }
+551        ast::TypeDesc::Tuple { items } => {
+552            let types = items
+553                .iter()
+554                .map(|typ| match type_desc(context, typ, self_type.clone()) {
+555                    Ok(typ) if typ.has_fixed_size(context.db()) => Ok(typ),
+556                    Err(e) => Err(e),
+557                    _ => Err(TypeError::new(context.error(
+558                        "tuple elements must have fixed size",
+559                        typ.span,
+560                        "this can't be stored in a tuple",
+561                    ))),
+562                })
+563                .collect::<Result<Vec<_>, _>>()?;
+564            Ok(context.db().intern_type(Type::Tuple(Tuple {
+565                items: types.into(),
+566            })))
+567        }
+568        ast::TypeDesc::Unit => Ok(TypeId::unit(context.db())),
+569        ast::TypeDesc::SelfType => {
+570            if let Some(val) = self_type {
+571                Ok(Type::SelfType(val).id(context.db()))
+572            } else {
+573                dbg!("Reporting error");
+574                Err(TypeError::new(context.error(
+575                    "`Self` can not be used here",
+576                    desc.span,
+577                    "",
+578                )))
+579            }
+580        }
+581    }
+582}
+583
+584/// Maps a type description node to a `TraitId`.
+585pub fn type_desc_to_trait(
+586    context: &mut dyn AnalyzerContext,
+587    desc: &Node<ast::TypeDesc>,
+588) -> Result<TraitId, TypeError> {
+589    match &desc.kind {
+590        ast::TypeDesc::Base { base } => {
+591            let named_thing = context.resolve_name(base, desc.span)?;
+592            resolve_concrete_trait_named_thing(context, named_thing, desc)
+593        }
+594        ast::TypeDesc::Path(path) => {
+595            let named_thing = context.resolve_path(path, desc.span)?;
+596            resolve_concrete_trait_named_thing(context, Some(named_thing), desc)
+597        }
+598        // generic will need to allow for paths too
+599        ast::TypeDesc::Generic { base, .. } => {
+600            let named_thing = context.resolve_name(&base.kind, desc.span)?;
+601            resolve_concrete_trait_named_thing(context, named_thing, desc)
+602        }
+603        _ => panic!("Should be rejected by parser"),
+604    }
+605}
+606
+607pub fn resolve_concrete_trait_named_thing<T: std::fmt::Display>(
+608    context: &mut dyn AnalyzerContext,
+609    val: Option<NamedThing>,
+610    base_desc: &Node<T>,
+611) -> Result<TraitId, TypeError> {
+612    match val {
+613        Some(NamedThing::Item(Item::Trait(treit))) => Ok(treit),
+614        Some(NamedThing::Item(Item::Type(ty))) => Err(TypeError::new(context.error(
+615            &format!("expected trait, found type `{}`", ty.name(context.db())),
+616            base_desc.span,
+617            "not a trait",
+618        ))),
+619        Some(named_thing) => Err(TypeError::new(context.fancy_error(
+620            &format!("`{}` is not a trait name", base_desc.kind),
+621            if let Some(def_span) = named_thing.name_span(context.db()) {
+622                vec![
+623                    Label::primary(
+624                        def_span,
+625                        format!(
+626                            "`{}` is defined here as a {}",
+627                            base_desc.kind,
+628                            named_thing.item_kind_display_name()
+629                        ),
+630                    ),
+631                    Label::primary(
+632                        base_desc.span,
+633                        format!("`{}` is used here as a trait", base_desc.kind),
+634                    ),
+635                ]
+636            } else {
+637                vec![Label::primary(
+638                    base_desc.span,
+639                    format!(
+640                        "`{}` is a {}",
+641                        base_desc.kind,
+642                        named_thing.item_kind_display_name()
+643                    ),
+644                )]
+645            },
+646            vec![],
+647        ))),
+648        None => Err(TypeError::new(context.error(
+649            "undefined trait",
+650            base_desc.span,
+651            &format!("`{}` has not been defined", base_desc.kind),
+652        ))),
+653    }
+654}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/utils.rs.html b/compiler-docs/src/fe_analyzer/traversal/utils.rs.html new file mode 100644 index 0000000000..dbb8bcd78b --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/utils.rs.html @@ -0,0 +1,61 @@ +utils.rs - source

fe_analyzer/traversal/
utils.rs

1use fe_common::diagnostics::Label;
+2use fe_common::Span;
+3
+4use crate::context::{AnalyzerContext, DiagnosticVoucher};
+5use crate::display::Displayable;
+6use crate::errors::BinaryOperationError;
+7use crate::namespace::types::TypeId;
+8use crate::AnalyzerDb;
+9use std::fmt::Display;
+10
+11fn type_label(db: &dyn AnalyzerDb, span: Span, typ: TypeId) -> Label {
+12    Label::primary(span, format!("this has type `{}`", typ.display(db)))
+13}
+14
+15pub fn add_bin_operations_errors(
+16    context: &dyn AnalyzerContext,
+17    op: &dyn Display,
+18    lspan: Span,
+19    ltype: TypeId,
+20    rspan: Span,
+21    rtype: TypeId,
+22    error: BinaryOperationError,
+23) -> DiagnosticVoucher {
+24    let db = context.db();
+25    let ltype = ltype.deref(db);
+26    let rtype = rtype.deref(db);
+27
+28    match error {
+29        BinaryOperationError::NotEqualAndUnsigned => context.fancy_error(
+30            &format!("`{op}` operand types must be equal and unsigned"),
+31            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+32            vec![],
+33        ),
+34        BinaryOperationError::RightIsSigned => context.fancy_error(
+35            &format!("The right hand side of the `{op}` operation must be unsigned"),
+36            vec![Label::primary(
+37                rspan,
+38                format!("this has signed type `{}`", rtype.display(db)),
+39            )],
+40            vec![],
+41        ),
+42        BinaryOperationError::RightTooLarge => context.fancy_error(
+43            &format!("incompatible `{op}` operand types"),
+44            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+45            vec![format!(
+46                "The type of the right hand side cannot be larger than the left (`{}`)",
+47                ltype.display(db)
+48            )],
+49        ),
+50        BinaryOperationError::TypesNotCompatible => context.fancy_error(
+51            &format!("`{op}` operand types are not compatible"),
+52            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+53            vec![],
+54        ),
+55        BinaryOperationError::TypesNotNumeric => context.fancy_error(
+56            &format!("`{op}` operands must be numeric"),
+57            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+58            vec![],
+59        ),
+60    }
+61}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db.rs.html b/compiler-docs/src/fe_codegen/db.rs.html new file mode 100644 index 0000000000..5c047a48f0 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db.rs.html @@ -0,0 +1,100 @@ +db.rs - source

fe_codegen/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use std::rc::Rc;
+3
+4use fe_abi::{contract::AbiContract, event::AbiEvent, function::AbiFunction, types::AbiType};
+5use fe_analyzer::{
+6    db::AnalyzerDbStorage,
+7    namespace::items::{ContractId, ModuleId},
+8    AnalyzerDb,
+9};
+10use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
+11use fe_mir::{
+12    db::{MirDb, MirDbStorage},
+13    ir::{FunctionBody, FunctionId, FunctionSignature, TypeId},
+14};
+15
+16mod queries;
+17
+18#[salsa::query_group(CodegenDbStorage)]
+19pub trait CodegenDb: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> {
+20    #[salsa::invoke(queries::function::legalized_signature)]
+21    fn codegen_legalized_signature(&self, function_id: FunctionId) -> Rc<FunctionSignature>;
+22    #[salsa::invoke(queries::function::legalized_body)]
+23    fn codegen_legalized_body(&self, function_id: FunctionId) -> Rc<FunctionBody>;
+24    #[salsa::invoke(queries::function::symbol_name)]
+25    fn codegen_function_symbol_name(&self, function_id: FunctionId) -> Rc<String>;
+26
+27    #[salsa::invoke(queries::types::legalized_type)]
+28    fn codegen_legalized_type(&self, ty: TypeId) -> TypeId;
+29
+30    #[salsa::invoke(queries::abi::abi_type)]
+31    fn codegen_abi_type(&self, ty: TypeId) -> AbiType;
+32    #[salsa::invoke(queries::abi::abi_function)]
+33    fn codegen_abi_function(&self, function_id: FunctionId) -> AbiFunction;
+34    #[salsa::invoke(queries::abi::abi_event)]
+35    fn codegen_abi_event(&self, ty: TypeId) -> AbiEvent;
+36    #[salsa::invoke(queries::abi::abi_contract)]
+37    fn codegen_abi_contract(&self, contract: ContractId) -> AbiContract;
+38    #[salsa::invoke(queries::abi::abi_module_events)]
+39    fn codegen_abi_module_events(&self, module: ModuleId) -> Vec<AbiEvent>;
+40    #[salsa::invoke(queries::abi::abi_type_maximum_size)]
+41    fn codegen_abi_type_maximum_size(&self, ty: TypeId) -> usize;
+42    #[salsa::invoke(queries::abi::abi_type_minimum_size)]
+43    fn codegen_abi_type_minimum_size(&self, ty: TypeId) -> usize;
+44    #[salsa::invoke(queries::abi::abi_function_argument_maximum_size)]
+45    fn codegen_abi_function_argument_maximum_size(&self, contract: FunctionId) -> usize;
+46    #[salsa::invoke(queries::abi::abi_function_return_maximum_size)]
+47    fn codegen_abi_function_return_maximum_size(&self, function: FunctionId) -> usize;
+48
+49    #[salsa::invoke(queries::contract::symbol_name)]
+50    fn codegen_contract_symbol_name(&self, contract: ContractId) -> Rc<String>;
+51    #[salsa::invoke(queries::contract::deployer_symbol_name)]
+52    fn codegen_contract_deployer_symbol_name(&self, contract: ContractId) -> Rc<String>;
+53
+54    #[salsa::invoke(queries::constant::string_symbol_name)]
+55    fn codegen_constant_string_symbol_name(&self, data: String) -> Rc<String>;
+56}
+57
+58// TODO: Move this to driver.
+59#[salsa::database(SourceDbStorage, AnalyzerDbStorage, MirDbStorage, CodegenDbStorage)]
+60#[derive(Default)]
+61pub struct Db {
+62    storage: salsa::Storage<Db>,
+63}
+64impl salsa::Database for Db {}
+65
+66impl Upcast<dyn MirDb> for Db {
+67    fn upcast(&self) -> &(dyn MirDb + 'static) {
+68        self
+69    }
+70}
+71
+72impl UpcastMut<dyn MirDb> for Db {
+73    fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static) {
+74        &mut *self
+75    }
+76}
+77
+78impl Upcast<dyn SourceDb> for Db {
+79    fn upcast(&self) -> &(dyn SourceDb + 'static) {
+80        self
+81    }
+82}
+83
+84impl UpcastMut<dyn SourceDb> for Db {
+85    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
+86        &mut *self
+87    }
+88}
+89
+90impl Upcast<dyn AnalyzerDb> for Db {
+91    fn upcast(&self) -> &(dyn AnalyzerDb + 'static) {
+92        self
+93    }
+94}
+95
+96impl UpcastMut<dyn AnalyzerDb> for Db {
+97    fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static) {
+98        &mut *self
+99    }
+100}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries.rs.html b/compiler-docs/src/fe_codegen/db/queries.rs.html new file mode 100644 index 0000000000..9406ddeca4 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries.rs.html @@ -0,0 +1,5 @@ +queries.rs - source

fe_codegen/db/
queries.rs

1pub mod abi;
+2pub mod constant;
+3pub mod contract;
+4pub mod function;
+5pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/abi.rs.html b/compiler-docs/src/fe_codegen/db/queries/abi.rs.html new file mode 100644 index 0000000000..d23d5ee235 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/abi.rs.html @@ -0,0 +1,279 @@ +abi.rs - source

fe_codegen/db/queries/
abi.rs

1use fe_abi::{
+2    contract::AbiContract,
+3    event::{AbiEvent, AbiEventField},
+4    function::{AbiFunction, AbiFunctionType, CtxParam, SelfParam, StateMutability},
+5    types::{AbiTupleField, AbiType},
+6};
+7use fe_analyzer::{
+8    constants::INDEXED,
+9    namespace::{
+10        items::{ContractId, ModuleId},
+11        types::{CtxDecl, SelfDecl},
+12    },
+13};
+14use fe_mir::ir::{self, FunctionId, TypeId};
+15
+16use crate::db::CodegenDb;
+17
+18pub fn abi_contract(db: &dyn CodegenDb, contract: ContractId) -> AbiContract {
+19    let mut funcs = vec![];
+20
+21    if let Some(init) = contract.init_function(db.upcast()) {
+22        let init_func = db.mir_lowered_func_signature(init);
+23        let init_abi = db.codegen_abi_function(init_func);
+24        funcs.push(init_abi);
+25    }
+26
+27    for &func in contract.all_functions(db.upcast()).as_ref() {
+28        let mir_func = db.mir_lowered_func_signature(func);
+29        if mir_func.linkage(db.upcast()).is_exported() {
+30            let func_abi = db.codegen_abi_function(mir_func);
+31            funcs.push(func_abi);
+32        }
+33    }
+34
+35    let events = abi_module_events(db, contract.module(db.upcast()));
+36
+37    AbiContract::new(funcs, events)
+38}
+39
+40pub fn abi_module_events(db: &dyn CodegenDb, module: ModuleId) -> Vec<AbiEvent> {
+41    let mut events = vec![];
+42    for &s in db.module_structs(module).as_ref() {
+43        let struct_ty = s.as_type(db.upcast());
+44        // TODO: This is a hack to avoid generating an ABI for non-`emittable` structs.
+45        if struct_ty.is_emittable(db.upcast()) {
+46            let mir_event = db.mir_lowered_type(struct_ty);
+47            let event = db.codegen_abi_event(mir_event);
+48            events.push(event);
+49        }
+50    }
+51
+52    events
+53}
+54
+55pub fn abi_function(db: &dyn CodegenDb, function: FunctionId) -> AbiFunction {
+56    // We use a legalized signature.
+57    let sig = db.codegen_legalized_signature(function);
+58
+59    let name = function.name(db.upcast());
+60    let args = sig
+61        .params
+62        .iter()
+63        .map(|param| (param.name.to_string(), db.codegen_abi_type(param.ty)))
+64        .collect();
+65    let ret_ty = sig.return_type.map(|ty| db.codegen_abi_type(ty));
+66
+67    let func_type = if function.is_contract_init(db.upcast()) {
+68        AbiFunctionType::Constructor
+69    } else {
+70        AbiFunctionType::Function
+71    };
+72
+73    // The "stateMutability" field is derived from the presence & mutability of
+74    // `self` and `ctx` params in the analyzer fn sig.
+75    let analyzer_sig = sig.analyzer_func_id.signature(db.upcast());
+76    let self_param = match analyzer_sig.self_decl {
+77        None => SelfParam::None,
+78        Some(SelfDecl { mut_: None, .. }) => SelfParam::Imm,
+79        Some(SelfDecl { mut_: Some(_), .. }) => SelfParam::Mut,
+80    };
+81    let ctx_param = match analyzer_sig.ctx_decl {
+82        None => CtxParam::None,
+83        Some(CtxDecl { mut_: None, .. }) => CtxParam::Imm,
+84        Some(CtxDecl { mut_: Some(_), .. }) => CtxParam::Mut,
+85    };
+86
+87    let state_mutability = if name == "__init__" {
+88        StateMutability::Payable
+89    } else {
+90        StateMutability::from_self_and_ctx_params(self_param, ctx_param)
+91    };
+92
+93    AbiFunction::new(func_type, name.to_string(), args, ret_ty, state_mutability)
+94}
+95
+96pub fn abi_function_argument_maximum_size(db: &dyn CodegenDb, function: FunctionId) -> usize {
+97    let sig = db.codegen_legalized_signature(function);
+98    sig.params.iter().fold(0, |acc, param| {
+99        acc + db.codegen_abi_type_maximum_size(param.ty)
+100    })
+101}
+102
+103pub fn abi_function_return_maximum_size(db: &dyn CodegenDb, function: FunctionId) -> usize {
+104    let sig = db.codegen_legalized_signature(function);
+105    sig.return_type
+106        .map(|ty| db.codegen_abi_type_maximum_size(ty))
+107        .unwrap_or_default()
+108}
+109
+110pub fn abi_type_maximum_size(db: &dyn CodegenDb, ty: TypeId) -> usize {
+111    let abi_type = db.codegen_abi_type(ty);
+112    if abi_type.is_static() {
+113        abi_type.header_size()
+114    } else {
+115        match &ty.data(db.upcast()).kind {
+116            ir::TypeKind::Array(def) if def.elem_ty.data(db.upcast()).kind == ir::TypeKind::U8 => {
+117                debug_assert_eq!(abi_type, AbiType::Bytes);
+118                64 + ceil_32(def.len)
+119            }
+120
+121            ir::TypeKind::Array(def) => {
+122                db.codegen_abi_type_maximum_size(def.elem_ty) * def.len + 32
+123            }
+124
+125            ir::TypeKind::String(len) => abi_type.header_size() + 32 + ceil_32(*len),
+126            _ if ty.is_aggregate(db.upcast()) => {
+127                let mut maximum = 0;
+128                for i in 0..ty.aggregate_field_num(db.upcast()) {
+129                    let field_ty = ty.projection_ty_imm(db.upcast(), i);
+130                    maximum += db.codegen_abi_type_maximum_size(field_ty)
+131                }
+132                maximum + 32
+133            }
+134            ir::TypeKind::MPtr(ty) => abi_type_maximum_size(db, ty.deref(db.upcast())),
+135
+136            _ => unreachable!(),
+137        }
+138    }
+139}
+140
+141pub fn abi_type_minimum_size(db: &dyn CodegenDb, ty: TypeId) -> usize {
+142    let abi_type = db.codegen_abi_type(ty);
+143    if abi_type.is_static() {
+144        abi_type.header_size()
+145    } else {
+146        match &ty.data(db.upcast()).kind {
+147            ir::TypeKind::Array(def) if def.elem_ty.data(db.upcast()).kind == ir::TypeKind::U8 => {
+148                debug_assert_eq!(abi_type, AbiType::Bytes);
+149                64
+150            }
+151            ir::TypeKind::Array(def) => {
+152                db.codegen_abi_type_minimum_size(def.elem_ty) * def.len + 32
+153            }
+154
+155            ir::TypeKind::String(_) => abi_type.header_size() + 32,
+156
+157            _ if ty.is_aggregate(db.upcast()) => {
+158                let mut minimum = 0;
+159                for i in 0..ty.aggregate_field_num(db.upcast()) {
+160                    let field_ty = ty.projection_ty_imm(db.upcast(), i);
+161                    minimum += db.codegen_abi_type_minimum_size(field_ty)
+162                }
+163                minimum + 32
+164            }
+165            ir::TypeKind::MPtr(ty) => abi_type_minimum_size(db, ty.deref(db.upcast())),
+166            _ => unreachable!(),
+167        }
+168    }
+169}
+170
+171pub fn abi_type(db: &dyn CodegenDb, ty: TypeId) -> AbiType {
+172    let legalized_ty = db.codegen_legalized_type(ty);
+173
+174    if legalized_ty.is_zero_sized(db.upcast()) {
+175        unreachable!("zero-sized type must be removed in legalization");
+176    }
+177
+178    let ty_data = legalized_ty.data(db.upcast());
+179
+180    match &ty_data.kind {
+181        ir::TypeKind::I8 => AbiType::Int(8),
+182        ir::TypeKind::I16 => AbiType::Int(16),
+183        ir::TypeKind::I32 => AbiType::Int(32),
+184        ir::TypeKind::I64 => AbiType::Int(64),
+185        ir::TypeKind::I128 => AbiType::Int(128),
+186        ir::TypeKind::I256 => AbiType::Int(256),
+187        ir::TypeKind::U8 => AbiType::UInt(8),
+188        ir::TypeKind::U16 => AbiType::UInt(16),
+189        ir::TypeKind::U32 => AbiType::UInt(32),
+190        ir::TypeKind::U64 => AbiType::UInt(64),
+191        ir::TypeKind::U128 => AbiType::UInt(128),
+192        ir::TypeKind::U256 => AbiType::UInt(256),
+193        ir::TypeKind::Bool => AbiType::Bool,
+194        ir::TypeKind::Address => AbiType::Address,
+195        ir::TypeKind::String(_) => AbiType::String,
+196        ir::TypeKind::Unit => unreachable!("zero-sized type must be removed in legalization"),
+197        ir::TypeKind::Array(def) => {
+198            let elem_ty_data = &def.elem_ty.data(db.upcast());
+199            match &elem_ty_data.kind {
+200                ir::TypeKind::U8 => AbiType::Bytes,
+201                _ => {
+202                    let elem_ty = db.codegen_abi_type(def.elem_ty);
+203                    let len = def.len;
+204                    AbiType::Array {
+205                        elem_ty: elem_ty.into(),
+206                        len,
+207                    }
+208                }
+209            }
+210        }
+211        ir::TypeKind::Tuple(def) => {
+212            let fields = def
+213                .items
+214                .iter()
+215                .enumerate()
+216                .map(|(i, item)| {
+217                    let field_ty = db.codegen_abi_type(*item);
+218                    AbiTupleField::new(format!("{i}"), field_ty)
+219                })
+220                .collect();
+221
+222            AbiType::Tuple(fields)
+223        }
+224        ir::TypeKind::Struct(def) => {
+225            let fields = def
+226                .fields
+227                .iter()
+228                .map(|(name, ty)| {
+229                    let ty = db.codegen_abi_type(*ty);
+230                    AbiTupleField::new(name.to_string(), ty)
+231                })
+232                .collect();
+233
+234            AbiType::Tuple(fields)
+235        }
+236        ir::TypeKind::MPtr(inner) => db.codegen_abi_type(*inner),
+237
+238        ir::TypeKind::Contract(_)
+239        | ir::TypeKind::Map(_)
+240        | ir::TypeKind::Enum(_)
+241        | ir::TypeKind::SPtr(_) => unreachable!(),
+242    }
+243}
+244
+245pub fn abi_event(db: &dyn CodegenDb, ty: TypeId) -> AbiEvent {
+246    debug_assert!(ty.is_struct(db.upcast()));
+247
+248    let legalized_ty = db.codegen_legalized_type(ty);
+249    let analyzer_struct = ty
+250        .analyzer_ty(db.upcast())
+251        .and_then(|val| val.as_struct(db.upcast()))
+252        .unwrap();
+253    let legalized_ty_data = legalized_ty.data(db.upcast());
+254    let event_def = match &legalized_ty_data.kind {
+255        ir::TypeKind::Struct(def) => def,
+256        _ => unreachable!(),
+257    };
+258
+259    let fields = event_def
+260        .fields
+261        .iter()
+262        .map(|(name, ty)| {
+263            let attr = analyzer_struct
+264                .field(db.upcast(), name)
+265                .unwrap()
+266                .attributes(db.upcast());
+267
+268            let ty = db.codegen_abi_type(*ty);
+269            let indexed = attr.iter().any(|attr| attr == INDEXED);
+270            AbiEventField::new(name.to_string(), ty, indexed)
+271        })
+272        .collect();
+273
+274    AbiEvent::new(event_def.name.to_string(), fields, false)
+275}
+276
+277fn ceil_32(value: usize) -> usize {
+278    ((value + 31) / 32) * 32
+279}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/constant.rs.html b/compiler-docs/src/fe_codegen/db/queries/constant.rs.html new file mode 100644 index 0000000000..f07a8f835a --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/constant.rs.html @@ -0,0 +1,12 @@ +constant.rs - source

fe_codegen/db/queries/
constant.rs

1use crate::db::CodegenDb;
+2use std::{
+3    collections::hash_map::DefaultHasher,
+4    hash::{Hash, Hasher},
+5    rc::Rc,
+6};
+7
+8pub fn string_symbol_name(_db: &dyn CodegenDb, data: String) -> Rc<String> {
+9    let mut hasher = DefaultHasher::new();
+10    data.hash(&mut hasher);
+11    format! {"{}", hasher.finish()}.into()
+12}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/contract.rs.html b/compiler-docs/src/fe_codegen/db/queries/contract.rs.html new file mode 100644 index 0000000000..519e580a1a --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/contract.rs.html @@ -0,0 +1,20 @@ +contract.rs - source

fe_codegen/db/queries/
contract.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::ContractId;
+4
+5use crate::db::CodegenDb;
+6
+7pub fn symbol_name(db: &dyn CodegenDb, contract: ContractId) -> Rc<String> {
+8    let module = contract.module(db.upcast());
+9
+10    format!(
+11        "{}${}",
+12        module.name(db.upcast()),
+13        contract.name(db.upcast())
+14    )
+15    .into()
+16}
+17
+18pub fn deployer_symbol_name(db: &dyn CodegenDb, contract: ContractId) -> Rc<String> {
+19    format!("deploy_{}", symbol_name(db, contract).as_ref()).into()
+20}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/function.rs.html b/compiler-docs/src/fe_codegen/db/queries/function.rs.html new file mode 100644 index 0000000000..8b55aa2b74 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/function.rs.html @@ -0,0 +1,76 @@ +function.rs - source

fe_codegen/db/queries/
function.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::{
+4    display::Displayable,
+5    namespace::{
+6        items::Item,
+7        types::{Type, TypeId},
+8    },
+9};
+10use fe_mir::ir::{FunctionBody, FunctionId, FunctionSignature};
+11use salsa::InternKey;
+12use smol_str::SmolStr;
+13
+14use crate::{db::CodegenDb, yul::legalize};
+15
+16pub fn legalized_signature(db: &dyn CodegenDb, function: FunctionId) -> Rc<FunctionSignature> {
+17    let mut sig = function.signature(db.upcast()).as_ref().clone();
+18    legalize::legalize_func_signature(db, &mut sig);
+19    sig.into()
+20}
+21
+22pub fn legalized_body(db: &dyn CodegenDb, function: FunctionId) -> Rc<FunctionBody> {
+23    let mut body = function.body(db.upcast()).as_ref().clone();
+24    legalize::legalize_func_body(db, &mut body);
+25    body.into()
+26}
+27
+28pub fn symbol_name(db: &dyn CodegenDb, function: FunctionId) -> Rc<String> {
+29    let module = function.signature(db.upcast()).module_id;
+30    let module_name = module.name(db.upcast());
+31
+32    let analyzer_func = function.analyzer_func(db.upcast());
+33    let func_name = format!(
+34        "{}{}",
+35        analyzer_func.name(db.upcast()),
+36        type_suffix(function, db)
+37    );
+38
+39    let func_name = match analyzer_func.sig(db.upcast()).self_item(db.upcast()) {
+40        Some(Item::Impl(id)) => {
+41            let class_name = format!(
+42                "{}${}",
+43                id.trait_id(db.upcast()).name(db.upcast()),
+44                safe_name(db, id.receiver(db.upcast()))
+45            );
+46            format!("{class_name}${func_name}")
+47        }
+48        Some(class) => {
+49            let class_name = class.name(db.upcast());
+50            format!("{class_name}${func_name}")
+51        }
+52        _ => func_name,
+53    };
+54
+55    format!("{module_name}${func_name}").into()
+56}
+57
+58fn type_suffix(function: FunctionId, db: &dyn CodegenDb) -> SmolStr {
+59    function
+60        .signature(db.upcast())
+61        .resolved_generics
+62        .values()
+63        .fold(String::new(), |acc, param| {
+64            format!("{}_{}", acc, safe_name(db, *param))
+65        })
+66        .into()
+67}
+68
+69fn safe_name(db: &dyn CodegenDb, ty: TypeId) -> SmolStr {
+70    match ty.typ(db.upcast()) {
+71        // TODO: Would be nice to get more human friendly names here
+72        Type::Array(_) => format!("array_{:?}", ty.as_intern_id()).into(),
+73        Type::Tuple(_) => format!("tuple_{:?}", ty.as_intern_id()).into(),
+74        _ => format!("{}", ty.display(db.upcast())).into(),
+75    }
+76}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/types.rs.html b/compiler-docs/src/fe_codegen/db/queries/types.rs.html new file mode 100644 index 0000000000..6061ee1af9 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/types.rs.html @@ -0,0 +1,102 @@ +types.rs - source

fe_codegen/db/queries/
types.rs

1use fe_mir::ir::{
+2    types::{ArrayDef, MapDef, StructDef, TupleDef},
+3    Type, TypeId, TypeKind,
+4};
+5
+6use crate::db::CodegenDb;
+7
+8pub fn legalized_type(db: &dyn CodegenDb, ty: TypeId) -> TypeId {
+9    let ty_data = ty.data(db.upcast());
+10    let ty_kind = match &ty.data(db.upcast()).kind {
+11        TypeKind::Tuple(def) => {
+12            let items = def
+13                .items
+14                .iter()
+15                .filter_map(|item| {
+16                    if item.is_zero_sized(db.upcast()) {
+17                        None
+18                    } else {
+19                        Some(legalized_type(db, *item))
+20                    }
+21                })
+22                .collect();
+23            let new_def = TupleDef { items };
+24            TypeKind::Tuple(new_def)
+25        }
+26
+27        TypeKind::Array(def) => {
+28            let new_def = ArrayDef {
+29                elem_ty: legalized_type(db, def.elem_ty),
+30                len: def.len,
+31            };
+32            TypeKind::Array(new_def)
+33        }
+34
+35        TypeKind::Struct(def) => {
+36            let fields = def
+37                .fields
+38                .iter()
+39                .cloned()
+40                .filter_map(|(name, ty)| {
+41                    if ty.is_zero_sized(db.upcast()) {
+42                        None
+43                    } else {
+44                        Some((name, legalized_type(db, ty)))
+45                    }
+46                })
+47                .collect();
+48            let new_def = StructDef {
+49                name: def.name.clone(),
+50                fields,
+51                span: def.span,
+52                module_id: def.module_id,
+53            };
+54            TypeKind::Struct(new_def)
+55        }
+56
+57        TypeKind::Contract(def) => {
+58            let fields = def
+59                .fields
+60                .iter()
+61                .cloned()
+62                .filter_map(|(name, ty)| {
+63                    if ty.is_zero_sized(db.upcast()) {
+64                        None
+65                    } else {
+66                        Some((name, legalized_type(db, ty)))
+67                    }
+68                })
+69                .collect();
+70            let new_def = StructDef {
+71                name: def.name.clone(),
+72                fields,
+73                span: def.span,
+74                module_id: def.module_id,
+75            };
+76            TypeKind::Contract(new_def)
+77        }
+78
+79        TypeKind::Map(def) => {
+80            let new_def = MapDef {
+81                key_ty: legalized_type(db, def.key_ty),
+82                value_ty: legalized_type(db, def.value_ty),
+83            };
+84            TypeKind::Map(new_def)
+85        }
+86
+87        TypeKind::MPtr(ty) => {
+88            let new_ty = legalized_type(db, *ty);
+89            TypeKind::MPtr(new_ty)
+90        }
+91
+92        TypeKind::SPtr(ty) => {
+93            let new_ty = legalized_type(db, *ty);
+94            TypeKind::SPtr(new_ty)
+95        }
+96
+97        _ => return ty,
+98    };
+99
+100    let analyzer_ty = ty_data.analyzer_ty;
+101    db.mir_intern_type(Type::new(ty_kind, analyzer_ty).into())
+102}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/lib.rs.html b/compiler-docs/src/fe_codegen/lib.rs.html new file mode 100644 index 0000000000..c599377b64 --- /dev/null +++ b/compiler-docs/src/fe_codegen/lib.rs.html @@ -0,0 +1,2 @@ +lib.rs - source

fe_codegen/
lib.rs

1pub mod db;
+2pub mod yul;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/context.rs.html b/compiler-docs/src/fe_codegen/yul/isel/context.rs.html new file mode 100644 index 0000000000..794413bc91 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/context.rs.html @@ -0,0 +1,81 @@ +context.rs - source

fe_codegen/yul/isel/
context.rs

1use indexmap::IndexSet;
+2
+3use fe_analyzer::namespace::items::ContractId;
+4use fe_mir::ir::FunctionId;
+5use fxhash::FxHashSet;
+6use yultsur::yul;
+7
+8use crate::{
+9    db::CodegenDb,
+10    yul::runtime::{DefaultRuntimeProvider, RuntimeProvider},
+11};
+12
+13use super::{lower_contract_deployable, lower_function};
+14
+15pub struct Context {
+16    pub runtime: Box<dyn RuntimeProvider>,
+17    pub(super) contract_dependency: IndexSet<ContractId>,
+18    pub(super) function_dependency: IndexSet<FunctionId>,
+19    pub(super) string_constants: IndexSet<String>,
+20    pub(super) lowered_functions: FxHashSet<FunctionId>,
+21}
+22
+23// Currently, `clippy::derivable_impls` causes false positive result,
+24// see https://github.com/rust-lang/rust-clippy/issues/10158 for more details.
+25#[allow(clippy::derivable_impls)]
+26impl Default for Context {
+27    fn default() -> Self {
+28        Self {
+29            runtime: Box::<DefaultRuntimeProvider>::default(),
+30            contract_dependency: IndexSet::default(),
+31            function_dependency: IndexSet::default(),
+32            string_constants: IndexSet::default(),
+33            lowered_functions: FxHashSet::default(),
+34        }
+35    }
+36}
+37
+38impl Context {
+39    pub(super) fn resolve_function_dependency(
+40        &mut self,
+41        db: &dyn CodegenDb,
+42    ) -> Vec<yul::FunctionDefinition> {
+43        let mut funcs = vec![];
+44        loop {
+45            let dependencies = std::mem::take(&mut self.function_dependency);
+46            if dependencies.is_empty() {
+47                break;
+48            }
+49            for dependency in dependencies {
+50                if self.lowered_functions.contains(&dependency) {
+51                    // Ignore dependency if it's already lowered.
+52                    continue;
+53                } else {
+54                    funcs.push(lower_function(db, self, dependency))
+55                }
+56            }
+57        }
+58
+59        funcs
+60    }
+61
+62    pub(super) fn resolve_constant_dependency(&self, db: &dyn CodegenDb) -> Vec<yul::Data> {
+63        self.string_constants
+64            .iter()
+65            .map(|s| {
+66                let symbol = db.codegen_constant_string_symbol_name(s.to_string());
+67                yul::Data {
+68                    name: symbol.as_ref().clone(),
+69                    value: s.to_string(),
+70                }
+71            })
+72            .collect()
+73    }
+74
+75    pub(super) fn resolve_contract_dependency(&self, db: &dyn CodegenDb) -> Vec<yul::Object> {
+76        self.contract_dependency
+77            .iter()
+78            .map(|cid| lower_contract_deployable(db, *cid))
+79            .collect()
+80    }
+81}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/contract.rs.html b/compiler-docs/src/fe_codegen/yul/isel/contract.rs.html new file mode 100644 index 0000000000..e10292650a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/contract.rs.html @@ -0,0 +1,289 @@ +contract.rs - source

fe_codegen/yul/isel/
contract.rs

1use fe_analyzer::namespace::items::ContractId;
+2use fe_mir::ir::{function::Linkage, FunctionId};
+3use yultsur::{yul, *};
+4
+5use crate::{
+6    db::CodegenDb,
+7    yul::{runtime::AbiSrcLocation, YulVariable},
+8};
+9
+10use super::context::Context;
+11
+12pub fn lower_contract_deployable(db: &dyn CodegenDb, contract: ContractId) -> yul::Object {
+13    let mut context = Context::default();
+14
+15    let constructor = if let Some(init) = contract.init_function(db.upcast()) {
+16        let init = db.mir_lowered_func_signature(init);
+17        make_init(db, &mut context, contract, init)
+18    } else {
+19        statements! {}
+20    };
+21
+22    let deploy_code = make_deploy(db, contract);
+23
+24    let dep_functions: Vec<_> = context
+25        .resolve_function_dependency(db)
+26        .into_iter()
+27        .map(yul::Statement::FunctionDefinition)
+28        .collect();
+29    let runtime_funcs: Vec<_> = context
+30        .runtime
+31        .collect_definitions()
+32        .into_iter()
+33        .map(yul::Statement::FunctionDefinition)
+34        .collect();
+35
+36    let deploy_block = block_statement! {
+37        [constructor...]
+38        [deploy_code...]
+39    };
+40
+41    let code = code! {
+42        [deploy_block]
+43        [dep_functions...]
+44        [runtime_funcs...]
+45    };
+46
+47    let mut dep_contracts = context.resolve_contract_dependency(db);
+48    dep_contracts.push(lower_contract(db, contract));
+49    let dep_constants = context.resolve_constant_dependency(db);
+50
+51    let name = identifier! {(
+52        db.codegen_contract_deployer_symbol_name(contract).as_ref()
+53    )};
+54    let object = yul::Object {
+55        name,
+56        code,
+57        objects: dep_contracts,
+58        data: dep_constants,
+59    };
+60
+61    normalize_object(object)
+62}
+63
+64pub fn lower_contract(db: &dyn CodegenDb, contract: ContractId) -> yul::Object {
+65    let exported_funcs: Vec<_> = db
+66        .mir_lower_contract_all_functions(contract)
+67        .iter()
+68        .filter_map(|fid| {
+69            if fid.signature(db.upcast()).linkage == Linkage::Export {
+70                Some(*fid)
+71            } else {
+72                None
+73            }
+74        })
+75        .collect();
+76
+77    let mut context = Context::default();
+78    let dispatcher = if let Some(call_fn) = contract.call_function(db.upcast()) {
+79        let call_fn = db.mir_lowered_func_signature(call_fn);
+80        context.function_dependency.insert(call_fn);
+81        let call_symbol = identifier! { (db.codegen_function_symbol_name(call_fn)) };
+82        statement! {
+83            ([call_symbol]())
+84        }
+85    } else {
+86        make_dispatcher(db, &mut context, &exported_funcs)
+87    };
+88
+89    let dep_functions: Vec<_> = context
+90        .resolve_function_dependency(db)
+91        .into_iter()
+92        .map(yul::Statement::FunctionDefinition)
+93        .collect();
+94    let runtime_funcs: Vec<_> = context
+95        .runtime
+96        .collect_definitions()
+97        .into_iter()
+98        .map(yul::Statement::FunctionDefinition)
+99        .collect();
+100
+101    let code = code! {
+102        ([dispatcher])
+103        [dep_functions...]
+104        [runtime_funcs...]
+105    };
+106
+107    // Lower dependant contracts.
+108    let dep_contracts = context.resolve_contract_dependency(db);
+109
+110    // Collect string constants.
+111    let dep_constants = context.resolve_constant_dependency(db);
+112    let contract_symbol = identifier! { (db.codegen_contract_symbol_name(contract)) };
+113
+114    yul::Object {
+115        name: contract_symbol,
+116        code,
+117        objects: dep_contracts,
+118        data: dep_constants,
+119    }
+120}
+121
+122fn make_dispatcher(
+123    db: &dyn CodegenDb,
+124    context: &mut Context,
+125    funcs: &[FunctionId],
+126) -> yul::Statement {
+127    let arms = funcs
+128        .iter()
+129        .map(|func| dispatch_arm(db, context, *func))
+130        .collect::<Vec<_>>();
+131
+132    if arms.is_empty() {
+133        statement! { return(0, 0) }
+134    } else {
+135        let selector = expression! {
+136            and((shr((sub(256, 32)), (calldataload(0)))), 0xffffffff)
+137        };
+138        switch! {
+139            switch ([selector])
+140            [arms...]
+141            (default { (return(0, 0)) })
+142        }
+143    }
+144}
+145
+146fn dispatch_arm(db: &dyn CodegenDb, context: &mut Context, func: FunctionId) -> yul::Case {
+147    context.function_dependency.insert(func);
+148    let func_sig = db.codegen_legalized_signature(func);
+149    let mut param_vars = Vec::with_capacity(func_sig.params.len());
+150    let mut param_tys = Vec::with_capacity(func_sig.params.len());
+151    func_sig.params.iter().for_each(|param| {
+152        param_vars.push(YulVariable::new(param.name.as_str()));
+153        param_tys.push(param.ty);
+154    });
+155
+156    let decode_params = if func_sig.params.is_empty() {
+157        statements! {}
+158    } else {
+159        let ident_params: Vec<_> = param_vars.iter().map(YulVariable::ident).collect();
+160        let param_size = YulVariable::new("param_size");
+161        statements! {
+162            (let [param_size.ident()] := sub((calldatasize()), 4))
+163            (let [ident_params...] := [context.runtime.abi_decode(db, expression! { 4 }, param_size.expr(), &param_tys, AbiSrcLocation::CallData)])
+164        }
+165    };
+166
+167    let call_and_encode_return = {
+168        let name = identifier! { (db.codegen_function_symbol_name(func)) };
+169        // we pass in a `0` for the expected `Context` argument
+170        let call = expression! {[name]([(param_vars.iter().map(YulVariable::expr).collect::<Vec<_>>())...])};
+171        if let Some(mut return_type) = func_sig.return_type {
+172            if return_type.is_aggregate(db.upcast()) {
+173                return_type = return_type.make_mptr(db.upcast());
+174            }
+175
+176            let ret = YulVariable::new("ret");
+177            let enc_start = YulVariable::new("enc_start");
+178            let enc_size = YulVariable::new("enc_size");
+179            let abi_encode = context.runtime.abi_encode_seq(
+180                db,
+181                &[ret.expr()],
+182                enc_start.expr(),
+183                &[return_type],
+184                false,
+185            );
+186            statements! {
+187                (let [ret.ident()] := [call])
+188                (let [enc_start.ident()] := [context.runtime.avail(db)])
+189                (let [enc_size.ident()] := [abi_encode])
+190                (return([enc_start.expr()], [enc_size.expr()]))
+191            }
+192        } else {
+193            statements! {
+194                ([yul::Statement::Expression(call)])
+195                (return(0, 0))
+196            }
+197        }
+198    };
+199
+200    let abi_sig = db.codegen_abi_function(func);
+201    let selector = literal! { (format!("0x{}", abi_sig.selector().hex())) };
+202    case! {
+203        case [selector] {
+204            [decode_params...]
+205            [call_and_encode_return...]
+206        }
+207    }
+208}
+209
+210fn make_init(
+211    db: &dyn CodegenDb,
+212    context: &mut Context,
+213    contract: ContractId,
+214    init: FunctionId,
+215) -> Vec<yul::Statement> {
+216    context.function_dependency.insert(init);
+217    let init_func_name = identifier! { (db.codegen_function_symbol_name(init)) };
+218    let contract_name = identifier_expression! { (format!{r#""{}""#, db.codegen_contract_deployer_symbol_name(contract)}) };
+219
+220    let func_sig = db.codegen_legalized_signature(init);
+221    let mut param_vars = Vec::with_capacity(func_sig.params.len());
+222    let mut param_tys = Vec::with_capacity(func_sig.params.len());
+223    let program_size = YulVariable::new("$program_size");
+224    let arg_size = YulVariable::new("$arg_size");
+225    let code_size = YulVariable::new("$code_size");
+226    let memory_data_offset = YulVariable::new("$memory_data_offset");
+227    func_sig.params.iter().for_each(|param| {
+228        param_vars.push(YulVariable::new(param.name.as_str()));
+229        param_tys.push(param.ty);
+230    });
+231
+232    let decode_params = if func_sig.params.is_empty() {
+233        statements! {}
+234    } else {
+235        let ident_params: Vec<_> = param_vars.iter().map(YulVariable::ident).collect();
+236        statements! {
+237            (let [ident_params...] := [context.runtime.abi_decode(db, memory_data_offset.expr(), arg_size.expr(), &param_tys, AbiSrcLocation::Memory)])
+238        }
+239    };
+240
+241    let call = expression! {[init_func_name]([(param_vars.iter().map(YulVariable::expr).collect::<Vec<_>>())...])};
+242    statements! {
+243        (let [program_size.ident()] := datasize([contract_name]))
+244        (let [code_size.ident()] := codesize())
+245        (let [arg_size.ident()] := sub([code_size.expr()], [program_size.expr()]))
+246        (let [memory_data_offset.ident()] := [context.runtime.alloc(db, arg_size.expr())])
+247        (codecopy([memory_data_offset.expr()], [program_size.expr()], [arg_size.expr()]))
+248        [decode_params...]
+249        ([yul::Statement::Expression(call)])
+250    }
+251}
+252
+253fn make_deploy(db: &dyn CodegenDb, contract: ContractId) -> Vec<yul::Statement> {
+254    let contract_symbol =
+255        identifier_expression! { (format!{r#""{}""#, db.codegen_contract_symbol_name(contract)}) };
+256    let size = YulVariable::new("$$size");
+257    statements! {
+258       (let [size.ident()] := (datasize([contract_symbol.clone()])))
+259       (datacopy(0, (dataoffset([contract_symbol])), [size.expr()]))
+260       (return (0, [size.expr()]))
+261    }
+262}
+263
+264fn normalize_object(obj: yul::Object) -> yul::Object {
+265    let data = obj
+266        .data
+267        .into_iter()
+268        .map(|data| yul::Data {
+269            name: data.name,
+270            value: data
+271                .value
+272                .replace('\\', "\\\\\\\\")
+273                .replace('\n', "\\\\n")
+274                .replace('"', "\\\\\"")
+275                .replace('\r', "\\\\r")
+276                .replace('\t', "\\\\t"),
+277        })
+278        .collect::<Vec<_>>();
+279    yul::Object {
+280        name: obj.name,
+281        code: obj.code,
+282        objects: obj
+283            .objects
+284            .into_iter()
+285            .map(normalize_object)
+286            .collect::<Vec<_>>(),
+287        data,
+288    }
+289}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/function.rs.html b/compiler-docs/src/fe_codegen/yul/isel/function.rs.html new file mode 100644 index 0000000000..c6ca45427f --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/function.rs.html @@ -0,0 +1,978 @@ +function.rs - source

fe_codegen/yul/isel/
function.rs

1#![allow(unused)]
+2use std::thread::Scope;
+3
+4use super::{context::Context, inst_order::InstSerializer};
+5use fe_common::numeric::to_hex_str;
+6
+7use fe_abi::function::{AbiFunction, AbiFunctionType};
+8use fe_common::db::Upcast;
+9use fe_mir::{
+10    ir::{
+11        self,
+12        constant::ConstantValue,
+13        inst::{BinOp, CallType, CastKind, InstKind, UnOp},
+14        value::AssignableValue,
+15        Constant, FunctionBody, FunctionId, FunctionSignature, InstId, Type, TypeId, TypeKind,
+16        Value, ValueId,
+17    },
+18    pretty_print::PrettyPrint,
+19};
+20use fxhash::FxHashMap;
+21use smol_str::SmolStr;
+22use yultsur::{
+23    yul::{self, Statement},
+24    *,
+25};
+26
+27use crate::{
+28    db::CodegenDb,
+29    yul::isel::inst_order::StructuralInst,
+30    yul::slot_size::{function_hash_type, yul_primitive_type, SLOT_SIZE},
+31    yul::{
+32        runtime::{self, RuntimeProvider},
+33        YulVariable,
+34    },
+35};
+36
+37pub fn lower_function(
+38    db: &dyn CodegenDb,
+39    ctx: &mut Context,
+40    function: FunctionId,
+41) -> yul::FunctionDefinition {
+42    debug_assert!(!ctx.lowered_functions.contains(&function));
+43    ctx.lowered_functions.insert(function);
+44    let sig = &db.codegen_legalized_signature(function);
+45    let body = &db.codegen_legalized_body(function);
+46    FuncLowerHelper::new(db, ctx, function, sig, body).lower_func()
+47}
+48
+49struct FuncLowerHelper<'db, 'a> {
+50    db: &'db dyn CodegenDb,
+51    ctx: &'a mut Context,
+52    value_map: ScopedValueMap,
+53    func: FunctionId,
+54    sig: &'a FunctionSignature,
+55    body: &'a FunctionBody,
+56    ret_value: Option<yul::Identifier>,
+57    sink: Vec<yul::Statement>,
+58}
+59
+60impl<'db, 'a> FuncLowerHelper<'db, 'a> {
+61    fn new(
+62        db: &'db dyn CodegenDb,
+63        ctx: &'a mut Context,
+64        func: FunctionId,
+65        sig: &'a FunctionSignature,
+66        body: &'a FunctionBody,
+67    ) -> Self {
+68        let mut value_map = ScopedValueMap::default();
+69        // Register arguments to value_map.
+70        for &value in body.store.locals() {
+71            match body.store.value_data(value) {
+72                Value::Local(local) if local.is_arg => {
+73                    let ident = YulVariable::new(local.name.as_str()).ident();
+74                    value_map.insert(value, ident);
+75                }
+76                _ => {}
+77            }
+78        }
+79
+80        let ret_value = if sig.return_type.is_some() {
+81            Some(YulVariable::new("$ret").ident())
+82        } else {
+83            None
+84        };
+85
+86        Self {
+87            db,
+88            ctx,
+89            value_map,
+90            func,
+91            sig,
+92            body,
+93            ret_value,
+94            sink: Vec::new(),
+95        }
+96    }
+97
+98    fn lower_func(mut self) -> yul::FunctionDefinition {
+99        let name = identifier! { (self.db.codegen_function_symbol_name(self.func)) };
+100
+101        let parameters = self
+102            .sig
+103            .params
+104            .iter()
+105            .map(|param| YulVariable::new(param.name.as_str()).ident())
+106            .collect();
+107
+108        let ret = self
+109            .ret_value
+110            .clone()
+111            .map(|value| vec![value])
+112            .unwrap_or_default();
+113
+114        let body = self.lower_body();
+115
+116        yul::FunctionDefinition {
+117            name,
+118            parameters,
+119            returns: ret,
+120            block: body,
+121        }
+122    }
+123
+124    fn lower_body(mut self) -> yul::Block {
+125        let inst_order = InstSerializer::new(self.body).serialize();
+126
+127        for inst in inst_order {
+128            self.lower_structural_inst(inst)
+129        }
+130
+131        yul::Block {
+132            statements: self.sink,
+133        }
+134    }
+135
+136    fn lower_structural_inst(&mut self, inst: StructuralInst) {
+137        match inst {
+138            StructuralInst::Inst(inst) => self.lower_inst(inst),
+139            StructuralInst::If { cond, then, else_ } => {
+140                let if_block = self.lower_if(cond, then, else_);
+141                self.sink.push(if_block)
+142            }
+143            StructuralInst::Switch {
+144                scrutinee,
+145                table,
+146                default,
+147            } => {
+148                let switch_block = self.lower_switch(scrutinee, table, default);
+149                self.sink.push(switch_block)
+150            }
+151            StructuralInst::For { body } => {
+152                let for_block = self.lower_for(body);
+153                self.sink.push(for_block)
+154            }
+155            StructuralInst::Break => self.sink.push(yul::Statement::Break),
+156            StructuralInst::Continue => self.sink.push(yul::Statement::Continue),
+157        };
+158    }
+159
+160    fn lower_inst(&mut self, inst: InstId) {
+161        if let Some(lhs) = self.body.store.inst_result(inst) {
+162            self.declare_assignable_value(lhs)
+163        }
+164
+165        match &self.body.store.inst_data(inst).kind {
+166            InstKind::Declare { local } => self.declare_value(*local),
+167
+168            InstKind::Unary { op, value } => {
+169                let inst_result = self.body.store.inst_result(inst).unwrap();
+170                let inst_result_ty = inst_result.ty(self.db.upcast(), &self.body.store);
+171                let result = self.lower_unary(*op, *value);
+172                self.assign_inst_result(inst, result, inst_result_ty.deref(self.db.upcast()))
+173            }
+174
+175            InstKind::Binary { op, lhs, rhs } => {
+176                let inst_result = self.body.store.inst_result(inst).unwrap();
+177                let inst_result_ty = inst_result.ty(self.db.upcast(), &self.body.store);
+178                let result = self.lower_binary(*op, *lhs, *rhs, inst);
+179                self.assign_inst_result(inst, result, inst_result_ty.deref(self.db.upcast()))
+180            }
+181
+182            InstKind::Cast { kind, value, to } => {
+183                let from_ty = self.body.store.value_ty(*value);
+184                let result = match kind {
+185                    CastKind::Primitive => {
+186                        debug_assert!(
+187                            from_ty.is_primitive(self.db.upcast())
+188                                && to.is_primitive(self.db.upcast())
+189                        );
+190                        let value = self.value_expr(*value);
+191                        self.ctx.runtime.primitive_cast(self.db, value, from_ty)
+192                    }
+193                    CastKind::Untag => {
+194                        let from_ty = from_ty.deref(self.db.upcast());
+195                        debug_assert!(from_ty.is_enum(self.db.upcast()));
+196                        let value = self.value_expr(*value);
+197                        let offset = literal_expression! {(from_ty.enum_data_offset(self.db.upcast(), SLOT_SIZE))};
+198                        expression! {add([value], [offset])}
+199                    }
+200                };
+201
+202                self.assign_inst_result(inst, result, *to)
+203            }
+204
+205            InstKind::AggregateConstruct { ty, args } => {
+206                let lhs = self.body.store.inst_result(inst).unwrap();
+207                let ptr = self.lower_assignable_value(lhs);
+208                let ptr_ty = lhs.ty(self.db.upcast(), &self.body.store);
+209                let arg_values = args.iter().map(|arg| self.value_expr(*arg)).collect();
+210                let arg_tys = args
+211                    .iter()
+212                    .map(|arg| self.body.store.value_ty(*arg))
+213                    .collect();
+214                self.sink.push(yul::Statement::Expression(
+215                    self.ctx
+216                        .runtime
+217                        .aggregate_init(self.db, ptr, arg_values, ptr_ty, arg_tys),
+218                ))
+219            }
+220
+221            InstKind::Bind { src } => {
+222                match self.body.store.value_data(*src) {
+223                    Value::Constant { constant, .. } => {
+224                        // Need special handling when rhs is the string literal because it needs ptr
+225                        // copy.
+226                        if let ConstantValue::Str(s) = &constant.data(self.db.upcast()).value {
+227                            self.ctx.string_constants.insert(s.to_string());
+228                            let size = self.value_ty_size_deref(*src);
+229                            let lhs = self.body.store.inst_result(inst).unwrap();
+230                            let ptr = self.lower_assignable_value(lhs);
+231                            let inst_result_ty = lhs.ty(self.db.upcast(), &self.body.store);
+232                            self.sink.push(yul::Statement::Expression(
+233                                self.ctx.runtime.string_copy(
+234                                    self.db,
+235                                    ptr,
+236                                    s,
+237                                    inst_result_ty.is_sptr(self.db.upcast()),
+238                                ),
+239                            ))
+240                        } else {
+241                            let src_ty = self.body.store.value_ty(*src);
+242                            let src = self.value_expr(*src);
+243                            self.assign_inst_result(inst, src, src_ty)
+244                        }
+245                    }
+246                    _ => {
+247                        let src_ty = self.body.store.value_ty(*src);
+248                        let src = self.value_expr(*src);
+249                        self.assign_inst_result(inst, src, src_ty)
+250                    }
+251                }
+252            }
+253
+254            InstKind::MemCopy { src } => {
+255                let lhs = self.body.store.inst_result(inst).unwrap();
+256                let dst_ptr = self.lower_assignable_value(lhs);
+257                let dst_ptr_ty = lhs.ty(self.db.upcast(), &self.body.store);
+258                let src_ptr = self.value_expr(*src);
+259                let src_ptr_ty = self.body.store.value_ty(*src);
+260                let ty_size = literal_expression! { (self.value_ty_size_deref(*src)) };
+261                self.sink
+262                    .push(yul::Statement::Expression(self.ctx.runtime.ptr_copy(
+263                        self.db,
+264                        src_ptr,
+265                        dst_ptr,
+266                        ty_size,
+267                        src_ptr_ty.is_sptr(self.db.upcast()),
+268                        dst_ptr_ty.is_sptr(self.db.upcast()),
+269                    )))
+270            }
+271
+272            InstKind::Load { src } => {
+273                let src_ty = self.body.store.value_ty(*src);
+274                let src = self.value_expr(*src);
+275                debug_assert!(src_ty.is_ptr(self.db.upcast()));
+276
+277                let result = self.body.store.inst_result(inst).unwrap();
+278                debug_assert!(!result
+279                    .ty(self.db.upcast(), &self.body.store)
+280                    .is_ptr(self.db.upcast()));
+281                self.assign_inst_result(inst, src, src_ty)
+282            }
+283
+284            InstKind::AggregateAccess { value, indices } => {
+285                let base = self.value_expr(*value);
+286                let mut ptr = base;
+287                let mut inner_ty = self.body.store.value_ty(*value);
+288                for &idx in indices {
+289                    ptr = self.aggregate_elem_ptr(ptr, idx, inner_ty.deref(self.db.upcast()));
+290                    inner_ty =
+291                        inner_ty.projection_ty(self.db.upcast(), self.body.store.value_data(idx));
+292                }
+293
+294                let result = self.body.store.inst_result(inst).unwrap();
+295                self.assign_inst_result(inst, ptr, inner_ty)
+296            }
+297
+298            InstKind::MapAccess { value, key } => {
+299                let map_ty = self.body.store.value_ty(*value).deref(self.db.upcast());
+300                let value_expr = self.value_expr(*value);
+301                let key_expr = self.value_expr(*key);
+302                let key_ty = self.body.store.value_ty(*key);
+303                let ptr = self
+304                    .ctx
+305                    .runtime
+306                    .map_value_ptr(self.db, value_expr, key_expr, key_ty);
+307                let value_ty = match &map_ty.data(self.db.upcast()).kind {
+308                    TypeKind::Map(def) => def.value_ty,
+309                    _ => unreachable!(),
+310                };
+311
+312                self.assign_inst_result(inst, ptr, value_ty.make_sptr(self.db.upcast()));
+313            }
+314
+315            InstKind::Call {
+316                func,
+317                args,
+318                call_type,
+319            } => {
+320                let args: Vec<_> = args.iter().map(|arg| self.value_expr(*arg)).collect();
+321                let result = match call_type {
+322                    CallType::Internal => {
+323                        self.ctx.function_dependency.insert(*func);
+324                        let func_name = identifier! {(self.db.codegen_function_symbol_name(*func))};
+325                        expression! {[func_name]([args...])}
+326                    }
+327                    CallType::External => self.ctx.runtime.external_call(self.db, *func, args),
+328                };
+329                match self.db.codegen_legalized_signature(*func).return_type {
+330                    Some(mut result_ty) => {
+331                        if result_ty.is_aggregate(self.db.upcast())
+332                            | result_ty.is_string(self.db.upcast())
+333                        {
+334                            result_ty = result_ty.make_mptr(self.db.upcast());
+335                        }
+336                        self.assign_inst_result(inst, result, result_ty)
+337                    }
+338                    _ => self.sink.push(Statement::Expression(result)),
+339                }
+340            }
+341
+342            InstKind::Revert { arg } => match arg {
+343                Some(arg) => {
+344                    let arg_ty = self.body.store.value_ty(*arg);
+345                    let deref_ty = arg_ty.deref(self.db.upcast());
+346                    let ty_data = deref_ty.data(self.db.upcast());
+347                    let arg_expr = if deref_ty.is_zero_sized(self.db.upcast()) {
+348                        None
+349                    } else {
+350                        Some(self.value_expr(*arg))
+351                    };
+352                    let name = match &ty_data.kind {
+353                        ir::TypeKind::Struct(def) => &def.name,
+354                        ir::TypeKind::String(def) => "Error",
+355                        _ => "Panic",
+356                    };
+357                    self.sink.push(yul::Statement::Expression(
+358                        self.ctx.runtime.revert(self.db, arg_expr, name, arg_ty),
+359                    ));
+360                }
+361                None => self.sink.push(statement! {revert(0, 0)}),
+362            },
+363
+364            InstKind::Emit { arg } => {
+365                let event = self.value_expr(*arg);
+366                let event_ty = self.body.store.value_ty(*arg);
+367                let result = self.ctx.runtime.emit(self.db, event, event_ty);
+368                let u256_ty = yul_primitive_type(self.db);
+369                self.assign_inst_result(inst, result, u256_ty);
+370            }
+371
+372            InstKind::Return { arg } => {
+373                if let Some(arg) = arg {
+374                    let arg = self.value_expr(*arg);
+375                    let ret_value = self.ret_value.clone().unwrap();
+376                    self.sink.push(statement! {[ret_value] := [arg]});
+377                }
+378                self.sink.push(yul::Statement::Leave)
+379            }
+380
+381            InstKind::Keccak256 { arg } => {
+382                let result = self.keccak256(*arg);
+383                let u256_ty = yul_primitive_type(self.db);
+384                self.assign_inst_result(inst, result, u256_ty);
+385            }
+386
+387            InstKind::AbiEncode { arg } => {
+388                let lhs = self.body.store.inst_result(inst).unwrap();
+389                let ptr = self.lower_assignable_value(lhs);
+390                let ptr_ty = lhs.ty(self.db.upcast(), &self.body.store);
+391                let src_expr = self.value_expr(*arg);
+392                let src_ty = self.body.store.value_ty(*arg);
+393
+394                let abi_encode = self.ctx.runtime.abi_encode(
+395                    self.db,
+396                    src_expr,
+397                    ptr,
+398                    src_ty,
+399                    ptr_ty.is_sptr(self.db.upcast()),
+400                );
+401                self.sink.push(statement! {
+402                    pop([abi_encode])
+403                });
+404            }
+405
+406            InstKind::Create { value, contract } => {
+407                self.ctx.contract_dependency.insert(*contract);
+408
+409                let value_expr = self.value_expr(*value);
+410                let result = self.ctx.runtime.create(self.db, *contract, value_expr);
+411                let u256_ty = yul_primitive_type(self.db);
+412                self.assign_inst_result(inst, result, u256_ty)
+413            }
+414
+415            InstKind::Create2 {
+416                value,
+417                salt,
+418                contract,
+419            } => {
+420                self.ctx.contract_dependency.insert(*contract);
+421
+422                let value_expr = self.value_expr(*value);
+423                let salt_expr = self.value_expr(*salt);
+424                let result = self
+425                    .ctx
+426                    .runtime
+427                    .create2(self.db, *contract, value_expr, salt_expr);
+428                let u256_ty = yul_primitive_type(self.db);
+429                self.assign_inst_result(inst, result, u256_ty)
+430            }
+431
+432            InstKind::YulIntrinsic { op, args } => {
+433                let args: Vec<_> = args.iter().map(|arg| self.value_expr(*arg)).collect();
+434                let op_name = identifier! { (format!("{op}").strip_prefix("__").unwrap()) };
+435                let result = expression! { [op_name]([args...]) };
+436                // Intrinsic operation never returns ptr type, so we can use u256_ty as a dummy
+437                // type for the result.
+438                let u256_ty = yul_primitive_type(self.db);
+439                self.assign_inst_result(inst, result, u256_ty)
+440            }
+441
+442            InstKind::Nop => {}
+443
+444            // These flow control instructions are already legalized.
+445            InstKind::Jump { .. } | InstKind::Branch { .. } | InstKind::Switch { .. } => {
+446                unreachable!()
+447            }
+448        }
+449    }
+450
+451    fn lower_if(
+452        &mut self,
+453        cond: ValueId,
+454        then: Vec<StructuralInst>,
+455        else_: Vec<StructuralInst>,
+456    ) -> yul::Statement {
+457        let cond = self.value_expr(cond);
+458
+459        self.enter_scope();
+460        let then_body = self.lower_branch_body(then);
+461        self.leave_scope();
+462
+463        self.enter_scope();
+464        let else_body = self.lower_branch_body(else_);
+465        self.leave_scope();
+466
+467        switch! {
+468            switch ([cond])
+469            (case 1 {[then_body...]})
+470            (case 0 {[else_body...]})
+471        }
+472    }
+473
+474    fn lower_switch(
+475        &mut self,
+476        scrutinee: ValueId,
+477        table: Vec<(ValueId, Vec<StructuralInst>)>,
+478        default: Option<Vec<StructuralInst>>,
+479    ) -> yul::Statement {
+480        let scrutinee = self.value_expr(scrutinee);
+481
+482        let mut cases = vec![];
+483        for (value, insts) in table {
+484            let value = self.value_expr(value);
+485            let value = match value {
+486                yul::Expression::Literal(lit) => lit,
+487                _ => panic!("switch table values must be literal"),
+488            };
+489
+490            self.enter_scope();
+491            let body = self.lower_branch_body(insts);
+492            self.leave_scope();
+493            cases.push(yul::Case {
+494                literal: Some(value),
+495                block: block! { [body...] },
+496            })
+497        }
+498
+499        if let Some(insts) = default {
+500            let block = self.lower_branch_body(insts);
+501            cases.push(case! {
+502                default {[block...]}
+503            });
+504        }
+505
+506        switch! {
+507            switch ([scrutinee])
+508            [cases...]
+509        }
+510    }
+511
+512    fn lower_branch_body(&mut self, insts: Vec<StructuralInst>) -> Vec<yul::Statement> {
+513        let mut body = vec![];
+514        std::mem::swap(&mut self.sink, &mut body);
+515        for inst in insts {
+516            self.lower_structural_inst(inst);
+517        }
+518        std::mem::swap(&mut self.sink, &mut body);
+519        body
+520    }
+521
+522    fn lower_for(&mut self, body: Vec<StructuralInst>) -> yul::Statement {
+523        let mut body_stmts = vec![];
+524        std::mem::swap(&mut self.sink, &mut body_stmts);
+525        for inst in body {
+526            self.lower_structural_inst(inst);
+527        }
+528        std::mem::swap(&mut self.sink, &mut body_stmts);
+529
+530        block_statement! {(
+531            for {} (1) {}
+532            {
+533                [body_stmts...]
+534            }
+535        )}
+536    }
+537
+538    fn lower_assign(&mut self, lhs: &AssignableValue, rhs: ValueId) -> yul::Statement {
+539        match lhs {
+540            AssignableValue::Value(value) => {
+541                let lhs = self.value_ident(*value);
+542                let rhs = self.value_expr(rhs);
+543                statement! { [lhs] := [rhs] }
+544            }
+545            AssignableValue::Aggregate { .. } | AssignableValue::Map { .. } => {
+546                let dst_ty = lhs.ty(self.db.upcast(), &self.body.store);
+547                let src_ty = self.body.store.value_ty(rhs);
+548                debug_assert_eq!(
+549                    dst_ty.deref(self.db.upcast()),
+550                    src_ty.deref(self.db.upcast())
+551                );
+552
+553                let dst = self.lower_assignable_value(lhs);
+554                let src = self.value_expr(rhs);
+555
+556                if src_ty.is_ptr(self.db.upcast()) {
+557                    let ty_size = literal_expression! { (self.value_ty_size_deref(rhs)) };
+558
+559                    let expr = self.ctx.runtime.ptr_copy(
+560                        self.db,
+561                        src,
+562                        dst,
+563                        ty_size,
+564                        src_ty.is_sptr(self.db.upcast()),
+565                        dst_ty.is_sptr(self.db.upcast()),
+566                    );
+567                    yul::Statement::Expression(expr)
+568                } else {
+569                    let expr = self.ctx.runtime.ptr_store(self.db, dst, src, dst_ty);
+570                    yul::Statement::Expression(expr)
+571                }
+572            }
+573        }
+574    }
+575
+576    fn lower_unary(&mut self, op: UnOp, value: ValueId) -> yul::Expression {
+577        let value_expr = self.value_expr(value);
+578        match op {
+579            UnOp::Not => expression! { iszero([value_expr])},
+580            UnOp::Neg => {
+581                let zero = literal_expression! {0};
+582                if self.body.store.value_data(value).is_imm() {
+583                    // Literals are checked at compile time (e.g. -128) so there's no point
+584                    // in adding a runtime check.
+585                    expression! {sub([zero], [value_expr])}
+586                } else {
+587                    let value_ty = self.body.store.value_ty(value);
+588                    self.ctx
+589                        .runtime
+590                        .safe_sub(self.db, zero, value_expr, value_ty)
+591                }
+592            }
+593            UnOp::Inv => expression! { not([value_expr])},
+594        }
+595    }
+596
+597    fn lower_binary(
+598        &mut self,
+599        op: BinOp,
+600        lhs: ValueId,
+601        rhs: ValueId,
+602        inst: InstId,
+603    ) -> yul::Expression {
+604        let lhs_expr = self.value_expr(lhs);
+605        let rhs_expr = self.value_expr(rhs);
+606        let is_result_signed = self
+607            .body
+608            .store
+609            .inst_result(inst)
+610            .map(|val| {
+611                let ty = val.ty(self.db.upcast(), &self.body.store);
+612                ty.is_signed(self.db.upcast())
+613            })
+614            .unwrap_or(false);
+615        let is_lhs_signed = self.body.store.value_ty(lhs).is_signed(self.db.upcast());
+616
+617        let inst_result = self.body.store.inst_result(inst).unwrap();
+618        let inst_result_ty = inst_result
+619            .ty(self.db.upcast(), &self.body.store)
+620            .deref(self.db.upcast());
+621        match op {
+622            BinOp::Add => self
+623                .ctx
+624                .runtime
+625                .safe_add(self.db, lhs_expr, rhs_expr, inst_result_ty),
+626            BinOp::Sub => self
+627                .ctx
+628                .runtime
+629                .safe_sub(self.db, lhs_expr, rhs_expr, inst_result_ty),
+630            BinOp::Mul => self
+631                .ctx
+632                .runtime
+633                .safe_mul(self.db, lhs_expr, rhs_expr, inst_result_ty),
+634            BinOp::Div => self
+635                .ctx
+636                .runtime
+637                .safe_div(self.db, lhs_expr, rhs_expr, inst_result_ty),
+638            BinOp::Mod => self
+639                .ctx
+640                .runtime
+641                .safe_mod(self.db, lhs_expr, rhs_expr, inst_result_ty),
+642            BinOp::Pow => self
+643                .ctx
+644                .runtime
+645                .safe_pow(self.db, lhs_expr, rhs_expr, inst_result_ty),
+646            BinOp::Shl => expression! {shl([rhs_expr], [lhs_expr])},
+647            BinOp::Shr if is_result_signed => expression! {sar([rhs_expr], [lhs_expr])},
+648            BinOp::Shr => expression! {shr([rhs_expr], [lhs_expr])},
+649            BinOp::BitOr | BinOp::LogicalOr => expression! {or([lhs_expr], [rhs_expr])},
+650            BinOp::BitXor => expression! {xor([lhs_expr], [rhs_expr])},
+651            BinOp::BitAnd | BinOp::LogicalAnd => expression! {and([lhs_expr], [rhs_expr])},
+652            BinOp::Eq => expression! {eq([lhs_expr], [rhs_expr])},
+653            BinOp::Ne => expression! {iszero((eq([lhs_expr], [rhs_expr])))},
+654            BinOp::Ge if is_lhs_signed => expression! {iszero((slt([lhs_expr], [rhs_expr])))},
+655            BinOp::Ge => expression! {iszero((lt([lhs_expr], [rhs_expr])))},
+656            BinOp::Gt if is_lhs_signed => expression! {sgt([lhs_expr], [rhs_expr])},
+657            BinOp::Gt => expression! {gt([lhs_expr], [rhs_expr])},
+658            BinOp::Le if is_lhs_signed => expression! {iszero((sgt([lhs_expr], [rhs_expr])))},
+659            BinOp::Le => expression! {iszero((gt([lhs_expr], [rhs_expr])))},
+660            BinOp::Lt if is_lhs_signed => expression! {slt([lhs_expr], [rhs_expr])},
+661            BinOp::Lt => expression! {lt([lhs_expr], [rhs_expr])},
+662        }
+663    }
+664
+665    fn lower_cast(&mut self, value: ValueId, to: TypeId) -> yul::Expression {
+666        let from_ty = self.body.store.value_ty(value);
+667        debug_assert!(from_ty.is_primitive(self.db.upcast()));
+668        debug_assert!(to.is_primitive(self.db.upcast()));
+669
+670        let value = self.value_expr(value);
+671        self.ctx.runtime.primitive_cast(self.db, value, from_ty)
+672    }
+673
+674    fn assign_inst_result(&mut self, inst: InstId, rhs: yul::Expression, rhs_ty: TypeId) {
+675        // NOTE: We don't have `deref` feature yet, so need a heuristics for an
+676        // assignment.
+677        let stmt = if let Some(result) = self.body.store.inst_result(inst) {
+678            let lhs = self.lower_assignable_value(result);
+679            let lhs_ty = result.ty(self.db.upcast(), &self.body.store);
+680            match result {
+681                AssignableValue::Value(value) => {
+682                    match (
+683                        lhs_ty.is_ptr(self.db.upcast()),
+684                        rhs_ty.is_ptr(self.db.upcast()),
+685                    ) {
+686                        (true, true) => {
+687                            if lhs_ty.is_mptr(self.db.upcast()) == rhs_ty.is_mptr(self.db.upcast())
+688                            {
+689                                let rhs = self.extend_value(rhs, lhs_ty);
+690                                let lhs_ident = self.value_ident(*value);
+691                                statement! { [lhs_ident] := [rhs] }
+692                            } else {
+693                                let ty_size = rhs_ty
+694                                    .deref(self.db.upcast())
+695                                    .size_of(self.db.upcast(), SLOT_SIZE);
+696                                yul::Statement::Expression(self.ctx.runtime.ptr_copy(
+697                                    self.db,
+698                                    rhs,
+699                                    lhs,
+700                                    literal_expression! { (ty_size) },
+701                                    rhs_ty.is_sptr(self.db.upcast()),
+702                                    lhs_ty.is_sptr(self.db.upcast()),
+703                                ))
+704                            }
+705                        }
+706                        (true, false) => yul::Statement::Expression(
+707                            self.ctx.runtime.ptr_store(self.db, lhs, rhs, lhs_ty),
+708                        ),
+709
+710                        (false, true) => {
+711                            let rhs = self.ctx.runtime.ptr_load(self.db, rhs, rhs_ty);
+712                            let rhs = self.extend_value(rhs, lhs_ty);
+713                            let lhs_ident = self.value_ident(*value);
+714                            statement! { [lhs_ident] := [rhs] }
+715                        }
+716                        (false, false) => {
+717                            let rhs = self.extend_value(rhs, lhs_ty);
+718                            let lhs_ident = self.value_ident(*value);
+719                            statement! { [lhs_ident] := [rhs] }
+720                        }
+721                    }
+722                }
+723                AssignableValue::Aggregate { .. } | AssignableValue::Map { .. } => {
+724                    let expr = if rhs_ty.is_ptr(self.db.upcast()) {
+725                        let ty_size = rhs_ty
+726                            .deref(self.db.upcast())
+727                            .size_of(self.db.upcast(), SLOT_SIZE);
+728                        self.ctx.runtime.ptr_copy(
+729                            self.db,
+730                            rhs,
+731                            lhs,
+732                            literal_expression! { (ty_size) },
+733                            rhs_ty.is_sptr(self.db.upcast()),
+734                            lhs_ty.is_sptr(self.db.upcast()),
+735                        )
+736                    } else {
+737                        self.ctx.runtime.ptr_store(self.db, lhs, rhs, lhs_ty)
+738                    };
+739                    yul::Statement::Expression(expr)
+740                }
+741            }
+742        } else {
+743            yul::Statement::Expression(rhs)
+744        };
+745
+746        self.sink.push(stmt);
+747    }
+748
+749    /// Extend a value to 256 bits.
+750    fn extend_value(&mut self, value: yul::Expression, ty: TypeId) -> yul::Expression {
+751        if ty.is_primitive(self.db.upcast()) {
+752            self.ctx.runtime.primitive_cast(self.db, value, ty)
+753        } else {
+754            value
+755        }
+756    }
+757
+758    fn declare_assignable_value(&mut self, value: &AssignableValue) {
+759        match value {
+760            AssignableValue::Value(value) if !self.value_map.contains(*value) => {
+761                self.declare_value(*value);
+762            }
+763            _ => {}
+764        }
+765    }
+766
+767    fn declare_value(&mut self, value: ValueId) {
+768        let var = YulVariable::new(format!("$tmp_{}", value.index()));
+769        self.value_map.insert(value, var.ident());
+770        let value_ty = self.body.store.value_ty(value);
+771
+772        // Allocate memory for a value if a value is a pointer type.
+773        let init = if value_ty.is_mptr(self.db.upcast()) {
+774            let deref_ty = value_ty.deref(self.db.upcast());
+775            let ty_size = deref_ty.size_of(self.db.upcast(), SLOT_SIZE);
+776            let size = literal_expression! { (ty_size) };
+777            Some(self.ctx.runtime.alloc(self.db, size))
+778        } else {
+779            None
+780        };
+781
+782        self.sink.push(yul::Statement::VariableDeclaration(
+783            yul::VariableDeclaration {
+784                identifiers: vec![var.ident()],
+785                expression: init,
+786            },
+787        ))
+788    }
+789
+790    fn value_expr(&mut self, value: ValueId) -> yul::Expression {
+791        match self.body.store.value_data(value) {
+792            Value::Local(_) | Value::Temporary { .. } => {
+793                let ident = self.value_map.lookup(value).unwrap();
+794                literal_expression! {(ident)}
+795            }
+796            Value::Immediate { imm, .. } => {
+797                literal_expression! {(imm)}
+798            }
+799            Value::Constant { constant, .. } => match &constant.data(self.db.upcast()).value {
+800                ConstantValue::Immediate(imm) => {
+801                    // YUL does not support representing negative integers with leading minus (e.g.
+802                    // `-1` in YUL would lead to an ICE). To mitigate that we
+803                    // convert all numeric values into hexadecimal representation.
+804                    literal_expression! {(to_hex_str(imm))}
+805                }
+806                ConstantValue::Str(s) => {
+807                    self.ctx.string_constants.insert(s.to_string());
+808                    self.ctx.runtime.string_construct(self.db, s, s.len())
+809                }
+810                ConstantValue::Bool(true) => {
+811                    literal_expression! {1}
+812                }
+813                ConstantValue::Bool(false) => {
+814                    literal_expression! {0}
+815                }
+816            },
+817            Value::Unit { .. } => unreachable!(),
+818        }
+819    }
+820
+821    fn value_ident(&self, value: ValueId) -> yul::Identifier {
+822        self.value_map.lookup(value).unwrap().clone()
+823    }
+824
+825    fn make_tmp(&mut self, tmp: ValueId) -> yul::Identifier {
+826        let ident = YulVariable::new(format! {"$tmp_{}", tmp.index()}).ident();
+827        self.value_map.insert(tmp, ident.clone());
+828        ident
+829    }
+830
+831    fn keccak256(&mut self, value: ValueId) -> yul::Expression {
+832        let value_ty = self.body.store.value_ty(value);
+833        debug_assert!(value_ty.is_mptr(self.db.upcast()));
+834
+835        let value_size = value_ty
+836            .deref(self.db.upcast())
+837            .size_of(self.db.upcast(), SLOT_SIZE);
+838        let value_size_expr = literal_expression! {(value_size)};
+839        let value_expr = self.value_expr(value);
+840        expression! {keccak256([value_expr], [value_size_expr])}
+841    }
+842
+843    fn lower_assignable_value(&mut self, value: &AssignableValue) -> yul::Expression {
+844        match value {
+845            AssignableValue::Value(value) => self.value_expr(*value),
+846
+847            AssignableValue::Aggregate { lhs, idx } => {
+848                let base_ptr = self.lower_assignable_value(lhs);
+849                let ty = lhs
+850                    .ty(self.db.upcast(), &self.body.store)
+851                    .deref(self.db.upcast());
+852                self.aggregate_elem_ptr(base_ptr, *idx, ty)
+853            }
+854            AssignableValue::Map { lhs, key } => {
+855                let map_ptr = self.lower_assignable_value(lhs);
+856                let key_ty = self.body.store.value_ty(*key);
+857                let key = self.value_expr(*key);
+858                self.ctx
+859                    .runtime
+860                    .map_value_ptr(self.db, map_ptr, key, key_ty)
+861            }
+862        }
+863    }
+864
+865    fn aggregate_elem_ptr(
+866        &mut self,
+867        base_ptr: yul::Expression,
+868        idx: ValueId,
+869        base_ty: TypeId,
+870    ) -> yul::Expression {
+871        debug_assert!(base_ty.is_aggregate(self.db.upcast()));
+872
+873        match &base_ty.data(self.db.upcast()).kind {
+874            TypeKind::Array(def) => {
+875                let elem_size =
+876                    literal_expression! {(base_ty.array_elem_size(self.db.upcast(), SLOT_SIZE))};
+877                self.validate_array_indexing(def.len, idx);
+878                let idx = self.value_expr(idx);
+879                let offset = expression! {mul([elem_size], [idx])};
+880                expression! { add([base_ptr], [offset]) }
+881            }
+882            _ => {
+883                let elem_idx = match self.body.store.value_data(idx) {
+884                    Value::Immediate { imm, .. } => imm,
+885                    _ => panic!("only array type can use dynamic value indexing"),
+886                };
+887                let offset = literal_expression! {(base_ty.aggregate_elem_offset(self.db.upcast(), elem_idx.clone(), SLOT_SIZE))};
+888                expression! {add([base_ptr], [offset])}
+889            }
+890        }
+891    }
+892
+893    fn validate_array_indexing(&mut self, array_len: usize, idx: ValueId) {
+894        const PANIC_OUT_OF_BOUNDS: usize = 0x32;
+895
+896        if let Value::Immediate { .. } = self.body.store.value_data(idx) {
+897            return;
+898        }
+899
+900        let idx = self.value_expr(idx);
+901        let max_idx = literal_expression! {(array_len - 1)};
+902        self.sink.push(statement!(if (gt([idx], [max_idx])) {
+903            ([runtime::panic_revert_numeric(
+904                self.ctx.runtime.as_mut(),
+905                self.db,
+906                literal_expression! {(PANIC_OUT_OF_BOUNDS)},
+907            )])
+908        }));
+909    }
+910
+911    fn value_ty_size(&self, value: ValueId) -> usize {
+912        self.body
+913            .store
+914            .value_ty(value)
+915            .size_of(self.db.upcast(), SLOT_SIZE)
+916    }
+917
+918    fn value_ty_size_deref(&self, value: ValueId) -> usize {
+919        self.body
+920            .store
+921            .value_ty(value)
+922            .deref(self.db.upcast())
+923            .size_of(self.db.upcast(), SLOT_SIZE)
+924    }
+925
+926    fn enter_scope(&mut self) {
+927        let value_map = std::mem::take(&mut self.value_map);
+928        self.value_map = ScopedValueMap::with_parent(value_map);
+929    }
+930
+931    fn leave_scope(&mut self) {
+932        let value_map = std::mem::take(&mut self.value_map);
+933        self.value_map = value_map.into_parent();
+934    }
+935}
+936
+937#[derive(Debug, Default)]
+938struct ScopedValueMap {
+939    parent: Option<Box<ScopedValueMap>>,
+940    map: FxHashMap<ValueId, yul::Identifier>,
+941}
+942
+943impl ScopedValueMap {
+944    fn lookup(&self, value: ValueId) -> Option<&yul::Identifier> {
+945        match self.map.get(&value) {
+946            Some(ident) => Some(ident),
+947            None => self.parent.as_ref().and_then(|p| p.lookup(value)),
+948        }
+949    }
+950
+951    fn with_parent(parent: ScopedValueMap) -> Self {
+952        Self {
+953            parent: Some(parent.into()),
+954            ..Self::default()
+955        }
+956    }
+957
+958    fn into_parent(self) -> Self {
+959        *self.parent.unwrap()
+960    }
+961
+962    fn insert(&mut self, value: ValueId, ident: yul::Identifier) {
+963        self.map.insert(value, ident);
+964    }
+965
+966    fn contains(&self, value: ValueId) -> bool {
+967        self.lookup(value).is_some()
+968    }
+969}
+970
+971fn bit_mask(byte_size: usize) -> usize {
+972    (1 << (byte_size * 8)) - 1
+973}
+974
+975fn bit_mask_expr(byte_size: usize) -> yul::Expression {
+976    let mask = format!("{:#x}", bit_mask(byte_size));
+977    literal_expression! {(mask)}
+978}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html b/compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html new file mode 100644 index 0000000000..0dec08eae0 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html @@ -0,0 +1,1368 @@ +inst_order.rs - source

fe_codegen/yul/isel/
inst_order.rs

1use fe_mir::{
+2    analysis::{
+3        domtree::DFSet, loop_tree::LoopId, post_domtree::PostIDom, ControlFlowGraph, DomTree,
+4        LoopTree, PostDomTree,
+5    },
+6    ir::{
+7        inst::{BranchInfo, SwitchTable},
+8        BasicBlockId, FunctionBody, InstId, ValueId,
+9    },
+10};
+11use indexmap::{IndexMap, IndexSet};
+12
+13#[derive(Debug, Clone)]
+14pub(super) enum StructuralInst {
+15    Inst(InstId),
+16    If {
+17        cond: ValueId,
+18        then: Vec<StructuralInst>,
+19        else_: Vec<StructuralInst>,
+20    },
+21
+22    Switch {
+23        scrutinee: ValueId,
+24        table: Vec<(ValueId, Vec<StructuralInst>)>,
+25        default: Option<Vec<StructuralInst>>,
+26    },
+27
+28    For {
+29        body: Vec<StructuralInst>,
+30    },
+31
+32    Break,
+33
+34    Continue,
+35}
+36
+37pub(super) struct InstSerializer<'a> {
+38    body: &'a FunctionBody,
+39    cfg: ControlFlowGraph,
+40    loop_tree: LoopTree,
+41    df: DFSet,
+42    domtree: DomTree,
+43    pd_tree: PostDomTree,
+44    scope: Option<Scope>,
+45}
+46
+47impl<'a> InstSerializer<'a> {
+48    pub(super) fn new(body: &'a FunctionBody) -> Self {
+49        let cfg = ControlFlowGraph::compute(body);
+50        let domtree = DomTree::compute(&cfg);
+51        let df = domtree.compute_df(&cfg);
+52        let pd_tree = PostDomTree::compute(body);
+53        let loop_tree = LoopTree::compute(&cfg, &domtree);
+54
+55        Self {
+56            body,
+57            cfg,
+58            loop_tree,
+59            df,
+60            domtree,
+61            pd_tree,
+62            scope: None,
+63        }
+64    }
+65
+66    pub(super) fn serialize(&mut self) -> Vec<StructuralInst> {
+67        self.scope = None;
+68        let entry = self.cfg.entry();
+69        let mut order = vec![];
+70        self.serialize_block(entry, &mut order);
+71        order
+72    }
+73
+74    fn serialize_block(&mut self, block: BasicBlockId, order: &mut Vec<StructuralInst>) {
+75        match self.loop_tree.loop_of_block(block) {
+76            Some(lp)
+77                if block == self.loop_tree.loop_header(lp)
+78                    && Some(block) != self.scope.as_ref().and_then(Scope::loop_header) =>
+79            {
+80                let loop_exit = self.find_loop_exit(lp);
+81                self.enter_loop_scope(lp, block, loop_exit);
+82                let mut body = vec![];
+83                self.serialize_block(block, &mut body);
+84                self.exit_scope();
+85                order.push(StructuralInst::For { body });
+86
+87                match loop_exit {
+88                    Some(exit)
+89                        if self
+90                            .scope
+91                            .as_ref()
+92                            .map(|scope| scope.branch_merge_block() != Some(exit))
+93                            .unwrap_or(true) =>
+94                    {
+95                        self.serialize_block(exit, order);
+96                    }
+97                    _ => {}
+98                }
+99
+100                return;
+101            }
+102            _ => {}
+103        };
+104
+105        for inst in self.body.order.iter_inst(block) {
+106            if self.body.store.is_terminator(inst) {
+107                break;
+108            }
+109            if !self.body.store.is_nop(inst) {
+110                order.push(StructuralInst::Inst(inst));
+111            }
+112        }
+113
+114        let terminator = self.body.order.terminator(&self.body.store, block).unwrap();
+115        match self.analyze_terminator(terminator) {
+116            TerminatorInfo::If {
+117                cond,
+118                then,
+119                else_,
+120                merge_block,
+121            } => self.serialize_if_terminator(cond, *then, *else_, merge_block, order),
+122
+123            TerminatorInfo::Switch {
+124                scrutinee,
+125                table,
+126                default,
+127                merge_block,
+128            } => self.serialize_switch_terminator(
+129                scrutinee,
+130                table,
+131                default.map(|value| *value),
+132                merge_block,
+133                order,
+134            ),
+135
+136            TerminatorInfo::ToMergeBlock => {}
+137            TerminatorInfo::Continue => order.push(StructuralInst::Continue),
+138            TerminatorInfo::Break => order.push(StructuralInst::Break),
+139            TerminatorInfo::FallThrough(next) => self.serialize_block(next, order),
+140            TerminatorInfo::NormalInst(inst) => order.push(StructuralInst::Inst(inst)),
+141        }
+142    }
+143
+144    fn serialize_if_terminator(
+145        &mut self,
+146        cond: ValueId,
+147        then: TerminatorInfo,
+148        else_: TerminatorInfo,
+149        merge_block: Option<BasicBlockId>,
+150        order: &mut Vec<StructuralInst>,
+151    ) {
+152        let mut then_body = vec![];
+153        let mut else_body = vec![];
+154
+155        self.enter_branch_scope(merge_block);
+156        self.serialize_branch_dest(then, &mut then_body, merge_block);
+157        self.serialize_branch_dest(else_, &mut else_body, merge_block);
+158        self.exit_scope();
+159
+160        order.push(StructuralInst::If {
+161            cond,
+162            then: then_body,
+163            else_: else_body,
+164        });
+165        if let Some(merge_block) = merge_block {
+166            self.serialize_block(merge_block, order);
+167        }
+168    }
+169
+170    fn serialize_switch_terminator(
+171        &mut self,
+172        scrutinee: ValueId,
+173        table: Vec<(ValueId, TerminatorInfo)>,
+174        default: Option<TerminatorInfo>,
+175        merge_block: Option<BasicBlockId>,
+176        order: &mut Vec<StructuralInst>,
+177    ) {
+178        self.enter_branch_scope(merge_block);
+179
+180        let mut serialized_table = Vec::with_capacity(table.len());
+181        for (value, dest) in table {
+182            let mut body = vec![];
+183            self.serialize_branch_dest(dest, &mut body, merge_block);
+184            serialized_table.push((value, body));
+185        }
+186
+187        let serialized_default = default.map(|dest| {
+188            let mut body = vec![];
+189            self.serialize_branch_dest(dest, &mut body, merge_block);
+190            body
+191        });
+192
+193        order.push(StructuralInst::Switch {
+194            scrutinee,
+195            table: serialized_table,
+196            default: serialized_default,
+197        });
+198
+199        self.exit_scope();
+200
+201        if let Some(merge_block) = merge_block {
+202            self.serialize_block(merge_block, order);
+203        }
+204    }
+205
+206    fn serialize_branch_dest(
+207        &mut self,
+208        dest: TerminatorInfo,
+209        body: &mut Vec<StructuralInst>,
+210        merge_block: Option<BasicBlockId>,
+211    ) {
+212        match dest {
+213            TerminatorInfo::Break => body.push(StructuralInst::Break),
+214            TerminatorInfo::Continue => body.push(StructuralInst::Continue),
+215            TerminatorInfo::ToMergeBlock => {}
+216            TerminatorInfo::FallThrough(dest) => {
+217                if Some(dest) != merge_block {
+218                    self.serialize_block(dest, body);
+219                }
+220            }
+221            _ => unreachable!(),
+222        };
+223    }
+224
+225    fn enter_loop_scope(&mut self, lp: LoopId, header: BasicBlockId, exit: Option<BasicBlockId>) {
+226        let kind = ScopeKind::Loop { lp, header, exit };
+227        let current_scope = std::mem::take(&mut self.scope);
+228        self.scope = Some(Scope {
+229            kind,
+230            parent: current_scope.map(Into::into),
+231        });
+232    }
+233
+234    fn enter_branch_scope(&mut self, merge_block: Option<BasicBlockId>) {
+235        let kind = ScopeKind::Branch { merge_block };
+236        let current_scope = std::mem::take(&mut self.scope);
+237        self.scope = Some(Scope {
+238            kind,
+239            parent: current_scope.map(Into::into),
+240        });
+241    }
+242
+243    fn exit_scope(&mut self) {
+244        let current_scope = std::mem::take(&mut self.scope);
+245        self.scope = current_scope.unwrap().parent.map(|parent| *parent);
+246    }
+247
+248    // NOTE: We assume loop has at most one canonical loop exit.
+249    fn find_loop_exit(&self, lp: LoopId) -> Option<BasicBlockId> {
+250        let mut exit_candidates = vec![];
+251        for block_in_loop in self.loop_tree.iter_blocks_post_order(&self.cfg, lp) {
+252            for &succ in self.cfg.succs(block_in_loop) {
+253                if !self.loop_tree.is_block_in_loop(succ, lp) {
+254                    exit_candidates.push(succ);
+255                }
+256            }
+257        }
+258
+259        if exit_candidates.is_empty() {
+260            return None;
+261        }
+262
+263        if exit_candidates.len() == 1 {
+264            let candidate = exit_candidates[0];
+265            let exit = if let Some(mut df) = self.df.frontiers(candidate) {
+266                debug_assert_eq!(self.df.frontier_num(candidate), 1);
+267                df.next()
+268            } else {
+269                Some(candidate)
+270            };
+271            return exit;
+272        }
+273
+274        // If a candidate is a dominance frontier of all other nodes, then the candidate
+275        // is a loop exit.
+276        for &cand in &exit_candidates {
+277            if exit_candidates.iter().all(|&block| {
+278                if block == cand {
+279                    true
+280                } else if let Some(mut df) = self.df.frontiers(block) {
+281                    df.any(|frontier| frontier == cand)
+282                } else {
+283                    true
+284                }
+285            }) {
+286                return Some(cand);
+287            }
+288        }
+289
+290        // If all candidates have the same dominance frontier, then the frontier block
+291        // is the canonicalized loop exit.
+292        let mut frontier: IndexSet<_> = self
+293            .df
+294            .frontiers(exit_candidates.pop().unwrap())
+295            .map(std::iter::Iterator::collect)
+296            .unwrap_or_default();
+297        for cand in exit_candidates {
+298            for cand_frontier in self.df.frontiers(cand).unwrap() {
+299                if !frontier.contains(&cand_frontier) {
+300                    frontier.remove(&cand_frontier);
+301                }
+302            }
+303        }
+304        debug_assert!(frontier.len() < 2);
+305        frontier.iter().next().copied()
+306    }
+307
+308    fn analyze_terminator(&self, inst: InstId) -> TerminatorInfo {
+309        debug_assert!(self.body.store.is_terminator(inst));
+310
+311        let inst_block = self.body.order.inst_block(inst);
+312        match self.body.store.branch_info(inst) {
+313            BranchInfo::Jump(dest) => self.analyze_jump(dest),
+314
+315            BranchInfo::Branch(cond, then, else_) => self.analyze_if(inst_block, cond, then, else_),
+316
+317            BranchInfo::Switch(scrutinee, table, default) => {
+318                self.analyze_switch(inst_block, scrutinee, table, default)
+319            }
+320
+321            BranchInfo::NotBranch => TerminatorInfo::NormalInst(inst),
+322        }
+323    }
+324
+325    fn analyze_if(
+326        &self,
+327        block: BasicBlockId,
+328        cond: ValueId,
+329        then_bb: BasicBlockId,
+330        else_bb: BasicBlockId,
+331    ) -> TerminatorInfo {
+332        let then = Box::new(self.analyze_dest(then_bb));
+333        let else_ = Box::new(self.analyze_dest(else_bb));
+334
+335        let then_cands = self.find_merge_block_candidates(block, then_bb);
+336        let else_cands = self.find_merge_block_candidates(block, else_bb);
+337        debug_assert!(then_cands.len() < 2);
+338        debug_assert!(else_cands.len() < 2);
+339
+340        let merge_block = match (then_cands.as_slice(), else_cands.as_slice()) {
+341            (&[then_cand], &[else_cand]) => {
+342                if then_cand == else_cand {
+343                    Some(then_cand)
+344                } else {
+345                    None
+346                }
+347            }
+348
+349            (&[cand], []) => {
+350                if cand == else_bb {
+351                    Some(cand)
+352                } else {
+353                    None
+354                }
+355            }
+356
+357            ([], &[cand]) => {
+358                if cand == then_bb {
+359                    Some(cand)
+360                } else {
+361                    None
+362                }
+363            }
+364
+365            ([], []) => match self.pd_tree.post_idom(block) {
+366                PostIDom::Block(block) => {
+367                    if let Some(lp) = self.scope.as_ref().and_then(Scope::loop_recursive) {
+368                        if self.loop_tree.is_block_in_loop(block, lp) {
+369                            Some(block)
+370                        } else {
+371                            None
+372                        }
+373                    } else {
+374                        Some(block)
+375                    }
+376                }
+377                _ => None,
+378            },
+379
+380            (_, _) => unreachable!(),
+381        };
+382
+383        TerminatorInfo::If {
+384            cond,
+385            then,
+386            else_,
+387            merge_block,
+388        }
+389    }
+390
+391    fn analyze_switch(
+392        &self,
+393        block: BasicBlockId,
+394        scrutinee: ValueId,
+395        table: &SwitchTable,
+396        default: Option<BasicBlockId>,
+397    ) -> TerminatorInfo {
+398        let mut analyzed_table = Vec::with_capacity(table.len());
+399
+400        let mut merge_block_cands = IndexSet::default();
+401        for (value, dest) in table.iter() {
+402            analyzed_table.push((value, self.analyze_dest(dest)));
+403            merge_block_cands.extend(self.find_merge_block_candidates(block, dest));
+404        }
+405
+406        let analyzed_default = default.map(|dest| {
+407            merge_block_cands.extend(self.find_merge_block_candidates(block, dest));
+408            Box::new(self.analyze_dest(dest))
+409        });
+410
+411        TerminatorInfo::Switch {
+412            scrutinee,
+413            table: analyzed_table,
+414            default: analyzed_default,
+415            merge_block: self.select_switch_merge_block(
+416                &merge_block_cands,
+417                table.iter().map(|(_, d)| d).chain(default),
+418            ),
+419        }
+420    }
+421
+422    fn find_merge_block_candidates(
+423        &self,
+424        branch_inst_bb: BasicBlockId,
+425        branch_dest_bb: BasicBlockId,
+426    ) -> Vec<BasicBlockId> {
+427        if self.domtree.dominates(branch_dest_bb, branch_inst_bb) {
+428            return vec![];
+429        }
+430
+431        // a block `cand` can be a candidate of a `merge` block iff
+432        // 1. `cand` is a dominance frontier of `branch_dest_bb`.
+433        // 2. `cand` is NOT a dominator of `branch_dest_bb`.
+434        // 3. `cand` is NOT a "merge" block of parent `if` or `switch`.
+435        // 4. `cand` is NOT a "loop_exit" block of parent `loop`.
+436        match self.df.frontiers(branch_dest_bb) {
+437            Some(cands) => cands
+438                .filter(|cand| {
+439                    !self.domtree.dominates(*cand, branch_dest_bb)
+440                        && Some(*cand)
+441                            != self
+442                                .scope
+443                                .as_ref()
+444                                .and_then(Scope::branch_merge_block_recursive)
+445                        && Some(*cand) != self.scope.as_ref().and_then(Scope::loop_exit_recursive)
+446                })
+447                .collect(),
+448            None => vec![],
+449        }
+450    }
+451
+452    /// Each destination block of `switch` instruction could have multiple
+453    /// candidates for the merge block because arm bodies can have multiple
+454    /// predecessors, e.g., `default` arm.
+455    /// So we need a heuristic to select the merge block from candidates.
+456    ///
+457    /// First, if one of the dominance frontiers of switch dests is a parent
+458    /// merge block, then we stop searching the merge block because the parent
+459    /// merge block should be the subsequent codes after the switch in terms of
+460    /// high-level flow structure like Fe or yul.
+461    ///
+462    /// If no parent merge block is found, we start scoring the candidates by
+463    /// the following function.
+464    ///
+465    /// The scoring function `F` is defined as follows:
+466    /// 1. The initial score of each candidate('cand_bb`) is number of
+467    /// predecessors of the candidate.
+468    ///
+469    /// 2. Find the `top_cand` of each `cand_bb`. `top_cand` can be found by
+470    /// [`Self::try_find_top_cand`] method, see the method for details.
+471    ///
+472    /// 3. If `top_cand` is found, then add the `cand_bb` score to the
+473    /// `top_cand` score, then set 0 to the `cand_bb` score.
+474    ///
+475    /// After the scoring, the candidates with the highest score will be
+476    /// selected.
+477    fn select_switch_merge_block(
+478        &self,
+479        cands: &IndexSet<BasicBlockId>,
+480        dests: impl Iterator<Item = BasicBlockId>,
+481    ) -> Option<BasicBlockId> {
+482        let parent_merge = self
+483            .scope
+484            .as_ref()
+485            .and_then(Scope::branch_merge_block_recursive);
+486        for dest in dests {
+487            if self
+488                .df
+489                .frontiers(dest)
+490                .map(|mut frontieres| frontieres.any(|frontier| Some(frontier) == parent_merge))
+491                .unwrap_or_default()
+492            {
+493                return None;
+494            }
+495        }
+496
+497        let mut cands_with_score = cands
+498            .iter()
+499            .map(|cand| (*cand, self.cfg.preds(*cand).len()))
+500            .collect::<IndexMap<_, _>>();
+501
+502        for cand_bb in cands_with_score.keys().copied().collect::<Vec<_>>() {
+503            if let Some(top_cand) = self.try_find_top_cand(&cands_with_score, cand_bb) {
+504                let score = std::mem::take(cands_with_score.get_mut(&cand_bb).unwrap());
+505                *cands_with_score.get_mut(&top_cand).unwrap() += score;
+506            }
+507        }
+508
+509        cands_with_score
+510            .iter()
+511            .max_by_key(|(_, score)| *score)
+512            .map(|(&cand, _)| cand)
+513    }
+514
+515    /// Try to find the `top_cand` of the `cand_bb`.
+516    /// A `top_cand` can be found by the following rules:
+517    ///
+518    /// 1. Find the block which is contained in DF of `cand_bb` and in
+519    /// `cands_with_score`.
+520    ///
+521    /// 2. If a block is found in 1., and the score of the block is positive,
+522    /// then the block is `top_cand`.
+523    ///
+524    /// 2'. If a block is found in 1., and the score of the block is 0, then the
+525    /// `top_cand` of the block is `top_cand` of `cand_bb`.
+526    ///
+527    /// 2''. If a block is NOT found in 1., then there is no `top_cand` for
+528    /// `cand_bb`.
+529    fn try_find_top_cand(
+530        &self,
+531        cands_with_score: &IndexMap<BasicBlockId, usize>,
+532        cand_bb: BasicBlockId,
+533    ) -> Option<BasicBlockId> {
+534        let mut frontiers = match self.df.frontiers(cand_bb) {
+535            Some(frontiers) => frontiers,
+536            _ => return None,
+537        };
+538
+539        while let Some(frontier_bb) = frontiers.next() {
+540            if cands_with_score.contains_key(&frontier_bb) {
+541                debug_assert!(frontiers.all(|bb| !cands_with_score.contains_key(&bb)));
+542                if cands_with_score[&frontier_bb] != 0 {
+543                    return Some(frontier_bb);
+544                } else {
+545                    return self.try_find_top_cand(cands_with_score, frontier_bb);
+546                }
+547            }
+548        }
+549
+550        None
+551    }
+552
+553    fn analyze_jump(&self, dest: BasicBlockId) -> TerminatorInfo {
+554        self.analyze_dest(dest)
+555    }
+556
+557    fn analyze_dest(&self, dest: BasicBlockId) -> TerminatorInfo {
+558        match &self.scope {
+559            Some(scope) => {
+560                if Some(dest) == scope.loop_header_recursive() {
+561                    TerminatorInfo::Continue
+562                } else if Some(dest) == scope.loop_exit_recursive() {
+563                    TerminatorInfo::Break
+564                } else if Some(dest) == scope.branch_merge_block_recursive() {
+565                    TerminatorInfo::ToMergeBlock
+566                } else {
+567                    TerminatorInfo::FallThrough(dest)
+568                }
+569            }
+570
+571            None => TerminatorInfo::FallThrough(dest),
+572        }
+573    }
+574}
+575
+576struct Scope {
+577    kind: ScopeKind,
+578    parent: Option<Box<Scope>>,
+579}
+580
+581#[derive(Debug, Clone, Copy)]
+582enum ScopeKind {
+583    Loop {
+584        lp: LoopId,
+585        header: BasicBlockId,
+586        exit: Option<BasicBlockId>,
+587    },
+588    Branch {
+589        merge_block: Option<BasicBlockId>,
+590    },
+591}
+592
+593impl Scope {
+594    fn loop_recursive(&self) -> Option<LoopId> {
+595        match self.kind {
+596            ScopeKind::Loop { lp, .. } => Some(lp),
+597            _ => self.parent.as_ref()?.loop_recursive(),
+598        }
+599    }
+600
+601    fn loop_header(&self) -> Option<BasicBlockId> {
+602        match self.kind {
+603            ScopeKind::Loop { header, .. } => Some(header),
+604            _ => None,
+605        }
+606    }
+607
+608    fn loop_header_recursive(&self) -> Option<BasicBlockId> {
+609        match self.kind {
+610            ScopeKind::Loop { header, .. } => Some(header),
+611            _ => self.parent.as_ref()?.loop_header_recursive(),
+612        }
+613    }
+614
+615    fn loop_exit_recursive(&self) -> Option<BasicBlockId> {
+616        match self.kind {
+617            ScopeKind::Loop { exit, .. } => exit,
+618            _ => self.parent.as_ref()?.loop_exit_recursive(),
+619        }
+620    }
+621
+622    fn branch_merge_block(&self) -> Option<BasicBlockId> {
+623        match self.kind {
+624            ScopeKind::Branch { merge_block } => merge_block,
+625            _ => None,
+626        }
+627    }
+628
+629    fn branch_merge_block_recursive(&self) -> Option<BasicBlockId> {
+630        match self.kind {
+631            ScopeKind::Branch {
+632                merge_block: Some(merge_block),
+633            } => Some(merge_block),
+634            _ => self.parent.as_ref()?.branch_merge_block_recursive(),
+635        }
+636    }
+637}
+638
+639#[derive(Debug, Clone)]
+640enum TerminatorInfo {
+641    If {
+642        cond: ValueId,
+643        then: Box<TerminatorInfo>,
+644        else_: Box<TerminatorInfo>,
+645        merge_block: Option<BasicBlockId>,
+646    },
+647
+648    Switch {
+649        scrutinee: ValueId,
+650        table: Vec<(ValueId, TerminatorInfo)>,
+651        default: Option<Box<TerminatorInfo>>,
+652        merge_block: Option<BasicBlockId>,
+653    },
+654
+655    ToMergeBlock,
+656    Continue,
+657    Break,
+658    FallThrough(BasicBlockId),
+659    NormalInst(InstId),
+660}
+661
+662#[cfg(test)]
+663mod tests {
+664    use fe_mir::ir::{body_builder::BodyBuilder, inst::InstKind, FunctionId, SourceInfo, TypeId};
+665
+666    use super::*;
+667
+668    fn body_builder() -> BodyBuilder {
+669        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+670    }
+671
+672    fn serialize_func_body(func: &mut FunctionBody) -> impl Iterator<Item = StructuralInst> {
+673        InstSerializer::new(func).serialize().into_iter()
+674    }
+675
+676    fn expect_if(
+677        insts: &mut impl Iterator<Item = StructuralInst>,
+678    ) -> (
+679        impl Iterator<Item = StructuralInst>,
+680        impl Iterator<Item = StructuralInst>,
+681    ) {
+682        match insts.next().unwrap() {
+683            StructuralInst::If { then, else_, .. } => (then.into_iter(), else_.into_iter()),
+684            _ => panic!("expect if inst"),
+685        }
+686    }
+687
+688    fn expect_switch(
+689        insts: &mut impl Iterator<Item = StructuralInst>,
+690    ) -> Vec<impl Iterator<Item = StructuralInst>> {
+691        match insts.next().unwrap() {
+692            StructuralInst::Switch { table, default, .. } => {
+693                let mut arms: Vec<_> = table
+694                    .into_iter()
+695                    .map(|(_, insts)| insts.into_iter())
+696                    .collect();
+697                if let Some(default) = default {
+698                    arms.push(default.into_iter());
+699                }
+700
+701                arms
+702            }
+703
+704            _ => panic!("expect if inst"),
+705        }
+706    }
+707
+708    fn expect_for(
+709        insts: &mut impl Iterator<Item = StructuralInst>,
+710    ) -> impl Iterator<Item = StructuralInst> {
+711        match insts.next().unwrap() {
+712            StructuralInst::For { body } => body.into_iter(),
+713            _ => panic!("expect if inst"),
+714        }
+715    }
+716
+717    fn expect_break(insts: &mut impl Iterator<Item = StructuralInst>) {
+718        assert!(matches!(insts.next().unwrap(), StructuralInst::Break))
+719    }
+720
+721    fn expect_continue(insts: &mut impl Iterator<Item = StructuralInst>) {
+722        assert!(matches!(insts.next().unwrap(), StructuralInst::Continue))
+723    }
+724
+725    fn expect_return(func: &FunctionBody, insts: &mut impl Iterator<Item = StructuralInst>) {
+726        let inst = insts.next().unwrap();
+727        match inst {
+728            StructuralInst::Inst(inst) => {
+729                assert!(matches!(
+730                    func.store.inst_data(inst).kind,
+731                    InstKind::Return { .. }
+732                ))
+733            }
+734            _ => panic!("expect return"),
+735        }
+736    }
+737
+738    fn expect_end(insts: &mut impl Iterator<Item = StructuralInst>) {
+739        assert!(insts.next().is_none())
+740    }
+741
+742    #[test]
+743    fn if_non_merge() {
+744        // +------+     +-------+
+745        // | then | <-- |  bb0  |
+746        // +------+     +-------+
+747        //                |
+748        //                |
+749        //                v
+750        //              +-------+
+751        //              | else_ |
+752        //              +-------+
+753        let mut builder = body_builder();
+754
+755        let then = builder.make_block();
+756        let else_ = builder.make_block();
+757
+758        let dummy_ty = TypeId(0);
+759        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+760        let unit = builder.make_unit(dummy_ty);
+761
+762        builder.branch(v0, then, else_, SourceInfo::dummy());
+763
+764        builder.move_to_block(then);
+765        builder.ret(unit, SourceInfo::dummy());
+766
+767        builder.move_to_block(else_);
+768        builder.ret(unit, SourceInfo::dummy());
+769
+770        let mut func = builder.build();
+771        let mut order = serialize_func_body(&mut func);
+772
+773        let (mut then, mut else_) = expect_if(&mut order);
+774        expect_return(&func, &mut then);
+775        expect_end(&mut then);
+776        expect_return(&func, &mut else_);
+777        expect_end(&mut else_);
+778
+779        expect_end(&mut order);
+780    }
+781
+782    #[test]
+783    fn if_merge() {
+784        // +------+     +-------+
+785        // | then | <-- |  bb0  |
+786        // +------+     +-------+
+787        //   |            |
+788        //   |            |
+789        //   |            v
+790        //   |          +-------+
+791        //   |          | else_ |
+792        //   |          +-------+
+793        //   |            |
+794        //   |            |
+795        //   |            v
+796        //   |          +-------+
+797        //   +--------> | merge |
+798        //              +-------+
+799        let mut builder = body_builder();
+800
+801        let then = builder.make_block();
+802        let else_ = builder.make_block();
+803        let merge = builder.make_block();
+804
+805        let dummy_ty = TypeId(0);
+806        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+807        let unit = builder.make_unit(dummy_ty);
+808
+809        builder.branch(v0, then, else_, SourceInfo::dummy());
+810
+811        builder.move_to_block(then);
+812        builder.jump(merge, SourceInfo::dummy());
+813
+814        builder.move_to_block(else_);
+815        builder.jump(merge, SourceInfo::dummy());
+816
+817        builder.move_to_block(merge);
+818        builder.ret(unit, SourceInfo::dummy());
+819
+820        let mut func = builder.build();
+821        let mut order = serialize_func_body(&mut func);
+822
+823        let (mut then, mut else_) = expect_if(&mut order);
+824        expect_end(&mut then);
+825        expect_end(&mut else_);
+826
+827        expect_return(&func, &mut order);
+828        expect_end(&mut order);
+829    }
+830
+831    #[test]
+832    fn nested_if() {
+833        //             +-----+
+834        //             | bb0 | -+
+835        //             +-----+  |
+836        //               |      |
+837        //               |      |
+838        //               v      |
+839        // +-----+     +-----+  |
+840        // | bb3 | <-- | bb1 |  |
+841        // +-----+     +-----+  |
+842        //               |      |
+843        //               |      |
+844        //               v      |
+845        //             +-----+  |
+846        //             | bb4 |  |
+847        //             +-----+  |
+848        //               |      |
+849        //               |      |
+850        //               v      |
+851        //             +-----+  |
+852        //             | bb2 | <+
+853        //             +-----+
+854        let mut builder = body_builder();
+855
+856        let bb1 = builder.make_block();
+857        let bb2 = builder.make_block();
+858        let bb3 = builder.make_block();
+859        let bb4 = builder.make_block();
+860
+861        let dummy_ty = TypeId(0);
+862        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+863        let unit = builder.make_unit(dummy_ty);
+864
+865        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+866
+867        builder.move_to_block(bb1);
+868        builder.branch(v0, bb3, bb4, SourceInfo::dummy());
+869
+870        builder.move_to_block(bb3);
+871        builder.ret(unit, SourceInfo::dummy());
+872
+873        builder.move_to_block(bb4);
+874        builder.jump(bb2, SourceInfo::dummy());
+875
+876        builder.move_to_block(bb2);
+877        builder.ret(unit, SourceInfo::dummy());
+878
+879        let mut func = builder.build();
+880        let mut order = serialize_func_body(&mut func);
+881
+882        let (mut then1, mut else2) = expect_if(&mut order);
+883        expect_end(&mut else2);
+884
+885        let (mut then3, mut else4) = expect_if(&mut then1);
+886        expect_end(&mut then1);
+887        expect_return(&func, &mut then3);
+888        expect_end(&mut then3);
+889        expect_end(&mut else4);
+890
+891        expect_return(&func, &mut order);
+892        expect_end(&mut order);
+893    }
+894
+895    #[test]
+896    fn simple_loop() {
+897        //    +--------+
+898        //    |  bb0   | -+
+899        //    +--------+  |
+900        //      |         |
+901        //      |         |
+902        //      v         |
+903        //    +--------+  |
+904        // +> | header |  |
+905        // |  +--------+  |
+906        // |    |         |
+907        // |    |         |
+908        // |    v         |
+909        // |  +--------+  |
+910        // +- | latch  |  |
+911        //    +--------+  |
+912        //      |         |
+913        //      |         |
+914        //      v         |
+915        //    +--------+  |
+916        //    |  exit  | <+
+917        //    +--------+
+918        let mut builder = body_builder();
+919
+920        let header = builder.make_block();
+921        let latch = builder.make_block();
+922        let exit = builder.make_block();
+923
+924        let dummy_ty = TypeId(0);
+925        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+926        let unit = builder.make_unit(dummy_ty);
+927
+928        builder.branch(v0, header, exit, SourceInfo::dummy());
+929
+930        builder.move_to_block(header);
+931        builder.jump(latch, SourceInfo::dummy());
+932
+933        builder.move_to_block(latch);
+934        builder.branch(v0, header, exit, SourceInfo::dummy());
+935
+936        builder.move_to_block(exit);
+937        builder.ret(unit, SourceInfo::dummy());
+938
+939        let mut func = builder.build();
+940        let mut order = serialize_func_body(&mut func);
+941
+942        let (mut lp, mut empty) = expect_if(&mut order);
+943
+944        let mut body = expect_for(&mut lp);
+945        let (mut continue_, mut break_) = expect_if(&mut body);
+946        expect_end(&mut body);
+947
+948        expect_continue(&mut continue_);
+949        expect_end(&mut continue_);
+950
+951        expect_break(&mut break_);
+952        expect_end(&mut break_);
+953
+954        expect_end(&mut empty);
+955
+956        expect_return(&func, &mut order);
+957        expect_end(&mut order);
+958    }
+959
+960    #[test]
+961    fn loop_with_continue() {
+962        //    +-----+
+963        // +- | bb0 |
+964        // |  +-----+
+965        // |    |
+966        // |    |
+967        // |    v
+968        // |  +---------------+     +-----+
+969        // |  |      bb1      | --> | bb3 |
+970        // |  +---------------+     +-----+
+971        // |    |      ^    ^         |
+972        // |    |      |    +---------+
+973        // |    v      |
+974        // |  +-----+  |
+975        // |  | bb4 | -+
+976        // |  +-----+
+977        // |    |
+978        // |    |
+979        // |    v
+980        // |  +-----+
+981        // +> | bb2 |
+982        //    +-----+
+983        let mut builder = body_builder();
+984
+985        let bb1 = builder.make_block();
+986        let bb2 = builder.make_block();
+987        let bb3 = builder.make_block();
+988        let bb4 = builder.make_block();
+989
+990        let dummy_ty = TypeId(0);
+991        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+992        let unit = builder.make_unit(dummy_ty);
+993
+994        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+995
+996        builder.move_to_block(bb1);
+997        builder.branch(v0, bb3, bb4, SourceInfo::dummy());
+998
+999        builder.move_to_block(bb3);
+1000        builder.jump(bb1, SourceInfo::dummy());
+1001
+1002        builder.move_to_block(bb4);
+1003        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+1004
+1005        builder.move_to_block(bb2);
+1006        builder.ret(unit, SourceInfo::dummy());
+1007
+1008        let mut func = builder.build();
+1009        let mut order = serialize_func_body(&mut func);
+1010
+1011        let (mut lp, mut empty) = expect_if(&mut order);
+1012        expect_end(&mut empty);
+1013
+1014        let mut body = expect_for(&mut lp);
+1015
+1016        let (mut continue_, mut empty) = expect_if(&mut body);
+1017        expect_continue(&mut continue_);
+1018        expect_end(&mut continue_);
+1019        expect_end(&mut empty);
+1020
+1021        let (mut continue_, mut break_) = expect_if(&mut body);
+1022        expect_continue(&mut continue_);
+1023        expect_end(&mut continue_);
+1024        expect_break(&mut break_);
+1025        expect_end(&mut break_);
+1026
+1027        expect_end(&mut body);
+1028        expect_end(&mut lp);
+1029
+1030        expect_return(&func, &mut order);
+1031        expect_end(&mut order);
+1032    }
+1033
+1034    #[test]
+1035    fn loop_with_break() {
+1036        //    +-----+
+1037        // +- | bb0 |
+1038        // |  +-----+
+1039        // |    |
+1040        // |    |           +---------+
+1041        // |    v           v         |
+1042        // |  +---------------+     +-----+
+1043        // |  |      bb1      | --> | bb4 |
+1044        // |  +---------------+     +-----+
+1045        // |    |                     |
+1046        // |    |                     |
+1047        // |    v                     |
+1048        // |  +-----+                 |
+1049        // |  | bb3 |                 |
+1050        // |  +-----+                 |
+1051        // |    |                     |
+1052        // |    |                     |
+1053        // |    v                     |
+1054        // |  +-----+                 |
+1055        // +> | bb2 | <---------------+
+1056        //    +-----+
+1057        let mut builder = body_builder();
+1058
+1059        let bb1 = builder.make_block();
+1060        let bb2 = builder.make_block();
+1061        let bb3 = builder.make_block();
+1062        let bb4 = builder.make_block();
+1063
+1064        let dummy_ty = TypeId(0);
+1065        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+1066        let unit = builder.make_unit(dummy_ty);
+1067
+1068        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+1069
+1070        builder.move_to_block(bb1);
+1071        builder.branch(v0, bb3, bb4, SourceInfo::dummy());
+1072
+1073        builder.move_to_block(bb3);
+1074        builder.jump(bb2, SourceInfo::dummy());
+1075
+1076        builder.move_to_block(bb4);
+1077        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+1078
+1079        builder.move_to_block(bb2);
+1080        builder.ret(unit, SourceInfo::dummy());
+1081
+1082        let mut func = builder.build();
+1083        let mut order = serialize_func_body(&mut func);
+1084
+1085        let (mut lp, mut empty) = expect_if(&mut order);
+1086        expect_end(&mut empty);
+1087
+1088        let mut body = expect_for(&mut lp);
+1089
+1090        let (mut break_, mut latch) = expect_if(&mut body);
+1091        expect_break(&mut break_);
+1092        expect_end(&mut break_);
+1093
+1094        let (mut continue_, mut break_) = expect_if(&mut latch);
+1095        expect_end(&mut latch);
+1096        expect_continue(&mut continue_);
+1097        expect_end(&mut continue_);
+1098        expect_break(&mut break_);
+1099        expect_end(&mut break_);
+1100
+1101        expect_end(&mut body);
+1102        expect_end(&mut lp);
+1103
+1104        expect_return(&func, &mut order);
+1105        expect_end(&mut order);
+1106    }
+1107
+1108    #[test]
+1109    fn loop_no_guard() {
+1110        // +-----+
+1111        // | bb0 |
+1112        // +-----+
+1113        //   |
+1114        //   |
+1115        //   v
+1116        // +-----+
+1117        // | bb1 | <+
+1118        // +-----+  |
+1119        //   |      |
+1120        //   |      |
+1121        //   v      |
+1122        // +-----+  |
+1123        // | bb2 | -+
+1124        // +-----+
+1125        //   |
+1126        //   |
+1127        //   v
+1128        // +-----+
+1129        // | bb3 |
+1130        // +-----+
+1131        let mut builder = body_builder();
+1132
+1133        let bb1 = builder.make_block();
+1134        let bb2 = builder.make_block();
+1135        let bb3 = builder.make_block();
+1136
+1137        let dummy_ty = TypeId(0);
+1138        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+1139        let unit = builder.make_unit(dummy_ty);
+1140
+1141        builder.jump(bb1, SourceInfo::dummy());
+1142
+1143        builder.move_to_block(bb1);
+1144        builder.jump(bb2, SourceInfo::dummy());
+1145
+1146        builder.move_to_block(bb2);
+1147        builder.branch(v0, bb1, bb3, SourceInfo::dummy());
+1148
+1149        builder.move_to_block(bb3);
+1150        builder.ret(unit, SourceInfo::dummy());
+1151
+1152        let mut func = builder.build();
+1153        let mut order = serialize_func_body(&mut func);
+1154
+1155        let mut body = expect_for(&mut order);
+1156        let (mut continue_, mut break_) = expect_if(&mut body);
+1157        expect_end(&mut body);
+1158
+1159        expect_continue(&mut continue_);
+1160        expect_end(&mut continue_);
+1161
+1162        expect_break(&mut break_);
+1163        expect_end(&mut break_);
+1164
+1165        expect_return(&func, &mut order);
+1166        expect_end(&mut order);
+1167    }
+1168
+1169    #[test]
+1170    fn infinite_loop() {
+1171        // +-----+
+1172        // | bb0 |
+1173        // +-----+
+1174        //   |
+1175        //   |
+1176        //   v
+1177        // +-----+
+1178        // | bb1 | <+
+1179        // +-----+  |
+1180        //   |      |
+1181        //   |      |
+1182        //   v      |
+1183        // +-----+  |
+1184        // | bb2 | -+
+1185        // +-----+
+1186        let mut builder = body_builder();
+1187
+1188        let bb1 = builder.make_block();
+1189        let bb2 = builder.make_block();
+1190
+1191        builder.jump(bb1, SourceInfo::dummy());
+1192
+1193        builder.move_to_block(bb1);
+1194        builder.jump(bb2, SourceInfo::dummy());
+1195
+1196        builder.move_to_block(bb2);
+1197        builder.jump(bb1, SourceInfo::dummy());
+1198
+1199        let mut func = builder.build();
+1200        let mut order = serialize_func_body(&mut func);
+1201
+1202        let mut body = expect_for(&mut order);
+1203        expect_continue(&mut body);
+1204        expect_end(&mut body);
+1205
+1206        expect_end(&mut order);
+1207    }
+1208
+1209    #[test]
+1210    fn switch_basic() {
+1211        // +-----+     +-------+     +-----+
+1212        // | bb2 | <-- |  bb0  | --> | bb3 |
+1213        // +-----+     +-------+     +-----+
+1214        //   |           |             |
+1215        //   |           |             |
+1216        //   |           v             |
+1217        //   |         +-------+       |
+1218        //   |         |  bb1  |       |
+1219        //   |         +-------+       |
+1220        //   |           |             |
+1221        //   |           |             |
+1222        //   |           v             |
+1223        //   |         +-------+       |
+1224        //   +-------> | merge | <-----+
+1225        //             +-------+
+1226        let mut builder = body_builder();
+1227        let dummy_ty = TypeId(0);
+1228        let dummy_value = builder.make_unit(dummy_ty);
+1229
+1230        let bb1 = builder.make_block();
+1231        let bb2 = builder.make_block();
+1232        let bb3 = builder.make_block();
+1233        let merge = builder.make_block();
+1234
+1235        let mut table = SwitchTable::default();
+1236        table.add_arm(dummy_value, bb1);
+1237        table.add_arm(dummy_value, bb2);
+1238        table.add_arm(dummy_value, bb3);
+1239        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1240
+1241        builder.move_to_block(bb1);
+1242        builder.jump(merge, SourceInfo::dummy());
+1243
+1244        builder.move_to_block(bb2);
+1245        builder.jump(merge, SourceInfo::dummy());
+1246        builder.move_to_block(bb3);
+1247        builder.jump(merge, SourceInfo::dummy());
+1248
+1249        builder.move_to_block(merge);
+1250        builder.ret(dummy_value, SourceInfo::dummy());
+1251
+1252        let mut func = builder.build();
+1253        let mut order = serialize_func_body(&mut func);
+1254
+1255        let arms = expect_switch(&mut order);
+1256        assert_eq!(arms.len(), 3);
+1257        for mut arm in arms {
+1258            expect_end(&mut arm);
+1259        }
+1260
+1261        expect_return(&func, &mut order);
+1262        expect_end(&mut order);
+1263    }
+1264
+1265    #[test]
+1266    fn switch_default() {
+1267        //      +-----------+
+1268        //      |           |
+1269        //      |           |
+1270        //      |      +----+--------+
+1271        //      v      |    |        |
+1272        //    +-----+  |  +-------+  |  +---------+
+1273        //    | bb2 | -+  |  bb0  | -+> |   bb3   |
+1274        //    +-----+     +-------+  |  +---------+
+1275        //      |           |        |    |
+1276        //      |           |        |    |
+1277        //      v           v        |    v
+1278        //    +-----+     +-------+  |  +---------+
+1279        //    | bb5 |  +- |  bb1  |  +> | default | <+
+1280        //    +-----+  |  +-------+     +---------+  |
+1281        //      |      |    |             |          |
+1282        //      |      |    |             |          |
+1283        //      |      |    v             |          |
+1284        //      |      |  +-------+       |          |
+1285        //      |      |  |  bb4  |       |          |
+1286        //      |      |  +-------+       |          |
+1287        //      |      |    |             |          |
+1288        // +----+------+    |             |          |
+1289        // |    |           v             |          |
+1290        // |    |         +-------+       |          |
+1291        // |    +-------> | merge | <-----+          |
+1292        // |              +-------+                  |
+1293        // |                                         |
+1294        // +-----------------------------------------+
+1295        let mut builder = body_builder();
+1296        let dummy_ty = TypeId(0);
+1297        let dummy_value = builder.make_unit(dummy_ty);
+1298
+1299        let bb1 = builder.make_block();
+1300        let bb2 = builder.make_block();
+1301        let bb3 = builder.make_block();
+1302        let bb4 = builder.make_block();
+1303        let bb5 = builder.make_block();
+1304        let default = builder.make_block();
+1305        let merge = builder.make_block();
+1306
+1307        let mut table = SwitchTable::default();
+1308        table.add_arm(dummy_value, bb1);
+1309        table.add_arm(dummy_value, bb2);
+1310        table.add_arm(dummy_value, bb3);
+1311        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1312
+1313        builder.move_to_block(bb1);
+1314        let mut table = SwitchTable::default();
+1315        table.add_arm(dummy_value, bb4);
+1316        table.add_arm(dummy_value, default);
+1317        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1318
+1319        builder.move_to_block(bb2);
+1320        let mut table = SwitchTable::default();
+1321        table.add_arm(dummy_value, bb5);
+1322        table.add_arm(dummy_value, default);
+1323        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1324
+1325        builder.move_to_block(bb3);
+1326        builder.jump(default, SourceInfo::dummy());
+1327
+1328        builder.move_to_block(bb4);
+1329        builder.jump(merge, SourceInfo::dummy());
+1330
+1331        builder.move_to_block(bb5);
+1332        builder.jump(merge, SourceInfo::dummy());
+1333
+1334        builder.move_to_block(default);
+1335        builder.jump(merge, SourceInfo::dummy());
+1336
+1337        builder.move_to_block(merge);
+1338        builder.ret(dummy_value, SourceInfo::dummy());
+1339
+1340        let mut func = builder.build();
+1341        let mut order = serialize_func_body(&mut func);
+1342
+1343        let mut arms = expect_switch(&mut order);
+1344        assert_eq!(arms.len(), 3);
+1345
+1346        let mut bb3_jump = arms.pop().unwrap();
+1347        expect_end(&mut bb3_jump);
+1348
+1349        let mut bb2_switch = arms.pop().unwrap();
+1350        let bb2_switch_arms = expect_switch(&mut bb2_switch);
+1351        assert_eq!(bb2_switch_arms.len(), 2);
+1352        for mut bb2_switch_arm in bb2_switch_arms {
+1353            expect_end(&mut bb2_switch_arm);
+1354        }
+1355        expect_end(&mut bb2_switch);
+1356
+1357        let mut bb1_switch = arms.pop().unwrap();
+1358        let bb1_switch_arms = expect_switch(&mut bb1_switch);
+1359        assert_eq!(bb1_switch_arms.len(), 2);
+1360        for mut bb1_switch_arm in bb1_switch_arms {
+1361            expect_end(&mut bb1_switch_arm);
+1362        }
+1363        expect_end(&mut bb1_switch);
+1364
+1365        expect_return(&func, &mut order);
+1366        expect_end(&mut order);
+1367    }
+1368}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/mod.rs.html b/compiler-docs/src/fe_codegen/yul/isel/mod.rs.html new file mode 100644 index 0000000000..57b5bae43b --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/mod.rs.html @@ -0,0 +1,9 @@ +mod.rs - source

fe_codegen/yul/isel/
mod.rs

1pub mod context;
+2mod contract;
+3mod function;
+4mod inst_order;
+5mod test;
+6
+7pub use contract::{lower_contract, lower_contract_deployable};
+8pub use function::lower_function;
+9pub use test::lower_test;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/test.rs.html b/compiler-docs/src/fe_codegen/yul/isel/test.rs.html new file mode 100644 index 0000000000..9149ae7844 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/test.rs.html @@ -0,0 +1,70 @@ +test.rs - source

fe_codegen/yul/isel/
test.rs

1use super::context::Context;
+2use crate::db::CodegenDb;
+3use fe_analyzer::namespace::items::FunctionId;
+4use yultsur::{yul, *};
+5
+6pub fn lower_test(db: &dyn CodegenDb, test: FunctionId) -> yul::Object {
+7    let mut context = Context::default();
+8    let test = db.mir_lowered_func_signature(test);
+9    context.function_dependency.insert(test);
+10
+11    let dep_functions: Vec<_> = context
+12        .resolve_function_dependency(db)
+13        .into_iter()
+14        .map(yul::Statement::FunctionDefinition)
+15        .collect();
+16    let dep_constants = context.resolve_constant_dependency(db);
+17    let dep_contracts = context.resolve_contract_dependency(db);
+18    let runtime_funcs: Vec<_> = context
+19        .runtime
+20        .collect_definitions()
+21        .into_iter()
+22        .map(yul::Statement::FunctionDefinition)
+23        .collect();
+24    let test_func_name = identifier! { (db.codegen_function_symbol_name(test)) };
+25    let call = function_call_statement! {[test_func_name]()};
+26
+27    let code = code! {
+28        [dep_functions...]
+29        [runtime_funcs...]
+30        [call]
+31        (stop())
+32    };
+33
+34    let name = identifier! { test };
+35    let object = yul::Object {
+36        name,
+37        code,
+38        objects: dep_contracts,
+39        data: dep_constants,
+40    };
+41
+42    normalize_object(object)
+43}
+44
+45fn normalize_object(obj: yul::Object) -> yul::Object {
+46    let data = obj
+47        .data
+48        .into_iter()
+49        .map(|data| yul::Data {
+50            name: data.name,
+51            value: data
+52                .value
+53                .replace('\\', "\\\\\\\\")
+54                .replace('\n', "\\\\n")
+55                .replace('"', "\\\\\"")
+56                .replace('\r', "\\\\r")
+57                .replace('\t', "\\\\t"),
+58        })
+59        .collect::<Vec<_>>();
+60    yul::Object {
+61        name: obj.name,
+62        code: obj.code,
+63        objects: obj
+64            .objects
+65            .into_iter()
+66            .map(normalize_object)
+67            .collect::<Vec<_>>(),
+68        data,
+69    }
+70}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/body.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/body.rs.html new file mode 100644 index 0000000000..5e7d94a1e8 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/body.rs.html @@ -0,0 +1,219 @@ +body.rs - source

fe_codegen/yul/legalize/
body.rs

1use fe_mir::ir::{
+2    body_cursor::{BodyCursor, CursorLocation},
+3    inst::InstKind,
+4    value::AssignableValue,
+5    FunctionBody, Inst, InstId, TypeId, TypeKind, Value, ValueId,
+6};
+7
+8use crate::db::CodegenDb;
+9
+10use super::critical_edge::CriticalEdgeSplitter;
+11
+12pub fn legalize_func_body(db: &dyn CodegenDb, body: &mut FunctionBody) {
+13    CriticalEdgeSplitter::new().run(body);
+14    legalize_func_arg(db, body);
+15
+16    let mut cursor = BodyCursor::new_at_entry(body);
+17    loop {
+18        match cursor.loc() {
+19            CursorLocation::BlockTop(_) | CursorLocation::BlockBottom(_) => cursor.proceed(),
+20            CursorLocation::Inst(inst) => {
+21                legalize_inst(db, &mut cursor, inst);
+22            }
+23            CursorLocation::NoWhere => break,
+24        }
+25    }
+26}
+27
+28fn legalize_func_arg(db: &dyn CodegenDb, body: &mut FunctionBody) {
+29    for value in body.store.func_args_mut() {
+30        let ty = value.ty();
+31        if ty.is_contract(db.upcast()) {
+32            let slot_ptr = make_storage_ptr(db, ty);
+33            *value = slot_ptr;
+34        } else if (ty.is_aggregate(db.upcast()) || ty.is_string(db.upcast()))
+35            && !ty.is_zero_sized(db.upcast())
+36        {
+37            change_ty(value, ty.make_mptr(db.upcast()))
+38        }
+39    }
+40}
+41
+42fn legalize_inst(db: &dyn CodegenDb, cursor: &mut BodyCursor, inst: InstId) {
+43    if legalize_unit_construct(db, cursor, inst) {
+44        return;
+45    }
+46    legalize_declared_ty(db, cursor.body_mut(), inst);
+47    legalize_inst_arg(db, cursor.body_mut(), inst);
+48    legalize_inst_result(db, cursor.body_mut(), inst);
+49    cursor.proceed();
+50}
+51
+52fn legalize_unit_construct(db: &dyn CodegenDb, cursor: &mut BodyCursor, inst: InstId) -> bool {
+53    let should_remove = match &cursor.body().store.inst_data(inst).kind {
+54        InstKind::Declare { local } => is_value_zst(db, cursor.body(), *local),
+55        InstKind::AggregateConstruct { ty, .. } => ty.deref(db.upcast()).is_zero_sized(db.upcast()),
+56        InstKind::AggregateAccess { .. } | InstKind::MapAccess { .. } | InstKind::Cast { .. } => {
+57            let result_value = cursor.body().store.inst_result(inst).unwrap();
+58            is_lvalue_zst(db, cursor.body(), result_value)
+59        }
+60
+61        _ => false,
+62    };
+63
+64    if should_remove {
+65        cursor.remove_inst()
+66    }
+67
+68    should_remove
+69}
+70
+71fn legalize_declared_ty(db: &dyn CodegenDb, body: &mut FunctionBody, inst_id: InstId) {
+72    let value = match &body.store.inst_data(inst_id).kind {
+73        InstKind::Declare { local } => *local,
+74        _ => return,
+75    };
+76
+77    let value_ty = body.store.value_ty(value);
+78    if value_ty.is_aggregate(db.upcast()) {
+79        let new_ty = value_ty.make_mptr(db.upcast());
+80        let value_data = body.store.value_data_mut(value);
+81        change_ty(value_data, new_ty)
+82    }
+83}
+84
+85fn legalize_inst_arg(db: &dyn CodegenDb, body: &mut FunctionBody, inst_id: InstId) {
+86    // Replace inst with dummy inst to avoid borrow checker complaining.
+87    let dummy_inst = Inst::nop();
+88    let mut inst = body.store.replace_inst(inst_id, dummy_inst);
+89
+90    for arg in inst.args() {
+91        let ty = body.store.value_ty(arg);
+92        if ty.is_string(db.upcast()) {
+93            let string_ptr = ty.make_mptr(db.upcast());
+94            change_ty(body.store.value_data_mut(arg), string_ptr)
+95        }
+96    }
+97
+98    match &mut inst.kind {
+99        InstKind::AggregateConstruct { args, .. } => {
+100            args.retain(|arg| !is_value_zst(db, body, *arg));
+101        }
+102
+103        InstKind::Call { args, .. } => {
+104            args.retain(|arg| !is_value_zst(db, body, *arg) && !is_value_contract(db, body, *arg))
+105        }
+106
+107        InstKind::Return { arg } => {
+108            if arg.map(|arg| is_value_zst(db, body, arg)).unwrap_or(false) {
+109                *arg = None;
+110            }
+111        }
+112
+113        InstKind::MapAccess { key: arg, .. } | InstKind::Emit { arg } => {
+114            let arg_ty = body.store.value_ty(*arg);
+115            if arg_ty.is_zero_sized(db.upcast()) {
+116                *arg = body.store.store_value(make_zst_ptr(db, arg_ty));
+117            }
+118        }
+119
+120        InstKind::Cast { value, to, .. } => {
+121            if to.is_aggregate(db.upcast()) && !to.is_zero_sized(db.upcast()) {
+122                let value_ty = body.store.value_ty(*value);
+123                if value_ty.is_mptr(db.upcast()) {
+124                    *to = to.make_mptr(db.upcast());
+125                } else if value_ty.is_sptr(db.upcast()) {
+126                    *to = to.make_sptr(db.upcast());
+127                } else {
+128                    unreachable!()
+129                }
+130            }
+131        }
+132
+133        _ => {}
+134    }
+135
+136    body.store.replace_inst(inst_id, inst);
+137}
+138
+139fn legalize_inst_result(db: &dyn CodegenDb, body: &mut FunctionBody, inst_id: InstId) {
+140    let result_value = if let Some(result) = body.store.inst_result(inst_id) {
+141        result
+142    } else {
+143        return;
+144    };
+145
+146    if is_lvalue_zst(db, body, result_value) {
+147        body.store.remove_inst_result(inst_id);
+148        return;
+149    };
+150
+151    let value_id = if let Some(value_id) = result_value.value_id() {
+152        value_id
+153    } else {
+154        return;
+155    };
+156    let result_ty = body.store.value_ty(value_id);
+157    let new_ty = if result_ty.is_aggregate(db.upcast()) || result_ty.is_string(db.upcast()) {
+158        match &body.store.inst_data(inst_id).kind {
+159            InstKind::AggregateAccess { value, .. } => {
+160                let value_ty = body.store.value_ty(*value);
+161                match &value_ty.data(db.upcast()).kind {
+162                    TypeKind::MPtr(..) => result_ty.make_mptr(db.upcast()),
+163                    // Note: All SPtr aggregate access results should be SPtr already
+164                    _ => unreachable!(),
+165                }
+166            }
+167            _ => result_ty.make_mptr(db.upcast()),
+168        }
+169    } else {
+170        return;
+171    };
+172
+173    let value = body.store.value_data_mut(value_id);
+174    change_ty(value, new_ty);
+175}
+176
+177fn change_ty(value: &mut Value, new_ty: TypeId) {
+178    match value {
+179        Value::Local(val) => val.ty = new_ty,
+180        Value::Immediate { ty, .. }
+181        | Value::Temporary { ty, .. }
+182        | Value::Unit { ty }
+183        | Value::Constant { ty, .. } => *ty = new_ty,
+184    }
+185}
+186
+187fn make_storage_ptr(db: &dyn CodegenDb, ty: TypeId) -> Value {
+188    debug_assert!(ty.is_contract(db.upcast()));
+189    let ty = ty.make_sptr(db.upcast());
+190
+191    Value::Immediate { imm: 0.into(), ty }
+192}
+193
+194fn make_zst_ptr(db: &dyn CodegenDb, ty: TypeId) -> Value {
+195    debug_assert!(ty.is_zero_sized(db.upcast()));
+196    let ty = ty.make_mptr(db.upcast());
+197
+198    Value::Immediate { imm: 0.into(), ty }
+199}
+200
+201/// Returns `true` if a value has a zero sized type.
+202fn is_value_zst(db: &dyn CodegenDb, body: &FunctionBody, value: ValueId) -> bool {
+203    body.store
+204        .value_ty(value)
+205        .deref(db.upcast())
+206        .is_zero_sized(db.upcast())
+207}
+208
+209fn is_value_contract(db: &dyn CodegenDb, body: &FunctionBody, value: ValueId) -> bool {
+210    let ty = body.store.value_ty(value);
+211    ty.deref(db.upcast()).is_contract(db.upcast())
+212}
+213
+214fn is_lvalue_zst(db: &dyn CodegenDb, body: &FunctionBody, lvalue: &AssignableValue) -> bool {
+215    lvalue
+216        .ty(db.upcast(), &body.store)
+217        .deref(db.upcast())
+218        .is_zero_sized(db.upcast())
+219}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html new file mode 100644 index 0000000000..06f40680ec --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html @@ -0,0 +1,121 @@ +critical_edge.rs - source

fe_codegen/yul/legalize/
critical_edge.rs

1use fe_mir::{
+2    analysis::ControlFlowGraph,
+3    ir::{
+4        body_cursor::{BodyCursor, CursorLocation},
+5        inst::InstKind,
+6        BasicBlock, BasicBlockId, FunctionBody, Inst, InstId, SourceInfo,
+7    },
+8};
+9
+10#[derive(Debug)]
+11pub struct CriticalEdgeSplitter {
+12    critical_edges: Vec<CriticalEdge>,
+13}
+14
+15impl CriticalEdgeSplitter {
+16    pub fn new() -> Self {
+17        Self {
+18            critical_edges: Vec::default(),
+19        }
+20    }
+21
+22    pub fn run(&mut self, func: &mut FunctionBody) {
+23        let cfg = ControlFlowGraph::compute(func);
+24
+25        for block in cfg.post_order() {
+26            let terminator = func.order.terminator(&func.store, block).unwrap();
+27            self.add_critical_edges(terminator, func, &cfg);
+28        }
+29
+30        self.split_edges(func);
+31    }
+32
+33    fn add_critical_edges(
+34        &mut self,
+35        terminator: InstId,
+36        func: &FunctionBody,
+37        cfg: &ControlFlowGraph,
+38    ) {
+39        for to in func.store.branch_info(terminator).block_iter() {
+40            if cfg.preds(to).len() > 1 {
+41                self.critical_edges.push(CriticalEdge { terminator, to });
+42            }
+43        }
+44    }
+45
+46    fn split_edges(&mut self, func: &mut FunctionBody) {
+47        for edge in std::mem::take(&mut self.critical_edges) {
+48            let terminator = edge.terminator;
+49            let source_block = func.order.inst_block(terminator);
+50            let original_dest = edge.to;
+51
+52            // Create new block that contains only jump inst.
+53            let new_dest = func.store.store_block(BasicBlock {});
+54            let mut cursor = BodyCursor::new(func, CursorLocation::BlockTop(source_block));
+55            cursor.insert_block(new_dest);
+56            cursor.set_loc(CursorLocation::BlockTop(new_dest));
+57            cursor.store_and_insert_inst(Inst::new(
+58                InstKind::Jump {
+59                    dest: original_dest,
+60                },
+61                SourceInfo::dummy(),
+62            ));
+63
+64            // Rewrite branch destination to the new dest.
+65            func.store
+66                .rewrite_branch_dest(terminator, original_dest, new_dest);
+67        }
+68    }
+69}
+70
+71#[derive(Debug)]
+72struct CriticalEdge {
+73    terminator: InstId,
+74    to: BasicBlockId,
+75}
+76
+77#[cfg(test)]
+78mod tests {
+79    use fe_mir::ir::{body_builder::BodyBuilder, FunctionId, TypeId};
+80
+81    use super::*;
+82
+83    fn body_builder() -> BodyBuilder {
+84        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+85    }
+86
+87    #[test]
+88    fn critical_edge_remove() {
+89        let mut builder = body_builder();
+90        let lp_header = builder.make_block();
+91        let lp_body = builder.make_block();
+92        let exit = builder.make_block();
+93
+94        let dummy_ty = TypeId(0);
+95        let v0 = builder.make_imm_from_bool(false, dummy_ty);
+96        builder.branch(v0, lp_header, exit, SourceInfo::dummy());
+97
+98        builder.move_to_block(lp_header);
+99        builder.jump(lp_body, SourceInfo::dummy());
+100
+101        builder.move_to_block(lp_body);
+102        builder.branch(v0, lp_header, exit, SourceInfo::dummy());
+103
+104        builder.move_to_block(exit);
+105        builder.ret(v0, SourceInfo::dummy());
+106
+107        let mut func = builder.build();
+108        CriticalEdgeSplitter::new().run(&mut func);
+109        let cfg = ControlFlowGraph::compute(&func);
+110
+111        for &header_pred in cfg.preds(lp_header) {
+112            debug_assert_eq!(cfg.succs(header_pred).len(), 1);
+113            debug_assert_eq!(cfg.succs(header_pred)[0], lp_header);
+114        }
+115
+116        for &exit_pred in cfg.preds(exit) {
+117            debug_assert_eq!(cfg.succs(exit_pred).len(), 1);
+118            debug_assert_eq!(cfg.succs(exit_pred)[0], exit);
+119        }
+120    }
+121}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html new file mode 100644 index 0000000000..d2cd3954fa --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html @@ -0,0 +1,6 @@ +mod.rs - source

fe_codegen/yul/legalize/
mod.rs

1mod body;
+2mod critical_edge;
+3mod signature;
+4
+5pub use body::legalize_func_body;
+6pub use signature::legalize_func_signature;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html new file mode 100644 index 0000000000..f905aaeb5b --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html @@ -0,0 +1,27 @@ +signature.rs - source

fe_codegen/yul/legalize/
signature.rs

1use fe_mir::ir::{FunctionSignature, TypeKind};
+2
+3use crate::db::CodegenDb;
+4
+5pub fn legalize_func_signature(db: &dyn CodegenDb, sig: &mut FunctionSignature) {
+6    // Remove param if the type is contract or zero-sized.
+7    let params = &mut sig.params;
+8    params.retain(|param| match param.ty.data(db.upcast()).kind {
+9        TypeKind::Contract(_) => false,
+10        _ => !param.ty.deref(db.upcast()).is_zero_sized(db.upcast()),
+11    });
+12
+13    // Legalize param types.
+14    for param in params.iter_mut() {
+15        param.ty = db.codegen_legalized_type(param.ty);
+16    }
+17
+18    if let Some(ret_ty) = sig.return_type {
+19        // Remove return type  if the type is contract or zero-sized.
+20        if ret_ty.is_contract(db.upcast()) || ret_ty.deref(db.upcast()).is_zero_sized(db.upcast()) {
+21            sig.return_type = None;
+22        } else {
+23            // Legalize param types.
+24            sig.return_type = Some(db.codegen_legalized_type(ret_ty));
+25        }
+26    }
+27}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/mod.rs.html b/compiler-docs/src/fe_codegen/yul/mod.rs.html new file mode 100644 index 0000000000..b2de24120a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/mod.rs.html @@ -0,0 +1,26 @@ +mod.rs - source

fe_codegen/yul/
mod.rs

1use std::borrow::Cow;
+2
+3pub mod isel;
+4pub mod legalize;
+5pub mod runtime;
+6
+7mod slot_size;
+8
+9use yultsur::*;
+10
+11/// A helper struct to abstract ident and expr.
+12struct YulVariable<'a>(Cow<'a, str>);
+13
+14impl<'a> YulVariable<'a> {
+15    fn expr(&self) -> yul::Expression {
+16        identifier_expression! {(format!{"${}", self.0})}
+17    }
+18
+19    fn ident(&self) -> yul::Identifier {
+20        identifier! {(format!{"${}", self.0})}
+21    }
+22
+23    fn new(name: impl Into<Cow<'a, str>>) -> Self {
+24        Self(name.into())
+25    }
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html new file mode 100644 index 0000000000..8955094478 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html @@ -0,0 +1,950 @@ +abi.rs - source

fe_codegen/yul/runtime/
abi.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{
+4        runtime::{error_revert_numeric, make_ptr},
+5        slot_size::{yul_primitive_type, SLOT_SIZE},
+6        YulVariable,
+7    },
+8};
+9
+10use super::{AbiSrcLocation, DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+11
+12use fe_abi::types::AbiType;
+13use fe_mir::ir::{self, types::ArrayDef, TypeId, TypeKind};
+14use yultsur::*;
+15
+16pub(super) fn make_abi_encode_primitive_type(
+17    provider: &mut DefaultRuntimeProvider,
+18    db: &dyn CodegenDb,
+19    func_name: &str,
+20    legalized_ty: TypeId,
+21    is_dst_storage: bool,
+22) -> RuntimeFunction {
+23    let func_name = YulVariable::new(func_name);
+24    let src = YulVariable::new("src");
+25    let dst = YulVariable::new("dst");
+26    let enc_size = YulVariable::new("enc_size");
+27    let func_def = function_definition! {
+28        function [func_name.ident()]([src.ident()], [dst.ident()]) ->  [enc_size.ident()] {
+29            ([src.ident()] := [provider.primitive_cast(db, src.expr(), legalized_ty)])
+30            ([yul::Statement::Expression(provider.ptr_store(
+31                db,
+32                dst.expr(),
+33                src.expr(),
+34                make_ptr(db, yul_primitive_type(db), is_dst_storage),
+35            ))])
+36            ([enc_size.ident()] := 32)
+37        }
+38    };
+39
+40    RuntimeFunction::from_statement(func_def)
+41}
+42
+43pub(super) fn make_abi_encode_static_array_type(
+44    provider: &mut DefaultRuntimeProvider,
+45    db: &dyn CodegenDb,
+46    func_name: &str,
+47    legalized_ty: TypeId,
+48) -> RuntimeFunction {
+49    let is_dst_storage = legalized_ty.is_sptr(db.upcast());
+50    let deref_ty = legalized_ty.deref(db.upcast());
+51    let (elem_ty, len) = match &deref_ty.data(db.upcast()).kind {
+52        ir::TypeKind::Array(def) => (def.elem_ty, def.len),
+53        _ => unreachable!(),
+54    };
+55    let elem_abi_ty = db.codegen_abi_type(elem_ty);
+56    let elem_ptr_ty = make_ptr(db, elem_ty, false);
+57    let elem_ty_size = deref_ty.array_elem_size(db.upcast(), SLOT_SIZE);
+58
+59    let func_name = YulVariable::new(func_name);
+60    let src = YulVariable::new("src");
+61    let dst = YulVariable::new("dst");
+62    let enc_size = YulVariable::new("enc_size");
+63    let header_size = elem_abi_ty.header_size();
+64    let iter_count = literal_expression! {(len)};
+65
+66    let func = function_definition! {
+67         function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+68             (for {(let i := 0)} (lt(i, [iter_count])) {(i := (add(i, 1)))}
+69             {
+70
+71                 (pop([provider.abi_encode(db, src.expr(), dst.expr(), elem_ptr_ty, is_dst_storage)]))
+72                 ([src.ident()] := add([src.expr()], [literal_expression!{(elem_ty_size)}]))
+73                 ([dst.ident()] := add([dst.expr()], [literal_expression!{(header_size)}]))
+74             })
+75             ([enc_size.ident()] := [literal_expression! {(header_size * len)}])
+76         }
+77    };
+78
+79    RuntimeFunction::from_statement(func)
+80}
+81
+82pub(super) fn make_abi_encode_dynamic_array_type(
+83    provider: &mut DefaultRuntimeProvider,
+84    db: &dyn CodegenDb,
+85    func_name: &str,
+86    legalized_ty: TypeId,
+87) -> RuntimeFunction {
+88    let is_dst_storage = legalized_ty.is_sptr(db.upcast());
+89    let deref_ty = legalized_ty.deref(db.upcast());
+90    let (elem_ty, len) = match &deref_ty.data(db.upcast()).kind {
+91        ir::TypeKind::Array(def) => (def.elem_ty, def.len),
+92        _ => unreachable!(),
+93    };
+94    let elem_header_size = 32;
+95    let total_header_size = elem_header_size * len;
+96    let elem_ptr_ty = make_ptr(db, elem_ty, false);
+97    let elem_ty_size = deref_ty.array_elem_size(db.upcast(), SLOT_SIZE);
+98    let header_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+99
+100    let func_name = YulVariable::new(func_name);
+101    let src = YulVariable::new("src");
+102    let dst = YulVariable::new("dst");
+103    let header_ptr = YulVariable::new("header_ptr");
+104    let data_ptr = YulVariable::new("data_ptr");
+105    let enc_size = YulVariable::new("enc_size");
+106    let iter_count = literal_expression! {(len)};
+107
+108    let func = function_definition! {
+109         function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+110             (let [header_ptr.ident()] := [dst.expr()])
+111             (let [data_ptr.ident()] := add([dst.expr()], [literal_expression!{(total_header_size)}]))
+112             ([enc_size.ident()] := [literal_expression!{(total_header_size)}])
+113             (for {(let i := 0)} (lt(i, [iter_count])) {(i := (add(i, 1)))}
+114             {
+115
+116                ([yul::Statement::Expression(provider.ptr_store(db, header_ptr.expr(), enc_size.expr(), header_ty))])
+117                ([enc_size.ident()] := add([provider.abi_encode(db, src.expr(), data_ptr.expr(), elem_ptr_ty, is_dst_storage)], [enc_size.expr()]))
+118                ([header_ptr.ident()] := add([header_ptr.expr()], [literal_expression!{(elem_header_size)}]))
+119                ([data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+120                ([src.ident()] := add([src.expr()], [literal_expression!{(elem_ty_size)}]))
+121             })
+122         }
+123    };
+124
+125    RuntimeFunction::from_statement(func)
+126}
+127
+128pub(super) fn make_abi_encode_static_aggregate_type(
+129    provider: &mut DefaultRuntimeProvider,
+130    db: &dyn CodegenDb,
+131    func_name: &str,
+132    legalized_ty: TypeId,
+133    is_dst_storage: bool,
+134) -> RuntimeFunction {
+135    let func_name = YulVariable::new(func_name);
+136    let deref_ty = legalized_ty.deref(db.upcast());
+137    let src = YulVariable::new("src");
+138    let dst = YulVariable::new("dst");
+139    let enc_size = YulVariable::new("enc_size");
+140    let field_enc_size = YulVariable::new("field_enc_size");
+141    let mut body = vec![
+142        statement! {[enc_size.ident()] := 0 },
+143        statement! {let [field_enc_size.ident()] := 0 },
+144    ];
+145    let field_num = deref_ty.aggregate_field_num(db.upcast());
+146
+147    for idx in 0..field_num {
+148        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+149        let field_ty_ptr = make_ptr(db, field_ty, false);
+150        let field_offset = deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE);
+151        let src_offset = expression! { add([src.expr()], [literal_expression!{(field_offset)}]) };
+152        body.push(statement!{
+153            [field_enc_size.ident()] := [provider.abi_encode(db, src_offset, dst.expr(), field_ty_ptr, is_dst_storage)]
+154        });
+155        body.push(statement! {
+156            [enc_size.ident()] := add([enc_size.expr()], [field_enc_size.expr()])
+157        });
+158
+159        if idx < field_num - 1 {
+160            body.push(assignment! {[dst.ident()] :=  add([dst.expr()], [field_enc_size.expr()])});
+161        }
+162    }
+163
+164    let func_def = yul::FunctionDefinition {
+165        name: func_name.ident(),
+166        parameters: vec![src.ident(), dst.ident()],
+167        returns: vec![enc_size.ident()],
+168        block: yul::Block { statements: body },
+169    };
+170
+171    RuntimeFunction(func_def)
+172}
+173
+174pub(super) fn make_abi_encode_dynamic_aggregate_type(
+175    provider: &mut DefaultRuntimeProvider,
+176    db: &dyn CodegenDb,
+177    func_name: &str,
+178    legalized_ty: TypeId,
+179    is_dst_storage: bool,
+180) -> RuntimeFunction {
+181    let func_name = YulVariable::new(func_name);
+182    let is_src_storage = legalized_ty.is_sptr(db.upcast());
+183    let deref_ty = legalized_ty.deref(db.upcast());
+184    let field_num = deref_ty.aggregate_field_num(db.upcast());
+185
+186    let src = YulVariable::new("src");
+187    let dst = YulVariable::new("dst");
+188    let header_ptr = YulVariable::new("header_ptr");
+189    let enc_size = YulVariable::new("enc_size");
+190    let data_ptr = YulVariable::new("data_ptr");
+191
+192    let total_header_size = literal_expression! { ((0..field_num).fold(0, |acc, idx| {
+193        let ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+194        acc + db.codegen_abi_type(ty).header_size()
+195    })) };
+196    let mut body = statements! {
+197        (let [header_ptr.ident()] := [dst.expr()])
+198        ([enc_size.ident()] := [total_header_size])
+199        (let [data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+200    };
+201
+202    for idx in 0..field_num {
+203        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+204        let field_abi_ty = db.codegen_abi_type(field_ty);
+205        let field_offset =
+206            literal_expression! { (deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE)) };
+207        let field_ptr = expression! { add([src.expr()], [field_offset]) };
+208        let field_ptr_ty = make_ptr(db, field_ty, is_src_storage);
+209
+210        let stmts = if field_abi_ty.is_static() {
+211            statements! {
+212                (pop([provider.abi_encode(db, field_ptr, header_ptr.expr(), field_ptr_ty, is_dst_storage)]))
+213                ([header_ptr.ident()] := add([header_ptr.expr()], [literal_expression! {(field_abi_ty.header_size())}]))
+214            }
+215        } else {
+216            let header_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+217            statements! {
+218               ([yul::Statement::Expression(provider.ptr_store(db, header_ptr.expr(), enc_size.expr(), header_ty))])
+219               ([enc_size.ident()] := add([provider.abi_encode(db, field_ptr, data_ptr.expr(), field_ptr_ty, is_dst_storage)], [enc_size.expr()]))
+220               ([header_ptr.ident()] := add([header_ptr.expr()], 32))
+221               ([data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+222            }
+223        };
+224        body.extend_from_slice(&stmts);
+225    }
+226
+227    let func_def = yul::FunctionDefinition {
+228        name: func_name.ident(),
+229        parameters: vec![src.ident(), dst.ident()],
+230        returns: vec![enc_size.ident()],
+231        block: yul::Block { statements: body },
+232    };
+233
+234    RuntimeFunction(func_def)
+235}
+236
+237pub(super) fn make_abi_encode_string_type(
+238    provider: &mut DefaultRuntimeProvider,
+239    db: &dyn CodegenDb,
+240    func_name: &str,
+241    is_dst_storage: bool,
+242) -> RuntimeFunction {
+243    let func_name = YulVariable::new(func_name);
+244    let src = YulVariable::new("src");
+245    let dst = YulVariable::new("dst");
+246    let string_len = YulVariable::new("string_len");
+247    let enc_size = YulVariable::new("enc_size");
+248
+249    let func_def = function_definition! {
+250        function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+251            (let [string_len.ident()] := mload([src.expr()]))
+252            (let data_size := add(32, [string_len.expr()]))
+253            ([enc_size.ident()] := mul((div((add(data_size, 31)), 32)), 32))
+254            (let padding_word_ptr := add([dst.expr()], (sub([enc_size.expr()], 32))))
+255            (mstore(padding_word_ptr, 0))
+256            ([yul::Statement::Expression(provider.ptr_copy(db, src.expr(), dst.expr(), literal_expression!{data_size}, false, is_dst_storage))])
+257        }
+258    };
+259    RuntimeFunction::from_statement(func_def)
+260}
+261
+262pub(super) fn make_abi_encode_bytes_type(
+263    provider: &mut DefaultRuntimeProvider,
+264    db: &dyn CodegenDb,
+265    func_name: &str,
+266    len: usize,
+267    is_dst_storage: bool,
+268) -> RuntimeFunction {
+269    let func_name = YulVariable::new(func_name);
+270    let src = YulVariable::new("src");
+271    let dst = YulVariable::new("dst");
+272    let enc_size = YulVariable::new("enc_size");
+273    let dst_len_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+274
+275    let func_def = function_definition! {
+276        function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+277            ([enc_size.ident()] := [literal_expression!{ (ceil_32(32 + len)) }])
+278            (if (gt([enc_size.expr()], 0)) {
+279                (let padding_word_ptr := add([dst.expr()], (sub([enc_size.expr()], 32))))
+280                (mstore(padding_word_ptr, 0))
+281            })
+282            ([yul::Statement::Expression(provider.ptr_store(db, dst.expr(), literal_expression!{ (len) }, dst_len_ty))])
+283            ([dst.ident()] := add(32, [dst.expr()]))
+284            ([yul::Statement::Expression(provider.ptr_copy(db, src.expr(), dst.expr(), literal_expression!{(len)}, false, is_dst_storage))])
+285        }
+286    };
+287    RuntimeFunction::from_statement(func_def)
+288}
+289
+290pub(super) fn make_abi_encode_seq(
+291    provider: &mut DefaultRuntimeProvider,
+292    db: &dyn CodegenDb,
+293    func_name: &str,
+294    value_tys: &[TypeId],
+295    is_dst_storage: bool,
+296) -> RuntimeFunction {
+297    let func_name = YulVariable::new(func_name);
+298    let value_num = value_tys.len();
+299    let abi_tys: Vec<_> = value_tys
+300        .iter()
+301        .map(|ty| db.codegen_abi_type(ty.deref(db.upcast())))
+302        .collect();
+303    let dst = YulVariable::new("dst");
+304    let header_ptr = YulVariable::new("header_ptr");
+305    let enc_size = YulVariable::new("enc_size");
+306    let data_ptr = YulVariable::new("data_ptr");
+307    let values: Vec<_> = (0..value_num)
+308        .map(|idx| YulVariable::new(format!("value{idx}")))
+309        .collect();
+310
+311    let total_header_size =
+312        literal_expression! { (abi_tys.iter().fold(0, |acc, ty| acc + ty.header_size())) };
+313    let mut body = statements! {
+314        (let [header_ptr.ident()] := [dst.expr()])
+315        ([enc_size.ident()] := [total_header_size])
+316        (let [data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+317    };
+318
+319    for i in 0..value_num {
+320        let ty = value_tys[i];
+321        let abi_ty = &abi_tys[i];
+322        let value = &values[i];
+323        let stmts = if abi_ty.is_static() {
+324            statements! {
+325                (pop([provider.abi_encode(db, value.expr(), header_ptr.expr(), ty, is_dst_storage)]))
+326                ([header_ptr.ident()] := add([header_ptr.expr()], [literal_expression!{ (abi_ty.header_size()) }]))
+327            }
+328        } else {
+329            let header_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+330            statements! {
+331               ([yul::Statement::Expression(provider.ptr_store(db, header_ptr.expr(), enc_size.expr(), header_ty))])
+332               ([enc_size.ident()] := add([provider.abi_encode(db, value.expr(), data_ptr.expr(), ty, is_dst_storage)], [enc_size.expr()]))
+333               ([header_ptr.ident()] := add([header_ptr.expr()], 32))
+334               ([data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+335            }
+336        };
+337        body.extend_from_slice(&stmts);
+338    }
+339
+340    let mut parameters = vec![dst.ident()];
+341    for value in values {
+342        parameters.push(value.ident());
+343    }
+344
+345    let func_def = yul::FunctionDefinition {
+346        name: func_name.ident(),
+347        parameters,
+348        returns: vec![enc_size.ident()],
+349        block: yul::Block { statements: body },
+350    };
+351
+352    RuntimeFunction(func_def)
+353}
+354
+355pub(super) fn make_abi_decode(
+356    provider: &mut DefaultRuntimeProvider,
+357    db: &dyn CodegenDb,
+358    func_name: &str,
+359    types: &[TypeId],
+360    abi_loc: AbiSrcLocation,
+361) -> RuntimeFunction {
+362    let func_name = YulVariable::new(func_name);
+363    let header_size = types
+364        .iter()
+365        .fold(0, |acc, ty| acc + db.codegen_abi_type(*ty).header_size());
+366    let src = YulVariable::new("$src");
+367    let enc_size = YulVariable::new("$enc_size");
+368    let header_ptr = YulVariable::new("header_ptr");
+369    let data_offset = YulVariable::new("data_offset");
+370    let tmp_offset = YulVariable::new("tmp_offset");
+371    let returns: Vec<_> = (0..types.len())
+372        .map(|i| YulVariable::new(format!("$ret{i}")))
+373        .collect();
+374
+375    let abi_enc_size = abi_enc_size(db, types);
+376    let size_check = match abi_enc_size {
+377        AbiEncodingSize::Static(size) => statements! {
+378                (if (iszero((eq([enc_size.expr()], [literal_expression!{(size)}]))))
+379        {             [revert_with_invalid_abi_data(provider, db)]
+380                })
+381            },
+382        AbiEncodingSize::Bounded { min, max } => statements! {
+383            (if (or(
+384                (lt([enc_size.expr()], [literal_expression!{(min)}])),
+385                (gt([enc_size.expr()], [literal_expression!{(max)}]))
+386            )) {
+387                [revert_with_invalid_abi_data(provider, db)]
+388            })
+389        },
+390    };
+391
+392    let mut body = statements! {
+393        (let [header_ptr.ident()] := [src.expr()])
+394        (let [data_offset.ident()] :=  [literal_expression!{ (header_size) }])
+395        (let [tmp_offset.ident()] := 0)
+396    };
+397    for i in 0..returns.len() {
+398        let ret_value = &returns[i];
+399        let field_ty = types[i];
+400        let field_abi_ty = db.codegen_abi_type(field_ty.deref(db.upcast()));
+401        if field_abi_ty.is_static() {
+402            body.push(statement!{ [ret_value.ident()] := [provider.abi_decode_static(db, header_ptr.expr(), field_ty, abi_loc)] });
+403        } else {
+404            let identifiers = identifiers! {
+405                [ret_value.ident()]
+406                [tmp_offset.ident()]
+407            };
+408            body.push(yul::Statement::Assignment(yul::Assignment {
+409                identifiers,
+410                expression: provider.abi_decode_dynamic(
+411                    db,
+412                    expression! {add([src.expr()], [data_offset.expr()])},
+413                    field_ty,
+414                    abi_loc,
+415                ),
+416            }));
+417            body.push(statement! { ([data_offset.ident()] := add([data_offset.expr()], [tmp_offset.expr()])) });
+418        };
+419
+420        let field_header_size = literal_expression! { (field_abi_ty.header_size()) };
+421        body.push(
+422            statement! { [header_ptr.ident()] := add([header_ptr.expr()], [field_header_size]) },
+423        );
+424    }
+425
+426    let offset_check = match abi_enc_size {
+427        AbiEncodingSize::Static(_) => vec![],
+428        AbiEncodingSize::Bounded { .. } => statements! {
+429            (if (iszero((eq([enc_size.expr()], [data_offset.expr()])))) { [revert_with_invalid_abi_data(provider, db)] })
+430        },
+431    };
+432
+433    let returns: Vec<_> = returns.iter().map(YulVariable::ident).collect();
+434    let func_def = function_definition! {
+435        function [func_name.ident()]([src.ident()], [enc_size.ident()]) -> [returns...] {
+436            [size_check...]
+437            [body...]
+438            [offset_check...]
+439        }
+440    };
+441    RuntimeFunction::from_statement(func_def)
+442}
+443
+444impl DefaultRuntimeProvider {
+445    fn abi_decode_static(
+446        &mut self,
+447        db: &dyn CodegenDb,
+448        src: yul::Expression,
+449        ty: TypeId,
+450        abi_loc: AbiSrcLocation,
+451    ) -> yul::Expression {
+452        let ty = db.codegen_legalized_type(ty).deref(db.upcast());
+453        let abi_ty = db.codegen_abi_type(ty.deref(db.upcast()));
+454        debug_assert!(abi_ty.is_static());
+455
+456        let func_name_postfix = match abi_loc {
+457            AbiSrcLocation::CallData => "calldata",
+458            AbiSrcLocation::Memory => "memory",
+459        };
+460
+461        let args = vec![src];
+462        if ty.is_primitive(db.upcast()) {
+463            let name = format! {
+464                "$abi_decode_primitive_type_{}_from_{}",
+465                ty.0, func_name_postfix,
+466            };
+467            return self.create_then_call(&name, args, |provider| {
+468                make_abi_decode_primitive_type(provider, db, &name, ty, abi_loc)
+469            });
+470        }
+471
+472        let name = format! {
+473            "$abi_decode_static_aggregate_type_{}_from_{}",
+474            ty.0, func_name_postfix,
+475        };
+476        self.create_then_call(&name, args, |provider| {
+477            make_abi_decode_static_aggregate_type(provider, db, &name, ty, abi_loc)
+478        })
+479    }
+480
+481    fn abi_decode_dynamic(
+482        &mut self,
+483        db: &dyn CodegenDb,
+484        src: yul::Expression,
+485        ty: TypeId,
+486        abi_loc: AbiSrcLocation,
+487    ) -> yul::Expression {
+488        let ty = db.codegen_legalized_type(ty).deref(db.upcast());
+489        let abi_ty = db.codegen_abi_type(ty.deref(db.upcast()));
+490        debug_assert!(!abi_ty.is_static());
+491
+492        let func_name_postfix = match abi_loc {
+493            AbiSrcLocation::CallData => "calldata",
+494            AbiSrcLocation::Memory => "memory",
+495        };
+496
+497        let mut args = vec![src];
+498        match abi_ty {
+499            AbiType::String => {
+500                let len = match &ty.data(db.upcast()).kind {
+501                    TypeKind::String(len) => *len,
+502                    _ => unreachable!(),
+503                };
+504                args.push(literal_expression! {(len)});
+505                let name = format! {"$abi_decode_string_from_{func_name_postfix}"};
+506                self.create_then_call(&name, args, |provider| {
+507                    make_abi_decode_string_type(provider, db, &name, abi_loc)
+508                })
+509            }
+510
+511            AbiType::Bytes => {
+512                let len = match &ty.data(db.upcast()).kind {
+513                    TypeKind::Array(ArrayDef { len, .. }) => *len,
+514                    _ => unreachable!(),
+515                };
+516                args.push(literal_expression! {(len)});
+517                let name = format! {"$abi_decode_bytes_from_{func_name_postfix}"};
+518                self.create_then_call(&name, args, |provider| {
+519                    make_abi_decode_bytes_type(provider, db, &name, abi_loc)
+520                })
+521            }
+522
+523            AbiType::Array { .. } => {
+524                let name =
+525                    format! {"$abi_decode_dynamic_array_{}_from_{}", ty.0, func_name_postfix};
+526                self.create_then_call(&name, args, |provider| {
+527                    make_abi_decode_dynamic_elem_array_type(provider, db, &name, ty, abi_loc)
+528                })
+529            }
+530
+531            AbiType::Tuple(_) => {
+532                let name =
+533                    format! {"$abi_decode_dynamic_aggregate_{}_from_{}", ty.0, func_name_postfix};
+534                self.create_then_call(&name, args, |provider| {
+535                    make_abi_decode_dynamic_aggregate_type(provider, db, &name, ty, abi_loc)
+536                })
+537            }
+538
+539            _ => unreachable!(),
+540        }
+541    }
+542}
+543
+544fn make_abi_decode_primitive_type(
+545    provider: &mut DefaultRuntimeProvider,
+546    db: &dyn CodegenDb,
+547    func_name: &str,
+548    ty: TypeId,
+549    abi_loc: AbiSrcLocation,
+550) -> RuntimeFunction {
+551    debug_assert! {ty.is_primitive(db.upcast())}
+552    let func_name = YulVariable::new(func_name);
+553    let src = YulVariable::new("src");
+554    let ret = YulVariable::new("ret");
+555
+556    let decode = match abi_loc {
+557        AbiSrcLocation::CallData => {
+558            statement! { [ret.ident()] := calldataload([src.expr()]) }
+559        }
+560        AbiSrcLocation::Memory => {
+561            statement! { [ret.ident()] := mload([src.expr()]) }
+562        }
+563    };
+564
+565    let ty_size_bits = ty.size_of(db.upcast(), SLOT_SIZE) * 8;
+566    let validation = if ty_size_bits == 256 {
+567        statements! {}
+568    } else if ty.is_signed(db.upcast()) {
+569        let shift_num = literal_expression! { ( ty_size_bits - 1) };
+570        let tmp1 = YulVariable::new("tmp1");
+571        let tmp2 = YulVariable::new("tmp2");
+572        statements! {
+573            (let [tmp1.ident()] := iszero((shr([shift_num.clone()], [ret.expr()]))))
+574            (let [tmp2.ident()] := iszero((shr([shift_num], (not([ret.expr()]))))))
+575            (if (iszero((or([tmp1.expr()], [tmp2.expr()])))) {
+576                [revert_with_invalid_abi_data(provider, db)]
+577            })
+578        }
+579    } else {
+580        let shift_num = literal_expression! { ( ty_size_bits) };
+581        let tmp = YulVariable::new("tmp");
+582        statements! {
+583            (let [tmp.ident()] := iszero((shr([shift_num], [ret.expr()]))))
+584            (if (iszero([tmp.expr()])) {
+585                [revert_with_invalid_abi_data(provider, db)]
+586            })
+587        }
+588    };
+589
+590    let func = function_definition! {
+591            function [func_name.ident()]([src.ident()]) -> [ret.ident()] {
+592                ([decode])
+593                [validation...]
+594        }
+595    };
+596
+597    RuntimeFunction::from_statement(func)
+598}
+599
+600fn make_abi_decode_static_aggregate_type(
+601    provider: &mut DefaultRuntimeProvider,
+602    db: &dyn CodegenDb,
+603    func_name: &str,
+604    ty: TypeId,
+605    abi_loc: AbiSrcLocation,
+606) -> RuntimeFunction {
+607    debug_assert!(ty.is_aggregate(db.upcast()));
+608
+609    let func_name = YulVariable::new(func_name);
+610    let src = YulVariable::new("src");
+611    let ret = YulVariable::new("ret");
+612    let field_data = YulVariable::new("field_data");
+613    let type_size = literal_expression! { (ty.size_of(db.upcast(), SLOT_SIZE)) };
+614
+615    let mut body = statements! {
+616        (let [field_data.ident()] := 0)
+617        ([ret.ident()] := [provider.alloc(db, type_size)])
+618    };
+619
+620    let field_num = ty.aggregate_field_num(db.upcast());
+621    for idx in 0..field_num {
+622        let field_ty = ty.projection_ty_imm(db.upcast(), idx);
+623        let field_ty_size = field_ty.size_of(db.upcast(), SLOT_SIZE);
+624        body.push(statement! { [field_data.ident()] := [provider.abi_decode_static(db, src.expr(), field_ty, abi_loc)] });
+625
+626        let dst_offset =
+627            literal_expression! { (ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE)) };
+628        let field_ty_ptr = make_ptr(db, field_ty, false);
+629        if field_ty.is_primitive(db.upcast()) {
+630            body.push(yul::Statement::Expression(provider.ptr_store(
+631                db,
+632                expression! {add([ret.expr()], [dst_offset])},
+633                field_data.expr(),
+634                field_ty_ptr,
+635            )));
+636        } else {
+637            body.push(yul::Statement::Expression(provider.ptr_copy(
+638                db,
+639                field_data.expr(),
+640                expression! {add([ret.expr()], [dst_offset])},
+641                literal_expression! { (field_ty_size) },
+642                false,
+643                false,
+644            )));
+645        }
+646
+647        if idx < field_num - 1 {
+648            let abi_field_ty = db.codegen_abi_type(field_ty);
+649            let field_abi_ty_size = literal_expression! { (abi_field_ty.header_size()) };
+650            body.push(assignment! {[src.ident()] :=  add([src.expr()], [field_abi_ty_size])});
+651        }
+652    }
+653
+654    let func_def = yul::FunctionDefinition {
+655        name: func_name.ident(),
+656        parameters: vec![src.ident()],
+657        returns: vec![ret.ident()],
+658        block: yul::Block { statements: body },
+659    };
+660
+661    RuntimeFunction(func_def)
+662}
+663
+664fn make_abi_decode_string_type(
+665    provider: &mut DefaultRuntimeProvider,
+666    db: &dyn CodegenDb,
+667    func_name: &str,
+668    abi_loc: AbiSrcLocation,
+669) -> RuntimeFunction {
+670    let func_name = YulVariable::new(func_name);
+671    let src = YulVariable::new("src");
+672    let decoded_data = YulVariable::new("decoded_data");
+673    let decoded_size = YulVariable::new("decoded_size");
+674    let max_len = YulVariable::new("max_len");
+675    let string_size = YulVariable::new("string_size");
+676    let dst_size = YulVariable::new("dst_size");
+677    let end_word = YulVariable::new("end_word");
+678    let end_word_ptr = YulVariable::new("end_word_ptr");
+679    let padding_size_bits = YulVariable::new("padding_size_bits");
+680    let primitive_ty_ptr = make_ptr(db, yul_primitive_type(db), false);
+681
+682    let func = function_definition! {
+683        function [func_name.ident()]([src.ident()], [max_len.ident()]) -> [(vec![decoded_data.ident(), decoded_size.ident()])...] {
+684            (let string_len := [provider.abi_decode_static(db, src.expr(), primitive_ty_ptr, abi_loc)])
+685            (if (gt(string_len, [max_len.expr()])) { [revert_with_invalid_abi_data(provider, db)] } )
+686            (let [string_size.ident()] := add(string_len, 32))
+687            ([decoded_size.ident()] := mul((div((add([string_size.expr()], 31)), 32)), 32))
+688            (let [end_word_ptr.ident()] := sub((add([src.expr()], [decoded_size.expr()])), 32))
+689            (let [end_word.ident()] := [provider.abi_decode_static(db, end_word_ptr.expr(), primitive_ty_ptr, abi_loc)])
+690            (let [padding_size_bits.ident()] := mul((sub([decoded_size.expr()], [string_size.expr()])), 8))
+691            [(check_right_padding(provider, db, end_word.expr(), padding_size_bits.expr()))...]
+692            (let [dst_size.ident()] := add([max_len.expr()], 32))
+693            ([decoded_data.ident()] := [provider.alloc(db, dst_size.expr())])
+694            ([ptr_copy_decode(provider, db, src.expr(), decoded_data.expr(), string_size.expr(), abi_loc)])
+695        }
+696    };
+697
+698    RuntimeFunction::from_statement(func)
+699}
+700
+701fn make_abi_decode_bytes_type(
+702    provider: &mut DefaultRuntimeProvider,
+703    db: &dyn CodegenDb,
+704    func_name: &str,
+705    abi_loc: AbiSrcLocation,
+706) -> RuntimeFunction {
+707    let func_name = YulVariable::new(func_name);
+708    let src = YulVariable::new("src");
+709    let decoded_data = YulVariable::new("decoded_data");
+710    let decoded_size = YulVariable::new("decoded_size");
+711    let max_len = YulVariable::new("max_len");
+712    let bytes_size = YulVariable::new("bytes_size");
+713    let end_word = YulVariable::new("end_word");
+714    let end_word_ptr = YulVariable::new("end_word_ptr");
+715    let padding_size_bits = YulVariable::new("padding_size_bits");
+716    let primitive_ty_ptr = make_ptr(db, yul_primitive_type(db), false);
+717
+718    let func = function_definition! {
+719        function [func_name.ident()]([src.ident()], [max_len.ident()]) -> [(vec![decoded_data.ident(),decoded_size.ident()])...] {
+720            (let [bytes_size.ident()] := [provider.abi_decode_static(db, src.expr(), primitive_ty_ptr, abi_loc)])
+721            (if (iszero((eq([bytes_size.expr()], [max_len.expr()])))) { [revert_with_invalid_abi_data(provider, db)] } )
+722            ([src.ident()] := add([src.expr()], 32))
+723            (let padded_data_size := mul((div((add([bytes_size.expr()], 31)), 32)), 32))
+724            ([decoded_size.ident()] := add(padded_data_size, 32))
+725            (let [end_word_ptr.ident()] := sub((add([src.expr()], padded_data_size)), 32))
+726            (let [end_word.ident()] := [provider.abi_decode_static(db, end_word_ptr.expr(), primitive_ty_ptr, abi_loc)])
+727            (let [padding_size_bits.ident()] := mul((sub(padded_data_size, [bytes_size.expr()])), 8))
+728            [(check_right_padding(provider, db, end_word.expr(), padding_size_bits.expr()))...]
+729            ([decoded_data.ident()] := [provider.alloc(db, max_len.expr())])
+730            ([ptr_copy_decode(provider, db, src.expr(), decoded_data.expr(), bytes_size.expr(), abi_loc)])
+731        }
+732    };
+733
+734    RuntimeFunction::from_statement(func)
+735}
+736
+737fn make_abi_decode_dynamic_elem_array_type(
+738    provider: &mut DefaultRuntimeProvider,
+739    db: &dyn CodegenDb,
+740    func_name: &str,
+741    legalized_ty: TypeId,
+742    abi_loc: AbiSrcLocation,
+743) -> RuntimeFunction {
+744    let deref_ty = legalized_ty.deref(db.upcast());
+745    let (elem_ty, len) = match &deref_ty.data(db.upcast()).kind {
+746        ir::TypeKind::Array(def) => (def.elem_ty, def.len),
+747        _ => unreachable!(),
+748    };
+749    let elem_ty_size = literal_expression! { (deref_ty.array_elem_size(db.upcast(), SLOT_SIZE)) };
+750    let total_header_size = literal_expression! { (32 * len) };
+751    let iter_count = literal_expression! { (len) };
+752    let ret_size = literal_expression! { (deref_ty.size_of(db.upcast(), SLOT_SIZE)) };
+753
+754    let func_name = YulVariable::new(func_name);
+755    let src = YulVariable::new("src");
+756    let header_ptr = YulVariable::new("header_ptr");
+757    let data_ptr = YulVariable::new("data_ptr");
+758    let decoded_data = YulVariable::new("decoded_data");
+759    let decoded_size = YulVariable::new("decoded_size");
+760    let decoded_size_tmp = YulVariable::new("decoded_size_tmp");
+761    let ret_elem_ptr = YulVariable::new("ret_elem_ptr");
+762    let elem_data = YulVariable::new("elem_data");
+763
+764    let func = function_definition! {
+765        function [func_name.ident()]([src.ident()]) -> [decoded_data.ident()], [decoded_size.ident()] {
+766            ([decoded_data.ident()] := [provider.alloc(db, ret_size)])
+767            ([decoded_size.ident()] := [total_header_size])
+768            (let [decoded_size_tmp.ident()] := 0)
+769            (let [header_ptr.ident()] := [src.expr()])
+770            (let [data_ptr.ident()] := 0)
+771            (let [elem_data.ident()] := 0)
+772            (let [ret_elem_ptr.ident()] := [decoded_data.expr()])
+773
+774            (for {(let i := 0)} (lt(i, [iter_count])) {(i := (add(i, 1)))}
+775             {
+776                 ([data_ptr.ident()] := add([src.expr()], [provider.abi_decode_static(db, header_ptr.expr(), yul_primitive_type(db), abi_loc)]))
+777                 ([assignment! {[elem_data.ident()], [decoded_size_tmp.ident()] := [provider.abi_decode_dynamic(db, data_ptr.expr(), elem_ty, abi_loc)] }])
+778                 ([decoded_size.ident()] := add([decoded_size.expr()], [decoded_size_tmp.expr()]))
+779                 ([yul::Statement::Expression(provider.ptr_copy(db, elem_data.expr(), ret_elem_ptr.expr(), elem_ty_size.clone(), false, false))])
+780                 ([header_ptr.ident()] := add([header_ptr.expr()], 32))
+781                 ([ret_elem_ptr.ident()] := add([ret_elem_ptr.expr()], [elem_ty_size]))
+782             })
+783        }
+784    };
+785
+786    RuntimeFunction::from_statement(func)
+787}
+788
+789fn make_abi_decode_dynamic_aggregate_type(
+790    provider: &mut DefaultRuntimeProvider,
+791    db: &dyn CodegenDb,
+792    func_name: &str,
+793    legalized_ty: TypeId,
+794    abi_loc: AbiSrcLocation,
+795) -> RuntimeFunction {
+796    let deref_ty = legalized_ty.deref(db.upcast());
+797    let type_size = literal_expression! { (deref_ty.size_of(db.upcast(), SLOT_SIZE)) };
+798
+799    let func_name = YulVariable::new(func_name);
+800    let src = YulVariable::new("src");
+801    let header_ptr = YulVariable::new("header_ptr");
+802    let data_offset = YulVariable::new("data_offset");
+803    let decoded_data = YulVariable::new("decoded_data");
+804    let decoded_size = YulVariable::new("decoded_size");
+805    let decoded_size_tmp = YulVariable::new("decoded_size_tmp");
+806    let ret_field_ptr = YulVariable::new("ret_field_ptr");
+807    let field_data = YulVariable::new("field_data");
+808
+809    let mut body = statements! {
+810            ([decoded_data.ident()] := [provider.alloc(db, type_size)])
+811            ([decoded_size.ident()] := 0)
+812            (let [decoded_size_tmp.ident()] := 0)
+813            (let [header_ptr.ident()] := [src.expr()])
+814            (let [data_offset.ident()] := 0)
+815            (let [field_data.ident()] := 0)
+816            (let [ret_field_ptr.ident()] := 0)
+817    };
+818
+819    for i in 0..deref_ty.aggregate_field_num(db.upcast()) {
+820        let field_ty = deref_ty.projection_ty_imm(db.upcast(), i);
+821        let field_size = field_ty.size_of(db.upcast(), SLOT_SIZE);
+822        let field_abi_ty = db.codegen_abi_type(field_ty);
+823        let field_offset = deref_ty.aggregate_elem_offset(db.upcast(), i, SLOT_SIZE);
+824
+825        let decode_data = if field_abi_ty.is_static() {
+826            statements! {
+827                ([field_data.ident()] := [provider.abi_decode_static(db, header_ptr.expr(), field_ty, abi_loc)])
+828                ([decoded_size_tmp.ident()] := [literal_expression!{ (field_abi_ty.header_size()) }])
+829            }
+830        } else {
+831            statements! {
+832                ([data_offset.ident()] := [provider.abi_decode_static(db, header_ptr.expr(), yul_primitive_type(db), abi_loc)])
+833                ([assignment! {
+834                    [field_data.ident()], [decoded_size_tmp.ident()] :=
+835                    [provider.abi_decode_dynamic(
+836                        db,
+837                        expression!{ add([src.expr()], [data_offset.expr()]) },
+838                        field_ty,
+839                        abi_loc
+840                    )]
+841                }])
+842                ([decoded_size_tmp.ident()] := add([decoded_size_tmp.expr()], 32))
+843            }
+844        };
+845        body.extend_from_slice(&decode_data);
+846        body.push(assignment!{ [decoded_size.ident()] := add([decoded_size.expr()], [decoded_size_tmp.expr()]) });
+847
+848        body.push(assignment! { [ret_field_ptr.ident()] := add([decoded_data.expr()], [literal_expression!{ (field_offset) }])});
+849        let copy_to_ret = if field_ty.is_primitive(db.upcast()) {
+850            let field_ptr_ty = make_ptr(db, field_ty, false);
+851            yul::Statement::Expression(provider.ptr_store(
+852                db,
+853                ret_field_ptr.expr(),
+854                field_data.expr(),
+855                field_ptr_ty,
+856            ))
+857        } else {
+858            yul::Statement::Expression(provider.ptr_copy(
+859                db,
+860                field_data.expr(),
+861                ret_field_ptr.expr(),
+862                literal_expression! { (field_size) },
+863                false,
+864                false,
+865            ))
+866        };
+867        body.push(copy_to_ret);
+868
+869        let header_size = literal_expression! { (field_abi_ty.header_size()) };
+870        body.push(statement! {
+871            [header_ptr.ident()] := add([header_ptr.expr()], [header_size])
+872        });
+873    }
+874
+875    let func_def = yul::FunctionDefinition {
+876        name: func_name.ident(),
+877        parameters: vec![src.ident()],
+878        returns: vec![decoded_data.ident(), decoded_size.ident()],
+879        block: yul::Block { statements: body },
+880    };
+881
+882    RuntimeFunction(func_def)
+883}
+884
+885enum AbiEncodingSize {
+886    Static(usize),
+887    Bounded { min: usize, max: usize },
+888}
+889
+890fn abi_enc_size(db: &dyn CodegenDb, types: &[TypeId]) -> AbiEncodingSize {
+891    let mut min = 0;
+892    let mut max = 0;
+893    for &ty in types {
+894        let legalized_ty = db.codegen_legalized_type(ty);
+895        min += db.codegen_abi_type_minimum_size(legalized_ty);
+896        max += db.codegen_abi_type_maximum_size(legalized_ty);
+897    }
+898
+899    if min == max {
+900        AbiEncodingSize::Static(min)
+901    } else {
+902        AbiEncodingSize::Bounded { min, max }
+903    }
+904}
+905
+906fn revert_with_invalid_abi_data(
+907    provider: &mut dyn RuntimeProvider,
+908    db: &dyn CodegenDb,
+909) -> yul::Statement {
+910    const ERROR_INVALID_ABI_DATA: usize = 0x103;
+911    let error_code = literal_expression! { (ERROR_INVALID_ABI_DATA) };
+912    error_revert_numeric(provider, db, error_code)
+913}
+914
+915fn check_right_padding(
+916    provider: &mut dyn RuntimeProvider,
+917    db: &dyn CodegenDb,
+918    val: yul::Expression,
+919    size_bits: yul::Expression,
+920) -> Vec<yul::Statement> {
+921    statements! {
+922        (let bits_shifted := sub(256, [size_bits]))
+923        (let is_ok := iszero((shl(bits_shifted, [val]))))
+924        (if (iszero((is_ok))) {
+925            [revert_with_invalid_abi_data(provider, db)]
+926        })
+927    }
+928}
+929
+930fn ptr_copy_decode(
+931    provider: &mut DefaultRuntimeProvider,
+932    db: &dyn CodegenDb,
+933    src: yul::Expression,
+934    dst: yul::Expression,
+935    len: yul::Expression,
+936    loc: AbiSrcLocation,
+937) -> yul::Statement {
+938    match loc {
+939        AbiSrcLocation::CallData => {
+940            statement! { calldatacopy([dst], [src], [len]) }
+941        }
+942        AbiSrcLocation::Memory => {
+943            yul::Statement::Expression(provider.ptr_copy(db, src, dst, len, false, false))
+944        }
+945    }
+946}
+947
+948fn ceil_32(len: usize) -> usize {
+949    ((len + 31) / 32) * 32
+950}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html new file mode 100644 index 0000000000..c46f011fb8 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html @@ -0,0 +1,127 @@ +contract.rs - source

fe_codegen/yul/runtime/
contract.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{runtime::AbiSrcLocation, YulVariable},
+4};
+5
+6use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+7
+8use fe_analyzer::namespace::items::ContractId;
+9use fe_mir::ir::{FunctionId, Type, TypeKind};
+10
+11use yultsur::*;
+12
+13pub(super) fn make_create(
+14    provider: &mut DefaultRuntimeProvider,
+15    db: &dyn CodegenDb,
+16    func_name: &str,
+17    contract: ContractId,
+18) -> RuntimeFunction {
+19    let func_name = YulVariable::new(func_name);
+20    let contract_symbol = literal_expression! {
+21        (format!(r#""{}""#, db.codegen_contract_deployer_symbol_name(contract)))
+22    };
+23
+24    let size = YulVariable::new("size");
+25    let value = YulVariable::new("value");
+26    let func = function_definition! {
+27        function [func_name.ident()]([value.ident()]) -> addr {
+28            (let [size.ident()] := datasize([contract_symbol.clone()]))
+29            (let mem_ptr := [provider.avail(db)])
+30            (let contract_ptr := dataoffset([contract_symbol]))
+31            (datacopy(mem_ptr, contract_ptr, [size.expr()]))
+32            (addr := create([value.expr()], mem_ptr, [size.expr()]))
+33        }
+34    };
+35
+36    RuntimeFunction::from_statement(func)
+37}
+38
+39pub(super) fn make_create2(
+40    provider: &mut DefaultRuntimeProvider,
+41    db: &dyn CodegenDb,
+42    func_name: &str,
+43    contract: ContractId,
+44) -> RuntimeFunction {
+45    let func_name = YulVariable::new(func_name);
+46    let contract_symbol = literal_expression! {
+47        (format!(r#""{}""#, db.codegen_contract_deployer_symbol_name(contract)))
+48    };
+49
+50    let size = YulVariable::new("size");
+51    let value = YulVariable::new("value");
+52    let func = function_definition! {
+53        function [func_name.ident()]([value.ident()], salt) -> addr {
+54            (let [size.ident()] := datasize([contract_symbol.clone()]))
+55            (let mem_ptr := [provider.avail(db)])
+56            (let contract_ptr := dataoffset([contract_symbol]))
+57            (datacopy(mem_ptr, contract_ptr, [size.expr()]))
+58            (addr := create2([value.expr()], mem_ptr, [size.expr()], salt))
+59        }
+60    };
+61
+62    RuntimeFunction::from_statement(func)
+63}
+64
+65pub(super) fn make_external_call(
+66    provider: &mut DefaultRuntimeProvider,
+67    db: &dyn CodegenDb,
+68    func_name: &str,
+69    function: FunctionId,
+70) -> RuntimeFunction {
+71    let func_name = YulVariable::new(func_name);
+72    let sig = db.codegen_legalized_signature(function);
+73    let param_num = sig.params.len();
+74
+75    let mut args = Vec::with_capacity(param_num);
+76    let mut arg_tys = Vec::with_capacity(param_num);
+77    for param in &sig.params {
+78        args.push(YulVariable::new(param.name.as_str()));
+79        arg_tys.push(param.ty);
+80    }
+81    let ret_ty = sig.return_type;
+82
+83    let func_addr = YulVariable::new("func_addr");
+84    let params: Vec<_> = args.iter().map(YulVariable::ident).collect();
+85    let params_expr: Vec<_> = args.iter().map(YulVariable::expr).collect();
+86    let input = YulVariable::new("input");
+87    let input_size = YulVariable::new("input_size");
+88    let output_size = YulVariable::new("output_size");
+89    let output = YulVariable::new("output");
+90
+91    let func_selector = literal_expression! { (format!{"0x{}", db.codegen_abi_function(function).selector().hex()}) };
+92    let selector_ty = db.mir_intern_type(Type::new(TypeKind::U32, None).into());
+93
+94    let mut body = statements! {
+95            (let [input.ident()] := [provider.avail(db)])
+96            [yul::Statement::Expression(provider.ptr_store(db, input.expr(), func_selector, selector_ty.make_mptr(db.upcast())))]
+97            (let [input_size.ident()] := add(4, [provider.abi_encode_seq(db, &params_expr, expression!{ add([input.expr()], 4) }, &arg_tys, false)]))
+98            (let [output.ident()] := add([provider.avail(db)], [input_size.expr()]))
+99            (let success := call((gas()), [func_addr.expr()], 0, [input.expr()], [input_size.expr()], 0, 0))
+100            (let [output_size.ident()] := returndatasize())
+101            (returndatacopy([output.expr()], 0, [output_size.expr()]))
+102            (if (iszero(success)) {
+103                (revert([output.expr()], [output_size.expr()]))
+104            })
+105    };
+106    let func = if let Some(ret_ty) = ret_ty {
+107        let ret = YulVariable::new("$ret");
+108        body.push(
+109            statement!{
+110                [ret.ident()] := [provider.abi_decode(db, output.expr(), output_size.expr(), &[ret_ty], AbiSrcLocation::Memory)]
+111            }
+112        );
+113        function_definition! {
+114            function [func_name.ident()]([func_addr.ident()], [params...]) -> [ret.ident()] {
+115                [body...]
+116            }
+117        }
+118    } else {
+119        function_definition! {
+120            function [func_name.ident()]([func_addr.ident()], [params...]) {
+121                [body...]
+122            }
+123        }
+124    };
+125
+126    RuntimeFunction::from_statement(func)
+127}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/data.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/data.rs.html new file mode 100644 index 0000000000..655e203b2a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/data.rs.html @@ -0,0 +1,461 @@ +data.rs - source

fe_codegen/yul/runtime/
data.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{
+4        runtime::{make_ptr, BitMask},
+5        slot_size::{yul_primitive_type, SLOT_SIZE},
+6        YulVariable,
+7    },
+8};
+9
+10use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+11
+12use fe_mir::ir::{types::TupleDef, Type, TypeId, TypeKind};
+13
+14use yultsur::*;
+15
+16const HASH_SCRATCH_SPACE_START: usize = 0x00;
+17const HASH_SCRATCH_SPACE_SIZE: usize = 64;
+18const FREE_MEMORY_ADDRESS_STORE: usize = HASH_SCRATCH_SPACE_START + HASH_SCRATCH_SPACE_SIZE;
+19const FREE_MEMORY_START: usize = FREE_MEMORY_ADDRESS_STORE + 32;
+20
+21pub(super) fn make_alloc(func_name: &str) -> RuntimeFunction {
+22    let func_name = YulVariable::new(func_name);
+23    let free_address_ptr = literal_expression! {(FREE_MEMORY_ADDRESS_STORE)};
+24    let free_memory_start = literal_expression! {(FREE_MEMORY_START)};
+25    let func = function_definition! {
+26        function [func_name.ident()](size) -> ptr {
+27            (ptr := mload([free_address_ptr.clone()]))
+28            (if (eq(ptr, 0x00)) { (ptr := [free_memory_start]) })
+29            (mstore([free_address_ptr], (add(ptr, size))))
+30        }
+31    };
+32
+33    RuntimeFunction::from_statement(func)
+34}
+35
+36pub(super) fn make_avail(func_name: &str) -> RuntimeFunction {
+37    let func_name = YulVariable::new(func_name);
+38    let free_address_ptr = literal_expression! {(FREE_MEMORY_ADDRESS_STORE)};
+39    let free_memory_start = literal_expression! {(FREE_MEMORY_START)};
+40    let func = function_definition! {
+41        function [func_name.ident()]() -> ptr {
+42            (ptr := mload([free_address_ptr]))
+43            (if (eq(ptr, 0x00)) { (ptr := [free_memory_start]) })
+44        }
+45    };
+46
+47    RuntimeFunction::from_statement(func)
+48}
+49
+50pub(super) fn make_mcopym(func_name: &str) -> RuntimeFunction {
+51    let func_name = YulVariable::new(func_name);
+52    let src = YulVariable::new("src");
+53    let dst = YulVariable::new("dst");
+54    let size = YulVariable::new("size");
+55
+56    let func = function_definition! {
+57        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+58            (let iter_count := div([size.expr()], 32))
+59            (let original_src := [src.expr()])
+60            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+61            {
+62                (mstore([dst.expr()], (mload([src.expr()]))))
+63                ([src.ident()] := add([src.expr()], 32))
+64                ([dst.ident()] := add([dst.expr()], 32))
+65            })
+66
+67            (let rem := sub([size.expr()], (sub([src.expr()], original_src))))
+68            (if (gt(rem, 0)) {
+69                (let rem_bits := mul(rem, 8))
+70                (let dst_mask := sub((shl((sub(256, rem_bits)), 1)), 1))
+71                (let src_mask := not(dst_mask))
+72                (let src_value := and((mload([src.expr()])), src_mask))
+73                (let dst_value := and((mload([dst.expr()])), dst_mask))
+74                (mstore([dst.expr()], (or(src_value, dst_value))))
+75            })
+76        }
+77    };
+78
+79    RuntimeFunction::from_statement(func)
+80}
+81
+82pub(super) fn make_mcopys(func_name: &str) -> RuntimeFunction {
+83    let func_name = YulVariable::new(func_name);
+84    let src = YulVariable::new("src");
+85    let dst = YulVariable::new("dst");
+86    let size = YulVariable::new("size");
+87
+88    let func = function_definition! {
+89        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+90            ([dst.ident()] := div([dst.expr()], 32))
+91            (let iter_count := div([size.expr()], 32))
+92            (let original_src := [src.expr()])
+93            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+94            {
+95                (sstore([dst.expr()], (mload([src.expr()]))))
+96                ([src.ident()] := add([src.expr()], 32))
+97                ([dst.ident()] := add([dst.expr()], 1))
+98            })
+99
+100            (let rem := sub([size.expr()], (sub([src.expr()], original_src))))
+101            (if (gt(rem, 0)) {
+102                (let rem_bits := mul(rem, 8))
+103                (let dst_mask := sub((shl((sub(256, rem_bits)), 1)), 1))
+104                (let src_mask := not(dst_mask))
+105                (let src_value := and((mload([src.expr()])), src_mask))
+106                (let dst_value := and((sload([dst.expr()])), dst_mask))
+107                (sstore([dst.expr()], (or(src_value, dst_value))))
+108            })
+109        }
+110    };
+111
+112    RuntimeFunction::from_statement(func)
+113}
+114
+115pub(super) fn make_scopym(func_name: &str) -> RuntimeFunction {
+116    let func_name = YulVariable::new(func_name);
+117    let src = YulVariable::new("src");
+118    let dst = YulVariable::new("dst");
+119    let size = YulVariable::new("size");
+120
+121    let func = function_definition! {
+122        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+123            ([src.ident()] := div([src.expr()], 32))
+124            (let iter_count := div([size.expr()], 32))
+125            (let original_dst := [dst.expr()])
+126            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+127            {
+128                (mstore([dst.expr()], (sload([src.expr()]))))
+129                ([src.ident()] := add([src.expr()], 1))
+130                ([dst.ident()] := add([dst.expr()], 32))
+131            })
+132
+133            (let rem := sub([size.expr()], (sub([dst.expr()], original_dst))))
+134            (if (gt(rem, 0)) {
+135                (let rem_bits := mul(rem, 8))
+136                (let dst_mask := sub((shl((sub(256, rem_bits)), 1)), 1))
+137                (let src_mask := not(dst_mask))
+138                (let src_value := and((sload([src.expr()])), src_mask))
+139                (let dst_value := and((mload([dst.expr()])), dst_mask))
+140                (mstore([dst.expr()], (or(src_value, dst_value))))
+141            })
+142        }
+143    };
+144
+145    RuntimeFunction::from_statement(func)
+146}
+147
+148pub(super) fn make_scopys(func_name: &str) -> RuntimeFunction {
+149    let func_name = YulVariable::new(func_name);
+150    let src = YulVariable::new("src");
+151    let dst = YulVariable::new("dst");
+152    let size = YulVariable::new("size");
+153    let func = function_definition! {
+154        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+155            ([src.ident()] := div([src.expr()], 32))
+156            ([dst.ident()] := div([dst.expr()], 32))
+157            (let iter_count := div((add([size.expr()], 31)), 32))
+158            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+159            {
+160                (sstore([dst.expr()], (sload([src.expr()]))))
+161                ([src.ident()] := add([src.expr()], 1))
+162                ([dst.ident()] := add([dst.expr()], 1))
+163            })
+164        }
+165    };
+166
+167    RuntimeFunction::from_statement(func)
+168}
+169
+170pub(super) fn make_sptr_store(func_name: &str) -> RuntimeFunction {
+171    let func_name = YulVariable::new(func_name);
+172    let func = function_definition! {
+173        function [func_name.ident()](ptr, value, size_bits) {
+174            (let rem_bits := mul((mod(ptr, 32)), 8))
+175            (let shift_bits := sub(256, (add(rem_bits, size_bits))))
+176            (let mask := (shl(shift_bits, (sub((shl(size_bits, 1)), 1)))))
+177            (let inv_mask := not(mask))
+178            (let slot := div(ptr, 32))
+179            (let new_value := or((and((sload(slot)), inv_mask)), (and((shl(shift_bits, value)), mask))))
+180            (sstore(slot, new_value))
+181        }
+182    };
+183
+184    RuntimeFunction::from_statement(func)
+185}
+186
+187pub(super) fn make_mptr_store(func_name: &str) -> RuntimeFunction {
+188    let func_name = YulVariable::new(func_name);
+189    let func = function_definition! {
+190        function [func_name.ident()](ptr, value, shift_num, mask) {
+191            (value := shl(shift_num, value))
+192            (let ptr_value := and((mload(ptr)), mask))
+193            (value := or(value, ptr_value))
+194            (mstore(ptr, value))
+195        }
+196    };
+197
+198    RuntimeFunction::from_statement(func)
+199}
+200
+201pub(super) fn make_sptr_load(func_name: &str) -> RuntimeFunction {
+202    let func_name = YulVariable::new(func_name);
+203    let func = function_definition! {
+204        function [func_name.ident()](ptr, size_bits) -> ret {
+205            (let rem_bits := mul((mod(ptr, 32)), 8))
+206            (let shift_num := sub(256, (add(rem_bits, size_bits))))
+207            (let slot := div(ptr, 32))
+208            (ret := shr(shift_num, (sload(slot))))
+209        }
+210    };
+211
+212    RuntimeFunction::from_statement(func)
+213}
+214
+215pub(super) fn make_mptr_load(func_name: &str) -> RuntimeFunction {
+216    let func_name = YulVariable::new(func_name);
+217    let func = function_definition! {
+218        function [func_name.ident()](ptr, shift_num) -> ret {
+219            (ret := shr(shift_num, (mload(ptr))))
+220        }
+221    };
+222
+223    RuntimeFunction::from_statement(func)
+224}
+225
+226// TODO: We can optimize aggregate initialization by combining multiple
+227// `ptr_store` operations into single `ptr_store` operation.
+228pub(super) fn make_aggregate_init(
+229    provider: &mut DefaultRuntimeProvider,
+230    db: &dyn CodegenDb,
+231    func_name: &str,
+232    legalized_ty: TypeId,
+233    arg_tys: Vec<TypeId>,
+234) -> RuntimeFunction {
+235    debug_assert!(legalized_ty.is_ptr(db.upcast()));
+236    let is_sptr = legalized_ty.is_sptr(db.upcast());
+237    let inner_ty = legalized_ty.deref(db.upcast());
+238    let ptr = YulVariable::new("ptr");
+239    let field_num = inner_ty.aggregate_field_num(db.upcast());
+240
+241    let iter_field_args = || (0..field_num).map(|i| YulVariable::new(format! {"arg{i}"}));
+242
+243    let mut body = vec![];
+244    for (idx, field_arg) in iter_field_args().enumerate() {
+245        let field_arg_ty = arg_tys[idx];
+246        let field_ty = inner_ty
+247            .projection_ty_imm(db.upcast(), idx)
+248            .deref(db.upcast());
+249        let field_ty_size = field_ty.size_of(db.upcast(), SLOT_SIZE);
+250        let field_ptr_ty = make_ptr(db, field_ty, is_sptr);
+251        let field_offset =
+252            literal_expression! {(inner_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE))};
+253
+254        let field_ptr = expression! { add([ptr.expr()], [field_offset] )};
+255        let copy_expr = if field_ty.is_aggregate(db.upcast()) || field_ty.is_string(db.upcast()) {
+256            // Call ptr copy function if field type is aggregate.
+257            debug_assert!(field_arg_ty.is_ptr(db.upcast()));
+258            provider.ptr_copy(
+259                db,
+260                field_arg.expr(),
+261                field_ptr,
+262                literal_expression! {(field_ty_size)},
+263                field_arg_ty.is_sptr(db.upcast()),
+264                is_sptr,
+265            )
+266        } else {
+267            // Call store function if field type is not aggregate.
+268            provider.ptr_store(db, field_ptr, field_arg.expr(), field_ptr_ty)
+269        };
+270        body.push(yul::Statement::Expression(copy_expr));
+271    }
+272
+273    let func_name = identifier! {(func_name)};
+274    let parameters = std::iter::once(ptr)
+275        .chain(iter_field_args())
+276        .map(|var| var.ident())
+277        .collect();
+278    let func_def = yul::FunctionDefinition {
+279        name: func_name,
+280        parameters,
+281        returns: vec![],
+282        block: yul::Block { statements: body },
+283    };
+284
+285    RuntimeFunction(func_def)
+286}
+287
+288pub(super) fn make_enum_init(
+289    provider: &mut DefaultRuntimeProvider,
+290    db: &dyn CodegenDb,
+291    func_name: &str,
+292    legalized_ty: TypeId,
+293    arg_tys: Vec<TypeId>,
+294) -> RuntimeFunction {
+295    debug_assert!(arg_tys.len() > 1);
+296
+297    let func_name = YulVariable::new(func_name);
+298    let is_sptr = legalized_ty.is_sptr(db.upcast());
+299    let ptr = YulVariable::new("ptr");
+300    let disc = YulVariable::new("disc");
+301    let disc_ty = arg_tys[0];
+302    let enum_data = || (0..arg_tys.len() - 1).map(|i| YulVariable::new(format! {"arg{i}"}));
+303
+304    let tuple_def = TupleDef {
+305        items: arg_tys
+306            .iter()
+307            .map(|ty| ty.deref(db.upcast()))
+308            .skip(1)
+309            .collect(),
+310    };
+311    let tuple_ty = db.mir_intern_type(
+312        Type {
+313            kind: TypeKind::Tuple(tuple_def),
+314            analyzer_ty: None,
+315        }
+316        .into(),
+317    );
+318    let data_ptr_ty = make_ptr(db, tuple_ty, is_sptr);
+319    let data_offset = legalized_ty
+320        .deref(db.upcast())
+321        .enum_data_offset(db.upcast(), SLOT_SIZE);
+322    let enum_data_init = statements! {
+323        [statement! {[ptr.ident()] := add([ptr.expr()], [literal_expression!{(data_offset)}])}]
+324        [yul::Statement::Expression(provider.aggregate_init(
+325        db,
+326        ptr.expr(),
+327        enum_data().map(|arg| arg.expr()).collect(),
+328        data_ptr_ty, arg_tys.iter().skip(1).copied().collect()))]
+329    };
+330
+331    let enum_data_args: Vec<_> = enum_data().map(|var| var.ident()).collect();
+332    let func_def = function_definition! {
+333        function [func_name.ident()]([ptr.ident()], [disc.ident()], [enum_data_args...]) {
+334            [yul::Statement::Expression(provider.ptr_store(db, ptr.expr(), disc.expr(), make_ptr(db, disc_ty, is_sptr)))]
+335            [enum_data_init...]
+336        }
+337    };
+338    RuntimeFunction::from_statement(func_def)
+339}
+340
+341pub(super) fn make_string_copy(
+342    provider: &mut DefaultRuntimeProvider,
+343    db: &dyn CodegenDb,
+344    func_name: &str,
+345    data: &str,
+346    is_dst_storage: bool,
+347) -> RuntimeFunction {
+348    let func_name = YulVariable::new(func_name);
+349    let dst_ptr = YulVariable::new("dst_ptr");
+350    let symbol_name = literal_expression! { (format!(r#""{}""#, db.codegen_constant_string_symbol_name(data.to_string()))) };
+351
+352    let func = if is_dst_storage {
+353        let tmp_ptr = YulVariable::new("tmp_ptr");
+354        let data_size = YulVariable::new("data_size");
+355        function_definition! {
+356            function [func_name.ident()]([dst_ptr.ident()]) {
+357                (let [tmp_ptr.ident()] := [provider.avail(db)])
+358                (let data_offset := dataoffset([symbol_name.clone()]))
+359                (let [data_size.ident()] := datasize([symbol_name]))
+360                (let len_slot := div([dst_ptr.expr()], 32))
+361                (sstore(len_slot, [data_size.expr()]))
+362                (datacopy([tmp_ptr.expr()], data_offset, [data_size.expr()]))
+363                ([dst_ptr.ident()] := add([dst_ptr.expr()], 32))
+364                ([yul::Statement::Expression(
+365                    provider.ptr_copy(db, tmp_ptr.expr(), dst_ptr.expr(), data_size.expr(), false, true))
+366                ])
+367            }
+368        }
+369    } else {
+370        function_definition! {
+371            function [func_name.ident()]([dst_ptr.ident()]) {
+372                (let data_offset := dataoffset([symbol_name.clone()]))
+373                (let data_size := datasize([symbol_name]))
+374                (mstore([dst_ptr.expr()], data_size))
+375                ([dst_ptr.ident()] := add([dst_ptr.expr()], 32))
+376                (datacopy([dst_ptr.expr()], data_offset, data_size))
+377            }
+378        }
+379    };
+380
+381    RuntimeFunction::from_statement(func)
+382}
+383
+384pub(super) fn make_string_construct(
+385    provider: &mut DefaultRuntimeProvider,
+386    db: &dyn CodegenDb,
+387    func_name: &str,
+388    data: &str,
+389) -> RuntimeFunction {
+390    let func_name = YulVariable::new(func_name);
+391    let ptr_size = YulVariable::new("ptr_size");
+392    let string_ptr = YulVariable::new("string_ptr");
+393
+394    let func = function_definition! {
+395        function [func_name.ident()]([ptr_size.ident()]) -> [string_ptr.ident()] {
+396            ([string_ptr.ident()] := [provider.alloc(db, ptr_size.expr())])
+397            ([yul::Statement::Expression(provider.string_copy(db, string_ptr.expr(), data, false))])
+398        }
+399    };
+400
+401    RuntimeFunction::from_statement(func)
+402}
+403
+404pub(super) fn make_map_value_ptr_with_primitive_key(
+405    provider: &mut DefaultRuntimeProvider,
+406    db: &dyn CodegenDb,
+407    func_name: &str,
+408    key_ty: TypeId,
+409) -> RuntimeFunction {
+410    debug_assert!(key_ty.is_primitive(db.upcast()));
+411    let scratch_space = literal_expression! {(HASH_SCRATCH_SPACE_START)};
+412    let scratch_size = literal_expression! {(HASH_SCRATCH_SPACE_SIZE)};
+413    let func_name = YulVariable::new(func_name);
+414    let map_ptr = YulVariable::new("map_ptr");
+415    let key = YulVariable::new("key");
+416    let yul_primitive_type = yul_primitive_type(db);
+417
+418    let mask = BitMask::new(1).not();
+419
+420    let func = function_definition! {
+421        function [func_name.ident()]([map_ptr.ident()], [key.ident()]) -> ret {
+422        ([yul::Statement::Expression(provider.ptr_store(
+423            db,
+424            scratch_space.clone(),
+425            key.expr(),
+426            yul_primitive_type.make_mptr(db.upcast()),
+427        ))])
+428        ([yul::Statement::Expression(provider.ptr_store(
+429            db,
+430            expression!(add([scratch_space.clone()], 32)),
+431            map_ptr.expr(),
+432            yul_primitive_type.make_mptr(db.upcast()),
+433        ))])
+434        (ret := and([mask.as_expr()], (keccak256([scratch_space], [scratch_size]))))
+435    }};
+436
+437    RuntimeFunction::from_statement(func)
+438}
+439
+440pub(super) fn make_map_value_ptr_with_ptr_key(
+441    provider: &mut DefaultRuntimeProvider,
+442    db: &dyn CodegenDb,
+443    func_name: &str,
+444    key_ty: TypeId,
+445) -> RuntimeFunction {
+446    debug_assert!(key_ty.is_ptr(db.upcast()));
+447
+448    let func_name = YulVariable::new(func_name);
+449    let size = literal_expression! {(key_ty.deref(db.upcast()).size_of(db.upcast(), SLOT_SIZE))};
+450    let map_ptr = YulVariable::new("map_ptr");
+451    let key = YulVariable::new("key");
+452
+453    let key_hash = expression! { keccak256([key.expr()], [size]) };
+454    let u256_ty = yul_primitive_type(db);
+455    let def = function_definition! {
+456        function [func_name.ident()]([map_ptr.ident()], [key.ident()]) -> ret {
+457            (ret := [provider.map_value_ptr(db, map_ptr.expr(), key_hash, u256_ty)])
+458        }
+459    };
+460    RuntimeFunction::from_statement(def)
+461}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html new file mode 100644 index 0000000000..5ba832877c --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html @@ -0,0 +1,74 @@ +emit.rs - source

fe_codegen/yul/runtime/
emit.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{runtime::make_ptr, slot_size::SLOT_SIZE, YulVariable},
+4};
+5
+6use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+7
+8use fe_mir::ir::TypeId;
+9
+10use yultsur::*;
+11
+12pub(super) fn make_emit(
+13    provider: &mut DefaultRuntimeProvider,
+14    db: &dyn CodegenDb,
+15    func_name: &str,
+16    legalized_ty: TypeId,
+17) -> RuntimeFunction {
+18    let func_name = YulVariable::new(func_name);
+19    let event_ptr = YulVariable::new("event_ptr");
+20    let deref_ty = legalized_ty.deref(db.upcast());
+21
+22    let abi = db.codegen_abi_event(deref_ty);
+23    let mut topics = vec![literal_expression! {(format!("0x{}", abi.signature().hash_hex()))}];
+24    for (idx, field) in abi.inputs.iter().enumerate() {
+25        if !field.indexed {
+26            continue;
+27        }
+28        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+29        let offset =
+30            literal_expression! {(deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE))};
+31        let elem_ptr = expression! { add([event_ptr.expr()], [offset]) };
+32        let topic = if field_ty.is_aggregate(db.upcast()) {
+33            todo!()
+34        } else {
+35            let topic = provider.ptr_load(
+36                db,
+37                elem_ptr,
+38                make_ptr(db, field_ty, legalized_ty.is_sptr(db.upcast())),
+39            );
+40            provider.primitive_cast(db, topic, field_ty)
+41        };
+42
+43        topics.push(topic)
+44    }
+45
+46    let mut event_data_tys = vec![];
+47    let mut event_data_values = vec![];
+48    for (idx, field) in abi.inputs.iter().enumerate() {
+49        if field.indexed {
+50            continue;
+51        }
+52
+53        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+54        let field_offset =
+55            literal_expression! { (deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE)) };
+56        event_data_tys.push(make_ptr(db, field_ty, legalized_ty.is_sptr(db.upcast())));
+57        event_data_values.push(expression! { add([event_ptr.expr()], [field_offset]) });
+58    }
+59
+60    debug_assert!(topics.len() < 5);
+61    let log_func = identifier! { (format!("log{}", topics.len()))};
+62
+63    let event_data_ptr = YulVariable::new("event_data_ptr");
+64    let event_enc_size = YulVariable::new("event_enc_size");
+65    let func = function_definition! {
+66        function [func_name.ident()]([event_ptr.ident()]) {
+67            (let [event_data_ptr.ident()] := [provider.avail(db)])
+68            (let [event_enc_size.ident()] := [provider.abi_encode_seq(db, &event_data_values, event_data_ptr.expr(), &event_data_tys, false )])
+69            ([log_func]([event_data_ptr.expr()], [event_enc_size.expr()], [topics...]))
+70        }
+71    };
+72
+73    RuntimeFunction::from_statement(func)
+74}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html new file mode 100644 index 0000000000..3a3916b292 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html @@ -0,0 +1,828 @@ +mod.rs - source

fe_codegen/yul/runtime/
mod.rs

1mod abi;
+2mod contract;
+3mod data;
+4mod emit;
+5mod revert;
+6mod safe_math;
+7
+8use std::fmt::Write;
+9
+10use fe_abi::types::AbiType;
+11use fe_analyzer::namespace::items::ContractId;
+12use fe_mir::ir::{types::ArrayDef, FunctionId, TypeId, TypeKind};
+13use indexmap::IndexMap;
+14use yultsur::*;
+15
+16use num_bigint::BigInt;
+17
+18use crate::{db::CodegenDb, yul::slot_size::SLOT_SIZE};
+19
+20use super::slot_size::yul_primitive_type;
+21
+22pub trait RuntimeProvider {
+23    fn collect_definitions(&self) -> Vec<yul::FunctionDefinition>;
+24
+25    fn alloc(&mut self, db: &dyn CodegenDb, size: yul::Expression) -> yul::Expression;
+26
+27    fn avail(&mut self, db: &dyn CodegenDb) -> yul::Expression;
+28
+29    fn create(
+30        &mut self,
+31        db: &dyn CodegenDb,
+32        contract: ContractId,
+33        value: yul::Expression,
+34    ) -> yul::Expression;
+35
+36    fn create2(
+37        &mut self,
+38        db: &dyn CodegenDb,
+39        contract: ContractId,
+40        value: yul::Expression,
+41        salt: yul::Expression,
+42    ) -> yul::Expression;
+43
+44    fn emit(
+45        &mut self,
+46        db: &dyn CodegenDb,
+47        event: yul::Expression,
+48        event_ty: TypeId,
+49    ) -> yul::Expression;
+50
+51    fn revert(
+52        &mut self,
+53        db: &dyn CodegenDb,
+54        arg: Option<yul::Expression>,
+55        arg_name: &str,
+56        arg_ty: TypeId,
+57    ) -> yul::Expression;
+58
+59    fn external_call(
+60        &mut self,
+61        db: &dyn CodegenDb,
+62        function: FunctionId,
+63        args: Vec<yul::Expression>,
+64    ) -> yul::Expression;
+65
+66    fn map_value_ptr(
+67        &mut self,
+68        db: &dyn CodegenDb,
+69        map_ptr: yul::Expression,
+70        key: yul::Expression,
+71        key_ty: TypeId,
+72    ) -> yul::Expression;
+73
+74    fn aggregate_init(
+75        &mut self,
+76        db: &dyn CodegenDb,
+77        ptr: yul::Expression,
+78        args: Vec<yul::Expression>,
+79        ptr_ty: TypeId,
+80        arg_tys: Vec<TypeId>,
+81    ) -> yul::Expression;
+82
+83    fn string_copy(
+84        &mut self,
+85        db: &dyn CodegenDb,
+86        dst: yul::Expression,
+87        data: &str,
+88        is_dst_storage: bool,
+89    ) -> yul::Expression;
+90
+91    fn string_construct(
+92        &mut self,
+93        db: &dyn CodegenDb,
+94        data: &str,
+95        string_len: usize,
+96    ) -> yul::Expression;
+97
+98    /// Copy data from `src` to `dst`.
+99    /// NOTE: src and dst must be aligned by 32 when a ptr is storage ptr.
+100    fn ptr_copy(
+101        &mut self,
+102        db: &dyn CodegenDb,
+103        src: yul::Expression,
+104        dst: yul::Expression,
+105        size: yul::Expression,
+106        is_src_storage: bool,
+107        is_dst_storage: bool,
+108    ) -> yul::Expression;
+109
+110    fn ptr_store(
+111        &mut self,
+112        db: &dyn CodegenDb,
+113        ptr: yul::Expression,
+114        imm: yul::Expression,
+115        ptr_ty: TypeId,
+116    ) -> yul::Expression;
+117
+118    fn ptr_load(
+119        &mut self,
+120        db: &dyn CodegenDb,
+121        ptr: yul::Expression,
+122        ptr_ty: TypeId,
+123    ) -> yul::Expression;
+124
+125    fn abi_encode(
+126        &mut self,
+127        db: &dyn CodegenDb,
+128        src: yul::Expression,
+129        dst: yul::Expression,
+130        src_ty: TypeId,
+131        is_dst_storage: bool,
+132    ) -> yul::Expression;
+133
+134    fn abi_encode_seq(
+135        &mut self,
+136        db: &dyn CodegenDb,
+137        src: &[yul::Expression],
+138        dst: yul::Expression,
+139        src_tys: &[TypeId],
+140        is_dst_storage: bool,
+141    ) -> yul::Expression;
+142
+143    fn abi_decode(
+144        &mut self,
+145        db: &dyn CodegenDb,
+146        src: yul::Expression,
+147        size: yul::Expression,
+148        types: &[TypeId],
+149        abi_loc: AbiSrcLocation,
+150    ) -> yul::Expression;
+151
+152    fn primitive_cast(
+153        &mut self,
+154        db: &dyn CodegenDb,
+155        value: yul::Expression,
+156        from_ty: TypeId,
+157    ) -> yul::Expression {
+158        debug_assert!(from_ty.is_primitive(db.upcast()));
+159        let from_size = from_ty.size_of(db.upcast(), SLOT_SIZE);
+160
+161        if from_ty.is_signed(db.upcast()) {
+162            let significant = literal_expression! {(from_size-1)};
+163            expression! { signextend([significant], [value]) }
+164        } else {
+165            let mask = BitMask::new(from_size);
+166            expression! { and([value], [mask.as_expr()]) }
+167        }
+168    }
+169
+170    // TODO: The all functions below will be reimplemented in `std`.
+171    fn safe_add(
+172        &mut self,
+173        db: &dyn CodegenDb,
+174        lhs: yul::Expression,
+175        rhs: yul::Expression,
+176        ty: TypeId,
+177    ) -> yul::Expression;
+178
+179    fn safe_sub(
+180        &mut self,
+181        db: &dyn CodegenDb,
+182        lhs: yul::Expression,
+183        rhs: yul::Expression,
+184        ty: TypeId,
+185    ) -> yul::Expression;
+186
+187    fn safe_mul(
+188        &mut self,
+189        db: &dyn CodegenDb,
+190        lhs: yul::Expression,
+191        rhs: yul::Expression,
+192        ty: TypeId,
+193    ) -> yul::Expression;
+194
+195    fn safe_div(
+196        &mut self,
+197        db: &dyn CodegenDb,
+198        lhs: yul::Expression,
+199        rhs: yul::Expression,
+200        ty: TypeId,
+201    ) -> yul::Expression;
+202
+203    fn safe_mod(
+204        &mut self,
+205        db: &dyn CodegenDb,
+206        lhs: yul::Expression,
+207        rhs: yul::Expression,
+208        ty: TypeId,
+209    ) -> yul::Expression;
+210
+211    fn safe_pow(
+212        &mut self,
+213        db: &dyn CodegenDb,
+214        lhs: yul::Expression,
+215        rhs: yul::Expression,
+216        ty: TypeId,
+217    ) -> yul::Expression;
+218}
+219
+220#[derive(Clone, Copy, Debug)]
+221pub enum AbiSrcLocation {
+222    CallData,
+223    Memory,
+224}
+225
+226#[derive(Debug, Default)]
+227pub struct DefaultRuntimeProvider {
+228    functions: IndexMap<String, RuntimeFunction>,
+229}
+230
+231impl DefaultRuntimeProvider {
+232    fn create_then_call<F>(
+233        &mut self,
+234        name: &str,
+235        args: Vec<yul::Expression>,
+236        func_builder: F,
+237    ) -> yul::Expression
+238    where
+239        F: FnOnce(&mut Self) -> RuntimeFunction,
+240    {
+241        if let Some(func) = self.functions.get(name) {
+242            func.call(args)
+243        } else {
+244            let func = func_builder(self);
+245            let result = func.call(args);
+246            self.functions.insert(name.to_string(), func);
+247            result
+248        }
+249    }
+250}
+251
+252impl RuntimeProvider for DefaultRuntimeProvider {
+253    fn collect_definitions(&self) -> Vec<yul::FunctionDefinition> {
+254        self.functions
+255            .values()
+256            .map(RuntimeFunction::definition)
+257            .collect()
+258    }
+259
+260    fn alloc(&mut self, _db: &dyn CodegenDb, bytes: yul::Expression) -> yul::Expression {
+261        let name = "$alloc";
+262        let arg = vec![bytes];
+263        self.create_then_call(name, arg, |_| data::make_alloc(name))
+264    }
+265
+266    fn avail(&mut self, _db: &dyn CodegenDb) -> yul::Expression {
+267        let name = "$avail";
+268        let arg = vec![];
+269        self.create_then_call(name, arg, |_| data::make_avail(name))
+270    }
+271
+272    fn create(
+273        &mut self,
+274        db: &dyn CodegenDb,
+275        contract: ContractId,
+276        value: yul::Expression,
+277    ) -> yul::Expression {
+278        let name = format!("$create_{}", db.codegen_contract_symbol_name(contract));
+279        let arg = vec![value];
+280        self.create_then_call(&name, arg, |provider| {
+281            contract::make_create(provider, db, &name, contract)
+282        })
+283    }
+284
+285    fn create2(
+286        &mut self,
+287        db: &dyn CodegenDb,
+288        contract: ContractId,
+289        value: yul::Expression,
+290        salt: yul::Expression,
+291    ) -> yul::Expression {
+292        let name = format!("$create2_{}", db.codegen_contract_symbol_name(contract));
+293        let arg = vec![value, salt];
+294        self.create_then_call(&name, arg, |provider| {
+295            contract::make_create2(provider, db, &name, contract)
+296        })
+297    }
+298
+299    fn emit(
+300        &mut self,
+301        db: &dyn CodegenDb,
+302        event: yul::Expression,
+303        event_ty: TypeId,
+304    ) -> yul::Expression {
+305        let name = format!("$emit_{}", event_ty.0);
+306        let legalized_ty = db.codegen_legalized_type(event_ty);
+307        self.create_then_call(&name, vec![event], |provider| {
+308            emit::make_emit(provider, db, &name, legalized_ty)
+309        })
+310    }
+311
+312    fn revert(
+313        &mut self,
+314        db: &dyn CodegenDb,
+315        arg: Option<yul::Expression>,
+316        arg_name: &str,
+317        arg_ty: TypeId,
+318    ) -> yul::Expression {
+319        let func_name = format! {"$revert_{}_{}", arg_name, arg_ty.0};
+320        let args = match arg {
+321            Some(arg) => vec![arg],
+322            None => vec![],
+323        };
+324        self.create_then_call(&func_name, args, |provider| {
+325            revert::make_revert(provider, db, &func_name, arg_name, arg_ty)
+326        })
+327    }
+328
+329    fn external_call(
+330        &mut self,
+331        db: &dyn CodegenDb,
+332        function: FunctionId,
+333        args: Vec<yul::Expression>,
+334    ) -> yul::Expression {
+335        let name = format!(
+336            "$call_external__{}",
+337            db.codegen_function_symbol_name(function)
+338        );
+339        self.create_then_call(&name, args, |provider| {
+340            contract::make_external_call(provider, db, &name, function)
+341        })
+342    }
+343
+344    fn map_value_ptr(
+345        &mut self,
+346        db: &dyn CodegenDb,
+347        map_ptr: yul::Expression,
+348        key: yul::Expression,
+349        key_ty: TypeId,
+350    ) -> yul::Expression {
+351        if key_ty.is_primitive(db.upcast()) {
+352            let name = "$map_value_ptr_with_primitive_key";
+353            self.create_then_call(name, vec![map_ptr, key], |provider| {
+354                data::make_map_value_ptr_with_primitive_key(provider, db, name, key_ty)
+355            })
+356        } else if key_ty.is_mptr(db.upcast()) {
+357            let name = "$map_value_ptr_with_ptr_key";
+358            self.create_then_call(name, vec![map_ptr, key], |provider| {
+359                data::make_map_value_ptr_with_ptr_key(provider, db, name, key_ty)
+360            })
+361        } else {
+362            unreachable!()
+363        }
+364    }
+365
+366    fn aggregate_init(
+367        &mut self,
+368        db: &dyn CodegenDb,
+369        ptr: yul::Expression,
+370        mut args: Vec<yul::Expression>,
+371        ptr_ty: TypeId,
+372        arg_tys: Vec<TypeId>,
+373    ) -> yul::Expression {
+374        debug_assert!(ptr_ty.is_ptr(db.upcast()));
+375        let deref_ty = ptr_ty.deref(db.upcast());
+376
+377        // Handle unit enum variant.
+378        if args.len() == 1 && deref_ty.is_enum(db.upcast()) {
+379            let tag = args.pop().unwrap();
+380            let tag_ty = arg_tys[0];
+381            let is_sptr = ptr_ty.is_sptr(db.upcast());
+382            return self.ptr_store(db, ptr, tag, make_ptr(db, tag_ty, is_sptr));
+383        }
+384
+385        let deref_ty = ptr_ty.deref(db.upcast());
+386        let args = std::iter::once(ptr).chain(args).collect();
+387        let legalized_ty = db.codegen_legalized_type(ptr_ty);
+388        if deref_ty.is_enum(db.upcast()) {
+389            let mut name = format!("enum_init_{}", ptr_ty.0);
+390            for ty in &arg_tys {
+391                write!(&mut name, "_{}", ty.0).unwrap();
+392            }
+393            self.create_then_call(&name, args, |provider| {
+394                data::make_enum_init(provider, db, &name, legalized_ty, arg_tys)
+395            })
+396        } else {
+397            let name = format!("$aggregate_init_{}", ptr_ty.0);
+398            self.create_then_call(&name, args, |provider| {
+399                data::make_aggregate_init(provider, db, &name, legalized_ty, arg_tys)
+400            })
+401        }
+402    }
+403
+404    fn string_copy(
+405        &mut self,
+406        db: &dyn CodegenDb,
+407        dst: yul::Expression,
+408        data: &str,
+409        is_dst_storage: bool,
+410    ) -> yul::Expression {
+411        debug_assert!(data.is_ascii());
+412        let symbol_name = db.codegen_constant_string_symbol_name(data.to_string());
+413
+414        let name = if is_dst_storage {
+415            format!("$string_copy_{symbol_name}_storage")
+416        } else {
+417            format!("$string_copy_{symbol_name}_memory")
+418        };
+419
+420        self.create_then_call(&name, vec![dst], |provider| {
+421            data::make_string_copy(provider, db, &name, data, is_dst_storage)
+422        })
+423    }
+424
+425    fn string_construct(
+426        &mut self,
+427        db: &dyn CodegenDb,
+428        data: &str,
+429        string_len: usize,
+430    ) -> yul::Expression {
+431        debug_assert!(data.is_ascii());
+432        debug_assert!(string_len >= data.len());
+433        let symbol_name = db.codegen_constant_string_symbol_name(data.to_string());
+434
+435        let name = format!("$string_construct_{symbol_name}");
+436        let arg = literal_expression!((32 + string_len));
+437        self.create_then_call(&name, vec![arg], |provider| {
+438            data::make_string_construct(provider, db, &name, data)
+439        })
+440    }
+441
+442    fn ptr_copy(
+443        &mut self,
+444        _db: &dyn CodegenDb,
+445        src: yul::Expression,
+446        dst: yul::Expression,
+447        size: yul::Expression,
+448        is_src_storage: bool,
+449        is_dst_storage: bool,
+450    ) -> yul::Expression {
+451        let args = vec![src, dst, size];
+452        match (is_src_storage, is_dst_storage) {
+453            (true, true) => {
+454                let name = "scopys";
+455                self.create_then_call(name, args, |_| data::make_scopys(name))
+456            }
+457            (true, false) => {
+458                let name = "scopym";
+459                self.create_then_call(name, args, |_| data::make_scopym(name))
+460            }
+461            (false, true) => {
+462                let name = "mcopys";
+463                self.create_then_call(name, args, |_| data::make_mcopys(name))
+464            }
+465            (false, false) => {
+466                let name = "mcopym";
+467                self.create_then_call(name, args, |_| data::make_mcopym(name))
+468            }
+469        }
+470    }
+471
+472    fn ptr_store(
+473        &mut self,
+474        db: &dyn CodegenDb,
+475        ptr: yul::Expression,
+476        imm: yul::Expression,
+477        ptr_ty: TypeId,
+478    ) -> yul::Expression {
+479        debug_assert!(ptr_ty.is_ptr(db.upcast()));
+480        let size = ptr_ty.deref(db.upcast()).size_of(db.upcast(), SLOT_SIZE);
+481        debug_assert!(size <= 32);
+482
+483        let size_bits = size * 8;
+484        if ptr_ty.is_sptr(db.upcast()) {
+485            let name = "$sptr_store";
+486            let args = vec![ptr, imm, literal_expression! {(size_bits)}];
+487            self.create_then_call(name, args, |_| data::make_sptr_store(name))
+488        } else if ptr_ty.is_mptr(db.upcast()) {
+489            let name = "$mptr_store";
+490            let shift_num = literal_expression! {(256 - size_bits)};
+491            let mask = BitMask::new(32 - size);
+492            let args = vec![ptr, imm, shift_num, mask.as_expr()];
+493            self.create_then_call(name, args, |_| data::make_mptr_store(name))
+494        } else {
+495            unreachable!()
+496        }
+497    }
+498
+499    fn ptr_load(
+500        &mut self,
+501        db: &dyn CodegenDb,
+502        ptr: yul::Expression,
+503        ptr_ty: TypeId,
+504    ) -> yul::Expression {
+505        debug_assert!(ptr_ty.is_ptr(db.upcast()));
+506        let size = ptr_ty.deref(db.upcast()).size_of(db.upcast(), SLOT_SIZE);
+507        debug_assert!(size <= 32);
+508
+509        let size_bits = size * 8;
+510        if ptr_ty.is_sptr(db.upcast()) {
+511            let name = "$sptr_load";
+512            let args = vec![ptr, literal_expression! {(size_bits)}];
+513            self.create_then_call(name, args, |_| data::make_sptr_load(name))
+514        } else if ptr_ty.is_mptr(db.upcast()) {
+515            let name = "$mptr_load";
+516            let shift_num = literal_expression! {(256 - size_bits)};
+517            let args = vec![ptr, shift_num];
+518            self.create_then_call(name, args, |_| data::make_mptr_load(name))
+519        } else {
+520            unreachable!()
+521        }
+522    }
+523
+524    fn abi_encode(
+525        &mut self,
+526        db: &dyn CodegenDb,
+527        src: yul::Expression,
+528        dst: yul::Expression,
+529        src_ty: TypeId,
+530        is_dst_storage: bool,
+531    ) -> yul::Expression {
+532        let legalized_ty = db.codegen_legalized_type(src_ty);
+533        let args = vec![src.clone(), dst.clone()];
+534
+535        let func_name_postfix = if is_dst_storage { "storage" } else { "memory" };
+536
+537        if legalized_ty.is_primitive(db.upcast()) {
+538            let name = format!(
+539                "$abi_encode_primitive_type_{}_to_{}",
+540                src_ty.0, func_name_postfix
+541            );
+542            return self.create_then_call(&name, args, |provider| {
+543                abi::make_abi_encode_primitive_type(
+544                    provider,
+545                    db,
+546                    &name,
+547                    legalized_ty,
+548                    is_dst_storage,
+549                )
+550            });
+551        }
+552
+553        let deref_ty = legalized_ty.deref(db.upcast());
+554        let abi_ty = db.codegen_abi_type(deref_ty);
+555        match abi_ty {
+556            AbiType::UInt(_) | AbiType::Int(_) | AbiType::Bool | AbiType::Address => {
+557                let value = self.ptr_load(db, src, src_ty);
+558                let extended_value = self.primitive_cast(db, value, deref_ty);
+559                self.abi_encode(db, extended_value, dst, deref_ty, is_dst_storage)
+560            }
+561            AbiType::Array { elem_ty, .. } => {
+562                if elem_ty.is_static() {
+563                    let name = format!(
+564                        "$abi_encode_static_array_type_{}_to_{}",
+565                        src_ty.0, func_name_postfix
+566                    );
+567                    self.create_then_call(&name, args, |provider| {
+568                        abi::make_abi_encode_static_array_type(provider, db, &name, legalized_ty)
+569                    })
+570                } else {
+571                    let name = format! {
+572                       "$abi_encode_dynamic_array_type{}_to_{}", src_ty.0, func_name_postfix
+573                    };
+574                    self.create_then_call(&name, args, |provider| {
+575                        abi::make_abi_encode_dynamic_array_type(provider, db, &name, legalized_ty)
+576                    })
+577                }
+578            }
+579            AbiType::Tuple(_) => {
+580                if abi_ty.is_static() {
+581                    let name = format!(
+582                        "$abi_encode_static_aggregate_type_{}_to_{}",
+583                        src_ty.0, func_name_postfix
+584                    );
+585                    self.create_then_call(&name, args, |provider| {
+586                        abi::make_abi_encode_static_aggregate_type(
+587                            provider,
+588                            db,
+589                            &name,
+590                            legalized_ty,
+591                            is_dst_storage,
+592                        )
+593                    })
+594                } else {
+595                    let name = format!(
+596                        "$abi_encode_dynamic_aggregate_type_{}_to_{}",
+597                        src_ty.0, func_name_postfix
+598                    );
+599                    self.create_then_call(&name, args, |provider| {
+600                        abi::make_abi_encode_dynamic_aggregate_type(
+601                            provider,
+602                            db,
+603                            &name,
+604                            legalized_ty,
+605                            is_dst_storage,
+606                        )
+607                    })
+608                }
+609            }
+610            AbiType::Bytes => {
+611                let len = match &deref_ty.data(db.upcast()).kind {
+612                    TypeKind::Array(ArrayDef { len, .. }) => *len,
+613                    _ => unreachable!(),
+614                };
+615                let name = format! {"$abi_encode_bytes{len}_type_to_{func_name_postfix}"};
+616                self.create_then_call(&name, args, |provider| {
+617                    abi::make_abi_encode_bytes_type(provider, db, &name, len, is_dst_storage)
+618                })
+619            }
+620            AbiType::String => {
+621                let name = format! {"$abi_encode_string_type_to_{func_name_postfix}"};
+622                self.create_then_call(&name, args, |provider| {
+623                    abi::make_abi_encode_string_type(provider, db, &name, is_dst_storage)
+624                })
+625            }
+626            AbiType::Function => unreachable!(),
+627        }
+628    }
+629
+630    fn abi_encode_seq(
+631        &mut self,
+632        db: &dyn CodegenDb,
+633        src: &[yul::Expression],
+634        dst: yul::Expression,
+635        src_tys: &[TypeId],
+636        is_dst_storage: bool,
+637    ) -> yul::Expression {
+638        let mut name = "$abi_encode_value_seq".to_string();
+639        for ty in src_tys {
+640            write!(&mut name, "_{}", ty.0).unwrap();
+641        }
+642
+643        let mut args = vec![dst];
+644        args.extend(src.iter().cloned());
+645        self.create_then_call(&name, args, |provider| {
+646            abi::make_abi_encode_seq(provider, db, &name, src_tys, is_dst_storage)
+647        })
+648    }
+649
+650    fn abi_decode(
+651        &mut self,
+652        db: &dyn CodegenDb,
+653        src: yul::Expression,
+654        size: yul::Expression,
+655        types: &[TypeId],
+656        abi_loc: AbiSrcLocation,
+657    ) -> yul::Expression {
+658        let mut name = "$abi_decode".to_string();
+659        for ty in types {
+660            write!(name, "_{}", ty.0).unwrap();
+661        }
+662
+663        match abi_loc {
+664            AbiSrcLocation::CallData => write!(name, "_from_calldata").unwrap(),
+665            AbiSrcLocation::Memory => write!(name, "_from_memory").unwrap(),
+666        };
+667
+668        self.create_then_call(&name, vec![src, size], |provider| {
+669            abi::make_abi_decode(provider, db, &name, types, abi_loc)
+670        })
+671    }
+672
+673    fn safe_add(
+674        &mut self,
+675        db: &dyn CodegenDb,
+676        lhs: yul::Expression,
+677        rhs: yul::Expression,
+678        ty: TypeId,
+679    ) -> yul::Expression {
+680        debug_assert!(ty.is_integral(db.upcast()));
+681        safe_math::dispatch_safe_add(self, db, lhs, rhs, ty)
+682    }
+683
+684    fn safe_sub(
+685        &mut self,
+686        db: &dyn CodegenDb,
+687        lhs: yul::Expression,
+688        rhs: yul::Expression,
+689        ty: TypeId,
+690    ) -> yul::Expression {
+691        debug_assert!(ty.is_integral(db.upcast()));
+692        safe_math::dispatch_safe_sub(self, db, lhs, rhs, ty)
+693    }
+694
+695    fn safe_mul(
+696        &mut self,
+697        db: &dyn CodegenDb,
+698        lhs: yul::Expression,
+699        rhs: yul::Expression,
+700        ty: TypeId,
+701    ) -> yul::Expression {
+702        debug_assert!(ty.is_integral(db.upcast()));
+703        safe_math::dispatch_safe_mul(self, db, lhs, rhs, ty)
+704    }
+705
+706    fn safe_div(
+707        &mut self,
+708        db: &dyn CodegenDb,
+709        lhs: yul::Expression,
+710        rhs: yul::Expression,
+711        ty: TypeId,
+712    ) -> yul::Expression {
+713        debug_assert!(ty.is_integral(db.upcast()));
+714        safe_math::dispatch_safe_div(self, db, lhs, rhs, ty)
+715    }
+716
+717    fn safe_mod(
+718        &mut self,
+719        db: &dyn CodegenDb,
+720        lhs: yul::Expression,
+721        rhs: yul::Expression,
+722        ty: TypeId,
+723    ) -> yul::Expression {
+724        debug_assert!(ty.is_integral(db.upcast()));
+725        safe_math::dispatch_safe_mod(self, db, lhs, rhs, ty)
+726    }
+727
+728    fn safe_pow(
+729        &mut self,
+730        db: &dyn CodegenDb,
+731        lhs: yul::Expression,
+732        rhs: yul::Expression,
+733        ty: TypeId,
+734    ) -> yul::Expression {
+735        debug_assert!(ty.is_integral(db.upcast()));
+736        safe_math::dispatch_safe_pow(self, db, lhs, rhs, ty)
+737    }
+738}
+739
+740#[derive(Debug)]
+741struct RuntimeFunction(yul::FunctionDefinition);
+742
+743impl RuntimeFunction {
+744    fn arg_num(&self) -> usize {
+745        self.0.parameters.len()
+746    }
+747
+748    fn definition(&self) -> yul::FunctionDefinition {
+749        self.0.clone()
+750    }
+751
+752    /// # Panics
+753    /// Panics if a number of arguments doesn't match the definition.
+754    fn call(&self, args: Vec<yul::Expression>) -> yul::Expression {
+755        debug_assert_eq!(self.arg_num(), args.len());
+756
+757        yul::Expression::FunctionCall(yul::FunctionCall {
+758            identifier: self.0.name.clone(),
+759            arguments: args,
+760        })
+761    }
+762
+763    /// Remove this when `yultsur::function_definition!` becomes to return
+764    /// `FunctionDefinition`.
+765    fn from_statement(func: yul::Statement) -> Self {
+766        match func {
+767            yul::Statement::FunctionDefinition(def) => Self(def),
+768            _ => unreachable!(),
+769        }
+770    }
+771}
+772
+773fn make_ptr(db: &dyn CodegenDb, inner: TypeId, is_sptr: bool) -> TypeId {
+774    if is_sptr {
+775        inner.make_sptr(db.upcast())
+776    } else {
+777        inner.make_mptr(db.upcast())
+778    }
+779}
+780
+781struct BitMask(BigInt);
+782
+783impl BitMask {
+784    fn new(byte_size: usize) -> Self {
+785        debug_assert!(byte_size <= 32);
+786        let one: BigInt = 1usize.into();
+787        Self((one << (byte_size * 8)) - 1)
+788    }
+789
+790    fn not(&self) -> Self {
+791        // Bigint is variable length integer, so we need special handling for `not`
+792        // operation.
+793        let one: BigInt = 1usize.into();
+794        let u256_max = (one << 256) - 1;
+795        Self(u256_max ^ &self.0)
+796    }
+797
+798    fn as_expr(&self) -> yul::Expression {
+799        let mask = format!("{:#x}", self.0);
+800        literal_expression! {(mask)}
+801    }
+802}
+803
+804pub(super) fn error_revert_numeric(
+805    provider: &mut dyn RuntimeProvider,
+806    db: &dyn CodegenDb,
+807    error_code: yul::Expression,
+808) -> yul::Statement {
+809    yul::Statement::Expression(provider.revert(
+810        db,
+811        Some(error_code),
+812        "Error",
+813        yul_primitive_type(db),
+814    ))
+815}
+816
+817pub(super) fn panic_revert_numeric(
+818    provider: &mut dyn RuntimeProvider,
+819    db: &dyn CodegenDb,
+820    error_code: yul::Expression,
+821) -> yul::Statement {
+822    yul::Statement::Expression(provider.revert(
+823        db,
+824        Some(error_code),
+825        "Panic",
+826        yul_primitive_type(db),
+827    ))
+828}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html new file mode 100644 index 0000000000..999eacab98 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html @@ -0,0 +1,90 @@ +revert.rs - source

fe_codegen/yul/runtime/
revert.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{slot_size::function_hash_type, YulVariable},
+4};
+5
+6use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+7
+8use fe_abi::function::{AbiFunction, AbiFunctionType, StateMutability};
+9use fe_mir::ir::{self, TypeId};
+10use yultsur::*;
+11
+12pub(super) fn make_revert(
+13    provider: &mut DefaultRuntimeProvider,
+14    db: &dyn CodegenDb,
+15    func_name: &str,
+16    arg_name: &str,
+17    arg_ty: TypeId,
+18) -> RuntimeFunction {
+19    let func_name = YulVariable::new(func_name);
+20    let arg = YulVariable::new("arg");
+21
+22    let abi_size = YulVariable::new("abi_size");
+23    let abi_tmp_ptr = YulVariable::new("$abi_tmp_ptr");
+24    let signature = type_signature_for_revert(db, arg_name, arg_ty);
+25
+26    let signature_store = yul::Statement::Expression(provider.ptr_store(
+27        db,
+28        abi_tmp_ptr.expr(),
+29        signature,
+30        function_hash_type(db).make_mptr(db.upcast()),
+31    ));
+32
+33    let func = if arg_ty.deref(db.upcast()).is_zero_sized(db.upcast()) {
+34        function_definition! {
+35            function [func_name.ident()]() {
+36                (let [abi_tmp_ptr.ident()] := [provider.avail(db)])
+37                ([signature_store])
+38                (revert([abi_tmp_ptr.expr()], [literal_expression!{4}]))
+39            }
+40        }
+41    } else {
+42        let encode = provider.abi_encode_seq(
+43            db,
+44            &[arg.expr()],
+45            expression! { add([abi_tmp_ptr.expr()], 4) },
+46            &[arg_ty],
+47            false,
+48        );
+49
+50        function_definition! {
+51            function [func_name.ident()]([arg.ident()]) {
+52                (let [abi_tmp_ptr.ident()] := [provider.avail(db)])
+53                ([signature_store])
+54                (let [abi_size.ident()] := add([encode], 4))
+55                (revert([abi_tmp_ptr.expr()], [abi_size.expr()]))
+56            }
+57        }
+58    };
+59
+60    RuntimeFunction::from_statement(func)
+61}
+62
+63/// Returns signature hash of the type.
+64fn type_signature_for_revert(db: &dyn CodegenDb, name: &str, ty: TypeId) -> yul::Expression {
+65    let deref_ty = ty.deref(db.upcast());
+66    let ty_data = deref_ty.data(db.upcast());
+67    let args = match &ty_data.kind {
+68        ir::TypeKind::Struct(def) => def
+69            .fields
+70            .iter()
+71            .map(|(_, ty)| ("".to_string(), db.codegen_abi_type(*ty)))
+72            .collect(),
+73        _ => {
+74            let abi_ty = db.codegen_abi_type(deref_ty);
+75            vec![("_".to_string(), abi_ty)]
+76        }
+77    };
+78
+79    // selector and state mutability is independent we can set has_self and has_ctx any value.
+80    let selector = AbiFunction::new(
+81        AbiFunctionType::Function,
+82        name.to_string(),
+83        args,
+84        None,
+85        StateMutability::Pure,
+86    )
+87    .selector();
+88    let type_sig = selector.hex();
+89    literal_expression! {(format!{"0x{type_sig}" })}
+90}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html new file mode 100644 index 0000000000..790e1eab49 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html @@ -0,0 +1,628 @@ +safe_math.rs - source

fe_codegen/yul/runtime/
safe_math.rs

1use crate::{db::CodegenDb, yul::YulVariable};
+2
+3use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+4
+5use fe_mir::ir::{TypeId, TypeKind};
+6
+7use yultsur::*;
+8
+9pub(super) fn dispatch_safe_add(
+10    provider: &mut DefaultRuntimeProvider,
+11    db: &dyn CodegenDb,
+12    lhs: yul::Expression,
+13    rhs: yul::Expression,
+14    ty: TypeId,
+15) -> yul::Expression {
+16    debug_assert!(ty.is_integral(db.upcast()));
+17    let min_value = get_min_value(db, ty);
+18    let max_value = get_max_value(db, ty);
+19
+20    if ty.is_signed(db.upcast()) {
+21        let name = "$safe_add_signed";
+22        let args = vec![lhs, rhs, min_value, max_value];
+23        provider.create_then_call(name, args, |provider| {
+24            make_safe_add_signed(provider, db, name)
+25        })
+26    } else {
+27        let name = "$safe_add_unsigned";
+28        let args = vec![lhs, rhs, max_value];
+29        provider.create_then_call(name, args, |provider| {
+30            make_safe_add_unsigned(provider, db, name)
+31        })
+32    }
+33}
+34
+35pub(super) fn dispatch_safe_sub(
+36    provider: &mut DefaultRuntimeProvider,
+37    db: &dyn CodegenDb,
+38    lhs: yul::Expression,
+39    rhs: yul::Expression,
+40    ty: TypeId,
+41) -> yul::Expression {
+42    debug_assert!(ty.is_integral(db.upcast()));
+43    let min_value = get_min_value(db, ty);
+44    let max_value = get_max_value(db, ty);
+45
+46    if ty.is_signed(db.upcast()) {
+47        let name = "$safe_sub_signed";
+48        let args = vec![lhs, rhs, min_value, max_value];
+49        provider.create_then_call(name, args, |provider| {
+50            make_safe_sub_signed(provider, db, name)
+51        })
+52    } else {
+53        let name = "$safe_sub_unsigned";
+54        let args = vec![lhs, rhs];
+55        provider.create_then_call(name, args, |provider| {
+56            make_safe_sub_unsigned(provider, db, name)
+57        })
+58    }
+59}
+60
+61pub(super) fn dispatch_safe_mul(
+62    provider: &mut DefaultRuntimeProvider,
+63    db: &dyn CodegenDb,
+64    lhs: yul::Expression,
+65    rhs: yul::Expression,
+66    ty: TypeId,
+67) -> yul::Expression {
+68    debug_assert!(ty.is_integral(db.upcast()));
+69    let min_value = get_min_value(db, ty);
+70    let max_value = get_max_value(db, ty);
+71
+72    if ty.is_signed(db.upcast()) {
+73        let name = "$safe_mul_signed";
+74        let args = vec![lhs, rhs, min_value, max_value];
+75        provider.create_then_call(name, args, |provider| {
+76            make_safe_mul_signed(provider, db, name)
+77        })
+78    } else {
+79        let name = "$safe_mul_unsigned";
+80        let args = vec![lhs, rhs, max_value];
+81        provider.create_then_call(name, args, |provider| {
+82            make_safe_mul_unsigned(provider, db, name)
+83        })
+84    }
+85}
+86
+87pub(super) fn dispatch_safe_div(
+88    provider: &mut DefaultRuntimeProvider,
+89    db: &dyn CodegenDb,
+90    lhs: yul::Expression,
+91    rhs: yul::Expression,
+92    ty: TypeId,
+93) -> yul::Expression {
+94    debug_assert!(ty.is_integral(db.upcast()));
+95    let min_value = get_min_value(db, ty);
+96
+97    if ty.is_signed(db.upcast()) {
+98        let name = "$safe_div_signed";
+99        let args = vec![lhs, rhs, min_value];
+100        provider.create_then_call(name, args, |provider| {
+101            make_safe_div_signed(provider, db, name)
+102        })
+103    } else {
+104        let name = "$safe_div_unsigned";
+105        let args = vec![lhs, rhs];
+106        provider.create_then_call(name, args, |provider| {
+107            make_safe_div_unsigned(provider, db, name)
+108        })
+109    }
+110}
+111
+112pub(super) fn dispatch_safe_mod(
+113    provider: &mut DefaultRuntimeProvider,
+114    db: &dyn CodegenDb,
+115    lhs: yul::Expression,
+116    rhs: yul::Expression,
+117    ty: TypeId,
+118) -> yul::Expression {
+119    debug_assert!(ty.is_integral(db.upcast()));
+120    if ty.is_signed(db.upcast()) {
+121        let name = "$safe_mod_signed";
+122        let args = vec![lhs, rhs];
+123        provider.create_then_call(name, args, |provider| {
+124            make_safe_mod_signed(provider, db, name)
+125        })
+126    } else {
+127        let name = "$safe_mod_unsigned";
+128        let args = vec![lhs, rhs];
+129        provider.create_then_call(name, args, |provider| {
+130            make_safe_mod_unsigned(provider, db, name)
+131        })
+132    }
+133}
+134
+135pub(super) fn dispatch_safe_pow(
+136    provider: &mut DefaultRuntimeProvider,
+137    db: &dyn CodegenDb,
+138    lhs: yul::Expression,
+139    rhs: yul::Expression,
+140    ty: TypeId,
+141) -> yul::Expression {
+142    debug_assert!(ty.is_integral(db.upcast()));
+143    let min_value = get_min_value(db, ty);
+144    let max_value = get_max_value(db, ty);
+145
+146    if ty.is_signed(db.upcast()) {
+147        let name = "$safe_pow_signed";
+148        let args = vec![lhs, rhs, min_value, max_value];
+149        provider.create_then_call(name, args, |provider| {
+150            make_safe_pow_signed(provider, db, name)
+151        })
+152    } else {
+153        let name = "$safe_pow_unsigned";
+154        let args = vec![lhs, rhs, max_value];
+155        provider.create_then_call(name, args, |provider| {
+156            make_safe_pow_unsigned(provider, db, name)
+157        })
+158    }
+159}
+160
+161fn make_safe_add_signed(
+162    provider: &mut DefaultRuntimeProvider,
+163    db: &dyn CodegenDb,
+164    func_name: &str,
+165) -> RuntimeFunction {
+166    let func_name = YulVariable::new(func_name);
+167    let lhs = YulVariable::new("$lhs");
+168    let rhs = YulVariable::new("$rhs");
+169    let min_value = YulVariable::new("$min_value");
+170    let max_value = YulVariable::new("$max_value");
+171    let ret = YulVariable::new("$ret");
+172
+173    let func = function_definition! {
+174        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()], [max_value.ident()]) -> [ret.ident()] {
+175            (if (and((iszero((slt([lhs.expr()], 0)))), (sgt([rhs.expr()], (sub([max_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+176            (if (and((slt([lhs.expr()], 0)), (slt([rhs.expr()], (sub([min_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+177            ([ret.ident()] := add([lhs.expr()], [rhs.expr()]))
+178        }
+179    };
+180    RuntimeFunction::from_statement(func)
+181}
+182
+183fn make_safe_add_unsigned(
+184    provider: &mut DefaultRuntimeProvider,
+185    db: &dyn CodegenDb,
+186    func_name: &str,
+187) -> RuntimeFunction {
+188    let func_name = YulVariable::new(func_name);
+189    let lhs = YulVariable::new("$lhs");
+190    let rhs = YulVariable::new("$rhs");
+191    let max_value = YulVariable::new("$max_value");
+192    let ret = YulVariable::new("$ret");
+193
+194    let func = function_definition! {
+195        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [max_value.ident()]) -> [ret.ident()] {
+196            (if (gt([lhs.expr()], (sub([max_value.expr()], [rhs.expr()])))) { [revert_with_overflow(provider, db)] })
+197            ([ret.ident()] := add([lhs.expr()], [rhs.expr()]))
+198        }
+199    };
+200    RuntimeFunction::from_statement(func)
+201}
+202
+203fn make_safe_sub_signed(
+204    provider: &mut DefaultRuntimeProvider,
+205    db: &dyn CodegenDb,
+206    func_name: &str,
+207) -> RuntimeFunction {
+208    let func_name = YulVariable::new(func_name);
+209    let lhs = YulVariable::new("$lhs");
+210    let rhs = YulVariable::new("$rhs");
+211    let min_value = YulVariable::new("$min_value");
+212    let max_value = YulVariable::new("$max_value");
+213    let ret = YulVariable::new("$ret");
+214
+215    let func = function_definition! {
+216        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()], [max_value.ident()]) -> [ret.ident()] {
+217            (if (and((iszero((slt([rhs.expr()], 0)))), (slt([lhs.expr()], (add([min_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+218            (if (and((slt([rhs.expr()], 0)), (sgt([lhs.expr()], (add([max_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+219            ([ret.ident()] := sub([lhs.expr()], [rhs.expr()]))
+220        }
+221    };
+222    RuntimeFunction::from_statement(func)
+223}
+224
+225fn make_safe_sub_unsigned(
+226    provider: &mut DefaultRuntimeProvider,
+227    db: &dyn CodegenDb,
+228    func_name: &str,
+229) -> RuntimeFunction {
+230    let func_name = YulVariable::new(func_name);
+231    let lhs = YulVariable::new("$lhs");
+232    let rhs = YulVariable::new("$rhs");
+233    let ret = YulVariable::new("$ret");
+234
+235    let func = function_definition! {
+236        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+237            (if (lt([lhs.expr()], [rhs.expr()])) { [revert_with_overflow(provider, db)] })
+238            ([ret.ident()] := sub([lhs.expr()], [rhs.expr()]))
+239        }
+240    };
+241    RuntimeFunction::from_statement(func)
+242}
+243
+244fn make_safe_mul_signed(
+245    provider: &mut DefaultRuntimeProvider,
+246    db: &dyn CodegenDb,
+247    func_name: &str,
+248) -> RuntimeFunction {
+249    let func_name = YulVariable::new(func_name);
+250    let lhs = YulVariable::new("$lhs");
+251    let rhs = YulVariable::new("$rhs");
+252    let min_value = YulVariable::new("$min_value");
+253    let max_value = YulVariable::new("$max_value");
+254    let ret = YulVariable::new("$ret");
+255
+256    let func = function_definition! {
+257        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()], [max_value.ident()]) -> [ret.ident()] {
+258            // overflow, if lhs > 0, rhs > 0 and lhs > (max_value / rhs)
+259            (if (and((and((sgt([lhs.expr()], 0)), (sgt([rhs.expr()], 0)))), (gt([lhs.expr()], (div([max_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+260            // underflow, if lhs > 0, rhs < 0 and rhs < (min_value / lhs)
+261            (if (and((and((sgt([lhs.expr()], 0)), (slt([rhs.expr()], 0)))), (slt([rhs.expr()], (sdiv([min_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+262            // underflow, if lhs < 0, rhs > 0 and lhs < (min_value / rhs)
+263            (if (and((and((slt([lhs.expr()], 0)), (sgt([rhs.expr()], 0)))), (slt([lhs.expr()], (sdiv([min_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+264            // overflow, if lhs < 0, rhs < 0 and lhs < (max_value / rhs)
+265            (if (and((and((slt([lhs.expr()], 0)), (slt([rhs.expr()], 0)))), (slt([lhs.expr()], (sdiv([max_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+266            ([ret.ident()] := mul([lhs.expr()], [rhs.expr()]))
+267        }
+268    };
+269    RuntimeFunction::from_statement(func)
+270}
+271
+272fn make_safe_mul_unsigned(
+273    provider: &mut DefaultRuntimeProvider,
+274    db: &dyn CodegenDb,
+275    func_name: &str,
+276) -> RuntimeFunction {
+277    let func_name = YulVariable::new(func_name);
+278    let lhs = YulVariable::new("$lhs");
+279    let rhs = YulVariable::new("$rhs");
+280    let max_value = YulVariable::new("$max_value");
+281    let ret = YulVariable::new("$ret");
+282
+283    let func = function_definition! {
+284        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [max_value.ident()]) -> [ret.ident()] {
+285            // overflow, if lhs != 0 and rhs > (max_value / lhs)
+286            (if (and((iszero((iszero([lhs.expr()])))), (gt([rhs.expr()], (div([max_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider ,db)] })
+287            ([ret.ident()] := mul([lhs.expr()], [rhs.expr()]))
+288        }
+289    };
+290    RuntimeFunction::from_statement(func)
+291}
+292
+293fn make_safe_div_signed(
+294    provider: &mut DefaultRuntimeProvider,
+295    db: &dyn CodegenDb,
+296    func_name: &str,
+297) -> RuntimeFunction {
+298    let func_name = YulVariable::new(func_name);
+299    let lhs = YulVariable::new("$lhs");
+300    let rhs = YulVariable::new("$rhs");
+301    let min_value = YulVariable::new("$min_value");
+302    let ret = YulVariable::new("$ret");
+303
+304    let func = function_definition! {
+305        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()]) -> [ret.ident()] {
+306            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+307            (if (and( (eq([lhs.expr()], [min_value.expr()])), (eq([rhs.expr()], (sub(0, 1))))) ) { [revert_with_overflow(provider, db)] })
+308            ([ret.ident()] := sdiv([lhs.expr()], [rhs.expr()]))
+309        }
+310    };
+311    RuntimeFunction::from_statement(func)
+312}
+313
+314fn make_safe_div_unsigned(
+315    provider: &mut DefaultRuntimeProvider,
+316    db: &dyn CodegenDb,
+317    func_name: &str,
+318) -> RuntimeFunction {
+319    let func_name = YulVariable::new(func_name);
+320    let lhs = YulVariable::new("$lhs");
+321    let rhs = YulVariable::new("$rhs");
+322    let ret = YulVariable::new("$ret");
+323
+324    let func = function_definition! {
+325        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+326            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+327            ([ret.ident()] := div([lhs.expr()], [rhs.expr()]))
+328        }
+329    };
+330    RuntimeFunction::from_statement(func)
+331}
+332
+333fn make_safe_mod_signed(
+334    provider: &mut DefaultRuntimeProvider,
+335    db: &dyn CodegenDb,
+336    func_name: &str,
+337) -> RuntimeFunction {
+338    let func_name = YulVariable::new(func_name);
+339    let lhs = YulVariable::new("$lhs");
+340    let rhs = YulVariable::new("$rhs");
+341    let ret = YulVariable::new("$ret");
+342
+343    let func = function_definition! {
+344        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+345            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+346            ([ret.ident()] := smod([lhs.expr()], [rhs.expr()]))
+347        }
+348    };
+349    RuntimeFunction::from_statement(func)
+350}
+351
+352fn make_safe_mod_unsigned(
+353    provider: &mut DefaultRuntimeProvider,
+354    db: &dyn CodegenDb,
+355    func_name: &str,
+356) -> RuntimeFunction {
+357    let func_name = YulVariable::new(func_name);
+358    let lhs = YulVariable::new("$lhs");
+359    let rhs = YulVariable::new("$rhs");
+360    let ret = YulVariable::new("$ret");
+361
+362    let func = function_definition! {
+363        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+364            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+365            ([ret.ident()] := mod([lhs.expr()], [rhs.expr()]))
+366        }
+367    };
+368    RuntimeFunction::from_statement(func)
+369}
+370
+371const SAFE_POW_HELPER_NAME: &str = "safe_pow_helper";
+372
+373fn make_safe_pow_unsigned(
+374    provider: &mut DefaultRuntimeProvider,
+375    db: &dyn CodegenDb,
+376    func_name: &str,
+377) -> RuntimeFunction {
+378    let func_name = YulVariable::new(func_name);
+379    let base = YulVariable::new("base");
+380    let exponent = YulVariable::new("exponent");
+381    let max_value = YulVariable::new("max_value");
+382    let power = YulVariable::new("power");
+383
+384    let safe_pow_helper_call = yul::Statement::Assignment(yul::Assignment {
+385        identifiers: vec![base.ident(), power.ident()],
+386        expression: {
+387            let args = vec![
+388                base.expr(),
+389                exponent.expr(),
+390                literal_expression! {1},
+391                max_value.expr(),
+392            ];
+393            provider.create_then_call(SAFE_POW_HELPER_NAME, args, |provider| {
+394                make_safe_exp_helper(provider, db, SAFE_POW_HELPER_NAME)
+395            })
+396        },
+397    });
+398
+399    let func = function_definition! {
+400        function [func_name.ident()]([base.ident()], [exponent.ident()], [max_value.ident()]) -> [power.ident()] {
+401            // Currently, `leave` avoids this function being inlined.
+402            // YUL team is working on optimizer improvements to fix that.
+403
+404            // Note that 0**0 == 1
+405            (if (iszero([exponent.expr()])) {
+406                ([power.ident()] := 1 )
+407                (leave)
+408            })
+409            (if (iszero([base.expr()])) {
+410                ([power.ident()] := 0 )
+411                (leave)
+412            })
+413            // Specializations for small bases
+414            ([switch! {
+415                switch [base.expr()]
+416                // 0 is handled above
+417                (case 1 {
+418                    ([power.ident()] := 1 )
+419                    (leave)
+420                })
+421                (case 2 {
+422                    (if (gt([exponent.expr()], 255)) {
+423                        [revert_with_overflow(provider, db)]
+424                    })
+425                    ([power.ident()] := (exp(2, [exponent.expr()])))
+426                    (if (gt([power.expr()], [max_value.expr()])) {
+427                        [revert_with_overflow(provider, db)]
+428                    })
+429                    (leave)
+430                })
+431            }])
+432            (if (and((sgt([power.expr()], 0)), (gt([power.expr()], (div([max_value.expr()], [base.expr()])))))) { [revert_with_overflow(provider, db)] })
+433
+434            (if (or((and((lt([base.expr()], 11)), (lt([exponent.expr()], 78)))), (and((lt([base.expr()], 307)), (lt([exponent.expr()], 32)))))) {
+435                ([power.ident()] := (exp([base.expr()], [exponent.expr()])))
+436                (if (gt([power.expr()], [max_value.expr()])) {
+437                    [revert_with_overflow(provider, db)]
+438                })
+439                (leave)
+440            })
+441
+442            ([safe_pow_helper_call])
+443            (if (gt([power.expr()], (div([max_value.expr()], [base.expr()])))) {
+444                [revert_with_overflow(provider, db)]
+445            })
+446            ([power.ident()] := (mul([power.expr()], [base.expr()])))
+447        }
+448    };
+449    RuntimeFunction::from_statement(func)
+450}
+451
+452fn make_safe_pow_signed(
+453    provider: &mut DefaultRuntimeProvider,
+454    db: &dyn CodegenDb,
+455    func_name: &str,
+456) -> RuntimeFunction {
+457    let func_name = YulVariable::new(func_name);
+458    let base = YulVariable::new("base");
+459    let exponent = YulVariable::new("exponent");
+460    let min_value = YulVariable::new("min_value");
+461    let max_value = YulVariable::new("max_value");
+462    let power = YulVariable::new("power");
+463
+464    let safe_pow_helper_call = yul::Statement::Assignment(yul::Assignment {
+465        identifiers: vec![base.ident(), power.ident()],
+466        expression: {
+467            let args = vec![base.expr(), exponent.expr(), power.expr(), max_value.expr()];
+468            provider.create_then_call(SAFE_POW_HELPER_NAME, args, |provider| {
+469                make_safe_exp_helper(provider, db, SAFE_POW_HELPER_NAME)
+470            })
+471        },
+472    });
+473
+474    let func = function_definition! {
+475        function [func_name.ident()]([base.ident()], [exponent.ident()], [min_value.ident()], [max_value.ident()]) -> [power.ident()] {
+476            // Currently, `leave` avoids this function being inlined.
+477            // YUL team is working on optimizer improvements to fix that.
+478
+479            // Note that 0**0 == 1
+480            ([switch! {
+481                switch [exponent.expr()]
+482                (case 0 {
+483                    ([power.ident()] := 1 )
+484                    (leave)
+485                })
+486                (case 1 {
+487                    ([power.ident()] := [base.expr()] )
+488                    (leave)
+489                })
+490            }])
+491            (if (iszero([base.expr()])) {
+492                ([power.ident()] := 0 )
+493                (leave)
+494            })
+495            ([power.ident()] := 1 )
+496            // We pull out the first iteration because it is the only one in which
+497            // base can be negative.
+498            // Exponent is at least 2 here.
+499            // overflow check for base * base
+500            ([switch! {
+501                switch (sgt([base.expr()], 0))
+502                (case 1 {
+503                    (if (gt([base.expr()], (div([max_value.expr()], [base.expr()])))) {
+504                        [revert_with_overflow(provider, db)]
+505                    })
+506                })
+507                (case 0 {
+508                    (if (slt([base.expr()], (sdiv([max_value.expr()], [base.expr()])))) {
+509                        [revert_with_overflow(provider, db)]
+510                    })
+511                })
+512            }])
+513            (if (and([exponent.expr()], 1)) {
+514                ([power.ident()] := [base.expr()] )
+515            })
+516            ([base.ident()] := (mul([base.expr()], [base.expr()])))
+517            ([exponent.ident()] := shr(1, [exponent.expr()]))
+518            // // Below this point, base is always positive.
+519            ([safe_pow_helper_call]) // power = 1, base = 16 which is wrong
+520            (if (and((sgt([power.expr()], 0)), (gt([power.expr()], (div([max_value.expr()], [base.expr()])))))) { [revert_with_overflow(provider , db)] })
+521            (if (and((slt([power.expr()], 0)), (slt([power.expr()], (sdiv([min_value.expr()], [base.expr()])))))) { [revert_with_overflow(provider, db)] })
+522            ([power.ident()] := (mul([power.expr()], [base.expr()])))
+523        }
+524    };
+525    RuntimeFunction::from_statement(func)
+526}
+527
+528fn make_safe_exp_helper(
+529    provider: &mut DefaultRuntimeProvider,
+530    db: &dyn CodegenDb,
+531    func_name: &str,
+532) -> RuntimeFunction {
+533    let func_name = YulVariable::new(func_name);
+534    let base = YulVariable::new("base");
+535    let exponent = YulVariable::new("exponent");
+536    let power = YulVariable::new("power");
+537    let max_value = YulVariable::new("max_value");
+538    let ret_power = YulVariable::new("ret_power");
+539    let ret_base = YulVariable::new("ret_base");
+540
+541    let func = function_definition! {
+542        function [func_name.ident()]([base.ident()], [exponent.ident()], [power.ident()], [max_value.ident()])
+543            -> [(vec![ret_base.ident(), ret_power.ident()])...] {
+544            ([ret_base.ident()] := [base.expr()])
+545            ([ret_power.ident()] := [power.expr()])
+546            (for {} (gt([exponent.expr()], 1)) {}
+547                {
+548                    // overflow check for base * base
+549                    (if (gt([ret_base.expr()], (div([max_value.expr()], [ret_base.expr()])))) { [revert_with_overflow(provider, db)] })
+550                    (if (and([exponent.expr()], 1)) {
+551                        // No checks for power := mul(power, base) needed, because the check
+552                        // for base * base above is sufficient, since:
+553                        // |power| <= base (proof by induction) and thus:
+554                        // |power * base| <= base * base <= max <= |min| (for signed)
+555                        // (this is equally true for signed and unsigned exp)
+556                        ([ret_power.ident()] := (mul([ret_power.expr()], [ret_base.expr()])))
+557                    })
+558                    ([ret_base.ident()] := mul([ret_base.expr()], [ret_base.expr()]))
+559                    ([exponent.ident()] := shr(1, [exponent.expr()]))
+560                })
+561        }
+562    };
+563    RuntimeFunction::from_statement(func)
+564}
+565
+566fn revert_with_overflow(provider: &mut dyn RuntimeProvider, db: &dyn CodegenDb) -> yul::Statement {
+567    const PANIC_OVERFLOW: usize = 0x11;
+568
+569    super::panic_revert_numeric(provider, db, literal_expression! {(PANIC_OVERFLOW)})
+570}
+571
+572fn revert_with_zero_division(
+573    provider: &mut dyn RuntimeProvider,
+574    db: &dyn CodegenDb,
+575) -> yul::Statement {
+576    pub const PANIC_ZERO_DIVISION: usize = 0x12;
+577
+578    super::panic_revert_numeric(provider, db, literal_expression! {(PANIC_ZERO_DIVISION)})
+579}
+580
+581fn get_max_value(db: &dyn CodegenDb, ty: TypeId) -> yul::Expression {
+582    match &ty.data(db.upcast()).kind {
+583        TypeKind::I8 => literal_expression! {0x7f},
+584        TypeKind::I16 => literal_expression! {0x7fff},
+585        TypeKind::I32 => literal_expression! {0x7fffffff},
+586        TypeKind::I64 => literal_expression! {0x7fffffffffffffff},
+587        TypeKind::I128 => literal_expression! {0x7fffffffffffffffffffffffffffffff},
+588        TypeKind::I256 => {
+589            literal_expression! {0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff}
+590        }
+591        TypeKind::U8 => literal_expression! {0xff},
+592        TypeKind::U16 => literal_expression! {0xffff},
+593        TypeKind::U32 => literal_expression! {0xffffffff},
+594        TypeKind::U64 => literal_expression! {0xffffffffffffffff},
+595        TypeKind::U128 => literal_expression! {0xffffffffffffffffffffffffffffffff},
+596        TypeKind::U256 => {
+597            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff}
+598        }
+599        _ => unreachable!(),
+600    }
+601}
+602
+603fn get_min_value(db: &dyn CodegenDb, ty: TypeId) -> yul::Expression {
+604    debug_assert! {ty.is_integral(db.upcast())};
+605
+606    match &ty.data(db.upcast()).kind {
+607        TypeKind::I8 => {
+608            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80}
+609        }
+610        TypeKind::I16 => {
+611            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000}
+612        }
+613        TypeKind::I32 => {
+614            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000}
+615        }
+616        TypeKind::I64 => {
+617            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000}
+618        }
+619        TypeKind::I128 => {
+620            literal_expression! {0xffffffffffffffffffffffffffffffff80000000000000000000000000000000}
+621        }
+622        TypeKind::I256 => {
+623            literal_expression! {0x8000000000000000000000000000000000000000000000000000000000000000}
+624        }
+625
+626        _ => literal_expression! {0x0},
+627    }
+628}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/slot_size.rs.html b/compiler-docs/src/fe_codegen/yul/slot_size.rs.html new file mode 100644 index 0000000000..907c4b0a6a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/slot_size.rs.html @@ -0,0 +1,16 @@ +slot_size.rs - source

fe_codegen/yul/
slot_size.rs

1use fe_mir::ir::{Type, TypeId, TypeKind};
+2
+3use crate::db::CodegenDb;
+4
+5// We use the same slot size between memory and storage to simplify the
+6// implementation and minimize gas consumption in memory <-> storage copy
+7// instructions.
+8pub(crate) const SLOT_SIZE: usize = 32;
+9
+10pub(crate) fn yul_primitive_type(db: &dyn CodegenDb) -> TypeId {
+11    db.mir_intern_type(Type::new(TypeKind::U256, None).into())
+12}
+13
+14pub(crate) fn function_hash_type(db: &dyn CodegenDb) -> TypeId {
+15    db.mir_intern_type(Type::new(TypeKind::U32, None).into())
+16}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/db.rs.html b/compiler-docs/src/fe_common/db.rs.html new file mode 100644 index 0000000000..df2391a346 --- /dev/null +++ b/compiler-docs/src/fe_common/db.rs.html @@ -0,0 +1,49 @@ +db.rs - source

fe_common/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use crate::files::{File, SourceFileId, Utf8Path};
+3use codespan_reporting as cs;
+4use salsa;
+5use smol_str::SmolStr;
+6use std::rc::Rc;
+7
+8pub trait Upcast<T: ?Sized> {
+9    fn upcast(&self) -> &T;
+10}
+11
+12pub trait UpcastMut<T: ?Sized> {
+13    fn upcast_mut(&mut self) -> &mut T;
+14}
+15
+16#[salsa::query_group(SourceDbStorage)]
+17pub trait SourceDb {
+18    #[salsa::interned]
+19    fn intern_file(&self, file: File) -> SourceFileId;
+20
+21    /// Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc<str>)
+22    #[salsa::input]
+23    fn file_content(&self, file: SourceFileId) -> Rc<str>;
+24
+25    #[salsa::invoke(file_line_starts_query)]
+26    fn file_line_starts(&self, file: SourceFileId) -> Rc<[usize]>;
+27
+28    #[salsa::invoke(file_name_query)]
+29    fn file_name(&self, file: SourceFileId) -> SmolStr;
+30}
+31
+32fn file_line_starts_query(db: &dyn SourceDb, file: SourceFileId) -> Rc<[usize]> {
+33    cs::files::line_starts(&file.content(db)).collect()
+34}
+35
+36fn file_name_query(db: &dyn SourceDb, file: SourceFileId) -> SmolStr {
+37    let path = db.lookup_intern_file(file).path;
+38    Utf8Path::new(path.as_str())
+39        .file_name()
+40        .expect("path lacks file name")
+41        .into()
+42}
+43
+44#[salsa::database(SourceDbStorage)]
+45#[derive(Default)]
+46pub struct TestDb {
+47    storage: salsa::Storage<TestDb>,
+48}
+49impl salsa::Database for TestDb {}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/diagnostics.rs.html b/compiler-docs/src/fe_common/diagnostics.rs.html new file mode 100644 index 0000000000..02d0bbeead --- /dev/null +++ b/compiler-docs/src/fe_common/diagnostics.rs.html @@ -0,0 +1,145 @@ +diagnostics.rs - source

fe_common/
diagnostics.rs

1use crate::db::SourceDb;
+2use crate::files::{SourceFileId, Utf8PathBuf};
+3use crate::Span;
+4pub use codespan_reporting::diagnostic as cs;
+5use codespan_reporting::files::Error as CsError;
+6use codespan_reporting::term;
+7pub use cs::Severity;
+8use std::ops::Range;
+9use std::rc::Rc;
+10use term::termcolor::{BufferWriter, ColorChoice};
+11
+12#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+13pub struct Diagnostic {
+14    pub severity: Severity,
+15    pub message: String,
+16    pub labels: Vec<Label>,
+17    pub notes: Vec<String>,
+18}
+19impl Diagnostic {
+20    pub fn into_cs(self) -> cs::Diagnostic<SourceFileId> {
+21        cs::Diagnostic {
+22            severity: self.severity,
+23            code: None,
+24            message: self.message,
+25            labels: self.labels.into_iter().map(Label::into_cs_label).collect(),
+26            notes: self.notes,
+27        }
+28    }
+29    pub fn error(message: String) -> Self {
+30        Self {
+31            severity: Severity::Error,
+32            message,
+33            labels: vec![],
+34            notes: vec![],
+35        }
+36    }
+37}
+38
+39#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
+40pub enum LabelStyle {
+41    Primary,
+42    Secondary,
+43}
+44impl From<LabelStyle> for cs::LabelStyle {
+45    fn from(other: LabelStyle) -> cs::LabelStyle {
+46        match other {
+47            LabelStyle::Primary => cs::LabelStyle::Primary,
+48            LabelStyle::Secondary => cs::LabelStyle::Secondary,
+49        }
+50    }
+51}
+52
+53#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+54pub struct Label {
+55    pub style: LabelStyle,
+56    pub span: Span,
+57    pub message: String,
+58}
+59impl Label {
+60    /// Create a primary label with the given message. This will underline the
+61    /// given span with carets (`^^^^`).
+62    pub fn primary<S: Into<String>>(span: Span, message: S) -> Self {
+63        Label {
+64            style: LabelStyle::Primary,
+65            span,
+66            message: message.into(),
+67        }
+68    }
+69
+70    /// Create a secondary label with the given message. This will underline the
+71    /// given span with hyphens (`----`).
+72    pub fn secondary<S: Into<String>>(span: Span, message: S) -> Self {
+73        Label {
+74            style: LabelStyle::Secondary,
+75            span,
+76            message: message.into(),
+77        }
+78    }
+79
+80    /// Convert into a [`codespan_reporting::Diagnostic::Label`]
+81    pub fn into_cs_label(self) -> cs::Label<SourceFileId> {
+82        cs::Label {
+83            style: self.style.into(),
+84            file_id: self.span.file_id,
+85            range: self.span.into(),
+86            message: self.message,
+87        }
+88    }
+89}
+90
+91/// Print the given diagnostics to stderr.
+92pub fn print_diagnostics(db: &dyn SourceDb, diagnostics: &[Diagnostic]) {
+93    let writer = BufferWriter::stderr(ColorChoice::Auto);
+94    let mut buffer = writer.buffer();
+95    let config = term::Config::default();
+96    let files = SourceDbWrapper(db);
+97
+98    for diag in diagnostics {
+99        term::emit(&mut buffer, &config, &files, &diag.clone().into_cs()).unwrap();
+100    }
+101    // If we use `writer` here, the output won't be captured by rust's test system.
+102    eprintln!("{}", std::str::from_utf8(buffer.as_slice()).unwrap());
+103}
+104
+105/// Format the given diagnostics as a string.
+106pub fn diagnostics_string(db: &dyn SourceDb, diagnostics: &[Diagnostic]) -> String {
+107    let writer = BufferWriter::stderr(ColorChoice::Never);
+108    let mut buffer = writer.buffer();
+109    let config = term::Config::default();
+110    let files = SourceDbWrapper(db);
+111
+112    for diag in diagnostics {
+113        term::emit(&mut buffer, &config, &files, &diag.clone().into_cs())
+114            .expect("failed to emit diagnostic");
+115    }
+116    std::str::from_utf8(buffer.as_slice()).unwrap().to_string()
+117}
+118
+119struct SourceDbWrapper<'a>(pub &'a dyn SourceDb);
+120
+121impl<'a> codespan_reporting::files::Files<'_> for SourceDbWrapper<'a> {
+122    type FileId = SourceFileId;
+123    type Name = Rc<Utf8PathBuf>;
+124    type Source = Rc<str>;
+125
+126    fn name(&self, file: SourceFileId) -> Result<Self::Name, CsError> {
+127        Ok(file.path(self.0))
+128    }
+129
+130    fn source(&self, file: SourceFileId) -> Result<Self::Source, CsError> {
+131        Ok(file.content(self.0))
+132    }
+133
+134    fn line_index(&self, file: SourceFileId, byte_index: usize) -> Result<usize, CsError> {
+135        Ok(file.line_index(self.0, byte_index))
+136    }
+137
+138    fn line_range(&self, file: SourceFileId, line_index: usize) -> Result<Range<usize>, CsError> {
+139        file.line_range(self.0, line_index)
+140            .ok_or(CsError::LineTooLarge {
+141                given: line_index,
+142                max: self.0.file_line_starts(file).len() - 1,
+143            })
+144    }
+145}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/files.rs.html b/compiler-docs/src/fe_common/files.rs.html new file mode 100644 index 0000000000..d523d087d8 --- /dev/null +++ b/compiler-docs/src/fe_common/files.rs.html @@ -0,0 +1,132 @@ +files.rs - source

fe_common/
files.rs

1use crate::db::SourceDb;
+2pub use camino::{Utf8Component, Utf8Path, Utf8PathBuf};
+3pub use fe_library::include_dir;
+4use std::ops::Range;
+5use std::rc::Rc;
+6
+7// NOTE: all file paths are stored as utf8 strings.
+8//  Non-utf8 paths (for user code) should be reported
+9//  as an error.
+10//  If include_dir paths aren't utf8, we panic and fix
+11//  our stdlib/test-file path names.
+12
+13#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+14pub struct File {
+15    /// Differentiates between local source files and fe std lib
+16    /// files, which may have the same path (for salsa's sake).
+17    pub kind: FileKind,
+18
+19    /// Path of the file. May include `src/` dir or longer prefix;
+20    /// this prefix will be stored in the `Ingot::src_path`, and stripped
+21    /// off as needed.
+22    pub path: Rc<Utf8PathBuf>,
+23}
+24
+25#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone)]
+26pub enum FileKind {
+27    /// User file; either part of the target project or an imported ingot
+28    Local,
+29    /// File is part of the fe standard library
+30    Std,
+31}
+32
+33/// Returns the common *prefix* of two paths. If the paths are identical,
+34/// returns the path parent.
+35pub fn common_prefix(left: &Utf8Path, right: &Utf8Path) -> Utf8PathBuf {
+36    left.components()
+37        .zip(right.components())
+38        .take_while(|(l, r)| l == r)
+39        .map(|(l, _)| l)
+40        .collect()
+41}
+42
+43// from rust-analyzer {
+44#[macro_export]
+45macro_rules! impl_intern_key {
+46    ($name:ident) => {
+47        impl salsa::InternKey for $name {
+48            fn from_intern_id(v: salsa::InternId) -> Self {
+49                $name(v.as_u32())
+50            }
+51            fn as_intern_id(&self) -> salsa::InternId {
+52                salsa::InternId::from(self.0)
+53            }
+54        }
+55    };
+56}
+57// } from rust-analyzer
+58
+59// TODO: rename to FileId
+60#[derive(Debug, serde::Deserialize, PartialEq, Eq, Hash, Copy, Clone)]
+61pub struct SourceFileId(pub(crate) u32);
+62impl_intern_key!(SourceFileId);
+63
+64impl SourceFileId {
+65    pub fn new_local(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self {
+66        Self::new(db, FileKind::Std, path, content)
+67    }
+68
+69    pub fn new_std(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self {
+70        Self::new(db, FileKind::Std, path, content)
+71    }
+72
+73    pub fn new(db: &mut dyn SourceDb, kind: FileKind, path: &str, content: Rc<str>) -> Self {
+74        let id = db.intern_file(File {
+75            kind,
+76            path: Rc::new(path.into()),
+77        });
+78        db.set_file_content(id, content);
+79        id
+80    }
+81
+82    pub fn path(&self, db: &dyn SourceDb) -> Rc<Utf8PathBuf> {
+83        db.lookup_intern_file(*self).path
+84    }
+85
+86    pub fn content(&self, db: &dyn SourceDb) -> Rc<str> {
+87        db.file_content(*self)
+88    }
+89
+90    pub fn line_index(&self, db: &dyn SourceDb, byte_index: usize) -> usize {
+91        db.file_line_starts(*self)
+92            .binary_search(&byte_index)
+93            .unwrap_or_else(|next_line| next_line - 1)
+94    }
+95
+96    pub fn line_range(&self, db: &dyn SourceDb, line_index: usize) -> Option<Range<usize>> {
+97        let line_starts = db.file_line_starts(*self);
+98        let end = if line_index == line_starts.len() - 1 {
+99            self.content(db).len()
+100        } else {
+101            *line_starts.get(line_index + 1)?
+102        };
+103        Some(Range {
+104            start: *line_starts.get(line_index)?,
+105            end,
+106        })
+107    }
+108
+109    pub fn dummy_file() -> Self {
+110        // Used by unit tests and benchmarks
+111        Self(u32::MAX)
+112    }
+113    pub fn is_dummy(self) -> bool {
+114        self == Self::dummy_file()
+115    }
+116}
+117
+118#[test]
+119fn test_common_prefix() {
+120    assert_eq!(
+121        common_prefix(Utf8Path::new("a/b/c/d/e"), Utf8Path::new("a/b/d/e")),
+122        Utf8Path::new("a/b")
+123    );
+124    assert_eq!(
+125        common_prefix(Utf8Path::new("src/foo.x"), Utf8Path::new("tests/bar.fe")),
+126        Utf8Path::new("")
+127    );
+128    assert_eq!(
+129        common_prefix(Utf8Path::new("/src/foo.x"), Utf8Path::new("src/bar.fe")),
+130        Utf8Path::new("")
+131    );
+132}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/lib.rs.html b/compiler-docs/src/fe_common/lib.rs.html new file mode 100644 index 0000000000..5c599c8fd1 --- /dev/null +++ b/compiler-docs/src/fe_common/lib.rs.html @@ -0,0 +1,26 @@ +lib.rs - source

fe_common/
lib.rs

1pub mod db;
+2pub mod diagnostics;
+3pub mod files;
+4pub mod numeric;
+5pub mod panic;
+6mod span;
+7pub mod utils;
+8
+9pub use files::{File, FileKind, SourceFileId};
+10pub use span::{Span, Spanned};
+11
+12#[macro_export]
+13#[cfg(target_arch = "wasm32")]
+14macro_rules! assert_snapshot_wasm {
+15    ($path:expr, $actual:expr) => {
+16        let snap = include_str!($path);
+17        let expected = snap.splitn(3, "---\n").last().unwrap();
+18        pretty_assertions::assert_eq!($actual.trim(), expected.trim());
+19    };
+20}
+21
+22#[macro_export]
+23#[cfg(not(target_arch = "wasm32"))]
+24macro_rules! assert_snapshot_wasm {
+25    ($path:expr, $actual:expr) => {};
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/numeric.rs.html b/compiler-docs/src/fe_common/numeric.rs.html new file mode 100644 index 0000000000..40d94a6aac --- /dev/null +++ b/compiler-docs/src/fe_common/numeric.rs.html @@ -0,0 +1,98 @@ +numeric.rs - source

fe_common/
numeric.rs

1use num_bigint::{BigInt, Sign};
+2
+3/// A type that represents the radix of a numeric literal.
+4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+5pub enum Radix {
+6    Hexadecimal,
+7    Decimal,
+8    Octal,
+9    Binary,
+10}
+11
+12impl Radix {
+13    /// Returns number representation of the radix.
+14    pub fn as_num(self) -> u32 {
+15        match self {
+16            Self::Hexadecimal => 16,
+17            Self::Decimal => 10,
+18            Self::Octal => 8,
+19            Self::Binary => 2,
+20        }
+21    }
+22}
+23
+24/// A helper type to interpret a numeric literal represented by string.
+25#[derive(Debug, Clone)]
+26pub struct Literal<'a> {
+27    /// The number part of the string.
+28    num: &'a str,
+29    /// The radix of the literal.
+30    radix: Radix,
+31}
+32
+33impl<'a> Literal<'a> {
+34    pub fn new(src: &'a str) -> Self {
+35        debug_assert!(!src.is_empty());
+36        debug_assert_ne!(src.chars().next(), Some('-'));
+37        let (radix, prefix) = if src.len() < 2 {
+38            (Radix::Decimal, None)
+39        } else {
+40            match &src[0..2] {
+41                "0x" | "0X" => (Radix::Hexadecimal, Some(&src[..2])),
+42                "0o" | "0O" => (Radix::Octal, Some(&src[..2])),
+43                "0b" | "0B" => (Radix::Binary, Some(&src[..2])),
+44                _ => (Radix::Decimal, None),
+45            }
+46        };
+47
+48        Self {
+49            num: &src[prefix.map_or(0, str::len)..],
+50            radix,
+51        }
+52    }
+53
+54    /// Parse the numeric literal to `T`.
+55    pub fn parse<T: num_traits::Num>(&self) -> Result<T, T::FromStrRadixErr> {
+56        T::from_str_radix(self.num, self.radix.as_num())
+57    }
+58
+59    /// Returns radix of the numeric literal.
+60    pub fn radix(&self) -> Radix {
+61        self.radix
+62    }
+63}
+64
+65// Converts any positive or negative `BigInt` into a hex str using 2s complement representation for negative values.
+66pub fn to_hex_str(val: &BigInt) -> String {
+67    format!(
+68        "0x{}",
+69        BigInt::from_bytes_be(Sign::Plus, &val.to_signed_bytes_be()).to_str_radix(16)
+70    )
+71}
+72
+73#[cfg(test)]
+74mod tests {
+75    use super::*;
+76
+77    #[test]
+78    fn test_radix() {
+79        assert_eq!(Literal::new("0XFF").radix(), Radix::Hexadecimal);
+80        assert_eq!(Literal::new("0xFF").radix(), Radix::Hexadecimal);
+81        assert_eq!(Literal::new("0O77").radix(), Radix::Octal);
+82        assert_eq!(Literal::new("0o77").radix(), Radix::Octal);
+83        assert_eq!(Literal::new("0B77").radix(), Radix::Binary);
+84        assert_eq!(Literal::new("0b77").radix(), Radix::Binary);
+85        assert_eq!(Literal::new("1").radix(), Radix::Decimal);
+86
+87        // Invalid radix is treated as `Decimal`.
+88        assert_eq!(Literal::new("0D15").radix(), Radix::Decimal);
+89    }
+90
+91    #[test]
+92    fn test_to_hex_str() {
+93        assert_eq!(to_hex_str(&BigInt::from(-1i8)), "0xff");
+94        assert_eq!(to_hex_str(&BigInt::from(-2i8)), "0xfe");
+95        assert_eq!(to_hex_str(&BigInt::from(1i8)), "0x1");
+96        assert_eq!(to_hex_str(&BigInt::from(2i8)), "0x2");
+97    }
+98}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/panic.rs.html b/compiler-docs/src/fe_common/panic.rs.html new file mode 100644 index 0000000000..58309e27fc --- /dev/null +++ b/compiler-docs/src/fe_common/panic.rs.html @@ -0,0 +1,24 @@ +panic.rs - source

fe_common/
panic.rs

1use once_cell::sync::Lazy;
+2use std::panic;
+3
+4const BUG_REPORT_URL: &str = "https://github.com/ethereum/fe/issues/new";
+5type PanicCallback = dyn Fn(&panic::PanicInfo<'_>) + Sync + Send + 'static;
+6static DEFAULT_PANIC_HOOK: Lazy<Box<PanicCallback>> = Lazy::new(|| {
+7    let hook = panic::take_hook();
+8    panic::set_hook(Box::new(report_ice));
+9    hook
+10});
+11
+12pub fn install_panic_hook() {
+13    Lazy::force(&DEFAULT_PANIC_HOOK);
+14}
+15fn report_ice(info: &panic::PanicInfo) {
+16    (*DEFAULT_PANIC_HOOK)(info);
+17
+18    eprintln!();
+19    eprintln!("You've hit an internal compiler error. This is a bug in the Fe compiler.");
+20    eprintln!("Fe is still under heavy development, and isn't yet ready for production use.");
+21    eprintln!();
+22    eprintln!("If you would, please report this bug at the following URL:");
+23    eprintln!("  {BUG_REPORT_URL}");
+24}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/span.rs.html b/compiler-docs/src/fe_common/span.rs.html new file mode 100644 index 0000000000..8d80a6fc9e --- /dev/null +++ b/compiler-docs/src/fe_common/span.rs.html @@ -0,0 +1,153 @@ +span.rs - source

fe_common/
span.rs

1use crate::files::SourceFileId;
+2use serde::{Deserialize, Serialize};
+3use std::cmp;
+4use std::fmt::{Debug, Formatter};
+5use std::ops::{Add, AddAssign, Range};
+6
+7/// An exclusive span of byte offsets in a source file.
+8#[derive(Serialize, Deserialize, PartialEq, Copy, Clone, Hash, Eq)]
+9pub struct Span {
+10    #[serde(skip_serializing)]
+11    pub file_id: SourceFileId,
+12    /// A byte offset specifying the inclusive start of a span.
+13    pub start: usize,
+14    /// A byte offset specifying the exclusive end of a span.
+15    pub end: usize,
+16}
+17
+18impl Span {
+19    pub fn new(file_id: SourceFileId, start: usize, end: usize) -> Self {
+20        Span {
+21            file_id,
+22            start: cmp::min(start, end),
+23            end: cmp::max(start, end),
+24        }
+25    }
+26
+27    pub fn zero(file_id: SourceFileId) -> Self {
+28        Span {
+29            file_id,
+30            start: 0,
+31            end: 0,
+32        }
+33    }
+34
+35    pub fn dummy() -> Self {
+36        Self {
+37            file_id: SourceFileId::dummy_file(),
+38            start: usize::MAX,
+39            end: usize::MAX,
+40        }
+41    }
+42
+43    pub fn is_dummy(&self) -> bool {
+44        self == &Self::dummy()
+45    }
+46
+47    pub fn from_pair<S, E>(start_elem: S, end_elem: E) -> Self
+48    where
+49        S: Into<Span>,
+50        E: Into<Span>,
+51    {
+52        let start_span: Span = start_elem.into();
+53        let end_span: Span = end_elem.into();
+54
+55        let file_id = if start_span.file_id == end_span.file_id {
+56            start_span.file_id
+57        } else {
+58            panic!("file ids are not equal")
+59        };
+60
+61        Self {
+62            file_id,
+63            start: start_span.start,
+64            end: end_span.end,
+65        }
+66    }
+67}
+68
+69impl Debug for Span {
+70    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+71        write!(f, "{:?}", Range::from(*self))
+72    }
+73}
+74
+75pub trait Spanned {
+76    fn span(&self) -> Span;
+77}
+78
+79impl Add for Span {
+80    type Output = Self;
+81
+82    fn add(self, other: Self) -> Self {
+83        use std::cmp::{max, min};
+84
+85        let file_id = if self.file_id == other.file_id {
+86            self.file_id
+87        } else {
+88            panic!("file ids are not equal")
+89        };
+90
+91        Self {
+92            file_id,
+93            start: min(self.start, other.start),
+94            end: max(self.end, other.end),
+95        }
+96    }
+97}
+98
+99impl Add<Option<Span>> for Span {
+100    type Output = Self;
+101
+102    fn add(self, other: Option<Span>) -> Self {
+103        if let Some(other) = other {
+104            self + other
+105        } else {
+106            self
+107        }
+108    }
+109}
+110
+111impl<'a, T> Add<Option<&'a T>> for Span
+112where
+113    Span: Add<&'a T, Output = Self>,
+114{
+115    type Output = Self;
+116
+117    fn add(self, other: Option<&'a T>) -> Self {
+118        if let Some(other) = other {
+119            self + other
+120        } else {
+121            self
+122        }
+123    }
+124}
+125
+126impl<'a, T> Add<&'a T> for Span
+127where
+128    T: Spanned,
+129{
+130    type Output = Self;
+131
+132    fn add(self, other: &'a T) -> Self {
+133        self + other.span()
+134    }
+135}
+136
+137impl<T> AddAssign<T> for Span
+138where
+139    Span: Add<T, Output = Self>,
+140{
+141    fn add_assign(&mut self, other: T) {
+142        *self = *self + other
+143    }
+144}
+145
+146impl From<Span> for Range<usize> {
+147    fn from(span: Span) -> Self {
+148        Range {
+149            start: span.start,
+150            end: span.end,
+151        }
+152    }
+153}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/dirs.rs.html b/compiler-docs/src/fe_common/utils/dirs.rs.html new file mode 100644 index 0000000000..f25601b2bc --- /dev/null +++ b/compiler-docs/src/fe_common/utils/dirs.rs.html @@ -0,0 +1,26 @@ +dirs.rs - source

fe_common/utils/
dirs.rs

1use std::path::PathBuf;
+2
+3pub fn get_fe_home() -> PathBuf {
+4    let fe_home = std::env::var("FE_HOME")
+5        .map(PathBuf::from)
+6        .unwrap_or_else(|_| {
+7            dirs::home_dir()
+8                .expect("Failed to get home dir")
+9                .join(".fe")
+10        });
+11
+12    if !fe_home.exists() {
+13        std::fs::create_dir_all(&fe_home).expect("Failed to create FE_HOME");
+14    }
+15
+16    fe_home
+17}
+18
+19pub fn get_fe_deps() -> PathBuf {
+20    let fe_deps = get_fe_home().join("deps");
+21
+22    if !fe_deps.exists() {
+23        std::fs::create_dir_all(&fe_deps).expect("Failed to create FE_DEPS");
+24    }
+25    fe_deps
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/files.rs.html b/compiler-docs/src/fe_common/utils/files.rs.html new file mode 100644 index 0000000000..47bbeec3aa --- /dev/null +++ b/compiler-docs/src/fe_common/utils/files.rs.html @@ -0,0 +1,416 @@ +files.rs - source

fe_common/utils/
files.rs

1use serde::Deserialize;
+2use std::{fs, path::Path};
+3use toml::Table;
+4
+5use indexmap::{indexmap, IndexMap};
+6use path_clean::PathClean;
+7use smol_str::SmolStr;
+8use walkdir::WalkDir;
+9
+10use crate::utils::dirs::get_fe_deps;
+11use crate::utils::git;
+12
+13const FE_TOML: &str = "fe.toml";
+14
+15pub enum FileLoader {
+16    Static(Vec<(&'static str, &'static str)>),
+17    Fs,
+18}
+19
+20impl FileLoader {
+21    pub fn canonicalize_path(&self, path: &str) -> Result<SmolStr, String> {
+22        match self {
+23            FileLoader::Static(_) => Ok(SmolStr::new(
+24                Path::new(path).clean().to_str().expect("path clean failed"),
+25            )),
+26            FileLoader::Fs => Ok(SmolStr::new(
+27                fs::canonicalize(path)
+28                    .map_err(|err| {
+29                        format!("unable to canonicalize root project path {path}.\n{err}")
+30                    })?
+31                    .to_str()
+32                    .expect("could not convert path to string"),
+33            )),
+34        }
+35    }
+36
+37    pub fn fe_files(&self, path: &str) -> Result<Vec<(String, String)>, String> {
+38        match self {
+39            FileLoader::Static(files) => Ok(files
+40                .iter()
+41                .filter_map(|(file_path, content)| {
+42                    if file_path.starts_with(path) && file_path.ends_with(".fe") {
+43                        Some((file_path.to_string(), content.to_string()))
+44                    } else {
+45                        None
+46                    }
+47                })
+48                .collect()),
+49            FileLoader::Fs => {
+50                let entries = WalkDir::new(path);
+51                let mut files = vec![];
+52
+53                for entry in entries.into_iter() {
+54                    let entry =
+55                        entry.map_err(|err| format!("Error loading source files.\n{err}"))?;
+56                    let path = entry.path();
+57
+58                    if path.is_file()
+59                        && path.extension().and_then(std::ffi::OsStr::to_str) == Some("fe")
+60                    {
+61                        let content = std::fs::read_to_string(path)
+62                            .map_err(|err| format!("Unable to read src file.\n{err}"))?;
+63                        files.push((path.to_string_lossy().to_string(), content));
+64                    }
+65                }
+66
+67                Ok(files)
+68            }
+69        }
+70    }
+71
+72    pub fn file_content(&self, path: &str) -> Result<String, String> {
+73        match self {
+74            FileLoader::Static(files) => {
+75                match files.iter().find(|(file_path, _)| file_path == &path) {
+76                    Some((_, content)) => Ok(content.to_string()),
+77                    None => Err(format!("could not load static file {}", path)),
+78                }
+79            }
+80            FileLoader::Fs => {
+81                std::fs::read_to_string(path).map_err(|err| format!("Unable to read file.\n{err}"))
+82            }
+83        }
+84    }
+85}
+86
+87pub struct BuildFiles {
+88    pub root_project_path: SmolStr,
+89    pub project_files: IndexMap<SmolStr, ProjectFiles>,
+90}
+91
+92impl BuildFiles {
+93    pub fn root_project_mode(&self) -> ProjectMode {
+94        self.project_files[&self.root_project_path].mode
+95    }
+96
+97    /// Build files are loaded from the file system.
+98    pub fn load_fs(root_path: &str) -> Result<Self, String> {
+99        Self::load(&FileLoader::Fs, root_path)
+100    }
+101
+102    /// Build files are loaded from static file vector.
+103    pub fn load_static(
+104        files: Vec<(&'static str, &'static str)>,
+105        root_path: &str,
+106    ) -> Result<Self, String> {
+107        Self::load(&FileLoader::Static(files), root_path)
+108    }
+109
+110    fn load(loader: &FileLoader, root_project_path: &str) -> Result<Self, String> {
+111        let root_project_path = loader.canonicalize_path(root_project_path)?;
+112
+113        // Map containing canonicalized project paths and their files.
+114        let mut project_files = indexmap! {
+115            root_project_path.clone() => ProjectFiles::load(loader, &root_project_path)?
+116        };
+117
+118        // The root project is the first project to have unresolved dependencies.
+119        let mut unresolved_projects = vec![root_project_path.clone()];
+120
+121        while let Some(unresolved_project_path) = unresolved_projects.pop() {
+122            // Iterate over each of `unresolved_projects` dependencies.
+123            for dependency in project_files[&unresolved_project_path].dependencies.clone() {
+124                if !project_files.contains_key(&dependency.canonicalized_path) {
+125                    // The dependency is being encountered for the first time.
+126                    let dep_project = dependency.resolve(loader)?;
+127                    project_files.insert(dependency.canonicalized_path.clone(), dep_project);
+128                    unresolved_projects.push(dependency.canonicalized_path);
+129                };
+130            }
+131        }
+132
+133        Ok(Self {
+134            root_project_path,
+135            project_files,
+136        })
+137    }
+138}
+139
+140pub struct ProjectFiles {
+141    pub name: SmolStr,
+142    pub version: SmolStr,
+143    pub mode: ProjectMode,
+144    pub dependencies: Vec<Dependency>,
+145    pub src: Vec<(String, String)>,
+146}
+147
+148impl ProjectFiles {
+149    fn load(loader: &FileLoader, path: &str) -> Result<Self, String> {
+150        let manifest_path = Path::new(path)
+151            .join(FE_TOML)
+152            .to_str()
+153            .expect("unable to convert path to &str")
+154            .to_owned();
+155        let manifest = Manifest::load(loader, &manifest_path)?;
+156        let name = manifest.name;
+157        let version = manifest.version;
+158
+159        let mut dependencies = vec![];
+160        let mut errors = vec![];
+161
+162        if let Some(deps) = &manifest.dependencies {
+163            for (name, value) in deps {
+164                match Dependency::new(loader, name, path, value) {
+165                    Ok(dep) => dependencies.push(dep),
+166                    Err(dep_err) => {
+167                        errors.push(format!("Misconfigured dependency {name}:\n{dep_err}"))
+168                    }
+169                }
+170            }
+171        }
+172
+173        if !errors.is_empty() {
+174            return Err(errors.join("\n"));
+175        }
+176
+177        let src_path = Path::new(path)
+178            .join("src")
+179            .to_str()
+180            .expect("unable to convert path to &str")
+181            .to_owned();
+182        let src = loader.fe_files(&src_path)?;
+183
+184        let mode = if src
+185            .iter()
+186            .any(|(file_path, _)| file_path.ends_with("main.fe"))
+187        {
+188            ProjectMode::Main
+189        } else if src
+190            .iter()
+191            .any(|(file_path, _)| file_path.ends_with("lib.fe"))
+192        {
+193            ProjectMode::Lib
+194        } else {
+195            return Err(format!("Unable to determine mode of {}. Consider adding src/main.fe or src/lib.fe file to the project.", name));
+196        };
+197
+198        Ok(Self {
+199            name,
+200            version,
+201            mode,
+202            dependencies,
+203            src,
+204        })
+205    }
+206}
+207
+208#[derive(Clone, Copy, PartialEq, Eq)]
+209pub enum ProjectMode {
+210    Main,
+211    Lib,
+212}
+213
+214#[derive(Clone)]
+215pub struct Dependency {
+216    pub name: SmolStr,
+217    pub version: Option<SmolStr>,
+218    pub canonicalized_path: SmolStr,
+219    pub kind: DependencyKind,
+220}
+221
+222pub trait DependencyResolver {
+223    fn resolve(dep: &Dependency, loader: &FileLoader) -> Result<ProjectFiles, String>;
+224}
+225
+226#[derive(Clone)]
+227pub struct LocalDependency;
+228
+229impl DependencyResolver for LocalDependency {
+230    fn resolve(dep: &Dependency, loader: &FileLoader) -> Result<ProjectFiles, String> {
+231        let project = ProjectFiles::load(loader, &dep.canonicalized_path)?;
+232
+233        let mut errors = vec![];
+234
+235        if project.mode == ProjectMode::Main {
+236            errors.push(format!("{} is not a library", project.name));
+237        }
+238
+239        if project.name != dep.name {
+240            errors.push(format!("Name mismatch: {} =/= {}", project.name, dep.name));
+241        }
+242
+243        if let Some(version) = &dep.version {
+244            if version != &project.version {
+245                errors.push(format!(
+246                    "Version mismatch: {} =/= {}",
+247                    project.version, version
+248                ));
+249            }
+250        }
+251
+252        if errors.is_empty() {
+253            Ok(project)
+254        } else {
+255            Err(format!(
+256                "Unable to resolve {} at {} due to the following errors.\n{}",
+257                dep.name,
+258                dep.canonicalized_path,
+259                errors.join("\n")
+260            ))
+261        }
+262    }
+263}
+264
+265#[derive(Clone)]
+266pub struct GitDependency {
+267    source: String,
+268    rev: String,
+269}
+270
+271impl DependencyResolver for GitDependency {
+272    fn resolve(dep: &Dependency, loader: &FileLoader) -> Result<ProjectFiles, String> {
+273        if let DependencyKind::Git(GitDependency { source, rev }) = &dep.kind {
+274            if let Err(e) = git::fetch_and_checkout(source, dep.canonicalized_path.as_str(), rev) {
+275                return Err(format!(
+276                    "Unable to clone git dependency {}.\n{}",
+277                    dep.name, e
+278                ));
+279            }
+280
+281            // Load it like any local dependency which will include additional checks.
+282            return LocalDependency::resolve(dep, loader);
+283        }
+284        Err(format!("Could not resolve git dependency {}", dep.name))
+285    }
+286}
+287
+288#[derive(Clone)]
+289pub enum DependencyKind {
+290    Local(LocalDependency),
+291    Git(GitDependency),
+292}
+293
+294impl Dependency {
+295    fn new(
+296        loader: &FileLoader,
+297        name: &str,
+298        orig_path: &str,
+299        value: &toml::Value,
+300    ) -> Result<Self, String> {
+301        let join_path = |path: &str| {
+302            loader.canonicalize_path(
+303                Path::new(orig_path)
+304                    .join(path)
+305                    .to_str()
+306                    .expect("unable to convert path to &str"),
+307            )
+308        };
+309
+310        match value {
+311            toml::Value::String(dep_path) => Ok(Dependency {
+312                name: name.into(),
+313                version: None,
+314                kind: DependencyKind::Local(LocalDependency),
+315                canonicalized_path: join_path(dep_path)?,
+316            }),
+317            toml::Value::Table(table) => {
+318                let version = table
+319                    .get("version")
+320                    .map(|version| version.as_str().unwrap().into());
+321
+322                let return_local_dep = |path| {
+323                    Ok::<Dependency, String>(Dependency {
+324                        name: name.into(),
+325                        version: version.clone(),
+326                        canonicalized_path: join_path(path)?,
+327
+328                        kind: DependencyKind::Local(LocalDependency),
+329                    })
+330                };
+331
+332                match (table.get("source"), table.get("rev"), table.get("path")) {
+333                    (Some(toml::Value::String(source)), Some(toml::Value::String(rev)), None) => {
+334                        let dep_path = get_fe_deps().join(format!("{}-{}", name, rev));
+335                        if dep_path.exists() {
+336                            // Should we at least perform some kind of integrity check here? We currently treat an
+337                            // existing directory as a valid dependency no matter what.
+338                            return_local_dep(dep_path.to_str().unwrap())
+339                        } else {
+340                            fs::create_dir_all(&dep_path).unwrap();
+341                            Ok(Dependency {
+342                                name: name.into(),
+343                                version: version.clone(),
+344                                canonicalized_path: loader.canonicalize_path(
+345                                    Path::new(orig_path)
+346                                        .join(dep_path)
+347                                        .to_str()
+348                                        .expect("unable to convert path to &str"),
+349                                )?,
+350                                kind: DependencyKind::Git(GitDependency {
+351                                    source: source.into(),
+352                                    rev: rev.into(),
+353                                }),
+354                            })
+355                        }
+356                    }
+357                    (Some(_), Some(_), Some(_)) => {
+358                        Err("`path` can not be used together with `rev` and `source`".into())
+359                    }
+360                    (Some(_), None, _) => Err("`source` specified but no `rev` given".into()),
+361                    (None, Some(_), _) => Err("`rev` specified but no `source` given".into()),
+362                    (None, None, Some(toml::Value::String(path))) => return_local_dep(path),
+363                    _ => Err("Dependency isn't well formed".into()),
+364                }
+365            }
+366            _ => Err("unsupported toml type".into()),
+367        }
+368    }
+369
+370    fn resolve(&self, loader: &FileLoader) -> Result<ProjectFiles, String> {
+371        match &self.kind {
+372            DependencyKind::Local(_) => LocalDependency::resolve(self, loader),
+373            DependencyKind::Git(_) => GitDependency::resolve(self, loader),
+374        }
+375    }
+376}
+377
+378#[derive(Deserialize)]
+379struct Manifest {
+380    pub name: SmolStr,
+381    pub version: SmolStr,
+382    dependencies: Option<Table>,
+383}
+384
+385impl Manifest {
+386    pub fn load(loader: &FileLoader, path: &str) -> Result<Self, String> {
+387        let content = loader
+388            .file_content(path)
+389            .map_err(|err| format!("Failed to load manifest content from {path}.\n{err}"))?;
+390        let manifest: Manifest = toml::from_str(&content)
+391            .map_err(|err| format!("Failed to parse the content of {path}.\n{err}"))?;
+392
+393        Ok(manifest)
+394    }
+395}
+396
+397/// Returns the root path of the current Fe project
+398pub fn get_project_root() -> Option<String> {
+399    let current_dir = std::env::current_dir().expect("Unable to get current directory");
+400
+401    let mut current_path = current_dir.clone();
+402    loop {
+403        let fe_toml_path = current_path.join(FE_TOML);
+404        if fe_toml_path.is_file() {
+405            return fe_toml_path
+406                .parent()
+407                .map(|val| val.to_string_lossy().to_string());
+408        }
+409
+410        if !current_path.pop() {
+411            break;
+412        }
+413    }
+414
+415    None
+416}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/git.rs.html b/compiler-docs/src/fe_common/utils/git.rs.html new file mode 100644 index 0000000000..b2b8b513da --- /dev/null +++ b/compiler-docs/src/fe_common/utils/git.rs.html @@ -0,0 +1,68 @@ +git.rs - source

fe_common/utils/
git.rs

1#[cfg(not(target_arch = "wasm32"))]
+2use git2::{FetchOptions, Oid, Repository};
+3use std::error::Error;
+4#[cfg(not(target_arch = "wasm32"))]
+5use std::path::Path;
+6
+7/// Fetch and checkout the specified refspec from the remote repository without
+8/// fetching any additional history.
+9#[cfg(not(target_arch = "wasm32"))]
+10pub fn fetch_and_checkout<P: AsRef<Path>>(
+11    remote: &str,
+12    target_directory: P,
+13    refspec: &str,
+14) -> Result<(), Box<dyn Error>> {
+15    // We initialize the repo here so that we can be sure that we created a directory that
+16    // needs to be clean up in case of an error. If the init fails, there won't be anything
+17    // to clean up.
+18    let repo = Repository::init(&target_directory)?;
+19    let res = _fetch_and_checkout(remote, repo, refspec);
+20    if res.is_err() {
+21        std::fs::remove_dir_all(target_directory).expect("Failed to clean up directory");
+22    }
+23
+24    res
+25}
+26
+27#[cfg(not(target_arch = "wasm32"))]
+28fn _fetch_and_checkout(
+29    remote: &str,
+30    repo: Repository,
+31    refspec: &str,
+32) -> Result<(), Box<dyn Error>> {
+33    let mut remote = repo.remote("origin", remote)?;
+34
+35    let mut fetch_options = FetchOptions::new();
+36
+37    fetch_options.depth(1);
+38
+39    // Fetch the specified SHA1 with depth 1
+40    if let Err(e) = remote.fetch(&[refspec], Some(&mut fetch_options), None) {
+41        if let (git2::ErrorClass::Net, git2::ErrorCode::GenericError) = (e.class(), e.code()) {
+42            // That's a pretty cryptic error for the common case of the refspec not existing.
+43            // We keep the cryptic error (because it might have other causes) but add a hint.
+44            return Err(format!("{}\nMake sure revision {} exists in remote", e, refspec).into());
+45        } else {
+46            return Err(e.into());
+47        }
+48    }
+49
+50    // Find the fetched commit by SHA1
+51    let oid = Oid::from_str(refspec)?;
+52    let commit = repo.find_commit(oid)?;
+53
+54    // Checkout the commit
+55    repo.checkout_tree(commit.as_object(), None)?;
+56    repo.set_head_detached(oid)?;
+57
+58    Ok(())
+59}
+60
+61#[cfg(target_arch = "wasm32")]
+62pub fn fetch_and_checkout(
+63    _remote: &str,
+64    _target_directory: &str,
+65    _refspec: &str,
+66) -> Result<(), Box<dyn Error>> {
+67    Err("Not supported on WASM".into())
+68}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/humanize.rs.html b/compiler-docs/src/fe_common/utils/humanize.rs.html new file mode 100644 index 0000000000..d58160e8d5 --- /dev/null +++ b/compiler-docs/src/fe_common/utils/humanize.rs.html @@ -0,0 +1,44 @@ +humanize.rs - source

fe_common/utils/
humanize.rs

1/// A trait to derive plural or singular representations from
+2pub trait Pluralizable {
+3    fn to_plural(&self) -> String;
+4
+5    fn to_singular(&self) -> String;
+6}
+7
+8impl Pluralizable for &str {
+9    fn to_plural(&self) -> String {
+10        if self.ends_with('s') {
+11            self.to_string()
+12        } else {
+13            format!("{self}s")
+14        }
+15    }
+16
+17    fn to_singular(&self) -> String {
+18        if self.ends_with('s') {
+19            self[0..self.len() - 1].to_string()
+20        } else {
+21            self.to_string()
+22        }
+23    }
+24}
+25
+26// Impl Pluralizable for (singular, plural)
+27impl Pluralizable for (&str, &str) {
+28    fn to_plural(&self) -> String {
+29        self.1.to_string()
+30    }
+31
+32    fn to_singular(&self) -> String {
+33        self.0.to_string()
+34    }
+35}
+36
+37// Pluralize the given pluralizable if the `count` is greater than one.
+38pub fn pluralize_conditionally(pluralizable: impl Pluralizable, count: usize) -> String {
+39    if count == 1 {
+40        pluralizable.to_singular()
+41    } else {
+42        pluralizable.to_plural()
+43    }
+44}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/keccak.rs.html b/compiler-docs/src/fe_common/utils/keccak.rs.html new file mode 100644 index 0000000000..89e4b26d8e --- /dev/null +++ b/compiler-docs/src/fe_common/utils/keccak.rs.html @@ -0,0 +1,36 @@ +keccak.rs - source

fe_common/utils/
keccak.rs

1use tiny_keccak::{Hasher, Keccak};
+2
+3/// Get the full 32 byte hash of the content.
+4pub fn full(content: &[u8]) -> String {
+5    partial(content, 32)
+6}
+7
+8/// Take the first `size` number of bytes of the hash and pad the right side
+9/// with zeros to 32 bytes.
+10pub fn partial_right_padded(content: &[u8], size: usize) -> String {
+11    let result = full_as_bytes(content);
+12    let padded_output: Vec<u8> = result
+13        .iter()
+14        .enumerate()
+15        .map(|(index, byte)| if index >= size { 0 } else { *byte })
+16        .collect();
+17
+18    hex::encode(padded_output)
+19}
+20
+21/// Take the first `size` number of bytes of the hash with no padding.
+22pub fn partial(content: &[u8], size: usize) -> String {
+23    let result = full_as_bytes(content);
+24    hex::encode(&result[0..size])
+25}
+26
+27/// Get the full 32 byte hash of the content as a byte array.
+28pub fn full_as_bytes(content: &[u8]) -> [u8; 32] {
+29    let mut keccak = Keccak::v256();
+30    let mut selector = [0_u8; 32];
+31
+32    keccak.update(content);
+33    keccak.finalize(&mut selector);
+34
+35    selector
+36}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/mod.rs.html b/compiler-docs/src/fe_common/utils/mod.rs.html new file mode 100644 index 0000000000..c74ae8e097 --- /dev/null +++ b/compiler-docs/src/fe_common/utils/mod.rs.html @@ -0,0 +1,6 @@ +mod.rs - source

fe_common/utils/
mod.rs

1pub mod dirs;
+2pub mod files;
+3pub mod git;
+4pub mod humanize;
+5pub mod keccak;
+6pub mod ron;
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/ron.rs.html b/compiler-docs/src/fe_common/utils/ron.rs.html new file mode 100644 index 0000000000..502912c337 --- /dev/null +++ b/compiler-docs/src/fe_common/utils/ron.rs.html @@ -0,0 +1,92 @@ +ron.rs - source

fe_common/utils/
ron.rs

1use difference::{Changeset, Difference};
+2use serde::Serialize;
+3use std::fmt;
+4
+5/// Return the lines of text in the string `lines` prefixed with the prefix in
+6/// the string `prefix`.
+7fn prefix_lines(prefix: &str, lines: &str) -> String {
+8    lines
+9        .lines()
+10        .map(|i| [prefix, i].concat())
+11        .collect::<Vec<String>>()
+12        .join("\n")
+13}
+14
+15/// Wrapper struct for formatting changesets from the `difference` package.
+16pub struct Diff(Changeset);
+17
+18impl Diff {
+19    pub fn new(left: &str, right: &str) -> Self {
+20        Self(Changeset::new(left, right, "\n"))
+21    }
+22}
+23
+24impl fmt::Display for Diff {
+25    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+26        for d in &self.0.diffs {
+27            match *d {
+28                Difference::Same(ref x) => {
+29                    write!(f, "{}{}", prefix_lines(" ", x), self.0.split)?;
+30                }
+31                Difference::Add(ref x) => {
+32                    write!(f, "\x1b[92m{}\x1b[0m{}", prefix_lines("+", x), self.0.split)?;
+33                }
+34                Difference::Rem(ref x) => {
+35                    write!(f, "\x1b[91m{}\x1b[0m{}", prefix_lines("-", x), self.0.split)?;
+36                }
+37            }
+38        }
+39        Ok(())
+40    }
+41}
+42
+43/// Compare the given strings and panic when not equal with a colorized line
+44/// diff.
+45#[macro_export]
+46macro_rules! assert_strings_eq {
+47    ($left:expr, $right:expr,) => {{
+48        assert_strings_eq!($left, $right)
+49    }};
+50    ($left:expr, $right:expr) => {{
+51        match (&($left), &($right)) {
+52            (left_val, right_val) => {
+53                if *left_val != *right_val {
+54                    panic!(
+55                        "assertion failed: `(left == right)`\ndiff:\n{}",
+56                        Diff::new(left_val, right_val),
+57                    )
+58                }
+59            }
+60        }
+61    }};
+62    ($left:expr, $right:expr, $($args:tt)*) => {{
+63        match (&($left), &($right)) {
+64            (left_val, right_val) => {
+65                if *left_val != *right_val {
+66                    panic!(
+67                        "assertion failed: `(left == right)`: {}\ndiff:\n{}",
+68                        format_args!($($args)*),
+69                        Diff::new(left_val, right_val),
+70                    )
+71                }
+72            }
+73        }
+74    }};
+75}
+76
+77/// Convenience function to serialize objects in RON format with custom pretty
+78/// printing config and struct names.
+79pub fn to_ron_string_pretty<T>(value: &T) -> ron::ser::Result<String>
+80where
+81    T: Serialize,
+82{
+83    let config = ron::ser::PrettyConfig {
+84        indentor: "  ".to_string(),
+85        ..Default::default()
+86    };
+87
+88    let mut serializer = ron::ser::Serializer::new(Some(config), true);
+89    value.serialize(&mut serializer)?;
+90
+91    Ok(serializer.into_output_string())
+92}
\ No newline at end of file diff --git a/compiler-docs/src/fe_compiler_test_utils/lib.rs.html b/compiler-docs/src/fe_compiler_test_utils/lib.rs.html new file mode 100644 index 0000000000..49a5dbd212 --- /dev/null +++ b/compiler-docs/src/fe_compiler_test_utils/lib.rs.html @@ -0,0 +1,901 @@ +lib.rs - source

fe_compiler_test_utils/
lib.rs

1use evm_runtime::{ExitReason, Handler};
+2use fe_common::diagnostics::print_diagnostics;
+3use fe_common::utils::keccak;
+4use fe_driver as driver;
+5use primitive_types::{H160, U256};
+6use std::cell::RefCell;
+7use std::collections::BTreeMap;
+8use std::fmt::{Display, Formatter};
+9use std::str::FromStr;
+10use yultsur::*;
+11
+12#[macro_export]
+13macro_rules! assert_harness_gas_report {
+14    ($harness: expr) => {
+15        assert_snapshot!(format!("{}", $harness.gas_reporter));
+16    };
+17
+18    ($harness: expr, $($expr:expr),*) => {
+19        let mut settings = insta::Settings::clone_current();
+20        let suffix = format!("{:?}", $($expr,)*).replace("\"", "");
+21        settings.set_snapshot_suffix(suffix);
+22        let _guard = settings.bind_to_scope();
+23        assert_snapshot!(format!("{}", $harness.gas_reporter));
+24    }
+25}
+26
+27#[derive(Default, Debug)]
+28pub struct GasReporter {
+29    records: RefCell<Vec<GasRecord>>,
+30}
+31
+32impl GasReporter {
+33    pub fn add_record(&self, description: &str, gas_used: u64) {
+34        self.records.borrow_mut().push(GasRecord {
+35            description: description.to_string(),
+36            gas_used,
+37        })
+38    }
+39
+40    pub fn add_func_call_record(&self, function: &str, input: &[ethabi::Token], gas_used: u64) {
+41        let description = format!("{function}({input:?})");
+42        self.add_record(&description, gas_used)
+43    }
+44}
+45
+46impl Display for GasReporter {
+47    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+48        for record in self.records.borrow().iter() {
+49            writeln!(f, "{} used {} gas", record.description, record.gas_used)?;
+50        }
+51
+52        Ok(())
+53    }
+54}
+55
+56#[derive(Debug)]
+57pub struct GasRecord {
+58    pub description: String,
+59    pub gas_used: u64,
+60}
+61
+62pub trait ToBeBytes {
+63    fn to_be_bytes(&self) -> [u8; 32];
+64}
+65
+66impl ToBeBytes for U256 {
+67    fn to_be_bytes(&self) -> [u8; 32] {
+68        let mut input_bytes: [u8; 32] = [0; 32];
+69        self.to_big_endian(&mut input_bytes);
+70        input_bytes
+71    }
+72}
+73
+74#[allow(dead_code)]
+75pub type Backend<'a> = evm::backend::MemoryBackend<'a>;
+76
+77#[allow(dead_code)]
+78pub type StackState<'a> = evm::executor::stack::MemoryStackState<'a, 'a, Backend<'a>>;
+79
+80#[allow(dead_code)]
+81pub type Executor<'a, 'b> = evm::executor::stack::StackExecutor<'a, 'b, StackState<'a>, ()>;
+82
+83#[allow(dead_code)]
+84pub const DEFAULT_CALLER: &str = "1000000000000000000000000000000000000001";
+85
+86#[allow(dead_code)]
+87pub struct ContractHarness {
+88    pub gas_reporter: GasReporter,
+89    pub address: H160,
+90    pub abi: ethabi::Contract,
+91    pub caller: H160,
+92    pub value: U256,
+93}
+94
+95#[allow(dead_code)]
+96impl ContractHarness {
+97    fn new(contract_address: H160, abi: ethabi::Contract) -> Self {
+98        let caller = address(DEFAULT_CALLER);
+99
+100        ContractHarness {
+101            gas_reporter: GasReporter::default(),
+102            address: contract_address,
+103            abi,
+104            caller,
+105            value: U256::zero(),
+106        }
+107    }
+108
+109    pub fn capture_call(
+110        &self,
+111        executor: &mut Executor,
+112        name: &str,
+113        input: &[ethabi::Token],
+114    ) -> evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible> {
+115        let input = self.build_calldata(name, input);
+116        self.capture_call_raw_bytes(executor, input)
+117    }
+118
+119    pub fn build_calldata(&self, name: &str, input: &[ethabi::Token]) -> Vec<u8> {
+120        let function = &self.abi.functions[name][0];
+121        function
+122            .encode_input(input)
+123            .unwrap_or_else(|reason| panic!("Unable to encode input for {name}: {reason:?}"))
+124    }
+125
+126    pub fn capture_call_raw_bytes(
+127        &self,
+128        executor: &mut Executor,
+129        input: Vec<u8>,
+130    ) -> evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible> {
+131        let context = evm::Context {
+132            address: self.address,
+133            caller: self.caller,
+134            apparent_value: self.value,
+135        };
+136
+137        executor.call(self.address, None, input, None, false, context)
+138    }
+139
+140    pub fn test_function(
+141        &self,
+142        executor: &mut Executor,
+143        name: &str,
+144        input: &[ethabi::Token],
+145        output: Option<&ethabi::Token>,
+146    ) {
+147        let actual_output = self.call_function(executor, name, input);
+148
+149        assert_eq!(
+150            output.map(ToOwned::to_owned),
+151            actual_output,
+152            "unexpected output from `fn {name}`"
+153        )
+154    }
+155
+156    pub fn call_function(
+157        &self,
+158        executor: &mut Executor,
+159        name: &str,
+160        input: &[ethabi::Token],
+161    ) -> Option<ethabi::Token> {
+162        let function = &self.abi.functions[name][0];
+163        let start_gas = executor.used_gas();
+164        let capture = self.capture_call(executor, name, input);
+165        let gas_used = executor.used_gas() - start_gas;
+166        self.gas_reporter
+167            .add_func_call_record(name, input, gas_used);
+168
+169        match capture {
+170            evm::Capture::Exit((ExitReason::Succeed(_), output)) => function
+171                .decode_output(&output)
+172                .unwrap_or_else(|_| panic!("unable to decode output of {}: {:?}", name, &output))
+173                .pop(),
+174            evm::Capture::Exit((reason, _)) => panic!("failed to run \"{name}\": {reason:?}"),
+175            evm::Capture::Trap(_) => panic!("trap"),
+176        }
+177    }
+178
+179    pub fn test_function_reverts(
+180        &self,
+181        executor: &mut Executor,
+182        name: &str,
+183        input: &[ethabi::Token],
+184        revert_data: &[u8],
+185    ) {
+186        validate_revert(self.capture_call(executor, name, input), revert_data)
+187    }
+188
+189    pub fn test_call_reverts(&self, executor: &mut Executor, input: Vec<u8>, revert_data: &[u8]) {
+190        validate_revert(self.capture_call_raw_bytes(executor, input), revert_data)
+191    }
+192
+193    pub fn test_function_returns(
+194        &self,
+195        executor: &mut Executor,
+196        name: &str,
+197        input: &[ethabi::Token],
+198        return_data: &[u8],
+199    ) {
+200        validate_return(self.capture_call(executor, name, input), return_data)
+201    }
+202
+203    pub fn test_call_returns(&self, executor: &mut Executor, input: Vec<u8>, return_data: &[u8]) {
+204        validate_return(self.capture_call_raw_bytes(executor, input), return_data)
+205    }
+206
+207    // Executor must be passed by value to get emitted events.
+208    pub fn events_emitted(&self, executor: Executor, events: &[(&str, &[ethabi::Token])]) {
+209        let raw_logs = executor
+210            .into_state()
+211            .deconstruct()
+212            .1
+213            .into_iter()
+214            .map(|log| ethabi::RawLog::from((log.topics, log.data)))
+215            .collect::<Vec<ethabi::RawLog>>();
+216
+217        for (name, expected_output) in events {
+218            let event = self
+219                .abi
+220                .events()
+221                .find(|event| event.name.eq(name))
+222                .expect("unable to find event for name");
+223
+224            let outputs_for_event = raw_logs
+225                .iter()
+226                .filter_map(|raw_log| event.parse_log(raw_log.clone()).ok())
+227                .map(|event_log| {
+228                    event_log
+229                        .params
+230                        .into_iter()
+231                        .map(|param| param.value)
+232                        .collect::<Vec<_>>()
+233                })
+234                .collect::<Vec<_>>();
+235
+236            if !outputs_for_event.iter().any(|v| v == expected_output) {
+237                println!("raw logs dump: {raw_logs:?}");
+238                panic!(
+239                    "no \"{name}\" logs matching: {expected_output:?}\nfound: {outputs_for_event:?}"
+240                )
+241            }
+242        }
+243    }
+244
+245    pub fn set_caller(&mut self, caller: H160) {
+246        self.caller = caller;
+247    }
+248}
+249
+250#[allow(dead_code)]
+251pub fn with_executor(test: &dyn Fn(Executor)) {
+252    let vicinity = evm::backend::MemoryVicinity {
+253        gas_price: U256::zero(),
+254        origin: H160::zero(),
+255        chain_id: U256::zero(),
+256        block_hashes: Vec::new(),
+257        block_number: U256::zero(),
+258        block_coinbase: H160::zero(),
+259        block_timestamp: U256::zero(),
+260        block_difficulty: U256::zero(),
+261        block_gas_limit: primitive_types::U256::MAX,
+262        block_base_fee_per_gas: U256::zero(),
+263    };
+264    let state: BTreeMap<primitive_types::H160, evm::backend::MemoryAccount> = BTreeMap::new();
+265    let backend = evm::backend::MemoryBackend::new(&vicinity, state);
+266
+267    with_executor_backend(backend, test)
+268}
+269
+270#[allow(dead_code)]
+271pub fn with_executor_backend(backend: Backend, test: &dyn Fn(Executor)) {
+272    let config = evm::Config::london();
+273    let stack_state = StackState::new(
+274        evm::executor::stack::StackSubstateMetadata::new(u64::MAX, &config),
+275        &backend,
+276    );
+277    let executor = Executor::new_with_precompiles(stack_state, &config, &());
+278
+279    test(executor)
+280}
+281
+282pub fn validate_revert(
+283    capture: evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible>,
+284    expected_data: &[u8],
+285) {
+286    if let evm::Capture::Exit((evm::ExitReason::Revert(_), output)) = capture {
+287        assert_eq!(
+288            format!("0x{}", hex::encode(output)),
+289            format!("0x{}", hex::encode(expected_data))
+290        );
+291    } else {
+292        panic!("Method was expected to revert but didn't")
+293    };
+294}
+295
+296pub fn validate_return(
+297    capture: evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible>,
+298    expected_data: &[u8],
+299) {
+300    if let evm::Capture::Exit((evm::ExitReason::Succeed(_), output)) = capture {
+301        assert_eq!(
+302            format!("0x{}", hex::encode(output)),
+303            format!("0x{}", hex::encode(expected_data))
+304        );
+305    } else {
+306        panic!("Method was expected to return but didn't")
+307    };
+308}
+309
+310pub fn encoded_panic_assert() -> Vec<u8> {
+311    encode_revert("Panic(uint256)", &[uint_token(0x01)])
+312}
+313
+314pub fn encoded_over_or_underflow() -> Vec<u8> {
+315    encode_revert("Panic(uint256)", &[uint_token(0x11)])
+316}
+317
+318pub fn encoded_panic_out_of_bounds() -> Vec<u8> {
+319    encode_revert("Panic(uint256)", &[uint_token(0x32)])
+320}
+321
+322pub fn encoded_div_or_mod_by_zero() -> Vec<u8> {
+323    encode_revert("Panic(uint256)", &[uint_token(0x12)])
+324}
+325
+326pub fn encoded_invalid_abi_data() -> Vec<u8> {
+327    encode_revert("Error(uint256)", &[uint_token(0x103)])
+328}
+329
+330#[allow(dead_code)]
+331#[cfg(feature = "solc-backend")]
+332pub fn deploy_contract(
+333    executor: &mut Executor,
+334    fixture: &str,
+335    contract_name: &str,
+336    init_params: &[ethabi::Token],
+337) -> ContractHarness {
+338    let mut db = driver::Db::default();
+339    let compiled_module = match driver::compile_single_file(
+340        &mut db,
+341        fixture,
+342        test_files::fixture(fixture),
+343        true,
+344        false,
+345        true,
+346    ) {
+347        Ok(module) => module,
+348        Err(error) => {
+349            fe_common::diagnostics::print_diagnostics(&db, &error.0);
+350            panic!("failed to compile module: {fixture}")
+351        }
+352    };
+353
+354    let compiled_contract = compiled_module
+355        .contracts
+356        .get(contract_name)
+357        .expect("could not find contract in fixture");
+358
+359    _deploy_contract(
+360        executor,
+361        &compiled_contract.bytecode,
+362        &compiled_contract.json_abi,
+363        init_params,
+364    )
+365}
+366
+367#[allow(dead_code)]
+368#[cfg(feature = "solc-backend")]
+369pub fn deploy_contract_from_ingot(
+370    executor: &mut Executor,
+371    path: &str,
+372    contract_name: &str,
+373    init_params: &[ethabi::Token],
+374) -> ContractHarness {
+375    use fe_common::utils::files::BuildFiles;
+376
+377    let files = test_files::fixture_dir_files("ingots");
+378    let build_files = BuildFiles::load_static(files, path).expect("failed to load build files");
+379    let mut db = driver::Db::default();
+380    let compiled_module = match driver::compile_ingot(&mut db, &build_files, true, false, true) {
+381        Ok(module) => module,
+382        Err(error) => {
+383            fe_common::diagnostics::print_diagnostics(&db, &error.0);
+384            panic!("failed to compile ingot: {path}")
+385        }
+386    };
+387
+388    let compiled_contract = compiled_module
+389        .contracts
+390        .get(contract_name)
+391        .expect("could not find contract in fixture");
+392
+393    _deploy_contract(
+394        executor,
+395        &compiled_contract.bytecode,
+396        &compiled_contract.json_abi,
+397        init_params,
+398    )
+399}
+400
+401#[allow(dead_code)]
+402#[cfg(feature = "solc-backend")]
+403pub fn deploy_solidity_contract(
+404    executor: &mut Executor,
+405    fixture: &str,
+406    contract_name: &str,
+407    init_params: &[ethabi::Token],
+408    optimized: bool,
+409) -> ContractHarness {
+410    let src = test_files::fixture(fixture)
+411        .replace('\n', "")
+412        .replace('"', "\\\"");
+413
+414    let (bytecode, abi) = compile_solidity_contract(contract_name, &src, optimized)
+415        .expect("Could not compile contract");
+416
+417    _deploy_contract(executor, &bytecode, &abi, init_params)
+418}
+419
+420#[allow(dead_code)]
+421pub fn encode_error_reason(reason: &str) -> Vec<u8> {
+422    encode_revert("Error(string)", &[string_token(reason)])
+423}
+424
+425#[allow(dead_code)]
+426pub fn encode_revert(selector: &str, input: &[ethabi::Token]) -> Vec<u8> {
+427    let mut data = String::new();
+428    for param in input {
+429        let encoded = match param {
+430            ethabi::Token::Uint(val) | ethabi::Token::Int(val) => {
+431                format!("{:0>64}", format!("{val:x}"))
+432            }
+433            ethabi::Token::Bool(val) => format!("{:0>64x}", *val as i32),
+434            ethabi::Token::String(val) => {
+435                const DATA_OFFSET: &str =
+436                    "0000000000000000000000000000000000000000000000000000000000000020";
+437
+438                // Length of the string padded to 32 bit hex
+439                let string_len = format!("{:0>64x}", val.len());
+440
+441                let mut string_bytes = val.as_bytes().to_vec();
+442                while string_bytes.len() % 32 != 0 {
+443                    string_bytes.push(0)
+444                }
+445                // The bytes of the string itself, right padded to consume a multiple of 32
+446                // bytes
+447                let string_bytes = hex::encode(&string_bytes);
+448
+449                format!("{DATA_OFFSET}{string_len}{string_bytes}")
+450            }
+451            _ => todo!("Other ABI types not supported yet"),
+452        };
+453        data.push_str(&encoded);
+454    }
+455
+456    let all = format!("{}{}", get_function_selector(selector), data);
+457    hex::decode(&all).unwrap_or_else(|_| panic!("No valid hex: {}", &all))
+458}
+459
+460fn get_function_selector(signature: &str) -> String {
+461    // Function selector (e.g first 4 bytes of keccak("Error(string)")
+462    hex::encode(&keccak::full_as_bytes(signature.as_bytes())[..4])
+463}
+464
+465fn _deploy_contract(
+466    executor: &mut Executor,
+467    bytecode: &str,
+468    abi: &str,
+469    init_params: &[ethabi::Token],
+470) -> ContractHarness {
+471    let abi = ethabi::Contract::load(abi.as_bytes()).expect("unable to load the ABI");
+472
+473    let mut bytecode = hex::decode(bytecode).expect("failed to decode bytecode");
+474
+475    if let Some(constructor) = &abi.constructor {
+476        bytecode = constructor.encode_input(bytecode, init_params).unwrap()
+477    }
+478
+479    if let evm::Capture::Exit(exit) = executor.create(
+480        address(DEFAULT_CALLER),
+481        evm_runtime::CreateScheme::Legacy {
+482            caller: address(DEFAULT_CALLER),
+483        },
+484        U256::zero(),
+485        bytecode,
+486        None,
+487    ) {
+488        return ContractHarness::new(
+489            exit.1
+490                .unwrap_or_else(|| panic!("Unable to retrieve contract address: {:?}", exit.0)),
+491            abi,
+492        );
+493    }
+494
+495    panic!("Failed to create contract")
+496}
+497
+498#[derive(Debug)]
+499pub struct SolidityCompileError(Vec<serde_json::Value>);
+500
+501impl std::fmt::Display for SolidityCompileError {
+502    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+503        write!(f, "{:?}", &self.0[..])
+504    }
+505}
+506
+507impl std::error::Error for SolidityCompileError {}
+508
+509#[cfg(feature = "solc-backend")]
+510pub fn compile_solidity_contract(
+511    name: &str,
+512    solidity_src: &str,
+513    optimized: bool,
+514) -> Result<(String, String), SolidityCompileError> {
+515    let solc_config = r#"
+516    {
+517        "language": "Solidity",
+518        "sources": { "input.sol": { "content": "{src}" } },
+519        "settings": {
+520          "optimizer": { "enabled": {optimizer_enabled} },
+521          "outputSelection": { "*": { "*": ["*"], "": [ "*" ] } }
+522        }
+523      }
+524    "#;
+525    let solc_config = solc_config
+526        .replace("{src}", solidity_src)
+527        .replace("{optimizer_enabled}", &optimized.to_string());
+528
+529    let raw_output = solc::compile(&solc_config);
+530
+531    let output: serde_json::Value =
+532        serde_json::from_str(&raw_output).expect("Unable to compile contract");
+533
+534    if output["errors"].is_array() {
+535        let severity: serde_json::Value =
+536            serde_json::to_value("error").expect("Unable to convert into serde value type");
+537        let errors: serde_json::Value = output["errors"]
+538            .as_array()
+539            .unwrap()
+540            .iter()
+541            .cloned()
+542            .filter_map(|err| {
+543                if err["severity"] == severity {
+544                    Some(err["formattedMessage"].clone())
+545                } else {
+546                    None
+547                }
+548            })
+549            .collect();
+550
+551        let errors_list = errors
+552            .as_array()
+553            .unwrap_or_else(|| panic!("Unable to parse error properly"));
+554        if !errors_list.is_empty() {
+555            return Err(SolidityCompileError(errors_list.clone()));
+556        }
+557    }
+558
+559    let bytecode = output["contracts"]["input.sol"][name]["evm"]["bytecode"]["object"]
+560        .to_string()
+561        .replace('"', "");
+562
+563    let abi = if let serde_json::Value::Array(data) = &output["contracts"]["input.sol"][name]["abi"]
+564    {
+565        data.iter()
+566            .filter(|val| {
+567                // ethabi doesn't yet support error types so we just filter them out for now
+568                // https://github.com/rust-ethereum/ethabi/issues/225
+569                val["type"] != "error"
+570            })
+571            .cloned()
+572            .collect::<Vec<_>>()
+573    } else {
+574        vec![]
+575    };
+576
+577    let abi = serde_json::Value::Array(abi).to_string();
+578
+579    if [&bytecode, &abi].iter().any(|val| val == &"null") {
+580        return Err(SolidityCompileError(vec![serde_json::Value::String(
+581            String::from("Bytecode not found"),
+582        )]));
+583    }
+584
+585    Ok((bytecode, abi))
+586}
+587
+588#[allow(dead_code)]
+589pub fn load_contract(address: H160, fixture: &str, contract_name: &str) -> ContractHarness {
+590    let mut db = driver::Db::default();
+591    let compiled_module = driver::compile_single_file(
+592        &mut db,
+593        fixture,
+594        test_files::fixture(fixture),
+595        true,
+596        false,
+597        true,
+598    )
+599    .unwrap_or_else(|err| {
+600        print_diagnostics(&db, &err.0);
+601        panic!("failed to compile fixture: {fixture}");
+602    });
+603    let compiled_contract = compiled_module
+604        .contracts
+605        .get(contract_name)
+606        .expect("could not find contract in fixture");
+607    let abi = ethabi::Contract::load(compiled_contract.json_abi.as_bytes())
+608        .expect("unable to load the ABI");
+609
+610    ContractHarness::new(address, abi)
+611}
+612pub struct Runtime {
+613    functions: Vec<yul::Statement>,
+614    test_statements: Vec<yul::Statement>,
+615    data: Vec<yul::Data>,
+616}
+617
+618impl Default for Runtime {
+619    fn default() -> Self {
+620        Self::new()
+621    }
+622}
+623
+624pub struct ExecutionOutput {
+625    exit_reason: ExitReason,
+626    data: Vec<u8>,
+627}
+628
+629#[allow(dead_code)]
+630impl Runtime {
+631    /// Create a new `Runtime` instance.
+632    pub fn new() -> Runtime {
+633        Runtime {
+634            functions: vec![],
+635            test_statements: vec![],
+636            data: vec![],
+637        }
+638    }
+639
+640    /// Add the given set of functions
+641    pub fn with_functions(self, fns: Vec<yul::Statement>) -> Runtime {
+642        Runtime {
+643            functions: fns,
+644            ..self
+645        }
+646    }
+647
+648    /// Add the given set of test statements
+649    pub fn with_test_statements(self, statements: Vec<yul::Statement>) -> Runtime {
+650        Runtime {
+651            test_statements: statements,
+652            ..self
+653        }
+654    }
+655
+656    // Add the given set of data
+657    pub fn with_data(self, data: Vec<yul::Data>) -> Runtime {
+658        Runtime { data, ..self }
+659    }
+660
+661    /// Generate the top level YUL object
+662    pub fn to_yul(&self) -> yul::Object {
+663        let all_statements = [self.functions.clone(), self.test_statements.clone()].concat();
+664        yul::Object {
+665            name: identifier! { Contract },
+666            code: code! { [all_statements...] },
+667            objects: vec![],
+668            data: self.data.clone(),
+669        }
+670    }
+671
+672    #[cfg(feature = "solc-backend")]
+673    pub fn execute(&self, executor: &mut Executor) -> ExecutionOutput {
+674        let (exit_reason, data) = execute_runtime_functions(executor, self);
+675        ExecutionOutput::new(exit_reason, data)
+676    }
+677}
+678
+679#[allow(dead_code)]
+680impl ExecutionOutput {
+681    /// Create an `ExecutionOutput` instance
+682    pub fn new(exit_reason: ExitReason, data: Vec<u8>) -> ExecutionOutput {
+683        ExecutionOutput { exit_reason, data }
+684    }
+685
+686    /// Panic if the execution did not succeed.
+687    pub fn expect_success(self) -> ExecutionOutput {
+688        if let ExecutionOutput {
+689            exit_reason: ExitReason::Succeed(_),
+690            ..
+691        } = &self
+692        {
+693            self
+694        } else {
+695            panic!("Execution did not succeed: {:?}", &self.exit_reason)
+696        }
+697    }
+698
+699    /// Panic if the execution did not revert.
+700    pub fn expect_revert(self) -> ExecutionOutput {
+701        if let ExecutionOutput {
+702            exit_reason: ExitReason::Revert(_),
+703            ..
+704        } = &self
+705        {
+706            self
+707        } else {
+708            panic!("Execution did not revert: {:?}", &self.exit_reason)
+709        }
+710    }
+711
+712    /// Panic if the output is not an encoded error reason of the given string.
+713    pub fn expect_revert_reason(self, reason: &str) -> ExecutionOutput {
+714        assert_eq!(self.data, encode_error_reason(reason));
+715        self
+716    }
+717}
+718
+719#[cfg(feature = "solc-backend")]
+720fn execute_runtime_functions(executor: &mut Executor, runtime: &Runtime) -> (ExitReason, Vec<u8>) {
+721    let yul_code = runtime.to_yul().to_string().replace('"', "\\\"");
+722    let contract_bytecode = fe_yulc::compile_single_contract("Contract", &yul_code, false, false)
+723        .expect("failed to compile Yul");
+724    let bytecode = hex::decode(contract_bytecode.bytecode).expect("failed to decode bytecode");
+725
+726    if let evm::Capture::Exit((reason, _, output)) = executor.create(
+727        address(DEFAULT_CALLER),
+728        evm_runtime::CreateScheme::Legacy {
+729            caller: address(DEFAULT_CALLER),
+730        },
+731        U256::zero(),
+732        bytecode,
+733        None,
+734    ) {
+735        (reason, output)
+736    } else {
+737        panic!("EVM trap during test")
+738    }
+739}
+740
+741#[allow(dead_code)]
+742pub fn uint_token(n: u64) -> ethabi::Token {
+743    ethabi::Token::Uint(U256::from(n))
+744}
+745
+746#[allow(dead_code)]
+747pub fn uint_token_from_dec_str(val: &str) -> ethabi::Token {
+748    ethabi::Token::Uint(U256::from_dec_str(val).expect("Not a valid dec string"))
+749}
+750
+751#[allow(dead_code)]
+752pub fn int_token(val: i64) -> ethabi::Token {
+753    ethabi::Token::Int(to_2s_complement(val))
+754}
+755
+756#[allow(dead_code)]
+757pub fn string_token(s: &str) -> ethabi::Token {
+758    ethabi::Token::String(s.to_string())
+759}
+760
+761#[allow(dead_code)]
+762pub fn address(s: &str) -> H160 {
+763    H160::from_str(s).unwrap_or_else(|_| panic!("couldn't create address from: {s}"))
+764}
+765
+766#[allow(dead_code)]
+767pub fn address_token(s: &str) -> ethabi::Token {
+768    // left pads to 40 characters
+769    ethabi::Token::Address(address(&format!("{s:0>40}")))
+770}
+771
+772#[allow(dead_code)]
+773pub fn bool_token(val: bool) -> ethabi::Token {
+774    ethabi::Token::Bool(val)
+775}
+776
+777#[allow(dead_code)]
+778pub fn bytes_token(s: &str) -> ethabi::Token {
+779    ethabi::Token::Bytes(ethabi::Bytes::from(s))
+780}
+781
+782#[allow(dead_code)]
+783pub fn uint_array_token(v: &[u64]) -> ethabi::Token {
+784    ethabi::Token::FixedArray(v.iter().map(|n| uint_token(*n)).collect())
+785}
+786
+787#[allow(dead_code)]
+788pub fn int_array_token(v: &[i64]) -> ethabi::Token {
+789    ethabi::Token::FixedArray(v.iter().map(|n| int_token(*n)).collect())
+790}
+791
+792#[allow(dead_code)]
+793pub fn address_array_token(v: &[&str]) -> ethabi::Token {
+794    ethabi::Token::FixedArray(v.iter().map(|s| address_token(s)).collect())
+795}
+796
+797#[allow(dead_code)]
+798pub fn tuple_token(tokens: &[ethabi::Token]) -> ethabi::Token {
+799    ethabi::Token::Tuple(tokens.to_owned())
+800}
+801
+802#[allow(dead_code)]
+803pub fn to_2s_complement(val: i64) -> U256 {
+804    // Since this API takes an `i64` we can be sure that the min and max values
+805    // will never be above what fits the `I256` type which has the same capacity
+806    // as U256 but splits it so that one half covers numbers above 0 and the
+807    // other half covers the numbers below 0.
+808
+809    // Conversion to Two's Complement: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
+810
+811    if val >= 0 {
+812        U256::from(val)
+813    } else {
+814        let positive_val = -val;
+815        get_2s_complement_for_negative(U256::from(positive_val))
+816    }
+817}
+818
+819/// To get the 2s complement value for e.g. -128 call
+820/// get_2s_complement_for_negative(128)
+821#[allow(dead_code)]
+822pub fn get_2s_complement_for_negative(assume_negative: U256) -> U256 {
+823    assume_negative.overflowing_neg().0
+824}
+825
+826#[allow(dead_code)]
+827pub struct NumericAbiTokenBounds {
+828    pub size: u64,
+829    pub u_min: ethabi::Token,
+830    pub i_min: ethabi::Token,
+831    pub u_max: ethabi::Token,
+832    pub i_max: ethabi::Token,
+833}
+834
+835impl NumericAbiTokenBounds {
+836    #[allow(dead_code)]
+837    pub fn get_all() -> [NumericAbiTokenBounds; 6] {
+838        let zero = uint_token(0);
+839        let u64_max = ethabi::Token::Uint(U256::from(2).pow(U256::from(64)) - 1);
+840        let i64_min = ethabi::Token::Int(get_2s_complement_for_negative(
+841            U256::from(2).pow(U256::from(63)),
+842        ));
+843
+844        let u128_max = ethabi::Token::Uint(U256::from(2).pow(U256::from(128)) - 1);
+845        let i128_max = ethabi::Token::Int(U256::from(2).pow(U256::from(127)) - 1);
+846        let i128_min = ethabi::Token::Int(get_2s_complement_for_negative(
+847            U256::from(2).pow(U256::from(127)),
+848        ));
+849
+850        let u256_max = ethabi::Token::Uint(U256::MAX);
+851        let i256_max = ethabi::Token::Int(U256::from(2).pow(U256::from(255)) - 1);
+852        let i256_min = ethabi::Token::Int(get_2s_complement_for_negative(
+853            U256::from(2).pow(U256::from(255)),
+854        ));
+855
+856        [
+857            NumericAbiTokenBounds {
+858                size: 8,
+859                u_min: zero.clone(),
+860                i_min: int_token(-128),
+861                u_max: uint_token(255),
+862                i_max: int_token(127),
+863            },
+864            NumericAbiTokenBounds {
+865                size: 16,
+866                u_min: zero.clone(),
+867                i_min: int_token(-32768),
+868                u_max: uint_token(65535),
+869                i_max: int_token(32767),
+870            },
+871            NumericAbiTokenBounds {
+872                size: 32,
+873                u_min: zero.clone(),
+874                i_min: int_token(-2147483648),
+875                u_max: uint_token(4294967295),
+876                i_max: int_token(2147483647),
+877            },
+878            NumericAbiTokenBounds {
+879                size: 64,
+880                u_min: zero.clone(),
+881                i_min: i64_min,
+882                u_max: u64_max,
+883                i_max: int_token(9223372036854775807),
+884            },
+885            NumericAbiTokenBounds {
+886                size: 128,
+887                u_min: zero.clone(),
+888                i_min: i128_min,
+889                u_max: u128_max,
+890                i_max: i128_max,
+891            },
+892            NumericAbiTokenBounds {
+893                size: 256,
+894                u_min: zero,
+895                i_min: i256_min,
+896                u_max: u256_max,
+897                i_max: i256_max,
+898            },
+899        ]
+900    }
+901}
\ No newline at end of file diff --git a/compiler-docs/src/fe_compiler_tests/lib.rs.html b/compiler-docs/src/fe_compiler_tests/lib.rs.html new file mode 100644 index 0000000000..053ff65cb3 --- /dev/null +++ b/compiler-docs/src/fe_compiler_tests/lib.rs.html @@ -0,0 +1,68 @@ +lib.rs - source

fe_compiler_tests/
lib.rs

1#![cfg(feature = "solc-backend")]
+2#![allow(dead_code)]
+3use std::path::Path;
+4
+5use dir_test::{dir_test, Fixture};
+6use fe_common::diagnostics::print_diagnostics;
+7use fe_common::utils::files::BuildFiles;
+8use fe_test_runner::TestSink;
+9
+10#[dir_test(dir: "$CARGO_MANIFEST_DIR/fixtures/files", glob: "*.fe")]
+11fn single_file_test_run(fixture: Fixture<&str>) {
+12    let mut db = fe_driver::Db::default();
+13    let tests = match fe_driver::compile_single_file_tests(
+14        &mut db,
+15        fixture.path(),
+16        fixture.content(),
+17        true,
+18    ) {
+19        Ok((_, tests)) => tests,
+20        Err(error) => {
+21            eprintln!("Unable to compile {}.", fixture.path());
+22            print_diagnostics(&db, &error.0);
+23            panic!("failed to compile tests")
+24        }
+25    };
+26
+27    let mut test_sink = TestSink::new(true);
+28
+29    for test in tests {
+30        test.execute(&mut test_sink);
+31    }
+32
+33    if test_sink.failure_count() != 0 {
+34        panic!("{}", test_sink)
+35    }
+36}
+37
+38#[dir_test(dir: "$CARGO_MANIFEST_DIR/fixtures/ingots/", glob: "**/fe.toml")]
+39fn ingot_test_run(fixture: Fixture<&str>) {
+40    let input_path = fixture.path().trim_end_matches("/fe.toml");
+41    let optimize = true;
+42
+43    if !Path::new(input_path).exists() {
+44        panic!("Input directory does not exist: `{input_path}`.");
+45    }
+46
+47    let build_files =
+48        BuildFiles::load_fs(input_path).expect("failed to load build files from file system");
+49
+50    let mut db = fe_driver::Db::default();
+51    match fe_driver::compile_ingot_tests(&mut db, &build_files, optimize) {
+52        Ok(test_batches) => {
+53            let mut sink = TestSink::new(true);
+54            for (_, tests) in test_batches {
+55                for test in tests {
+56                    test.execute(&mut sink);
+57                }
+58                if sink.failure_count() != 0 {
+59                    panic!("{}", sink)
+60                }
+61            }
+62        }
+63        Err(error) => {
+64            print_diagnostics(&db, &error.0);
+65            panic!("Unable to compile {input_path}.");
+66        }
+67    }
+68}
\ No newline at end of file diff --git a/compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html b/compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html new file mode 100644 index 0000000000..a595a4c002 --- /dev/null +++ b/compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html @@ -0,0 +1,18 @@ +lib.rs - source

fe_compiler_tests_legacy/
lib.rs

1#[cfg(test)]
+2mod crashes;
+3#[cfg(test)]
+4mod demo_erc20;
+5#[cfg(test)]
+6mod demo_guestbook;
+7#[cfg(test)]
+8mod demo_simple_open_auction;
+9#[cfg(test)]
+10mod demo_uniswap;
+11#[cfg(test)]
+12mod differential;
+13#[cfg(test)]
+14mod features;
+15#[cfg(test)]
+16mod solidity;
+17#[cfg(test)]
+18mod stress;
\ No newline at end of file diff --git a/compiler-docs/src/fe_driver/lib.rs.html b/compiler-docs/src/fe_driver/lib.rs.html new file mode 100644 index 0000000000..daa1bf6785 --- /dev/null +++ b/compiler-docs/src/fe_driver/lib.rs.html @@ -0,0 +1,359 @@ +lib.rs - source

fe_driver/
lib.rs

1#![allow(unused_imports, dead_code)]
+2
+3use fe_abi::event::AbiEvent;
+4use fe_abi::types::{AbiTupleField, AbiType};
+5pub use fe_codegen::db::{CodegenDb, Db};
+6
+7use fe_analyzer::namespace::items::{ContractId, FunctionId, IngotId, IngotMode, ModuleId};
+8use fe_common::diagnostics::Diagnostic;
+9use fe_common::files::FileKind;
+10use fe_common::{db::Upcast, utils::files::BuildFiles};
+11use fe_parser::ast::SmolStr;
+12use fe_test_runner::ethabi::{Event, EventParam, ParamType};
+13use fe_test_runner::TestSink;
+14use indexmap::{indexmap, IndexMap};
+15use serde_json::Value;
+16use std::fmt::Display;
+17
+18/// The artifacts of a compiled module.
+19pub struct CompiledModule {
+20    pub src_ast: String,
+21    pub lowered_ast: String,
+22    pub contracts: IndexMap<String, CompiledContract>,
+23}
+24
+25/// The artifacts of a compiled contract.
+26pub struct CompiledContract {
+27    pub json_abi: String,
+28    pub yul: String,
+29    pub origin: ContractId,
+30    #[cfg(feature = "solc-backend")]
+31    pub bytecode: String,
+32    #[cfg(feature = "solc-backend")]
+33    pub runtime_bytecode: String,
+34}
+35
+36#[cfg(feature = "solc-backend")]
+37#[derive(Debug, Clone, PartialEq, Eq)]
+38pub struct CompiledTest {
+39    pub name: SmolStr,
+40    events: Vec<AbiEvent>,
+41    bytecode: String,
+42}
+43
+44#[cfg(feature = "solc-backend")]
+45impl CompiledTest {
+46    pub fn new(name: SmolStr, events: Vec<AbiEvent>, bytecode: String) -> Self {
+47        Self {
+48            name,
+49            events,
+50            bytecode,
+51        }
+52    }
+53
+54    pub fn execute(&self, sink: &mut TestSink) -> bool {
+55        let events = map_abi_events(&self.events);
+56        fe_test_runner::execute(&self.name, &events, &self.bytecode, sink)
+57    }
+58}
+59
+60fn map_abi_events(events: &[AbiEvent]) -> Vec<Event> {
+61    events.iter().map(map_abi_event).collect()
+62}
+63
+64fn map_abi_event(event: &AbiEvent) -> Event {
+65    let inputs = event
+66        .inputs
+67        .iter()
+68        .map(|input| {
+69            let kind = map_abi_type(&input.ty);
+70            EventParam {
+71                name: input.name.to_owned(),
+72                kind,
+73                indexed: input.indexed,
+74            }
+75        })
+76        .collect();
+77    Event {
+78        name: event.name.to_owned(),
+79        inputs,
+80        anonymous: event.anonymous,
+81    }
+82}
+83
+84fn map_abi_type(typ: &AbiType) -> ParamType {
+85    match typ {
+86        AbiType::UInt(value) => ParamType::Uint(*value),
+87        AbiType::Int(value) => ParamType::Int(*value),
+88        AbiType::Address => ParamType::Address,
+89        AbiType::Bool => ParamType::Bool,
+90        AbiType::Function => panic!("function cannot be mapped to an actual ABI value type"),
+91        AbiType::Array { elem_ty, len } => {
+92            ParamType::FixedArray(Box::new(map_abi_type(elem_ty)), *len)
+93        }
+94        AbiType::Tuple(params) => ParamType::Tuple(map_abi_types(params)),
+95        AbiType::Bytes => ParamType::Bytes,
+96        AbiType::String => ParamType::String,
+97    }
+98}
+99
+100fn map_abi_types(fields: &[AbiTupleField]) -> Vec<ParamType> {
+101    fields.iter().map(|field| map_abi_type(&field.ty)).collect()
+102}
+103
+104#[derive(Debug)]
+105pub struct CompileError(pub Vec<Diagnostic>);
+106
+107pub fn check_single_file(db: &mut Db, path: &str, src: &str) -> Vec<Diagnostic> {
+108    let module = ModuleId::new_standalone(db, path, src);
+109    module.diagnostics(db)
+110}
+111
+112pub fn compile_single_file(
+113    db: &mut Db,
+114    path: &str,
+115    src: &str,
+116    with_bytecode: bool,
+117    with_runtime_bytecode: bool,
+118    optimize: bool,
+119) -> Result<CompiledModule, CompileError> {
+120    let module = ModuleId::new_standalone(db, path, src);
+121    let diags = module.diagnostics(db);
+122
+123    if diags.is_empty() {
+124        compile_module(db, module, with_bytecode, with_runtime_bytecode, optimize)
+125    } else {
+126        Err(CompileError(diags))
+127    }
+128}
+129
+130#[cfg(feature = "solc-backend")]
+131pub fn compile_single_file_tests(
+132    db: &mut Db,
+133    path: &str,
+134    src: &str,
+135    optimize: bool,
+136) -> Result<(SmolStr, Vec<CompiledTest>), CompileError> {
+137    let module = ModuleId::new_standalone(db, path, src);
+138    let diags = module.diagnostics(db);
+139
+140    if diags.is_empty() {
+141        Ok((module.name(db), compile_module_tests(db, module, optimize)))
+142    } else {
+143        Err(CompileError(diags))
+144    }
+145}
+146
+147// Run analysis with ingot
+148// Return vector error,waring...
+149pub fn check_ingot(db: &mut Db, build_files: &BuildFiles) -> Vec<Diagnostic> {
+150    let ingot = IngotId::from_build_files(db, build_files);
+151
+152    let mut diags = ingot.diagnostics(db);
+153    ingot.sink_external_ingot_diagnostics(db, &mut diags);
+154    diags
+155}
+156
+157/// Compiles the main module of a project.
+158///
+159/// If `with_bytecode` is set to false, the compiler will skip the final Yul ->
+160/// Bytecode pass. This is useful when debugging invalid Yul code.
+161pub fn compile_ingot(
+162    db: &mut Db,
+163    build_files: &BuildFiles,
+164    with_bytecode: bool,
+165    with_runtime_bytecode: bool,
+166    optimize: bool,
+167) -> Result<CompiledModule, CompileError> {
+168    let ingot = IngotId::from_build_files(db, build_files);
+169
+170    let mut diags = ingot.diagnostics(db);
+171    ingot.sink_external_ingot_diagnostics(db, &mut diags);
+172    if !diags.is_empty() {
+173        return Err(CompileError(diags));
+174    }
+175    let main_module = ingot
+176        .root_module(db)
+177        .expect("missing root module, with no diagnostic");
+178    compile_module(
+179        db,
+180        main_module,
+181        with_bytecode,
+182        with_runtime_bytecode,
+183        optimize,
+184    )
+185}
+186
+187#[cfg(feature = "solc-backend")]
+188pub fn compile_ingot_tests(
+189    db: &mut Db,
+190    build_files: &BuildFiles,
+191    optimize: bool,
+192) -> Result<Vec<(SmolStr, Vec<CompiledTest>)>, CompileError> {
+193    let ingot = IngotId::from_build_files(db, build_files);
+194
+195    let mut diags = ingot.diagnostics(db);
+196    ingot.sink_external_ingot_diagnostics(db, &mut diags);
+197    if !diags.is_empty() {
+198        return Err(CompileError(diags));
+199    }
+200
+201    if diags.is_empty() {
+202        Ok(ingot
+203            .all_modules(db)
+204            .iter()
+205            .fold(vec![], |mut accum, module| {
+206                accum.push((module.name(db), compile_module_tests(db, *module, optimize)));
+207                accum
+208            }))
+209    } else {
+210        Err(CompileError(diags))
+211    }
+212}
+213
+214/// Returns graphviz string.
+215// TODO: This is temporary function for debugging.
+216pub fn dump_mir_single_file(db: &mut Db, path: &str, src: &str) -> Result<String, CompileError> {
+217    let module = ModuleId::new_standalone(db, path, src);
+218
+219    let diags = module.diagnostics(db);
+220    if !diags.is_empty() {
+221        return Err(CompileError(diags));
+222    }
+223
+224    let mut text = vec![];
+225    fe_mir::graphviz::write_mir_graphs(db, module, &mut text).unwrap();
+226    Ok(String::from_utf8(text).unwrap())
+227}
+228
+229#[cfg(feature = "solc-backend")]
+230fn compile_test(db: &mut Db, test: FunctionId, optimize: bool) -> CompiledTest {
+231    let yul_test = fe_codegen::yul::isel::lower_test(db, test)
+232        .to_string()
+233        .replace('"', "\\\"");
+234    let bytecode = compile_to_evm("test", &yul_test, optimize, false).bytecode;
+235    let events = db.codegen_abi_module_events(test.module(db));
+236    CompiledTest::new(test.name(db), events, bytecode)
+237}
+238
+239#[cfg(feature = "solc-backend")]
+240fn compile_module_tests(db: &mut Db, module_id: ModuleId, optimize: bool) -> Vec<CompiledTest> {
+241    module_id
+242        .tests(db)
+243        .iter()
+244        .map(|test| compile_test(db, *test, optimize))
+245        .collect()
+246}
+247
+248#[cfg(feature = "solc-backend")]
+249fn compile_module(
+250    db: &mut Db,
+251    module_id: ModuleId,
+252    with_bytecode: bool,
+253    with_runtime_bytecode: bool,
+254    optimize: bool,
+255) -> Result<CompiledModule, CompileError> {
+256    let mut contracts = IndexMap::default();
+257
+258    for contract in module_id.all_contracts(db.upcast()) {
+259        let name = &contract.data(db.upcast()).name;
+260        let abi = db.codegen_abi_contract(contract);
+261        let yul_contract = compile_to_yul(db, contract);
+262
+263        let (bytecode, runtime_bytecode) = if with_bytecode || with_runtime_bytecode {
+264            let deployable_name = db.codegen_contract_deployer_symbol_name(contract);
+265            let bytecode = compile_to_evm(
+266                deployable_name.as_str(),
+267                &yul_contract,
+268                optimize,
+269                with_runtime_bytecode,
+270            );
+271            (bytecode.bytecode, bytecode.runtime_bytecode)
+272        } else {
+273            ("".to_string(), "".to_string())
+274        };
+275
+276        contracts.insert(
+277            name.to_string(),
+278            // Maybe put the ContractID here so we can trace it back to the source file
+279            CompiledContract {
+280                json_abi: serde_json::to_string_pretty(&abi).unwrap(),
+281                yul: yul_contract,
+282                origin: contract,
+283                bytecode,
+284                runtime_bytecode,
+285            },
+286        );
+287    }
+288
+289    Ok(CompiledModule {
+290        src_ast: format!("{:#?}", module_id.ast(db)),
+291        lowered_ast: format!("{:#?}", module_id.ast(db)),
+292        contracts,
+293    })
+294}
+295
+296#[cfg(not(feature = "solc-backend"))]
+297fn compile_module(
+298    db: &mut Db,
+299    module_id: ModuleId,
+300    _with_bytecode: bool,
+301    _with_runtime_bytecode: bool,
+302    _optimize: bool,
+303) -> Result<CompiledModule, CompileError> {
+304    let mut contracts = IndexMap::default();
+305    for contract in module_id.all_contracts(db.upcast()) {
+306        let name = &contract.data(db.upcast()).name;
+307        let abi = db.codegen_abi_contract(contract);
+308        let yul_contract = compile_to_yul(db, contract);
+309
+310        contracts.insert(
+311            name.to_string(),
+312            CompiledContract {
+313                json_abi: serde_json::to_string_pretty(&abi).unwrap(),
+314                yul: yul_contract,
+315                origin: contract,
+316            },
+317        );
+318    }
+319
+320    Ok(CompiledModule {
+321        src_ast: format!("{:#?}", module_id.ast(db)),
+322        lowered_ast: format!("{:#?}", module_id.ast(db)),
+323        contracts,
+324    })
+325}
+326
+327fn compile_to_yul(db: &mut Db, contract: ContractId) -> String {
+328    let yul_contract = fe_codegen::yul::isel::lower_contract_deployable(db, contract);
+329    yul_contract.to_string().replace('"', "\\\"")
+330}
+331
+332#[cfg(feature = "solc-backend")]
+333fn compile_to_evm(
+334    name: &str,
+335    yul_object: &str,
+336    optimize: bool,
+337    verify_runtime_bytecode: bool,
+338) -> fe_yulc::ContractBytecode {
+339    match fe_yulc::compile_single_contract(name, yul_object, optimize, verify_runtime_bytecode) {
+340        Ok(bytecode) => bytecode,
+341
+342        Err(error) => {
+343            for error in serde_json::from_str::<Value>(&error.0)
+344                .expect("unable to deserialize json output")["errors"]
+345                .as_array()
+346                .expect("errors not an array")
+347            {
+348                eprintln!(
+349                    "Error: {}",
+350                    error["formattedMessage"]
+351                        .as_str()
+352                        .expect("error value not a string")
+353                        .replace("\\\n", "\n")
+354                )
+355            }
+356            panic!("Yul compilation failed with the above errors")
+357        }
+358    }
+359}
\ No newline at end of file diff --git a/compiler-docs/src/fe_library/lib.rs.html b/compiler-docs/src/fe_library/lib.rs.html new file mode 100644 index 0000000000..fa40b5592d --- /dev/null +++ b/compiler-docs/src/fe_library/lib.rs.html @@ -0,0 +1,27 @@ +lib.rs - source

fe_library/
lib.rs

1pub use ::include_dir;
+2use include_dir::{include_dir, Dir};
+3
+4pub const STD: Dir = include_dir!("$CARGO_MANIFEST_DIR/std");
+5
+6pub fn std_src_files() -> Vec<(&'static str, &'static str)> {
+7    static_dir_files(STD.get_dir("src").unwrap())
+8}
+9
+10pub fn static_dir_files(dir: &'static Dir) -> Vec<(&'static str, &'static str)> {
+11    fn add_files(dir: &'static Dir, accum: &mut Vec<(&'static str, &'static str)>) {
+12        accum.extend(dir.files().map(|file| {
+13            (
+14                file.path().to_str().unwrap(),
+15                file.contents_utf8().expect("non-utf8 static file"),
+16            )
+17        }));
+18
+19        for sub_dir in dir.dirs() {
+20            add_files(sub_dir, accum)
+21        }
+22    }
+23
+24    let mut files = vec![];
+25    add_files(dir, &mut files);
+26    files
+27}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/cfg.rs.html b/compiler-docs/src/fe_mir/analysis/cfg.rs.html new file mode 100644 index 0000000000..b40d1bb0ff --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/cfg.rs.html @@ -0,0 +1,164 @@ +cfg.rs - source

fe_mir/analysis/
cfg.rs

1use fxhash::FxHashMap;
+2
+3use crate::ir::{BasicBlockId, FunctionBody, InstId};
+4
+5#[derive(Debug, Clone, PartialEq, Eq)]
+6pub struct ControlFlowGraph {
+7    entry: BasicBlockId,
+8    blocks: FxHashMap<BasicBlockId, BlockNode>,
+9    pub(super) exits: Vec<BasicBlockId>,
+10}
+11
+12impl ControlFlowGraph {
+13    pub fn compute(func: &FunctionBody) -> Self {
+14        let entry = func.order.entry();
+15        let mut cfg = Self {
+16            entry,
+17            blocks: FxHashMap::default(),
+18            exits: vec![],
+19        };
+20
+21        for block in func.order.iter_block() {
+22            let terminator = func
+23                .order
+24                .terminator(&func.store, block)
+25                .expect("a block must have terminator");
+26            cfg.analyze_terminator(func, terminator);
+27        }
+28
+29        cfg
+30    }
+31
+32    pub fn entry(&self) -> BasicBlockId {
+33        self.entry
+34    }
+35
+36    pub fn preds(&self, block: BasicBlockId) -> &[BasicBlockId] {
+37        self.blocks[&block].preds()
+38    }
+39
+40    pub fn succs(&self, block: BasicBlockId) -> &[BasicBlockId] {
+41        self.blocks[&block].succs()
+42    }
+43
+44    pub fn post_order(&self) -> CfgPostOrder {
+45        CfgPostOrder::new(self)
+46    }
+47
+48    pub(super) fn add_edge(&mut self, from: BasicBlockId, to: BasicBlockId) {
+49        self.node_mut(to).push_pred(from);
+50        self.node_mut(from).push_succ(to);
+51    }
+52
+53    pub(super) fn reverse_edge(&mut self, new_entry: BasicBlockId, new_exits: Vec<BasicBlockId>) {
+54        for (_, block) in self.blocks.iter_mut() {
+55            block.reverse_edge()
+56        }
+57
+58        self.entry = new_entry;
+59        self.exits = new_exits;
+60    }
+61
+62    fn analyze_terminator(&mut self, func: &FunctionBody, terminator: InstId) {
+63        let block = func.order.inst_block(terminator);
+64        let branch_info = func.store.branch_info(terminator);
+65        if branch_info.is_not_a_branch() {
+66            self.node_mut(block);
+67            self.exits.push(block)
+68        } else {
+69            for dest in branch_info.block_iter() {
+70                self.add_edge(block, dest)
+71            }
+72        }
+73    }
+74
+75    fn node_mut(&mut self, block: BasicBlockId) -> &mut BlockNode {
+76        self.blocks.entry(block).or_default()
+77    }
+78}
+79
+80#[derive(Default, Clone, Debug, PartialEq, Eq)]
+81struct BlockNode {
+82    preds: Vec<BasicBlockId>,
+83    succs: Vec<BasicBlockId>,
+84}
+85
+86impl BlockNode {
+87    fn push_pred(&mut self, pred: BasicBlockId) {
+88        self.preds.push(pred);
+89    }
+90
+91    fn push_succ(&mut self, succ: BasicBlockId) {
+92        self.succs.push(succ);
+93    }
+94
+95    fn preds(&self) -> &[BasicBlockId] {
+96        &self.preds
+97    }
+98
+99    fn succs(&self) -> &[BasicBlockId] {
+100        &self.succs
+101    }
+102
+103    fn reverse_edge(&mut self) {
+104        std::mem::swap(&mut self.preds, &mut self.succs)
+105    }
+106}
+107
+108pub struct CfgPostOrder<'a> {
+109    cfg: &'a ControlFlowGraph,
+110    node_state: FxHashMap<BasicBlockId, NodeState>,
+111    stack: Vec<BasicBlockId>,
+112}
+113
+114impl<'a> CfgPostOrder<'a> {
+115    fn new(cfg: &'a ControlFlowGraph) -> Self {
+116        let stack = vec![cfg.entry()];
+117
+118        Self {
+119            cfg,
+120            node_state: FxHashMap::default(),
+121            stack,
+122        }
+123    }
+124}
+125
+126impl<'a> Iterator for CfgPostOrder<'a> {
+127    type Item = BasicBlockId;
+128
+129    fn next(&mut self) -> Option<BasicBlockId> {
+130        while let Some(&block) = self.stack.last() {
+131            let node_state = self.node_state.entry(block).or_default();
+132            if *node_state == NodeState::Unvisited {
+133                *node_state = NodeState::Visited;
+134                for &succ in self.cfg.succs(block) {
+135                    let pred_state = self.node_state.entry(succ).or_default();
+136                    if *pred_state == NodeState::Unvisited {
+137                        self.stack.push(succ);
+138                    }
+139                }
+140            } else {
+141                self.stack.pop().unwrap();
+142                if *node_state != NodeState::Finished {
+143                    *node_state = NodeState::Finished;
+144                    return Some(block);
+145                }
+146            }
+147        }
+148
+149        None
+150    }
+151}
+152
+153#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+154enum NodeState {
+155    Unvisited,
+156    Visited,
+157    Finished,
+158}
+159
+160impl Default for NodeState {
+161    fn default() -> Self {
+162        Self::Unvisited
+163    }
+164}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/domtree.rs.html b/compiler-docs/src/fe_mir/analysis/domtree.rs.html new file mode 100644 index 0000000000..ea703ff3c9 --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/domtree.rs.html @@ -0,0 +1,343 @@ +domtree.rs - source

fe_mir/analysis/
domtree.rs

1//! This module contains dominator tree related structs.
+2//!
+3//! The algorithm is based on Keith D. Cooper., Timothy J. Harvey., and Ken
+4//! Kennedy.: A Simple, Fast Dominance Algorithm: <https://www.cs.rice.edu/~keith/EMBED/dom.pdf>
+5
+6use std::collections::BTreeSet;
+7
+8use fxhash::FxHashMap;
+9
+10use crate::ir::BasicBlockId;
+11
+12use super::cfg::ControlFlowGraph;
+13
+14#[derive(Debug, Clone)]
+15pub struct DomTree {
+16    doms: FxHashMap<BasicBlockId, BasicBlockId>,
+17    /// CFG sorted in reverse post order.
+18    rpo: Vec<BasicBlockId>,
+19}
+20
+21impl DomTree {
+22    pub fn compute(cfg: &ControlFlowGraph) -> Self {
+23        let mut doms = FxHashMap::default();
+24        doms.insert(cfg.entry(), cfg.entry());
+25        let mut rpo: Vec<_> = cfg.post_order().collect();
+26        rpo.reverse();
+27
+28        let mut domtree = Self { doms, rpo };
+29
+30        let block_num = domtree.rpo.len();
+31
+32        let mut rpo_nums = FxHashMap::default();
+33        for (i, &block) in domtree.rpo.iter().enumerate() {
+34            rpo_nums.insert(block, (block_num - i) as u32);
+35        }
+36
+37        let mut changed = true;
+38        while changed {
+39            changed = false;
+40            for &block in domtree.rpo.iter().skip(1) {
+41                let processed_pred = match cfg
+42                    .preds(block)
+43                    .iter()
+44                    .find(|pred| domtree.doms.contains_key(pred))
+45                {
+46                    Some(pred) => *pred,
+47                    _ => continue,
+48                };
+49                let mut new_dom = processed_pred;
+50
+51                for &pred in cfg.preds(block) {
+52                    if pred != processed_pred && domtree.doms.contains_key(&pred) {
+53                        new_dom = domtree.intersect(new_dom, pred, &rpo_nums);
+54                    }
+55                }
+56                if Some(new_dom) != domtree.doms.get(&block).copied() {
+57                    changed = true;
+58                    domtree.doms.insert(block, new_dom);
+59                }
+60            }
+61        }
+62
+63        domtree
+64    }
+65
+66    /// Returns the immediate dominator of the `block`.
+67    /// Returns None if the `block` is unreachable from the entry block, or the
+68    /// `block` is the entry block itself.
+69    pub fn idom(&self, block: BasicBlockId) -> Option<BasicBlockId> {
+70        if self.rpo[0] == block {
+71            return None;
+72        }
+73        self.doms.get(&block).copied()
+74    }
+75
+76    /// Returns `true` if block1 strictly dominates block2.
+77    pub fn strictly_dominates(&self, block1: BasicBlockId, block2: BasicBlockId) -> bool {
+78        let mut current_block = block2;
+79        while let Some(block) = self.idom(current_block) {
+80            if block == block1 {
+81                return true;
+82            }
+83            current_block = block;
+84        }
+85
+86        false
+87    }
+88
+89    /// Returns `true` if block1 dominates block2.
+90    pub fn dominates(&self, block1: BasicBlockId, block2: BasicBlockId) -> bool {
+91        if block1 == block2 {
+92            return true;
+93        }
+94
+95        self.strictly_dominates(block1, block2)
+96    }
+97
+98    /// Returns `true` if block is reachable from the entry block.
+99    pub fn is_reachable(&self, block: BasicBlockId) -> bool {
+100        self.idom(block).is_some()
+101    }
+102
+103    /// Returns blocks in RPO.
+104    pub fn rpo(&self) -> &[BasicBlockId] {
+105        &self.rpo
+106    }
+107
+108    fn intersect(
+109        &self,
+110        mut b1: BasicBlockId,
+111        mut b2: BasicBlockId,
+112        rpo_nums: &FxHashMap<BasicBlockId, u32>,
+113    ) -> BasicBlockId {
+114        while b1 != b2 {
+115            while rpo_nums[&b1] < rpo_nums[&b2] {
+116                b1 = self.doms[&b1];
+117            }
+118            while rpo_nums[&b2] < rpo_nums[&b1] {
+119                b2 = self.doms[&b2]
+120            }
+121        }
+122
+123        b1
+124    }
+125
+126    /// Compute dominance frontiers of each blocks.
+127    pub fn compute_df(&self, cfg: &ControlFlowGraph) -> DFSet {
+128        let mut df = DFSet::default();
+129
+130        for &block in &self.rpo {
+131            let preds = cfg.preds(block);
+132            if preds.len() < 2 {
+133                continue;
+134            }
+135
+136            for pred in preds {
+137                let mut runner = *pred;
+138                while self.doms.get(&block) != Some(&runner) && self.is_reachable(runner) {
+139                    df.0.entry(runner).or_default().insert(block);
+140                    runner = self.doms[&runner];
+141                }
+142            }
+143        }
+144
+145        df
+146    }
+147}
+148
+149/// Dominance frontiers of each blocks.
+150#[derive(Default, Debug)]
+151pub struct DFSet(FxHashMap<BasicBlockId, BTreeSet<BasicBlockId>>);
+152
+153impl DFSet {
+154    /// Returns all dominance frontieres of a `block`.
+155    pub fn frontiers(
+156        &self,
+157        block: BasicBlockId,
+158    ) -> Option<impl Iterator<Item = BasicBlockId> + '_> {
+159        self.0.get(&block).map(|set| set.iter().copied())
+160    }
+161
+162    /// Returns number of frontier blocks of a `block`.
+163    pub fn frontier_num(&self, block: BasicBlockId) -> usize {
+164        self.0.get(&block).map(BTreeSet::len).unwrap_or(0)
+165    }
+166}
+167
+168#[cfg(test)]
+169mod tests {
+170    use super::*;
+171
+172    use crate::ir::{body_builder::BodyBuilder, FunctionBody, FunctionId, SourceInfo, TypeId};
+173
+174    fn calc_dom(func: &FunctionBody) -> (DomTree, DFSet) {
+175        let cfg = ControlFlowGraph::compute(func);
+176        let domtree = DomTree::compute(&cfg);
+177        let df = domtree.compute_df(&cfg);
+178        (domtree, df)
+179    }
+180
+181    fn body_builder() -> BodyBuilder {
+182        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+183    }
+184
+185    #[test]
+186    fn dom_tree_if_else() {
+187        let mut builder = body_builder();
+188
+189        let then_block = builder.make_block();
+190        let else_block = builder.make_block();
+191        let merge_block = builder.make_block();
+192
+193        let dummy_ty = TypeId(0);
+194        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+195        builder.branch(v0, then_block, else_block, SourceInfo::dummy());
+196
+197        builder.move_to_block(then_block);
+198        builder.jump(merge_block, SourceInfo::dummy());
+199
+200        builder.move_to_block(else_block);
+201        builder.jump(merge_block, SourceInfo::dummy());
+202
+203        builder.move_to_block(merge_block);
+204        let dummy_value = builder.make_unit(dummy_ty);
+205        builder.ret(dummy_value, SourceInfo::dummy());
+206
+207        let func = builder.build();
+208
+209        let (dom_tree, df) = calc_dom(&func);
+210        let entry_block = func.order.entry();
+211        assert_eq!(dom_tree.idom(entry_block), None);
+212        assert_eq!(dom_tree.idom(then_block), Some(entry_block));
+213        assert_eq!(dom_tree.idom(else_block), Some(entry_block));
+214        assert_eq!(dom_tree.idom(merge_block), Some(entry_block));
+215
+216        assert_eq!(df.frontier_num(entry_block), 0);
+217        assert_eq!(df.frontier_num(then_block), 1);
+218        assert_eq!(
+219            df.frontiers(then_block).unwrap().next().unwrap(),
+220            merge_block
+221        );
+222        assert_eq!(
+223            df.frontiers(else_block).unwrap().next().unwrap(),
+224            merge_block
+225        );
+226        assert_eq!(df.frontier_num(merge_block), 0);
+227    }
+228
+229    #[test]
+230    fn unreachable_edge() {
+231        let mut builder = body_builder();
+232
+233        let block1 = builder.make_block();
+234        let block2 = builder.make_block();
+235        let block3 = builder.make_block();
+236        let block4 = builder.make_block();
+237
+238        let dummy_ty = TypeId(0);
+239        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+240        builder.branch(v0, block1, block2, SourceInfo::dummy());
+241
+242        builder.move_to_block(block1);
+243        builder.jump(block4, SourceInfo::dummy());
+244
+245        builder.move_to_block(block2);
+246        builder.jump(block4, SourceInfo::dummy());
+247
+248        builder.move_to_block(block3);
+249        builder.jump(block4, SourceInfo::dummy());
+250
+251        builder.move_to_block(block4);
+252        let dummy_value = builder.make_unit(dummy_ty);
+253        builder.ret(dummy_value, SourceInfo::dummy());
+254
+255        let func = builder.build();
+256
+257        let (dom_tree, _) = calc_dom(&func);
+258        let entry_block = func.order.entry();
+259        assert_eq!(dom_tree.idom(entry_block), None);
+260        assert_eq!(dom_tree.idom(block1), Some(entry_block));
+261        assert_eq!(dom_tree.idom(block2), Some(entry_block));
+262        assert_eq!(dom_tree.idom(block3), None);
+263        assert!(!dom_tree.is_reachable(block3));
+264        assert_eq!(dom_tree.idom(block4), Some(entry_block));
+265    }
+266
+267    #[test]
+268    fn dom_tree_complex() {
+269        let mut builder = body_builder();
+270
+271        let block1 = builder.make_block();
+272        let block2 = builder.make_block();
+273        let block3 = builder.make_block();
+274        let block4 = builder.make_block();
+275        let block5 = builder.make_block();
+276        let block6 = builder.make_block();
+277        let block7 = builder.make_block();
+278        let block8 = builder.make_block();
+279        let block9 = builder.make_block();
+280        let block10 = builder.make_block();
+281        let block11 = builder.make_block();
+282        let block12 = builder.make_block();
+283
+284        let dummy_ty = TypeId(0);
+285        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+286        builder.branch(v0, block2, block1, SourceInfo::dummy());
+287
+288        builder.move_to_block(block1);
+289        builder.branch(v0, block6, block3, SourceInfo::dummy());
+290
+291        builder.move_to_block(block2);
+292        builder.branch(v0, block7, block4, SourceInfo::dummy());
+293
+294        builder.move_to_block(block3);
+295        builder.branch(v0, block6, block5, SourceInfo::dummy());
+296
+297        builder.move_to_block(block4);
+298        builder.branch(v0, block7, block2, SourceInfo::dummy());
+299
+300        builder.move_to_block(block5);
+301        builder.branch(v0, block10, block8, SourceInfo::dummy());
+302
+303        builder.move_to_block(block6);
+304        builder.jump(block9, SourceInfo::dummy());
+305
+306        builder.move_to_block(block7);
+307        builder.jump(block12, SourceInfo::dummy());
+308
+309        builder.move_to_block(block8);
+310        builder.jump(block11, SourceInfo::dummy());
+311
+312        builder.move_to_block(block9);
+313        builder.jump(block8, SourceInfo::dummy());
+314
+315        builder.move_to_block(block10);
+316        builder.jump(block11, SourceInfo::dummy());
+317
+318        builder.move_to_block(block11);
+319        builder.branch(v0, block12, block2, SourceInfo::dummy());
+320
+321        builder.move_to_block(block12);
+322        let dummy_value = builder.make_unit(dummy_ty);
+323        builder.ret(dummy_value, SourceInfo::dummy());
+324
+325        let func = builder.build();
+326
+327        let (dom_tree, _) = calc_dom(&func);
+328        let entry_block = func.order.entry();
+329        assert_eq!(dom_tree.idom(entry_block), None);
+330        assert_eq!(dom_tree.idom(block1), Some(entry_block));
+331        assert_eq!(dom_tree.idom(block2), Some(entry_block));
+332        assert_eq!(dom_tree.idom(block3), Some(block1));
+333        assert_eq!(dom_tree.idom(block4), Some(block2));
+334        assert_eq!(dom_tree.idom(block5), Some(block3));
+335        assert_eq!(dom_tree.idom(block6), Some(block1));
+336        assert_eq!(dom_tree.idom(block7), Some(block2));
+337        assert_eq!(dom_tree.idom(block8), Some(block1));
+338        assert_eq!(dom_tree.idom(block9), Some(block6));
+339        assert_eq!(dom_tree.idom(block10), Some(block5));
+340        assert_eq!(dom_tree.idom(block11), Some(block1));
+341        assert_eq!(dom_tree.idom(block12), Some(entry_block));
+342    }
+343}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/loop_tree.rs.html b/compiler-docs/src/fe_mir/analysis/loop_tree.rs.html new file mode 100644 index 0000000000..85cb217bad --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/loop_tree.rs.html @@ -0,0 +1,347 @@ +loop_tree.rs - source

fe_mir/analysis/
loop_tree.rs

1use id_arena::{Arena, Id};
+2
+3use fxhash::FxHashMap;
+4
+5use super::{cfg::ControlFlowGraph, domtree::DomTree};
+6
+7use crate::ir::BasicBlockId;
+8
+9#[derive(Debug, Default, Clone)]
+10pub struct LoopTree {
+11    /// Stores loops.
+12    /// The index of an outer loops is guaranteed to be lower than its inner
+13    /// loops because loops are found in RPO.
+14    loops: Arena<Loop>,
+15
+16    /// Maps blocks to its contained loop.
+17    /// If the block is contained by multiple nested loops, then the block is
+18    /// mapped to the innermost loop.
+19    block_to_loop: FxHashMap<BasicBlockId, LoopId>,
+20}
+21
+22pub type LoopId = Id<Loop>;
+23
+24#[derive(Debug, Clone, PartialEq, Eq)]
+25pub struct Loop {
+26    /// A header of the loop.
+27    pub header: BasicBlockId,
+28
+29    /// A parent loop that includes the loop.
+30    pub parent: Option<LoopId>,
+31
+32    /// Child loops that the loop includes.
+33    pub children: Vec<LoopId>,
+34}
+35
+36impl LoopTree {
+37    pub fn compute(cfg: &ControlFlowGraph, domtree: &DomTree) -> Self {
+38        let mut tree = LoopTree::default();
+39
+40        // Find loop headers in RPO, this means outer loops are guaranteed to be
+41        // inserted first, then its inner loops are inserted.
+42        for &block in domtree.rpo() {
+43            for &pred in cfg.preds(block) {
+44                if domtree.dominates(block, pred) {
+45                    let loop_data = Loop {
+46                        header: block,
+47                        parent: None,
+48                        children: Vec::new(),
+49                    };
+50
+51                    tree.loops.alloc(loop_data);
+52                    break;
+53                }
+54            }
+55        }
+56
+57        tree.analyze_loops(cfg, domtree);
+58
+59        tree
+60    }
+61
+62    /// Returns all blocks in the loop.
+63    pub fn iter_blocks_post_order<'a, 'b>(
+64        &'a self,
+65        cfg: &'b ControlFlowGraph,
+66        lp: LoopId,
+67    ) -> BlocksInLoopPostOrder<'a, 'b> {
+68        BlocksInLoopPostOrder::new(self, cfg, lp)
+69    }
+70
+71    /// Returns all loops in a function body.
+72    /// An outer loop is guaranteed to be iterated before its inner loops.
+73    pub fn loops(&self) -> impl Iterator<Item = LoopId> + '_ {
+74        self.loops.iter().map(|(id, _)| id)
+75    }
+76
+77    /// Returns number of loops found.
+78    pub fn loop_num(&self) -> usize {
+79        self.loops.len()
+80    }
+81
+82    /// Returns `true` if the `block` is in the `lp`.
+83    pub fn is_block_in_loop(&self, block: BasicBlockId, lp: LoopId) -> bool {
+84        let mut loop_of_block = self.loop_of_block(block);
+85        while let Some(cur_lp) = loop_of_block {
+86            if lp == cur_lp {
+87                return true;
+88            }
+89            loop_of_block = self.parent_loop(cur_lp);
+90        }
+91        false
+92    }
+93
+94    /// Returns header block of the `lp`.
+95    pub fn loop_header(&self, lp: LoopId) -> BasicBlockId {
+96        self.loops[lp].header
+97    }
+98
+99    /// Get parent loop of the `lp` if exists.
+100    pub fn parent_loop(&self, lp: LoopId) -> Option<LoopId> {
+101        self.loops[lp].parent
+102    }
+103
+104    /// Returns the loop that the `block` belongs to.
+105    /// If the `block` belongs to multiple loops, then returns the innermost
+106    /// loop.
+107    pub fn loop_of_block(&self, block: BasicBlockId) -> Option<LoopId> {
+108        self.block_to_loop.get(&block).copied()
+109    }
+110
+111    /// Analyze loops. This method does
+112    /// 1. Mapping each blocks to its contained loop.
+113    /// 2. Setting parent and child of the loops.
+114    fn analyze_loops(&mut self, cfg: &ControlFlowGraph, domtree: &DomTree) {
+115        let mut worklist = vec![];
+116
+117        // Iterate loops reversely to ensure analyze inner loops first.
+118        let loops_rev: Vec<_> = self.loops.iter().rev().map(|(id, _)| id).collect();
+119        for cur_lp in loops_rev {
+120            let cur_lp_header = self.loop_header(cur_lp);
+121
+122            // Add predecessors of the loop header to worklist.
+123            for &block in cfg.preds(cur_lp_header) {
+124                if domtree.dominates(cur_lp_header, block) {
+125                    worklist.push(block);
+126                }
+127            }
+128
+129            while let Some(block) = worklist.pop() {
+130                match self.block_to_loop.get(&block).copied() {
+131                    Some(lp_of_block) => {
+132                        let outermost_parent = self.outermost_parent(lp_of_block);
+133
+134                        // If outermost parent is current loop, then the block is already visited.
+135                        if outermost_parent == cur_lp {
+136                            continue;
+137                        } else {
+138                            self.loops[cur_lp].children.push(outermost_parent);
+139                            self.loops[outermost_parent].parent = cur_lp.into();
+140
+141                            let lp_header_of_block = self.loop_header(lp_of_block);
+142                            worklist.extend(cfg.preds(lp_header_of_block));
+143                        }
+144                    }
+145
+146                    // If the block is not mapped to any loops, then map it to the loop.
+147                    None => {
+148                        self.map_block(block, cur_lp);
+149                        // If block is not loop header, then add its predecessors to the worklist.
+150                        if block != cur_lp_header {
+151                            worklist.extend(cfg.preds(block));
+152                        }
+153                    }
+154                }
+155            }
+156        }
+157    }
+158
+159    /// Returns the outermost parent loop of `lp`. If `lp` doesn't have any
+160    /// parent, then returns `lp` itself.
+161    fn outermost_parent(&self, mut lp: LoopId) -> LoopId {
+162        while let Some(parent) = self.parent_loop(lp) {
+163            lp = parent;
+164        }
+165        lp
+166    }
+167
+168    /// Map `block` to `lp`.
+169    fn map_block(&mut self, block: BasicBlockId, lp: LoopId) {
+170        self.block_to_loop.insert(block, lp);
+171    }
+172}
+173
+174pub struct BlocksInLoopPostOrder<'a, 'b> {
+175    lpt: &'a LoopTree,
+176    cfg: &'b ControlFlowGraph,
+177    lp: LoopId,
+178    stack: Vec<BasicBlockId>,
+179    block_state: FxHashMap<BasicBlockId, BlockState>,
+180}
+181
+182impl<'a, 'b> BlocksInLoopPostOrder<'a, 'b> {
+183    fn new(lpt: &'a LoopTree, cfg: &'b ControlFlowGraph, lp: LoopId) -> Self {
+184        let loop_header = lpt.loop_header(lp);
+185
+186        Self {
+187            lpt,
+188            cfg,
+189            lp,
+190            stack: vec![loop_header],
+191            block_state: FxHashMap::default(),
+192        }
+193    }
+194}
+195
+196impl<'a, 'b> Iterator for BlocksInLoopPostOrder<'a, 'b> {
+197    type Item = BasicBlockId;
+198
+199    fn next(&mut self) -> Option<Self::Item> {
+200        while let Some(&block) = self.stack.last() {
+201            match self.block_state.get(&block) {
+202                // The block is already visited, but not returned from the iterator,
+203                // so mark the block as `Finished` and return the block.
+204                Some(BlockState::Visited) => {
+205                    let block = self.stack.pop().unwrap();
+206                    self.block_state.insert(block, BlockState::Finished);
+207                    return Some(block);
+208                }
+209
+210                // The block is already returned, so just remove the block from the stack.
+211                Some(BlockState::Finished) => {
+212                    self.stack.pop().unwrap();
+213                }
+214
+215                // The block is not visited yet, so push its unvisited in-loop successors to the
+216                // stack and mark the block as `Visited`.
+217                None => {
+218                    self.block_state.insert(block, BlockState::Visited);
+219                    for &succ in self.cfg.succs(block) {
+220                        if !self.block_state.contains_key(&succ)
+221                            && self.lpt.is_block_in_loop(succ, self.lp)
+222                        {
+223                            self.stack.push(succ);
+224                        }
+225                    }
+226                }
+227            }
+228        }
+229
+230        None
+231    }
+232}
+233
+234enum BlockState {
+235    Visited,
+236    Finished,
+237}
+238
+239#[cfg(test)]
+240mod tests {
+241    use super::*;
+242
+243    use crate::ir::{body_builder::BodyBuilder, FunctionBody, FunctionId, SourceInfo, TypeId};
+244
+245    fn compute_loop(func: &FunctionBody) -> LoopTree {
+246        let cfg = ControlFlowGraph::compute(func);
+247        let domtree = DomTree::compute(&cfg);
+248        LoopTree::compute(&cfg, &domtree)
+249    }
+250
+251    fn body_builder() -> BodyBuilder {
+252        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+253    }
+254
+255    #[test]
+256    fn simple_loop() {
+257        let mut builder = body_builder();
+258
+259        let entry = builder.current_block();
+260        let block1 = builder.make_block();
+261        let block2 = builder.make_block();
+262
+263        let dummy_ty = TypeId(0);
+264        let v0 = builder.make_imm_from_bool(false, dummy_ty);
+265        builder.branch(v0, block1, block2, SourceInfo::dummy());
+266
+267        builder.move_to_block(block1);
+268        builder.jump(entry, SourceInfo::dummy());
+269
+270        builder.move_to_block(block2);
+271        let dummy_value = builder.make_unit(dummy_ty);
+272        builder.ret(dummy_value, SourceInfo::dummy());
+273
+274        let func = builder.build();
+275
+276        let lpt = compute_loop(&func);
+277
+278        assert_eq!(lpt.loop_num(), 1);
+279        let lp = lpt.loops().next().unwrap();
+280
+281        assert!(lpt.is_block_in_loop(entry, lp));
+282        assert_eq!(lpt.loop_of_block(entry), Some(lp));
+283
+284        assert!(lpt.is_block_in_loop(block1, lp));
+285        assert_eq!(lpt.loop_of_block(block1), Some(lp));
+286
+287        assert!(!lpt.is_block_in_loop(block2, lp));
+288        assert!(lpt.loop_of_block(block2).is_none());
+289
+290        assert_eq!(lpt.loop_header(lp), entry);
+291    }
+292
+293    #[test]
+294    fn nested_loop() {
+295        let mut builder = body_builder();
+296
+297        let entry = builder.current_block();
+298        let block1 = builder.make_block();
+299        let block2 = builder.make_block();
+300        let block3 = builder.make_block();
+301
+302        let dummy_ty = TypeId(0);
+303        let v0 = builder.make_imm_from_bool(false, dummy_ty);
+304        builder.branch(v0, block1, block3, SourceInfo::dummy());
+305
+306        builder.move_to_block(block1);
+307        builder.branch(v0, entry, block2, SourceInfo::dummy());
+308
+309        builder.move_to_block(block2);
+310        builder.jump(block1, SourceInfo::dummy());
+311
+312        builder.move_to_block(block3);
+313        let dummy_value = builder.make_unit(dummy_ty);
+314        builder.ret(dummy_value, SourceInfo::dummy());
+315
+316        let func = builder.build();
+317
+318        let lpt = compute_loop(&func);
+319
+320        assert_eq!(lpt.loop_num(), 2);
+321        let mut loops = lpt.loops();
+322        let outer_lp = loops.next().unwrap();
+323        let inner_lp = loops.next().unwrap();
+324
+325        assert!(lpt.is_block_in_loop(entry, outer_lp));
+326        assert!(!lpt.is_block_in_loop(entry, inner_lp));
+327        assert_eq!(lpt.loop_of_block(entry), Some(outer_lp));
+328
+329        assert!(lpt.is_block_in_loop(block1, outer_lp));
+330        assert!(lpt.is_block_in_loop(block1, inner_lp));
+331        assert_eq!(lpt.loop_of_block(block1), Some(inner_lp));
+332
+333        assert!(lpt.is_block_in_loop(block2, outer_lp));
+334        assert!(lpt.is_block_in_loop(block2, inner_lp));
+335        assert_eq!(lpt.loop_of_block(block2), Some(inner_lp));
+336
+337        assert!(!lpt.is_block_in_loop(block3, outer_lp));
+338        assert!(!lpt.is_block_in_loop(block3, inner_lp));
+339        assert!(lpt.loop_of_block(block3).is_none());
+340
+341        assert!(lpt.parent_loop(outer_lp).is_none());
+342        assert_eq!(lpt.parent_loop(inner_lp), Some(outer_lp));
+343
+344        assert_eq!(lpt.loop_header(outer_lp), entry);
+345        assert_eq!(lpt.loop_header(inner_lp), block1);
+346    }
+347}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/mod.rs.html b/compiler-docs/src/fe_mir/analysis/mod.rs.html new file mode 100644 index 0000000000..dfa9ab367a --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/mod.rs.html @@ -0,0 +1,9 @@ +mod.rs - source

fe_mir/analysis/
mod.rs

1pub mod cfg;
+2pub mod domtree;
+3pub mod loop_tree;
+4pub mod post_domtree;
+5
+6pub use cfg::ControlFlowGraph;
+7pub use domtree::DomTree;
+8pub use loop_tree::LoopTree;
+9pub use post_domtree::PostDomTree;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/post_domtree.rs.html b/compiler-docs/src/fe_mir/analysis/post_domtree.rs.html new file mode 100644 index 0000000000..d474ddd993 --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/post_domtree.rs.html @@ -0,0 +1,284 @@ +post_domtree.rs - source

fe_mir/analysis/
post_domtree.rs

1//! This module contains implementation of `Post Dominator Tree`.
+2
+3use id_arena::{ArenaBehavior, DefaultArenaBehavior};
+4
+5use super::{cfg::ControlFlowGraph, domtree::DomTree};
+6
+7use crate::ir::{BasicBlock, BasicBlockId, FunctionBody};
+8
+9#[derive(Debug)]
+10pub struct PostDomTree {
+11    /// Dummy entry block to calculate post dom tree.
+12    dummy_entry: BasicBlockId,
+13    /// Canonical dummy exit block to calculate post dom tree. All blocks ends
+14    /// with `return` has an edge to this block.
+15    dummy_exit: BasicBlockId,
+16
+17    /// Dominator tree of reverse control flow graph.
+18    domtree: DomTree,
+19}
+20
+21impl PostDomTree {
+22    pub fn compute(func: &FunctionBody) -> Self {
+23        let mut rcfg = ControlFlowGraph::compute(func);
+24
+25        let real_entry = rcfg.entry();
+26
+27        let dummy_entry = Self::make_dummy_block();
+28        let dummy_exit = Self::make_dummy_block();
+29        // Add edges from dummy entry block to real entry block and dummy exit block.
+30        rcfg.add_edge(dummy_entry, real_entry);
+31        rcfg.add_edge(dummy_entry, dummy_exit);
+32
+33        // Add edges from real exit blocks to dummy exit block.
+34        for exit in std::mem::take(&mut rcfg.exits) {
+35            rcfg.add_edge(exit, dummy_exit);
+36        }
+37
+38        rcfg.reverse_edge(dummy_exit, vec![dummy_entry]);
+39        let domtree = DomTree::compute(&rcfg);
+40
+41        Self {
+42            dummy_entry,
+43            dummy_exit,
+44            domtree,
+45        }
+46    }
+47
+48    pub fn post_idom(&self, block: BasicBlockId) -> PostIDom {
+49        match self.domtree.idom(block).unwrap() {
+50            block if block == self.dummy_entry => PostIDom::DummyEntry,
+51            block if block == self.dummy_exit => PostIDom::DummyExit,
+52            other => PostIDom::Block(other),
+53        }
+54    }
+55
+56    /// Returns `true` if block is reachable from the exit blocks.
+57    pub fn is_reachable(&self, block: BasicBlockId) -> bool {
+58        self.domtree.is_reachable(block)
+59    }
+60
+61    fn make_dummy_block() -> BasicBlockId {
+62        let arena_id = DefaultArenaBehavior::<BasicBlock>::new_arena_id();
+63        DefaultArenaBehavior::new_id(arena_id, 0)
+64    }
+65}
+66
+67#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+68pub enum PostIDom {
+69    DummyEntry,
+70    DummyExit,
+71    Block(BasicBlockId),
+72}
+73
+74#[cfg(test)]
+75mod tests {
+76    use super::*;
+77
+78    use crate::ir::{body_builder::BodyBuilder, FunctionId, SourceInfo, TypeId};
+79
+80    fn body_builder() -> BodyBuilder {
+81        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+82    }
+83
+84    #[test]
+85    fn test_if_else_merge() {
+86        let mut builder = body_builder();
+87        let then_block = builder.make_block();
+88        let else_block = builder.make_block();
+89        let merge_block = builder.make_block();
+90
+91        let dummy_ty = TypeId(0);
+92        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+93        builder.branch(v0, then_block, else_block, SourceInfo::dummy());
+94
+95        builder.move_to_block(then_block);
+96        builder.jump(merge_block, SourceInfo::dummy());
+97
+98        builder.move_to_block(else_block);
+99        builder.jump(merge_block, SourceInfo::dummy());
+100
+101        builder.move_to_block(merge_block);
+102        let dummy_value = builder.make_unit(dummy_ty);
+103        builder.ret(dummy_value, SourceInfo::dummy());
+104
+105        let func = builder.build();
+106
+107        let post_dom_tree = PostDomTree::compute(&func);
+108        let entry_block = func.order.entry();
+109        assert_eq!(
+110            post_dom_tree.post_idom(entry_block),
+111            PostIDom::Block(merge_block)
+112        );
+113        assert_eq!(
+114            post_dom_tree.post_idom(then_block),
+115            PostIDom::Block(merge_block)
+116        );
+117        assert_eq!(
+118            post_dom_tree.post_idom(else_block),
+119            PostIDom::Block(merge_block)
+120        );
+121        assert_eq!(post_dom_tree.post_idom(merge_block), PostIDom::DummyExit);
+122    }
+123
+124    #[test]
+125    fn test_if_else_return() {
+126        let mut builder = body_builder();
+127        let then_block = builder.make_block();
+128        let else_block = builder.make_block();
+129        let merge_block = builder.make_block();
+130
+131        let dummy_ty = TypeId(0);
+132        let dummy_value = builder.make_unit(dummy_ty);
+133        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+134        builder.branch(v0, then_block, else_block, SourceInfo::dummy());
+135
+136        builder.move_to_block(then_block);
+137        builder.jump(merge_block, SourceInfo::dummy());
+138
+139        builder.move_to_block(else_block);
+140        builder.ret(dummy_value, SourceInfo::dummy());
+141
+142        builder.move_to_block(merge_block);
+143        builder.ret(dummy_value, SourceInfo::dummy());
+144
+145        let func = builder.build();
+146
+147        let post_dom_tree = PostDomTree::compute(&func);
+148        let entry_block = func.order.entry();
+149        assert_eq!(post_dom_tree.post_idom(entry_block), PostIDom::DummyExit,);
+150        assert_eq!(
+151            post_dom_tree.post_idom(then_block),
+152            PostIDom::Block(merge_block),
+153        );
+154        assert_eq!(post_dom_tree.post_idom(else_block), PostIDom::DummyExit);
+155        assert_eq!(post_dom_tree.post_idom(merge_block), PostIDom::DummyExit);
+156    }
+157
+158    #[test]
+159    fn test_if_non_else() {
+160        let mut builder = body_builder();
+161        let then_block = builder.make_block();
+162        let merge_block = builder.make_block();
+163
+164        let dummy_ty = TypeId(0);
+165        let dummy_value = builder.make_unit(dummy_ty);
+166        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+167        builder.branch(v0, then_block, merge_block, SourceInfo::dummy());
+168
+169        builder.move_to_block(then_block);
+170        builder.jump(merge_block, SourceInfo::dummy());
+171
+172        builder.move_to_block(merge_block);
+173        builder.ret(dummy_value, SourceInfo::dummy());
+174
+175        let func = builder.build();
+176
+177        let post_dom_tree = PostDomTree::compute(&func);
+178        let entry_block = func.order.entry();
+179        assert_eq!(
+180            post_dom_tree.post_idom(entry_block),
+181            PostIDom::Block(merge_block),
+182        );
+183        assert_eq!(
+184            post_dom_tree.post_idom(then_block),
+185            PostIDom::Block(merge_block),
+186        );
+187        assert_eq!(post_dom_tree.post_idom(merge_block), PostIDom::DummyExit);
+188    }
+189
+190    #[test]
+191    fn test_loop() {
+192        let mut builder = body_builder();
+193        let block1 = builder.make_block();
+194        let block2 = builder.make_block();
+195        let block3 = builder.make_block();
+196        let block4 = builder.make_block();
+197
+198        let dummy_ty = TypeId(0);
+199        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+200
+201        builder.branch(v0, block1, block2, SourceInfo::dummy());
+202
+203        builder.move_to_block(block1);
+204        builder.jump(block3, SourceInfo::dummy());
+205
+206        builder.move_to_block(block2);
+207        builder.branch(v0, block3, block4, SourceInfo::dummy());
+208
+209        builder.move_to_block(block3);
+210        let dummy_value = builder.make_unit(dummy_ty);
+211        builder.ret(dummy_value, SourceInfo::dummy());
+212
+213        builder.move_to_block(block4);
+214        builder.jump(block2, SourceInfo::dummy());
+215
+216        let func = builder.build();
+217
+218        let post_dom_tree = PostDomTree::compute(&func);
+219        let entry_block = func.order.entry();
+220        assert_eq!(
+221            post_dom_tree.post_idom(entry_block),
+222            PostIDom::Block(block3),
+223        );
+224        assert_eq!(post_dom_tree.post_idom(block1), PostIDom::Block(block3));
+225        assert_eq!(post_dom_tree.post_idom(block2), PostIDom::Block(block3));
+226        assert_eq!(post_dom_tree.post_idom(block3), PostIDom::DummyExit);
+227        assert_eq!(post_dom_tree.post_idom(block4), PostIDom::Block(block2));
+228    }
+229
+230    #[test]
+231    fn test_pd_complex() {
+232        let mut builder = body_builder();
+233        let block1 = builder.make_block();
+234        let block2 = builder.make_block();
+235        let block3 = builder.make_block();
+236        let block4 = builder.make_block();
+237        let block5 = builder.make_block();
+238        let block6 = builder.make_block();
+239        let block7 = builder.make_block();
+240
+241        let dummy_ty = TypeId(0);
+242        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+243
+244        builder.branch(v0, block1, block2, SourceInfo::dummy());
+245
+246        builder.move_to_block(block1);
+247        builder.jump(block6, SourceInfo::dummy());
+248
+249        builder.move_to_block(block2);
+250        builder.branch(v0, block3, block4, SourceInfo::dummy());
+251
+252        builder.move_to_block(block3);
+253        builder.jump(block5, SourceInfo::dummy());
+254
+255        builder.move_to_block(block4);
+256        builder.jump(block5, SourceInfo::dummy());
+257
+258        builder.move_to_block(block5);
+259        builder.jump(block6, SourceInfo::dummy());
+260
+261        builder.move_to_block(block6);
+262        builder.jump(block7, SourceInfo::dummy());
+263
+264        builder.move_to_block(block7);
+265        let dummy_value = builder.make_unit(dummy_ty);
+266        builder.ret(dummy_value, SourceInfo::dummy());
+267
+268        let func = builder.build();
+269
+270        let post_dom_tree = PostDomTree::compute(&func);
+271        let entry_block = func.order.entry();
+272        assert_eq!(
+273            post_dom_tree.post_idom(entry_block),
+274            PostIDom::Block(block6),
+275        );
+276        assert_eq!(post_dom_tree.post_idom(block1), PostIDom::Block(block6));
+277        assert_eq!(post_dom_tree.post_idom(block2), PostIDom::Block(block5));
+278        assert_eq!(post_dom_tree.post_idom(block3), PostIDom::Block(block5));
+279        assert_eq!(post_dom_tree.post_idom(block4), PostIDom::Block(block5));
+280        assert_eq!(post_dom_tree.post_idom(block5), PostIDom::Block(block6));
+281        assert_eq!(post_dom_tree.post_idom(block6), PostIDom::Block(block7));
+282        assert_eq!(post_dom_tree.post_idom(block7), PostIDom::DummyExit);
+283    }
+284}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db.rs.html b/compiler-docs/src/fe_mir/db.rs.html new file mode 100644 index 0000000000..5b06ba49d6 --- /dev/null +++ b/compiler-docs/src/fe_mir/db.rs.html @@ -0,0 +1,104 @@ +db.rs - source

fe_mir/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use std::{collections::BTreeMap, rc::Rc};
+3
+4use fe_analyzer::{
+5    db::AnalyzerDbStorage,
+6    namespace::{items as analyzer_items, types as analyzer_types},
+7    AnalyzerDb,
+8};
+9use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
+10use smol_str::SmolStr;
+11
+12use crate::ir::{self, ConstantId, TypeId};
+13
+14mod queries;
+15
+16#[salsa::query_group(MirDbStorage)]
+17pub trait MirDb: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> {
+18    #[salsa::interned]
+19    fn mir_intern_const(&self, data: Rc<ir::Constant>) -> ir::ConstantId;
+20    #[salsa::interned]
+21    fn mir_intern_type(&self, data: Rc<ir::Type>) -> ir::TypeId;
+22    #[salsa::interned]
+23    fn mir_intern_function(&self, data: Rc<ir::FunctionSignature>) -> ir::FunctionId;
+24
+25    #[salsa::invoke(queries::module::mir_lower_module_all_functions)]
+26    fn mir_lower_module_all_functions(
+27        &self,
+28        module: analyzer_items::ModuleId,
+29    ) -> Rc<Vec<ir::FunctionId>>;
+30
+31    #[salsa::invoke(queries::contract::mir_lower_contract_all_functions)]
+32    fn mir_lower_contract_all_functions(
+33        &self,
+34        contract: analyzer_items::ContractId,
+35    ) -> Rc<Vec<ir::FunctionId>>;
+36
+37    #[salsa::invoke(queries::structs::mir_lower_struct_all_functions)]
+38    fn mir_lower_struct_all_functions(
+39        &self,
+40        struct_: analyzer_items::StructId,
+41    ) -> Rc<Vec<ir::FunctionId>>;
+42
+43    #[salsa::invoke(queries::enums::mir_lower_enum_all_functions)]
+44    fn mir_lower_enum_all_functions(
+45        &self,
+46        enum_: analyzer_items::EnumId,
+47    ) -> Rc<Vec<ir::FunctionId>>;
+48
+49    #[salsa::invoke(queries::types::mir_lowered_type)]
+50    fn mir_lowered_type(&self, analyzer_type: analyzer_types::TypeId) -> TypeId;
+51
+52    #[salsa::invoke(queries::constant::mir_lowered_constant)]
+53    fn mir_lowered_constant(&self, analyzer_const: analyzer_items::ModuleConstantId) -> ConstantId;
+54
+55    #[salsa::invoke(queries::function::mir_lowered_func_signature)]
+56    fn mir_lowered_func_signature(
+57        &self,
+58        analyzer_func: analyzer_items::FunctionId,
+59    ) -> ir::FunctionId;
+60    #[salsa::invoke(queries::function::mir_lowered_monomorphized_func_signature)]
+61    fn mir_lowered_monomorphized_func_signature(
+62        &self,
+63        analyzer_func: analyzer_items::FunctionId,
+64        resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+65    ) -> ir::FunctionId;
+66    #[salsa::invoke(queries::function::mir_lowered_pseudo_monomorphized_func_signature)]
+67    fn mir_lowered_pseudo_monomorphized_func_signature(
+68        &self,
+69        analyzer_func: analyzer_items::FunctionId,
+70    ) -> ir::FunctionId;
+71    #[salsa::invoke(queries::function::mir_lowered_func_body)]
+72    fn mir_lowered_func_body(&self, func: ir::FunctionId) -> Rc<ir::FunctionBody>;
+73}
+74
+75#[salsa::database(SourceDbStorage, AnalyzerDbStorage, MirDbStorage)]
+76#[derive(Default)]
+77pub struct NewDb {
+78    storage: salsa::Storage<NewDb>,
+79}
+80impl salsa::Database for NewDb {}
+81
+82impl Upcast<dyn SourceDb> for NewDb {
+83    fn upcast(&self) -> &(dyn SourceDb + 'static) {
+84        self
+85    }
+86}
+87
+88impl UpcastMut<dyn SourceDb> for NewDb {
+89    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
+90        &mut *self
+91    }
+92}
+93
+94impl Upcast<dyn AnalyzerDb> for NewDb {
+95    fn upcast(&self) -> &(dyn AnalyzerDb + 'static) {
+96        self
+97    }
+98}
+99
+100impl UpcastMut<dyn AnalyzerDb> for NewDb {
+101    fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static) {
+102        &mut *self
+103    }
+104}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries.rs.html b/compiler-docs/src/fe_mir/db/queries.rs.html new file mode 100644 index 0000000000..b029476695 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries.rs.html @@ -0,0 +1,7 @@ +queries.rs - source

fe_mir/db/
queries.rs

1pub mod constant;
+2pub mod contract;
+3pub mod enums;
+4pub mod function;
+5pub mod module;
+6pub mod structs;
+7pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/constant.rs.html b/compiler-docs/src/fe_mir/db/queries/constant.rs.html new file mode 100644 index 0000000000..33327505c4 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/constant.rs.html @@ -0,0 +1,43 @@ +constant.rs - source

fe_mir/db/queries/
constant.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items as analyzer_items;
+4
+5use crate::{
+6    db::MirDb,
+7    ir::{Constant, ConstantId, SourceInfo, TypeId},
+8};
+9
+10pub fn mir_lowered_constant(
+11    db: &dyn MirDb,
+12    analyzer_const: analyzer_items::ModuleConstantId,
+13) -> ConstantId {
+14    let name = analyzer_const.name(db.upcast());
+15    let value = analyzer_const.constant_value(db.upcast()).unwrap();
+16    let ty = analyzer_const.typ(db.upcast()).unwrap();
+17    let module_id = analyzer_const.module(db.upcast());
+18    let span = analyzer_const.span(db.upcast());
+19    let id = analyzer_const.node_id(db.upcast());
+20
+21    let ty = db.mir_lowered_type(ty);
+22    let source = SourceInfo { span, id };
+23
+24    let constant = Constant {
+25        name,
+26        value: value.into(),
+27        ty,
+28        module_id,
+29        source,
+30    };
+31
+32    db.mir_intern_const(constant.into())
+33}
+34
+35impl ConstantId {
+36    pub fn data(self, db: &dyn MirDb) -> Rc<Constant> {
+37        db.lookup_mir_intern_const(self)
+38    }
+39
+40    pub fn ty(self, db: &dyn MirDb) -> TypeId {
+41        self.data(db).ty
+42    }
+43}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/contract.rs.html b/compiler-docs/src/fe_mir/db/queries/contract.rs.html new file mode 100644 index 0000000000..f13344d10c --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/contract.rs.html @@ -0,0 +1,17 @@ +contract.rs - source

fe_mir/db/queries/
contract.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_contract_all_functions(
+8    db: &dyn MirDb,
+9    contract: analyzer_items::ContractId,
+10) -> Rc<Vec<FunctionId>> {
+11    contract
+12        .all_functions(db.upcast())
+13        .iter()
+14        .map(|func| db.mir_lowered_func_signature(*func))
+15        .collect::<Vec<_>>()
+16        .into()
+17}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/enums.rs.html b/compiler-docs/src/fe_mir/db/queries/enums.rs.html new file mode 100644 index 0000000000..8abc577843 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/enums.rs.html @@ -0,0 +1,17 @@ +enums.rs - source

fe_mir/db/queries/
enums.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_enum_all_functions(
+8    db: &dyn MirDb,
+9    enum_: analyzer_items::EnumId,
+10) -> Rc<Vec<FunctionId>> {
+11    enum_
+12        .all_functions(db.upcast())
+13        .iter()
+14        .map(|func| db.mir_lowered_func_signature(*func))
+15        .collect::<Vec<_>>()
+16        .into()
+17}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/function.rs.html b/compiler-docs/src/fe_mir/db/queries/function.rs.html new file mode 100644 index 0000000000..aa82bc41ee --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/function.rs.html @@ -0,0 +1,130 @@ +function.rs - source

fe_mir/db/queries/
function.rs

1use std::{collections::BTreeMap, rc::Rc};
+2
+3use fe_analyzer::display::Displayable;
+4use fe_analyzer::namespace::items as analyzer_items;
+5use fe_analyzer::namespace::items::Item;
+6use fe_analyzer::namespace::types as analyzer_types;
+7
+8use smol_str::SmolStr;
+9
+10use crate::{
+11    db::MirDb,
+12    ir::{self, function::Linkage, FunctionSignature, TypeId},
+13    lower::function::{lower_func_body, lower_func_signature, lower_monomorphized_func_signature},
+14};
+15
+16pub fn mir_lowered_func_signature(
+17    db: &dyn MirDb,
+18    analyzer_func: analyzer_items::FunctionId,
+19) -> ir::FunctionId {
+20    lower_func_signature(db, analyzer_func)
+21}
+22
+23pub fn mir_lowered_monomorphized_func_signature(
+24    db: &dyn MirDb,
+25    analyzer_func: analyzer_items::FunctionId,
+26    resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+27) -> ir::FunctionId {
+28    lower_monomorphized_func_signature(db, analyzer_func, resolved_generics)
+29}
+30
+31/// Generate MIR function and monomorphize generic parameters as if they were called with unit type
+32/// NOTE: THIS SHOULD ONLY BE USED IN TEST CODE
+33pub fn mir_lowered_pseudo_monomorphized_func_signature(
+34    db: &dyn MirDb,
+35    analyzer_func: analyzer_items::FunctionId,
+36) -> ir::FunctionId {
+37    let resolved_generics = analyzer_func
+38        .sig(db.upcast())
+39        .generic_params(db.upcast())
+40        .iter()
+41        .map(|generic| (generic.name(), analyzer_types::TypeId::unit(db.upcast())))
+42        .collect::<BTreeMap<_, _>>();
+43    lower_monomorphized_func_signature(db, analyzer_func, resolved_generics)
+44}
+45
+46pub fn mir_lowered_func_body(db: &dyn MirDb, func: ir::FunctionId) -> Rc<ir::FunctionBody> {
+47    lower_func_body(db, func)
+48}
+49
+50impl ir::FunctionId {
+51    pub fn signature(self, db: &dyn MirDb) -> Rc<FunctionSignature> {
+52        db.lookup_mir_intern_function(self)
+53    }
+54
+55    pub fn return_type(self, db: &dyn MirDb) -> Option<TypeId> {
+56        self.signature(db).return_type
+57    }
+58
+59    pub fn linkage(self, db: &dyn MirDb) -> Linkage {
+60        self.signature(db).linkage
+61    }
+62
+63    pub fn analyzer_func(self, db: &dyn MirDb) -> analyzer_items::FunctionId {
+64        self.signature(db).analyzer_func_id
+65    }
+66
+67    pub fn body(self, db: &dyn MirDb) -> Rc<ir::FunctionBody> {
+68        db.mir_lowered_func_body(self)
+69    }
+70
+71    pub fn module(self, db: &dyn MirDb) -> analyzer_items::ModuleId {
+72        let analyzer_func = self.analyzer_func(db);
+73        analyzer_func.module(db.upcast())
+74    }
+75
+76    pub fn is_contract_init(self, db: &dyn MirDb) -> bool {
+77        self.analyzer_func(db)
+78            .data(db.upcast())
+79            .sig
+80            .is_constructor(db.upcast())
+81    }
+82
+83    /// Returns a type suffix if a generic function was monomorphized
+84    pub fn type_suffix(&self, db: &dyn MirDb) -> SmolStr {
+85        self.signature(db)
+86            .resolved_generics
+87            .values()
+88            .fold(String::new(), |acc, param| {
+89                format!("{}_{}", acc, param.display(db.upcast()))
+90            })
+91            .into()
+92    }
+93
+94    pub fn name(&self, db: &dyn MirDb) -> SmolStr {
+95        let analyzer_func = self.analyzer_func(db);
+96        analyzer_func.name(db.upcast())
+97    }
+98
+99    /// Returns `class_name::fn_name` if a function is a method else `fn_name`.
+100    pub fn debug_name(self, db: &dyn MirDb) -> SmolStr {
+101        let analyzer_func = self.analyzer_func(db);
+102        let func_name = format!(
+103            "{}{}",
+104            analyzer_func.name(db.upcast()),
+105            self.type_suffix(db)
+106        );
+107
+108        match analyzer_func.sig(db.upcast()).self_item(db.upcast()) {
+109            Some(Item::Impl(id)) => {
+110                let class_name = format!(
+111                    "<{} as {}>",
+112                    id.receiver(db.upcast()).display(db.upcast()),
+113                    id.trait_id(db.upcast()).name(db.upcast())
+114                );
+115                format!("{class_name}::{func_name}").into()
+116            }
+117            Some(class) => {
+118                let class_name = class.name(db.upcast());
+119                format!("{class_name}::{func_name}").into()
+120            }
+121            _ => func_name.into(),
+122        }
+123    }
+124
+125    pub fn returns_aggregate(self, db: &dyn MirDb) -> bool {
+126        self.return_type(db)
+127            .map(|ty| ty.is_aggregate(db))
+128            .unwrap_or_default()
+129    }
+130}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/module.rs.html b/compiler-docs/src/fe_mir/db/queries/module.rs.html new file mode 100644 index 0000000000..92cdd44c58 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/module.rs.html @@ -0,0 +1,35 @@ +module.rs - source

fe_mir/db/queries/
module.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items, TypeDef};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_module_all_functions(
+8    db: &dyn MirDb,
+9    module: analyzer_items::ModuleId,
+10) -> Rc<Vec<FunctionId>> {
+11    let mut functions = vec![];
+12
+13    let items = module.all_items(db.upcast());
+14    items.iter().for_each(|item| match item {
+15        analyzer_items::Item::Function(func) => {
+16            functions.push(db.mir_lowered_func_signature(*func))
+17        }
+18
+19        analyzer_items::Item::Type(TypeDef::Contract(contract)) => {
+20            functions.extend_from_slice(&db.mir_lower_contract_all_functions(*contract))
+21        }
+22
+23        analyzer_items::Item::Type(TypeDef::Struct(struct_)) => {
+24            functions.extend_from_slice(&db.mir_lower_struct_all_functions(*struct_))
+25        }
+26
+27        analyzer_items::Item::Type(TypeDef::Enum(enum_)) => {
+28            functions.extend_from_slice(&db.mir_lower_enum_all_functions(*enum_))
+29        }
+30
+31        _ => {}
+32    });
+33
+34    functions.into()
+35}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/structs.rs.html b/compiler-docs/src/fe_mir/db/queries/structs.rs.html new file mode 100644 index 0000000000..224248a59a --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/structs.rs.html @@ -0,0 +1,17 @@ +structs.rs - source

fe_mir/db/queries/
structs.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_struct_all_functions(
+8    db: &dyn MirDb,
+9    struct_: analyzer_items::StructId,
+10) -> Rc<Vec<FunctionId>> {
+11    struct_
+12        .all_functions(db.upcast())
+13        .iter()
+14        .map(|func| db.mir_lowered_pseudo_monomorphized_func_signature(*func))
+15        .collect::<Vec<_>>()
+16        .into()
+17}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/types.rs.html b/compiler-docs/src/fe_mir/db/queries/types.rs.html new file mode 100644 index 0000000000..528a92a5b8 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/types.rs.html @@ -0,0 +1,657 @@ +types.rs - source

fe_mir/db/queries/
types.rs

1use std::{fmt, rc::Rc, str::FromStr};
+2
+3use fe_analyzer::namespace::{items::EnumVariantId, types as analyzer_types};
+4
+5use num_bigint::BigInt;
+6use num_traits::ToPrimitive;
+7
+8use crate::{
+9    db::MirDb,
+10    ir::{
+11        types::{ArrayDef, TupleDef, TypeKind},
+12        Type, TypeId, Value,
+13    },
+14    lower::types::lower_type,
+15};
+16
+17pub fn mir_lowered_type(db: &dyn MirDb, analyzer_type: analyzer_types::TypeId) -> TypeId {
+18    lower_type(db, analyzer_type)
+19}
+20
+21impl TypeId {
+22    pub fn data(self, db: &dyn MirDb) -> Rc<Type> {
+23        db.lookup_mir_intern_type(self)
+24    }
+25
+26    pub fn analyzer_ty(self, db: &dyn MirDb) -> Option<analyzer_types::TypeId> {
+27        self.data(db).analyzer_ty
+28    }
+29
+30    pub fn projection_ty(self, db: &dyn MirDb, access: &Value) -> TypeId {
+31        let ty = self.deref(db);
+32        let pty = match &ty.data(db).kind {
+33            TypeKind::Array(ArrayDef { elem_ty, .. }) => *elem_ty,
+34            TypeKind::Tuple(def) => {
+35                let index = expect_projection_index(access);
+36                def.items[index]
+37            }
+38            TypeKind::Struct(def) | TypeKind::Contract(def) => {
+39                let index = expect_projection_index(access);
+40                def.fields[index].1
+41            }
+42            TypeKind::Enum(_) => {
+43                let index = expect_projection_index(access);
+44                debug_assert_eq!(index, 0);
+45                ty.projection_ty_imm(db, 0)
+46            }
+47            _ => panic!("{:?} can't project onto the `access`", self.as_string(db)),
+48        };
+49        match &self.data(db).kind {
+50            TypeKind::SPtr(_) | TypeKind::Contract(_) => pty.make_sptr(db),
+51            TypeKind::MPtr(_) => pty.make_mptr(db),
+52            _ => pty,
+53        }
+54    }
+55
+56    pub fn deref(self, db: &dyn MirDb) -> TypeId {
+57        match self.data(db).kind {
+58            TypeKind::SPtr(inner) => inner,
+59            TypeKind::MPtr(inner) => inner.deref(db),
+60            _ => self,
+61        }
+62    }
+63
+64    pub fn make_sptr(self, db: &dyn MirDb) -> TypeId {
+65        db.mir_intern_type(Type::new(TypeKind::SPtr(self), None).into())
+66    }
+67
+68    pub fn make_mptr(self, db: &dyn MirDb) -> TypeId {
+69        db.mir_intern_type(Type::new(TypeKind::MPtr(self), None).into())
+70    }
+71
+72    pub fn projection_ty_imm(self, db: &dyn MirDb, index: usize) -> TypeId {
+73        match &self.data(db).kind {
+74            TypeKind::Array(ArrayDef { elem_ty, .. }) => *elem_ty,
+75            TypeKind::Tuple(def) => def.items[index],
+76            TypeKind::Struct(def) | TypeKind::Contract(def) => def.fields[index].1,
+77            TypeKind::Enum(_) => {
+78                debug_assert_eq!(index, 0);
+79                self.enum_disc_type(db)
+80            }
+81            _ => panic!("{:?} can't project onto the `index`", self.as_string(db)),
+82        }
+83    }
+84
+85    pub fn aggregate_field_num(self, db: &dyn MirDb) -> usize {
+86        match &self.data(db).kind {
+87            TypeKind::Array(ArrayDef { len, .. }) => *len,
+88            TypeKind::Tuple(def) => def.items.len(),
+89            TypeKind::Struct(def) | TypeKind::Contract(def) => def.fields.len(),
+90            TypeKind::Enum(_) => 2,
+91            _ => unreachable!(),
+92        }
+93    }
+94
+95    pub fn enum_disc_type(self, db: &dyn MirDb) -> TypeId {
+96        let kind = match &self.deref(db).data(db).kind {
+97            TypeKind::Enum(def) => def.tag_type(),
+98            _ => unreachable!(),
+99        };
+100        let analyzer_type = match kind {
+101            TypeKind::U8 => Some(analyzer_types::Integer::U8),
+102            TypeKind::U16 => Some(analyzer_types::Integer::U16),
+103            TypeKind::U32 => Some(analyzer_types::Integer::U32),
+104            TypeKind::U64 => Some(analyzer_types::Integer::U64),
+105            TypeKind::U128 => Some(analyzer_types::Integer::U128),
+106            TypeKind::U256 => Some(analyzer_types::Integer::U256),
+107            _ => None,
+108        }
+109        .map(|int| analyzer_types::TypeId::int(db.upcast(), int));
+110
+111        db.mir_intern_type(Type::new(kind, analyzer_type).into())
+112    }
+113
+114    pub fn enum_data_offset(self, db: &dyn MirDb, slot_size: usize) -> usize {
+115        match &self.data(db).kind {
+116            TypeKind::Enum(def) => {
+117                let disc_size = self.enum_disc_type(db).size_of(db, slot_size);
+118                let mut align = 1;
+119                for variant in def.variants.iter() {
+120                    let variant_align = variant.ty.align_of(db, slot_size);
+121                    align = num_integer::lcm(align, variant_align);
+122                }
+123                round_up(disc_size, align)
+124            }
+125            _ => unreachable!(),
+126        }
+127    }
+128
+129    pub fn enum_variant_type(self, db: &dyn MirDb, variant_id: EnumVariantId) -> TypeId {
+130        let name = variant_id.name(db.upcast());
+131        match &self.deref(db).data(db).kind {
+132            TypeKind::Enum(def) => def
+133                .variants
+134                .iter()
+135                .find(|variant| variant.name == name)
+136                .map(|variant| variant.ty)
+137                .unwrap(),
+138            _ => unreachable!(),
+139        }
+140    }
+141
+142    pub fn index_from_fname(self, db: &dyn MirDb, fname: &str) -> BigInt {
+143        let ty = self.deref(db);
+144        match &ty.data(db).kind {
+145            TypeKind::Tuple(_) => {
+146                // TODO: Fix this when the syntax for tuple access changes.
+147                let index_str = &fname[4..];
+148                BigInt::from_str(index_str).unwrap()
+149            }
+150
+151            TypeKind::Struct(def) | TypeKind::Contract(def) => def
+152                .fields
+153                .iter()
+154                .enumerate()
+155                .find_map(|(i, field)| (field.0 == fname).then(|| i.into()))
+156                .unwrap(),
+157
+158            other => unreachable!("{:?} does not have fields", other),
+159        }
+160    }
+161
+162    pub fn is_primitive(self, db: &dyn MirDb) -> bool {
+163        matches!(
+164            &self.data(db).kind,
+165            TypeKind::I8
+166                | TypeKind::I16
+167                | TypeKind::I32
+168                | TypeKind::I64
+169                | TypeKind::I128
+170                | TypeKind::I256
+171                | TypeKind::U8
+172                | TypeKind::U16
+173                | TypeKind::U32
+174                | TypeKind::U64
+175                | TypeKind::U128
+176                | TypeKind::U256
+177                | TypeKind::Bool
+178                | TypeKind::Address
+179                | TypeKind::Unit
+180        )
+181    }
+182
+183    pub fn is_integral(self, db: &dyn MirDb) -> bool {
+184        matches!(
+185            &self.data(db).kind,
+186            TypeKind::I8
+187                | TypeKind::I16
+188                | TypeKind::I32
+189                | TypeKind::I64
+190                | TypeKind::I128
+191                | TypeKind::I256
+192                | TypeKind::U8
+193                | TypeKind::U16
+194                | TypeKind::U32
+195                | TypeKind::U64
+196                | TypeKind::U128
+197                | TypeKind::U256
+198        )
+199    }
+200
+201    pub fn is_address(self, db: &dyn MirDb) -> bool {
+202        matches!(&self.data(db).kind, TypeKind::Address)
+203    }
+204
+205    pub fn is_unit(self, db: &dyn MirDb) -> bool {
+206        matches!(&self.data(db).as_ref().kind, TypeKind::Unit)
+207    }
+208
+209    pub fn is_enum(self, db: &dyn MirDb) -> bool {
+210        matches!(&self.data(db).as_ref().kind, TypeKind::Enum(_))
+211    }
+212
+213    pub fn is_signed(self, db: &dyn MirDb) -> bool {
+214        matches!(
+215            &self.data(db).kind,
+216            TypeKind::I8
+217                | TypeKind::I16
+218                | TypeKind::I32
+219                | TypeKind::I64
+220                | TypeKind::I128
+221                | TypeKind::I256
+222        )
+223    }
+224
+225    /// Returns size of the type in bytes.
+226    pub fn size_of(self, db: &dyn MirDb, slot_size: usize) -> usize {
+227        match &self.data(db).kind {
+228            TypeKind::Bool | TypeKind::I8 | TypeKind::U8 => 1,
+229            TypeKind::I16 | TypeKind::U16 => 2,
+230            TypeKind::I32 | TypeKind::U32 => 4,
+231            TypeKind::I64 | TypeKind::U64 => 8,
+232            TypeKind::I128 | TypeKind::U128 => 16,
+233            TypeKind::String(len) => 32 + len,
+234            TypeKind::MPtr(..)
+235            | TypeKind::SPtr(..)
+236            | TypeKind::I256
+237            | TypeKind::U256
+238            | TypeKind::Map(_) => 32,
+239            TypeKind::Address => 20,
+240            TypeKind::Unit => 0,
+241
+242            TypeKind::Array(def) => array_elem_size_imp(db, def, slot_size) * def.len,
+243
+244            TypeKind::Tuple(def) => {
+245                if def.items.is_empty() {
+246                    return 0;
+247                }
+248                let last_idx = def.items.len() - 1;
+249                self.aggregate_elem_offset(db, last_idx, slot_size)
+250                    + def.items[last_idx].size_of(db, slot_size)
+251            }
+252
+253            TypeKind::Struct(def) | TypeKind::Contract(def) => {
+254                if def.fields.is_empty() {
+255                    return 0;
+256                }
+257                let last_idx = def.fields.len() - 1;
+258                self.aggregate_elem_offset(db, last_idx, slot_size)
+259                    + def.fields[last_idx].1.size_of(db, slot_size)
+260            }
+261
+262            TypeKind::Enum(def) => {
+263                let data_offset = self.enum_data_offset(db, slot_size);
+264                let maximum_data_size = def
+265                    .variants
+266                    .iter()
+267                    .map(|variant| variant.ty.size_of(db, slot_size))
+268                    .max()
+269                    .unwrap_or(0);
+270                data_offset + maximum_data_size
+271            }
+272        }
+273    }
+274
+275    pub fn is_zero_sized(self, db: &dyn MirDb) -> bool {
+276        // It's ok to use 1 as a slot size because slot size doesn't affect whether a
+277        // type is zero sized or not.
+278        self.size_of(db, 1) == 0
+279    }
+280
+281    pub fn align_of(self, db: &dyn MirDb, slot_size: usize) -> usize {
+282        if self.is_primitive(db) {
+283            1
+284        } else {
+285            // TODO: Too naive, we could implement more efficient layout for aggregate
+286            // types.
+287            slot_size
+288        }
+289    }
+290
+291    /// Returns an offset of the element of aggregate type.
+292    pub fn aggregate_elem_offset<T>(self, db: &dyn MirDb, elem_idx: T, slot_size: usize) -> usize
+293    where
+294        T: num_traits::ToPrimitive,
+295    {
+296        debug_assert!(self.is_aggregate(db));
+297        debug_assert!(elem_idx.to_usize().unwrap() < self.aggregate_field_num(db));
+298        let elem_idx = elem_idx.to_usize().unwrap();
+299
+300        if elem_idx == 0 {
+301            return 0;
+302        }
+303
+304        match &self.data(db).kind {
+305            TypeKind::Array(def) => array_elem_size_imp(db, def, slot_size) * elem_idx,
+306            TypeKind::Enum(_) => self.enum_data_offset(db, slot_size),
+307            _ => {
+308                let mut offset = self.aggregate_elem_offset(db, elem_idx - 1, slot_size)
+309                    + self
+310                        .projection_ty_imm(db, elem_idx - 1)
+311                        .size_of(db, slot_size);
+312
+313                let elem_ty = self.projection_ty_imm(db, elem_idx);
+314                if (offset % slot_size + elem_ty.size_of(db, slot_size)) > slot_size {
+315                    offset = round_up(offset, slot_size);
+316                }
+317
+318                round_up(offset, elem_ty.align_of(db, slot_size))
+319            }
+320        }
+321    }
+322
+323    pub fn is_aggregate(self, db: &dyn MirDb) -> bool {
+324        matches!(
+325            &self.data(db).kind,
+326            TypeKind::Array(_)
+327                | TypeKind::Tuple(_)
+328                | TypeKind::Struct(_)
+329                | TypeKind::Enum(_)
+330                | TypeKind::Contract(_)
+331        )
+332    }
+333
+334    pub fn is_struct(self, db: &dyn MirDb) -> bool {
+335        matches!(&self.data(db).as_ref().kind, TypeKind::Struct(_))
+336    }
+337
+338    pub fn is_array(self, db: &dyn MirDb) -> bool {
+339        matches!(&self.data(db).kind, TypeKind::Array(_))
+340    }
+341
+342    pub fn is_string(self, db: &dyn MirDb) -> bool {
+343        matches! {
+344            &self.data(db).kind,
+345            TypeKind::String(_)
+346        }
+347    }
+348
+349    pub fn is_ptr(self, db: &dyn MirDb) -> bool {
+350        self.is_mptr(db) || self.is_sptr(db)
+351    }
+352
+353    pub fn is_mptr(self, db: &dyn MirDb) -> bool {
+354        matches!(self.data(db).kind, TypeKind::MPtr(_))
+355    }
+356
+357    pub fn is_sptr(self, db: &dyn MirDb) -> bool {
+358        matches!(self.data(db).kind, TypeKind::SPtr(_))
+359    }
+360
+361    pub fn is_map(self, db: &dyn MirDb) -> bool {
+362        matches!(self.data(db).kind, TypeKind::Map(_))
+363    }
+364
+365    pub fn is_contract(self, db: &dyn MirDb) -> bool {
+366        matches!(self.data(db).kind, TypeKind::Contract(_))
+367    }
+368
+369    pub fn array_elem_size(self, db: &dyn MirDb, slot_size: usize) -> usize {
+370        let data = self.data(db);
+371        if let TypeKind::Array(def) = &data.kind {
+372            array_elem_size_imp(db, def, slot_size)
+373        } else {
+374            panic!("expected `Array` type; but got {:?}", data.as_ref())
+375        }
+376    }
+377
+378    pub fn print<W: fmt::Write>(&self, db: &dyn MirDb, w: &mut W) -> fmt::Result {
+379        match &self.data(db).kind {
+380            TypeKind::I8 => write!(w, "i8"),
+381            TypeKind::I16 => write!(w, "i16"),
+382            TypeKind::I32 => write!(w, "i32"),
+383            TypeKind::I64 => write!(w, "i64"),
+384            TypeKind::I128 => write!(w, "i128"),
+385            TypeKind::I256 => write!(w, "i256"),
+386            TypeKind::U8 => write!(w, "u8"),
+387            TypeKind::U16 => write!(w, "u16"),
+388            TypeKind::U32 => write!(w, "u32"),
+389            TypeKind::U64 => write!(w, "u64"),
+390            TypeKind::U128 => write!(w, "u128"),
+391            TypeKind::U256 => write!(w, "u256"),
+392            TypeKind::Bool => write!(w, "bool"),
+393            TypeKind::Address => write!(w, "address"),
+394            TypeKind::Unit => write!(w, "()"),
+395            TypeKind::String(size) => write!(w, "Str<{size}>"),
+396            TypeKind::Array(ArrayDef { elem_ty, len }) => {
+397                write!(w, "[")?;
+398                elem_ty.print(db, w)?;
+399                write!(w, "; {len}]")
+400            }
+401            TypeKind::Tuple(TupleDef { items }) => {
+402                write!(w, "(")?;
+403                if items.is_empty() {
+404                    return write!(w, ")");
+405                }
+406
+407                let len = items.len();
+408                for item in &items[0..len - 1] {
+409                    item.print(db, w)?;
+410                    write!(w, ", ")?;
+411                }
+412                items.last().unwrap().print(db, w)?;
+413                write!(w, ")")
+414            }
+415            TypeKind::Struct(def) => {
+416                write!(w, "{}", def.name)
+417            }
+418            TypeKind::Enum(def) => {
+419                write!(w, "{}", def.name)
+420            }
+421            TypeKind::Contract(def) => {
+422                write!(w, "{}", def.name)
+423            }
+424            TypeKind::Map(def) => {
+425                write!(w, "Map<")?;
+426                def.key_ty.print(db, w)?;
+427                write!(w, ",")?;
+428                def.value_ty.print(db, w)?;
+429                write!(w, ">")
+430            }
+431            TypeKind::MPtr(inner) => {
+432                write!(w, "*@m ")?;
+433                inner.print(db, w)
+434            }
+435            TypeKind::SPtr(inner) => {
+436                write!(w, "*@s ")?;
+437                inner.print(db, w)
+438            }
+439        }
+440    }
+441
+442    pub fn as_string(&self, db: &dyn MirDb) -> String {
+443        let mut s = String::new();
+444        self.print(db, &mut s).unwrap();
+445        s
+446    }
+447}
+448
+449fn array_elem_size_imp(db: &dyn MirDb, arr: &ArrayDef, slot_size: usize) -> usize {
+450    let elem_ty = arr.elem_ty;
+451    let elem = elem_ty.size_of(db, slot_size);
+452    let align = if elem_ty.is_address(db) {
+453        slot_size
+454    } else {
+455        elem_ty.align_of(db, slot_size)
+456    };
+457    round_up(elem, align)
+458}
+459
+460fn expect_projection_index(value: &Value) -> usize {
+461    match value {
+462        Value::Immediate { imm, .. } => imm.to_usize().unwrap(),
+463        _ => panic!("given `value` is not an immediate"),
+464    }
+465}
+466
+467fn round_up(value: usize, slot_size: usize) -> usize {
+468    ((value + slot_size - 1) / slot_size) * slot_size
+469}
+470
+471#[cfg(test)]
+472mod tests {
+473    use fe_analyzer::namespace::items::ModuleId;
+474    use fe_common::Span;
+475
+476    use super::*;
+477    use crate::{
+478        db::{MirDb, NewDb},
+479        ir::types::StructDef,
+480    };
+481
+482    #[test]
+483    fn test_primitive_type_info() {
+484        let db = NewDb::default();
+485        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+486        let bool = db.mir_intern_type(Type::new(TypeKind::Bool, None).into());
+487
+488        debug_assert_eq!(i8.size_of(&db, 1), 1);
+489        debug_assert_eq!(i8.size_of(&db, 32), 1);
+490        debug_assert_eq!(i8.align_of(&db, 1), 1);
+491        debug_assert_eq!(i8.align_of(&db, 32), 1);
+492        debug_assert_eq!(bool.size_of(&db, 1), 1);
+493        debug_assert_eq!(bool.size_of(&db, 32), 1);
+494        debug_assert_eq!(i8.align_of(&db, 32), 1);
+495        debug_assert_eq!(i8.align_of(&db, 32), 1);
+496
+497        let u32 = db.mir_intern_type(Type::new(TypeKind::U32, None).into());
+498        debug_assert_eq!(u32.size_of(&db, 1), 4);
+499        debug_assert_eq!(u32.size_of(&db, 32), 4);
+500        debug_assert_eq!(u32.align_of(&db, 32), 1);
+501
+502        let address = db.mir_intern_type(Type::new(TypeKind::Address, None).into());
+503        debug_assert_eq!(address.size_of(&db, 1), 20);
+504        debug_assert_eq!(address.size_of(&db, 32), 20);
+505        debug_assert_eq!(address.align_of(&db, 32), 1);
+506    }
+507
+508    #[test]
+509    fn test_primitive_elem_array_type_info() {
+510        let db = NewDb::default();
+511        let i32 = db.mir_intern_type(Type::new(TypeKind::I32, None).into());
+512
+513        let array_len = 10;
+514        let array_def = ArrayDef {
+515            elem_ty: i32,
+516            len: array_len,
+517        };
+518        let array = db.mir_intern_type(Type::new(TypeKind::Array(array_def), None).into());
+519
+520        let elem_size = array.array_elem_size(&db, 1);
+521        debug_assert_eq!(elem_size, 4);
+522        debug_assert_eq!(array.array_elem_size(&db, 32), elem_size);
+523
+524        debug_assert_eq!(array.size_of(&db, 1), elem_size * array_len);
+525        debug_assert_eq!(array.size_of(&db, 32), elem_size * array_len);
+526        debug_assert_eq!(array.align_of(&db, 1), 1);
+527        debug_assert_eq!(array.align_of(&db, 32), 32);
+528
+529        debug_assert_eq!(array.aggregate_elem_offset(&db, 3, 32), elem_size * 3);
+530        debug_assert_eq!(array.aggregate_elem_offset(&db, 9, 1), elem_size * 9);
+531    }
+532
+533    #[test]
+534    fn test_aggregate_elem_array_type_info() {
+535        let db = NewDb::default();
+536        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+537        let i64 = db.mir_intern_type(Type::new(TypeKind::I64, None).into());
+538        let i128 = db.mir_intern_type(Type::new(TypeKind::I128, None).into());
+539
+540        let fields = vec![
+541            ("".into(), i64),
+542            ("".into(), i64),
+543            ("".into(), i8),
+544            ("".into(), i128),
+545            ("".into(), i8),
+546        ];
+547
+548        let struct_def = StructDef {
+549            name: "".into(),
+550            fields,
+551            span: Span::dummy(),
+552            module_id: ModuleId::from_raw_internal(0),
+553        };
+554        let aggregate = db.mir_intern_type(Type::new(TypeKind::Struct(struct_def), None).into());
+555
+556        let array_len = 10;
+557        let array_def = ArrayDef {
+558            elem_ty: aggregate,
+559            len: array_len,
+560        };
+561        let array = db.mir_intern_type(Type::new(TypeKind::Array(array_def), None).into());
+562
+563        debug_assert_eq!(array.array_elem_size(&db, 1), 34);
+564        debug_assert_eq!(array.array_elem_size(&db, 32), 64);
+565
+566        debug_assert_eq!(array.size_of(&db, 1), 34 * array_len);
+567        debug_assert_eq!(array.size_of(&db, 32), 64 * array_len);
+568
+569        debug_assert_eq!(array.align_of(&db, 1), 1);
+570        debug_assert_eq!(array.align_of(&db, 32), 32);
+571
+572        debug_assert_eq!(array.aggregate_elem_offset(&db, 3, 1), 102);
+573        debug_assert_eq!(array.aggregate_elem_offset(&db, 3, 32), 192);
+574    }
+575
+576    #[test]
+577    fn test_primitive_elem_aggregate_type_info() {
+578        let db = NewDb::default();
+579        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+580        let i64 = db.mir_intern_type(Type::new(TypeKind::I64, None).into());
+581        let i128 = db.mir_intern_type(Type::new(TypeKind::I128, None).into());
+582
+583        let fields = vec![
+584            ("".into(), i64),
+585            ("".into(), i64),
+586            ("".into(), i8),
+587            ("".into(), i128),
+588            ("".into(), i8),
+589        ];
+590
+591        let struct_def = StructDef {
+592            name: "".into(),
+593            fields,
+594            span: Span::dummy(),
+595            module_id: ModuleId::from_raw_internal(0),
+596        };
+597        let aggregate = db.mir_intern_type(Type::new(TypeKind::Struct(struct_def), None).into());
+598
+599        debug_assert_eq!(aggregate.size_of(&db, 1), 34);
+600        debug_assert_eq!(aggregate.size_of(&db, 32), 49);
+601
+602        debug_assert_eq!(aggregate.align_of(&db, 1), 1);
+603        debug_assert_eq!(aggregate.align_of(&db, 32), 32);
+604
+605        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 1), 0);
+606        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 32), 0);
+607        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 3, 1), 17);
+608        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 3, 32), 32);
+609        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 4, 1), 33);
+610        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 4, 32), 48);
+611    }
+612
+613    #[test]
+614    fn test_aggregate_elem_aggregate_type_info() {
+615        let db = NewDb::default();
+616        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+617        let i64 = db.mir_intern_type(Type::new(TypeKind::I64, None).into());
+618        let i128 = db.mir_intern_type(Type::new(TypeKind::I128, None).into());
+619
+620        let fields_inner = vec![
+621            ("".into(), i64),
+622            ("".into(), i64),
+623            ("".into(), i8),
+624            ("".into(), i128),
+625            ("".into(), i8),
+626        ];
+627
+628        let struct_def_inner = StructDef {
+629            name: "".into(),
+630            fields: fields_inner,
+631            span: Span::dummy(),
+632            module_id: ModuleId::from_raw_internal(0),
+633        };
+634        let aggregate_inner =
+635            db.mir_intern_type(Type::new(TypeKind::Struct(struct_def_inner), None).into());
+636
+637        let fields = vec![("".into(), i8), ("".into(), aggregate_inner)];
+638        let struct_def = StructDef {
+639            name: "".into(),
+640            fields,
+641            span: Span::dummy(),
+642            module_id: ModuleId::from_raw_internal(0),
+643        };
+644        let aggregate = db.mir_intern_type(Type::new(TypeKind::Struct(struct_def), None).into());
+645
+646        debug_assert_eq!(aggregate.size_of(&db, 1), 35);
+647        debug_assert_eq!(aggregate.size_of(&db, 32), 81);
+648
+649        debug_assert_eq!(aggregate.align_of(&db, 1), 1);
+650        debug_assert_eq!(aggregate.align_of(&db, 32), 32);
+651
+652        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 1), 0);
+653        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 32), 0);
+654        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 1, 1), 1);
+655        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 1, 32), 32);
+656    }
+657}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/block.rs.html b/compiler-docs/src/fe_mir/graphviz/block.rs.html new file mode 100644 index 0000000000..bf799116e1 --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/block.rs.html @@ -0,0 +1,62 @@ +block.rs - source

fe_mir/graphviz/
block.rs

1use std::fmt::Write;
+2
+3use dot2::{label, Id};
+4
+5use crate::{
+6    analysis::ControlFlowGraph,
+7    db::MirDb,
+8    ir::{BasicBlockId, FunctionId},
+9    pretty_print::PrettyPrint,
+10};
+11
+12#[derive(Debug, Clone, Copy)]
+13pub(super) struct BlockNode {
+14    func: FunctionId,
+15    pub block: BasicBlockId,
+16}
+17
+18impl BlockNode {
+19    pub(super) fn new(func: FunctionId, block: BasicBlockId) -> Self {
+20        Self { func, block }
+21    }
+22    pub(super) fn id(self) -> dot2::Result<Id<'static>> {
+23        Id::new(format!("fn{}_bb{}", self.func.0, self.block.index()))
+24    }
+25
+26    pub(super) fn label(self, db: &dyn MirDb) -> label::Text<'static> {
+27        let mut label = r#"<table border="0" cellborder="1" cellspacing="0">"#.to_string();
+28
+29        // Write block header.
+30        write!(
+31            &mut label,
+32            r#"<tr><td bgcolor="gray" align="center" colspan="1">BB{}</td></tr>"#,
+33            self.block.index()
+34        )
+35        .unwrap();
+36
+37        // Write block body.
+38        let func_body = self.func.body(db);
+39        write!(label, r#"<tr><td align="left" balign="left">"#).unwrap();
+40        for inst in func_body.order.iter_inst(self.block) {
+41            let mut inst_string = String::new();
+42            inst.pretty_print(db, &func_body.store, &mut inst_string)
+43                .unwrap();
+44            write!(label, "{}", dot2::escape_html(&inst_string)).unwrap();
+45            write!(label, "<br/>").unwrap();
+46        }
+47        write!(label, r#"</td></tr>"#).unwrap();
+48
+49        write!(label, "</table>").unwrap();
+50
+51        label::Text::HtmlStr(label.into())
+52    }
+53
+54    pub(super) fn succs(self, db: &dyn MirDb) -> Vec<BlockNode> {
+55        let func_body = self.func.body(db);
+56        let cfg = ControlFlowGraph::compute(&func_body);
+57        cfg.succs(self.block)
+58            .iter()
+59            .map(|block| Self::new(self.func, *block))
+60            .collect()
+61    }
+62}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/function.rs.html b/compiler-docs/src/fe_mir/graphviz/function.rs.html new file mode 100644 index 0000000000..5002661885 --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/function.rs.html @@ -0,0 +1,78 @@ +function.rs - source

fe_mir/graphviz/
function.rs

1use std::fmt::Write;
+2
+3use dot2::{label, Id};
+4
+5use crate::{analysis::ControlFlowGraph, db::MirDb, ir::FunctionId, pretty_print::PrettyPrint};
+6
+7use super::block::BlockNode;
+8
+9#[derive(Debug, Clone, Copy)]
+10pub(super) struct FunctionNode {
+11    pub(super) func: FunctionId,
+12}
+13
+14impl FunctionNode {
+15    pub(super) fn new(func: FunctionId) -> Self {
+16        Self { func }
+17    }
+18
+19    pub(super) fn subgraph_id(self) -> Option<Id<'static>> {
+20        dot2::Id::new(format!("cluster_{}", self.func.0)).ok()
+21    }
+22
+23    pub(super) fn label(self, db: &dyn MirDb) -> label::Text<'static> {
+24        let mut label = self.signature(db);
+25        write!(label, r#"<br/><br align="left"/>"#).unwrap();
+26
+27        // Maps local value id to local name.
+28        let body = self.func.body(db);
+29        for local in body.store.locals() {
+30            local.pretty_print(db, &body.store, &mut label).unwrap();
+31            write!(
+32                label,
+33                r#" =&gt; {}<br align="left"/>"#,
+34                body.store.local_name(*local).unwrap()
+35            )
+36            .unwrap();
+37        }
+38
+39        label::Text::HtmlStr(label.into())
+40    }
+41
+42    pub(super) fn blocks(self, db: &dyn MirDb) -> Vec<BlockNode> {
+43        let body = self.func.body(db);
+44        // We use control flow graph to collect reachable blocks.
+45        let cfg = ControlFlowGraph::compute(&body);
+46        cfg.post_order()
+47            .map(|block| BlockNode::new(self.func, block))
+48            .collect()
+49    }
+50
+51    fn signature(self, db: &dyn MirDb) -> String {
+52        let body = self.func.body(db);
+53
+54        let sig_data = self.func.signature(db);
+55        let mut sig = format!("fn {}(", self.func.debug_name(db));
+56
+57        let params = &sig_data.params;
+58        let param_len = params.len();
+59        for (i, param) in params.iter().enumerate() {
+60            let name = &param.name;
+61            let ty = param.ty;
+62            write!(&mut sig, "{name}: ").unwrap();
+63            ty.pretty_print(db, &body.store, &mut sig).unwrap();
+64            if param_len - 1 != i {
+65                write!(sig, ", ").unwrap();
+66            }
+67        }
+68        write!(sig, ")").unwrap();
+69
+70        let ret_ty = self.func.return_type(db);
+71        if let Some(ret_ty) = ret_ty {
+72            write!(sig, " -> ").unwrap();
+73            ret_ty.pretty_print(db, &body.store, &mut sig).unwrap();
+74        }
+75
+76        dot2::escape_html(&sig)
+77    }
+78}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/mod.rs.html b/compiler-docs/src/fe_mir/graphviz/mod.rs.html new file mode 100644 index 0000000000..e5a663daa8 --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/mod.rs.html @@ -0,0 +1,22 @@ +mod.rs - source

fe_mir/graphviz/
mod.rs

1use std::io;
+2
+3use fe_analyzer::namespace::items::ModuleId;
+4
+5use crate::db::MirDb;
+6
+7mod block;
+8mod function;
+9mod module;
+10
+11/// Writes mir graphs of functions in a `module`.
+12pub fn write_mir_graphs<W: io::Write>(
+13    db: &dyn MirDb,
+14    module: ModuleId,
+15    w: &mut W,
+16) -> io::Result<()> {
+17    let module_graph = module::ModuleGraph::new(db, module);
+18    dot2::render(&module_graph, w).map_err(|err| match err {
+19        dot2::Error::Io(err) => err,
+20        _ => panic!("invalid graphviz id"),
+21    })
+22}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/module.rs.html b/compiler-docs/src/fe_mir/graphviz/module.rs.html new file mode 100644 index 0000000000..a4ed39b9ba --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/module.rs.html @@ -0,0 +1,158 @@ +module.rs - source

fe_mir/graphviz/
module.rs

1use dot2::{label::Text, GraphWalk, Id, Kind, Labeller};
+2use fe_analyzer::namespace::items::ModuleId;
+3
+4use crate::{
+5    db::MirDb,
+6    ir::{inst::BranchInfo, FunctionId},
+7    pretty_print::PrettyPrint,
+8};
+9
+10use super::{block::BlockNode, function::FunctionNode};
+11
+12pub(super) struct ModuleGraph<'db> {
+13    db: &'db dyn MirDb,
+14    module: ModuleId,
+15}
+16
+17impl<'db> ModuleGraph<'db> {
+18    pub(super) fn new(db: &'db dyn MirDb, module: ModuleId) -> Self {
+19        Self { db, module }
+20    }
+21}
+22
+23impl<'db> GraphWalk<'db> for ModuleGraph<'db> {
+24    type Node = BlockNode;
+25    type Edge = ModuleGraphEdge;
+26    type Subgraph = FunctionNode;
+27
+28    fn nodes(&self) -> dot2::Nodes<'db, Self::Node> {
+29        let mut nodes = Vec::new();
+30
+31        // Collect function nodes.
+32        for func in self
+33            .db
+34            .mir_lower_module_all_functions(self.module)
+35            .iter()
+36            .map(|id| FunctionNode::new(*id))
+37        {
+38            nodes.extend(func.blocks(self.db).into_iter())
+39        }
+40
+41        nodes.into()
+42    }
+43
+44    fn edges(&self) -> dot2::Edges<'db, Self::Edge> {
+45        let mut edges = vec![];
+46        for func in self.db.mir_lower_module_all_functions(self.module).iter() {
+47            for block in FunctionNode::new(*func).blocks(self.db) {
+48                for succ in block.succs(self.db) {
+49                    let edge = ModuleGraphEdge {
+50                        from: block,
+51                        to: succ,
+52                        func: *func,
+53                    };
+54                    edges.push(edge);
+55                }
+56            }
+57        }
+58
+59        edges.into()
+60    }
+61
+62    fn source(&self, edge: &Self::Edge) -> Self::Node {
+63        edge.from
+64    }
+65
+66    fn target(&self, edge: &Self::Edge) -> Self::Node {
+67        edge.to
+68    }
+69
+70    fn subgraphs(&self) -> dot2::Subgraphs<'db, Self::Subgraph> {
+71        self.db
+72            .mir_lower_module_all_functions(self.module)
+73            .iter()
+74            .map(|id| FunctionNode::new(*id))
+75            .collect::<Vec<_>>()
+76            .into()
+77    }
+78
+79    fn subgraph_nodes(&self, s: &Self::Subgraph) -> dot2::Nodes<'db, Self::Node> {
+80        s.blocks(self.db).into_iter().collect::<Vec<_>>().into()
+81    }
+82}
+83
+84impl<'db> Labeller<'db> for ModuleGraph<'db> {
+85    type Node = BlockNode;
+86    type Edge = ModuleGraphEdge;
+87    type Subgraph = FunctionNode;
+88
+89    fn graph_id(&self) -> dot2::Result<Id<'db>> {
+90        let module_name = self.module.name(self.db.upcast());
+91        dot2::Id::new(module_name.to_string())
+92    }
+93
+94    fn node_id(&self, n: &Self::Node) -> dot2::Result<Id<'db>> {
+95        n.id()
+96    }
+97
+98    fn node_shape(&self, _n: &Self::Node) -> Option<Text<'db>> {
+99        Some(Text::LabelStr("none".into()))
+100    }
+101
+102    fn node_label(&self, n: &Self::Node) -> dot2::Result<Text<'db>> {
+103        Ok(n.label(self.db))
+104    }
+105
+106    fn edge_label<'a>(&self, e: &Self::Edge) -> Text<'db> {
+107        Text::LabelStr(e.label(self.db).into())
+108    }
+109
+110    fn subgraph_id(&self, s: &Self::Subgraph) -> Option<Id<'db>> {
+111        s.subgraph_id()
+112    }
+113
+114    fn subgraph_label(&self, s: &Self::Subgraph) -> Text<'db> {
+115        s.label(self.db)
+116    }
+117
+118    fn kind(&self) -> Kind {
+119        Kind::Digraph
+120    }
+121}
+122
+123#[derive(Debug, Clone)]
+124pub(super) struct ModuleGraphEdge {
+125    from: BlockNode,
+126    to: BlockNode,
+127    func: FunctionId,
+128}
+129
+130impl ModuleGraphEdge {
+131    fn label(&self, db: &dyn MirDb) -> String {
+132        let body = self.func.body(db);
+133        let terminator = body.order.terminator(&body.store, self.from.block).unwrap();
+134        let to = self.to.block;
+135        match body.store.branch_info(terminator) {
+136            BranchInfo::NotBranch => unreachable!(),
+137            BranchInfo::Jump(_) => String::new(),
+138            BranchInfo::Branch(_, true_bb, _) => {
+139                format! {"{}", true_bb == to}
+140            }
+141            BranchInfo::Switch(_, table, default) => {
+142                if default == Some(to) {
+143                    return "*".to_string();
+144                }
+145
+146                for (value, bb) in table.iter() {
+147                    if bb == to {
+148                        let mut s = String::new();
+149                        value.pretty_print(db, &body.store, &mut s).unwrap();
+150                        return s;
+151                    }
+152                }
+153
+154                unreachable!()
+155            }
+156        }
+157    }
+158}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/basic_block.rs.html b/compiler-docs/src/fe_mir/ir/basic_block.rs.html new file mode 100644 index 0000000000..1d18d6be66 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/basic_block.rs.html @@ -0,0 +1,6 @@ +basic_block.rs - source

fe_mir/ir/
basic_block.rs

1use id_arena::Id;
+2
+3pub type BasicBlockId = Id<BasicBlock>;
+4
+5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+6pub struct BasicBlock {}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/body_builder.rs.html b/compiler-docs/src/fe_mir/ir/body_builder.rs.html new file mode 100644 index 0000000000..a720a09181 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/body_builder.rs.html @@ -0,0 +1,381 @@ +body_builder.rs - source

fe_mir/ir/
body_builder.rs

1use fe_analyzer::namespace::items::ContractId;
+2use num_bigint::BigInt;
+3
+4use crate::ir::{
+5    body_cursor::{BodyCursor, CursorLocation},
+6    inst::{BinOp, Inst, InstKind, UnOp},
+7    value::{AssignableValue, Local},
+8    BasicBlock, BasicBlockId, FunctionBody, FunctionId, InstId, SourceInfo, TypeId,
+9};
+10
+11use super::{
+12    inst::{CallType, CastKind, SwitchTable, YulIntrinsicOp},
+13    ConstantId, Value, ValueId,
+14};
+15
+16#[derive(Debug)]
+17pub struct BodyBuilder {
+18    pub body: FunctionBody,
+19    loc: CursorLocation,
+20}
+21
+22macro_rules! impl_unary_inst {
+23    ($name:ident, $code:path) => {
+24        pub fn $name(&mut self, value: ValueId, source: SourceInfo) -> InstId {
+25            let inst = Inst::unary($code, value, source);
+26            self.insert_inst(inst)
+27        }
+28    };
+29}
+30
+31macro_rules! impl_binary_inst {
+32    ($name:ident, $code:path) => {
+33        pub fn $name(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId {
+34            let inst = Inst::binary($code, lhs, rhs, source);
+35            self.insert_inst(inst)
+36        }
+37    };
+38}
+39
+40impl BodyBuilder {
+41    pub fn new(fid: FunctionId, source: SourceInfo) -> Self {
+42        let body = FunctionBody::new(fid, source);
+43        let entry_block = body.order.entry();
+44        Self {
+45            body,
+46            loc: CursorLocation::BlockTop(entry_block),
+47        }
+48    }
+49
+50    pub fn build(self) -> FunctionBody {
+51        self.body
+52    }
+53
+54    pub fn func_id(&self) -> FunctionId {
+55        self.body.fid
+56    }
+57
+58    pub fn make_block(&mut self) -> BasicBlockId {
+59        let block = BasicBlock {};
+60        let block_id = self.body.store.store_block(block);
+61        self.body.order.append_block(block_id);
+62        block_id
+63    }
+64
+65    pub fn make_value(&mut self, value: impl Into<Value>) -> ValueId {
+66        self.body.store.store_value(value.into())
+67    }
+68
+69    pub fn map_result(&mut self, inst: InstId, result: AssignableValue) {
+70        self.body.store.map_result(inst, result)
+71    }
+72
+73    pub fn inst_result(&mut self, inst: InstId) -> Option<&AssignableValue> {
+74        self.body.store.inst_result(inst)
+75    }
+76
+77    pub fn move_to_block(&mut self, block: BasicBlockId) {
+78        self.loc = CursorLocation::BlockBottom(block)
+79    }
+80
+81    pub fn move_to_block_top(&mut self, block: BasicBlockId) {
+82        self.loc = CursorLocation::BlockTop(block)
+83    }
+84
+85    pub fn make_unit(&mut self, unit_ty: TypeId) -> ValueId {
+86        self.body.store.store_value(Value::Unit { ty: unit_ty })
+87    }
+88
+89    pub fn make_imm(&mut self, imm: BigInt, ty: TypeId) -> ValueId {
+90        self.body.store.store_value(Value::Immediate { imm, ty })
+91    }
+92
+93    pub fn make_imm_from_bool(&mut self, imm: bool, ty: TypeId) -> ValueId {
+94        if imm {
+95            self.make_imm(1u8.into(), ty)
+96        } else {
+97            self.make_imm(0u8.into(), ty)
+98        }
+99    }
+100
+101    pub fn make_constant(&mut self, constant: ConstantId, ty: TypeId) -> ValueId {
+102        self.body
+103            .store
+104            .store_value(Value::Constant { constant, ty })
+105    }
+106
+107    pub fn declare(&mut self, local: Local) -> ValueId {
+108        let source = local.source.clone();
+109        let local_id = self.body.store.store_value(Value::Local(local));
+110
+111        let kind = InstKind::Declare { local: local_id };
+112        let inst = Inst::new(kind, source);
+113        self.insert_inst(inst);
+114        local_id
+115    }
+116
+117    pub fn store_func_arg(&mut self, local: Local) -> ValueId {
+118        self.body.store.store_value(Value::Local(local))
+119    }
+120
+121    impl_unary_inst!(not, UnOp::Not);
+122    impl_unary_inst!(neg, UnOp::Neg);
+123    impl_unary_inst!(inv, UnOp::Inv);
+124
+125    impl_binary_inst!(add, BinOp::Add);
+126    impl_binary_inst!(sub, BinOp::Sub);
+127    impl_binary_inst!(mul, BinOp::Mul);
+128    impl_binary_inst!(div, BinOp::Div);
+129    impl_binary_inst!(modulo, BinOp::Mod);
+130    impl_binary_inst!(pow, BinOp::Pow);
+131    impl_binary_inst!(shl, BinOp::Shl);
+132    impl_binary_inst!(shr, BinOp::Shr);
+133    impl_binary_inst!(bit_or, BinOp::BitOr);
+134    impl_binary_inst!(bit_xor, BinOp::BitXor);
+135    impl_binary_inst!(bit_and, BinOp::BitAnd);
+136    impl_binary_inst!(logical_and, BinOp::LogicalAnd);
+137    impl_binary_inst!(logical_or, BinOp::LogicalOr);
+138    impl_binary_inst!(eq, BinOp::Eq);
+139    impl_binary_inst!(ne, BinOp::Ne);
+140    impl_binary_inst!(ge, BinOp::Ge);
+141    impl_binary_inst!(gt, BinOp::Gt);
+142    impl_binary_inst!(le, BinOp::Le);
+143    impl_binary_inst!(lt, BinOp::Lt);
+144
+145    pub fn primitive_cast(
+146        &mut self,
+147        value: ValueId,
+148        result_ty: TypeId,
+149        source: SourceInfo,
+150    ) -> InstId {
+151        let kind = InstKind::Cast {
+152            kind: CastKind::Primitive,
+153            value,
+154            to: result_ty,
+155        };
+156        let inst = Inst::new(kind, source);
+157        self.insert_inst(inst)
+158    }
+159
+160    pub fn untag_cast(&mut self, value: ValueId, result_ty: TypeId, source: SourceInfo) -> InstId {
+161        let kind = InstKind::Cast {
+162            kind: CastKind::Untag,
+163            value,
+164            to: result_ty,
+165        };
+166        let inst = Inst::new(kind, source);
+167        self.insert_inst(inst)
+168    }
+169
+170    pub fn aggregate_construct(
+171        &mut self,
+172        ty: TypeId,
+173        args: Vec<ValueId>,
+174        source: SourceInfo,
+175    ) -> InstId {
+176        let kind = InstKind::AggregateConstruct { ty, args };
+177        let inst = Inst::new(kind, source);
+178        self.insert_inst(inst)
+179    }
+180
+181    pub fn bind(&mut self, src: ValueId, source: SourceInfo) -> InstId {
+182        let kind = InstKind::Bind { src };
+183        let inst = Inst::new(kind, source);
+184        self.insert_inst(inst)
+185    }
+186
+187    pub fn mem_copy(&mut self, src: ValueId, source: SourceInfo) -> InstId {
+188        let kind = InstKind::MemCopy { src };
+189        let inst = Inst::new(kind, source);
+190        self.insert_inst(inst)
+191    }
+192
+193    pub fn load(&mut self, src: ValueId, source: SourceInfo) -> InstId {
+194        let kind = InstKind::Load { src };
+195        let inst = Inst::new(kind, source);
+196        self.insert_inst(inst)
+197    }
+198
+199    pub fn aggregate_access(
+200        &mut self,
+201        value: ValueId,
+202        indices: Vec<ValueId>,
+203        source: SourceInfo,
+204    ) -> InstId {
+205        let kind = InstKind::AggregateAccess { value, indices };
+206        let inst = Inst::new(kind, source);
+207        self.insert_inst(inst)
+208    }
+209
+210    pub fn map_access(&mut self, value: ValueId, key: ValueId, source: SourceInfo) -> InstId {
+211        let kind = InstKind::MapAccess { value, key };
+212        let inst = Inst::new(kind, source);
+213        self.insert_inst(inst)
+214    }
+215
+216    pub fn call(
+217        &mut self,
+218        func: FunctionId,
+219        args: Vec<ValueId>,
+220        call_type: CallType,
+221        source: SourceInfo,
+222    ) -> InstId {
+223        let kind = InstKind::Call {
+224            func,
+225            args,
+226            call_type,
+227        };
+228        let inst = Inst::new(kind, source);
+229        self.insert_inst(inst)
+230    }
+231
+232    pub fn keccak256(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+233        let kind = InstKind::Keccak256 { arg };
+234        let inst = Inst::new(kind, source);
+235        self.insert_inst(inst)
+236    }
+237
+238    pub fn abi_encode(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+239        let kind = InstKind::AbiEncode { arg };
+240        let inst = Inst::new(kind, source);
+241        self.insert_inst(inst)
+242    }
+243
+244    pub fn create(&mut self, value: ValueId, contract: ContractId, source: SourceInfo) -> InstId {
+245        let kind = InstKind::Create { value, contract };
+246        let inst = Inst::new(kind, source);
+247        self.insert_inst(inst)
+248    }
+249
+250    pub fn create2(
+251        &mut self,
+252        value: ValueId,
+253        salt: ValueId,
+254        contract: ContractId,
+255        source: SourceInfo,
+256    ) -> InstId {
+257        let kind = InstKind::Create2 {
+258            value,
+259            salt,
+260            contract,
+261        };
+262        let inst = Inst::new(kind, source);
+263        self.insert_inst(inst)
+264    }
+265
+266    pub fn yul_intrinsic(
+267        &mut self,
+268        op: YulIntrinsicOp,
+269        args: Vec<ValueId>,
+270        source: SourceInfo,
+271    ) -> InstId {
+272        let inst = Inst::intrinsic(op, args, source);
+273        self.insert_inst(inst)
+274    }
+275
+276    pub fn jump(&mut self, dest: BasicBlockId, source: SourceInfo) -> InstId {
+277        let kind = InstKind::Jump { dest };
+278        let inst = Inst::new(kind, source);
+279        self.insert_inst(inst)
+280    }
+281
+282    pub fn branch(
+283        &mut self,
+284        cond: ValueId,
+285        then: BasicBlockId,
+286        else_: BasicBlockId,
+287        source: SourceInfo,
+288    ) -> InstId {
+289        let kind = InstKind::Branch { cond, then, else_ };
+290        let inst = Inst::new(kind, source);
+291        self.insert_inst(inst)
+292    }
+293
+294    pub fn switch(
+295        &mut self,
+296        disc: ValueId,
+297        table: SwitchTable,
+298        default: Option<BasicBlockId>,
+299        source: SourceInfo,
+300    ) -> InstId {
+301        let kind = InstKind::Switch {
+302            disc,
+303            table,
+304            default,
+305        };
+306        let inst = Inst::new(kind, source);
+307        self.insert_inst(inst)
+308    }
+309
+310    pub fn revert(&mut self, arg: Option<ValueId>, source: SourceInfo) -> InstId {
+311        let kind = InstKind::Revert { arg };
+312        let inst = Inst::new(kind, source);
+313        self.insert_inst(inst)
+314    }
+315
+316    pub fn emit(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+317        let kind = InstKind::Emit { arg };
+318        let inst = Inst::new(kind, source);
+319        self.insert_inst(inst)
+320    }
+321
+322    pub fn ret(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+323        let kind = InstKind::Return { arg: arg.into() };
+324        let inst = Inst::new(kind, source);
+325        self.insert_inst(inst)
+326    }
+327
+328    pub fn nop(&mut self, source: SourceInfo) -> InstId {
+329        let kind = InstKind::Nop;
+330        let inst = Inst::new(kind, source);
+331        self.insert_inst(inst)
+332    }
+333
+334    pub fn value_ty(&mut self, value: ValueId) -> TypeId {
+335        self.body.store.value_ty(value)
+336    }
+337
+338    pub fn value_data(&mut self, value: ValueId) -> &Value {
+339        self.body.store.value_data(value)
+340    }
+341
+342    /// Returns `true` if current block is terminated.
+343    pub fn is_block_terminated(&mut self, block: BasicBlockId) -> bool {
+344        self.body.order.is_terminated(&self.body.store, block)
+345    }
+346
+347    pub fn is_current_block_terminated(&mut self) -> bool {
+348        let current_block = self.current_block();
+349        self.is_block_terminated(current_block)
+350    }
+351
+352    pub fn current_block(&mut self) -> BasicBlockId {
+353        self.cursor().expect_block()
+354    }
+355
+356    pub fn remove_inst(&mut self, inst: InstId) {
+357        let mut cursor = BodyCursor::new(&mut self.body, CursorLocation::Inst(inst));
+358        if self.loc == cursor.loc() {
+359            self.loc = cursor.prev_loc();
+360        }
+361        cursor.remove_inst();
+362    }
+363
+364    pub fn inst_data(&self, inst: InstId) -> &Inst {
+365        self.body.store.inst_data(inst)
+366    }
+367
+368    fn insert_inst(&mut self, inst: Inst) -> InstId {
+369        let mut cursor = self.cursor();
+370        let inst_id = cursor.store_and_insert_inst(inst);
+371
+372        // Set cursor to the new inst.
+373        self.loc = CursorLocation::Inst(inst_id);
+374
+375        inst_id
+376    }
+377
+378    fn cursor(&mut self) -> BodyCursor {
+379        BodyCursor::new(&mut self.body, self.loc)
+380    }
+381}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/body_cursor.rs.html b/compiler-docs/src/fe_mir/ir/body_cursor.rs.html new file mode 100644 index 0000000000..695e29c678 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/body_cursor.rs.html @@ -0,0 +1,231 @@ +body_cursor.rs - source

fe_mir/ir/
body_cursor.rs

1//! This module provides a collection of structs to modify function body
+2//! in-place.
+3// The design used here is greatly inspired by [`cranelift`](https://crates.io/crates/cranelift)
+4
+5use super::{
+6    value::AssignableValue, BasicBlock, BasicBlockId, FunctionBody, Inst, InstId, ValueId,
+7};
+8
+9/// Specify a current location of [`BodyCursor`]
+10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+11pub enum CursorLocation {
+12    Inst(InstId),
+13    BlockTop(BasicBlockId),
+14    BlockBottom(BasicBlockId),
+15    NoWhere,
+16}
+17
+18pub struct BodyCursor<'a> {
+19    body: &'a mut FunctionBody,
+20    loc: CursorLocation,
+21}
+22
+23impl<'a> BodyCursor<'a> {
+24    pub fn new(body: &'a mut FunctionBody, loc: CursorLocation) -> Self {
+25        Self { body, loc }
+26    }
+27
+28    pub fn new_at_entry(body: &'a mut FunctionBody) -> Self {
+29        let entry = body.order.entry();
+30        Self {
+31            body,
+32            loc: CursorLocation::BlockTop(entry),
+33        }
+34    }
+35    pub fn set_loc(&mut self, loc: CursorLocation) {
+36        self.loc = loc;
+37    }
+38
+39    pub fn loc(&self) -> CursorLocation {
+40        self.loc
+41    }
+42
+43    pub fn next_loc(&self) -> CursorLocation {
+44        match self.loc() {
+45            CursorLocation::Inst(inst) => self.body.order.next_inst(inst).map_or_else(
+46                || CursorLocation::BlockBottom(self.body.order.inst_block(inst)),
+47                CursorLocation::Inst,
+48            ),
+49            CursorLocation::BlockTop(block) => self
+50                .body
+51                .order
+52                .first_inst(block)
+53                .map_or_else(|| CursorLocation::BlockBottom(block), CursorLocation::Inst),
+54            CursorLocation::BlockBottom(block) => self
+55                .body()
+56                .order
+57                .next_block(block)
+58                .map_or(CursorLocation::NoWhere, |next_block| {
+59                    CursorLocation::BlockTop(next_block)
+60                }),
+61            CursorLocation::NoWhere => CursorLocation::NoWhere,
+62        }
+63    }
+64
+65    pub fn prev_loc(&self) -> CursorLocation {
+66        match self.loc() {
+67            CursorLocation::Inst(inst) => self.body.order.prev_inst(inst).map_or_else(
+68                || CursorLocation::BlockTop(self.body.order.inst_block(inst)),
+69                CursorLocation::Inst,
+70            ),
+71            CursorLocation::BlockTop(block) => self
+72                .body
+73                .order
+74                .prev_block(block)
+75                .map_or(CursorLocation::NoWhere, |prev_block| {
+76                    CursorLocation::BlockBottom(prev_block)
+77                }),
+78            CursorLocation::BlockBottom(block) => self
+79                .body
+80                .order
+81                .last_inst(block)
+82                .map_or_else(|| CursorLocation::BlockTop(block), CursorLocation::Inst),
+83            CursorLocation::NoWhere => CursorLocation::NoWhere,
+84        }
+85    }
+86
+87    pub fn next_block(&self) -> Option<BasicBlockId> {
+88        let block = self.expect_block();
+89        self.body.order.next_block(block)
+90    }
+91
+92    pub fn prev_block(&self) -> Option<BasicBlockId> {
+93        let block = self.expect_block();
+94        self.body.order.prev_block(block)
+95    }
+96
+97    pub fn proceed(&mut self) {
+98        self.set_loc(self.next_loc())
+99    }
+100
+101    pub fn back(&mut self) {
+102        self.set_loc(self.prev_loc());
+103    }
+104
+105    pub fn body(&self) -> &FunctionBody {
+106        self.body
+107    }
+108
+109    pub fn body_mut(&mut self) -> &mut FunctionBody {
+110        self.body
+111    }
+112
+113    /// Sets a cursor to an entry block.
+114    pub fn set_to_entry(&mut self) {
+115        let entry_bb = self.body().order.entry();
+116        let loc = CursorLocation::BlockTop(entry_bb);
+117        self.set_loc(loc);
+118    }
+119
+120    /// Insert [`InstId`] to a location where a cursor points.
+121    /// If you need to store and insert [`Inst`], use [`store_and_insert_inst`].
+122    ///
+123    /// # Panics
+124    /// Panics if a cursor points [`CursorLocation::NoWhere`].
+125    pub fn insert_inst(&mut self, inst: InstId) {
+126        match self.loc() {
+127            CursorLocation::Inst(at) => self.body.order.insert_inst_after(inst, at),
+128            CursorLocation::BlockTop(block) => self.body.order.prepend_inst(inst, block),
+129            CursorLocation::BlockBottom(block) => self.body.order.append_inst(inst, block),
+130            CursorLocation::NoWhere => panic!("cursor loc points to `NoWhere`"),
+131        }
+132    }
+133
+134    pub fn store_and_insert_inst(&mut self, data: Inst) -> InstId {
+135        let inst = self.body.store.store_inst(data);
+136        self.insert_inst(inst);
+137        inst
+138    }
+139
+140    /// Remove a current pointed [`Inst`] from a function body. A cursor
+141    /// proceeds to a next inst.
+142    ///
+143    /// # Panics
+144    /// Panics if a cursor doesn't point [`CursorLocation::Inst`].
+145    pub fn remove_inst(&mut self) {
+146        let inst = self.expect_inst();
+147        let next_loc = self.next_loc();
+148        self.body.order.remove_inst(inst);
+149        self.set_loc(next_loc);
+150    }
+151
+152    /// Remove a current pointed `block` and contained insts from a function
+153    /// body. A cursor proceeds to a next block.
+154    ///
+155    /// # Panics
+156    /// Panics if a cursor doesn't point [`CursorLocation::Inst`].
+157    pub fn remove_block(&mut self) {
+158        let block = match self.loc() {
+159            CursorLocation::Inst(inst) => self.body.order.inst_block(inst),
+160            CursorLocation::BlockTop(block) | CursorLocation::BlockBottom(block) => block,
+161            CursorLocation::NoWhere => panic!("cursor loc points `NoWhere`"),
+162        };
+163
+164        // Store next block of the current block for later use.
+165        let next_block = self.body.order.next_block(block);
+166
+167        // Remove all insts in the current block.
+168        if let Some(first_inst) = self.body.order.first_inst(block) {
+169            self.set_loc(CursorLocation::Inst(first_inst));
+170            while matches!(self.loc(), CursorLocation::Inst(..)) {
+171                self.remove_inst();
+172            }
+173        }
+174        // Remove current block.
+175        self.body.order.remove_block(block);
+176
+177        // Set cursor location to next block if exists.
+178        if let Some(next_block) = next_block {
+179            self.set_loc(CursorLocation::BlockTop(next_block))
+180        } else {
+181            self.set_loc(CursorLocation::NoWhere)
+182        }
+183    }
+184
+185    /// Insert [`BasicBlockId`] to a location where a cursor points.
+186    /// If you need to store and insert [`BasicBlock`], use
+187    /// [`store_and_insert_block`].
+188    ///
+189    /// # Panics
+190    /// Panics if a cursor points [`CursorLocation::NoWhere`].
+191    pub fn insert_block(&mut self, block: BasicBlockId) {
+192        let current = self.expect_block();
+193        self.body.order.insert_block_after_block(block, current)
+194    }
+195
+196    pub fn store_and_insert_block(&mut self, block: BasicBlock) -> BasicBlockId {
+197        let block_id = self.body.store.store_block(block);
+198        self.insert_block(block_id);
+199        block_id
+200    }
+201
+202    pub fn map_result(&mut self, result: AssignableValue) -> Option<ValueId> {
+203        let inst = self.expect_inst();
+204        let result_value = result.value_id();
+205        self.body.store.map_result(inst, result);
+206        result_value
+207    }
+208
+209    /// Returns current inst that cursor points.
+210    ///
+211    /// # Panics
+212    /// Panics if a cursor doesn't point [`CursorLocation::Inst`].
+213    pub fn expect_inst(&self) -> InstId {
+214        match self.loc {
+215            CursorLocation::Inst(inst) => inst,
+216            _ => panic!("Cursor doesn't point any inst."),
+217        }
+218    }
+219
+220    /// Returns current block that cursor points.
+221    ///
+222    /// # Panics
+223    /// Panics if a cursor points [`CursorLocation::NoWhere`].
+224    pub fn expect_block(&self) -> BasicBlockId {
+225        match self.loc {
+226            CursorLocation::Inst(inst) => self.body.order.inst_block(inst),
+227            CursorLocation::BlockTop(block) | CursorLocation::BlockBottom(block) => block,
+228            CursorLocation::NoWhere => panic!("cursor loc points `NoWhere`"),
+229        }
+230    }
+231}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/body_order.rs.html b/compiler-docs/src/fe_mir/ir/body_order.rs.html new file mode 100644 index 0000000000..e9a538b3a1 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/body_order.rs.html @@ -0,0 +1,473 @@ +body_order.rs - source

fe_mir/ir/
body_order.rs

1use fxhash::FxHashMap;
+2
+3use super::{basic_block::BasicBlockId, function::BodyDataStore, inst::InstId};
+4
+5#[derive(Debug, Clone, PartialEq, Eq)]
+6/// Represents basic block order and instruction order.
+7pub struct BodyOrder {
+8    blocks: FxHashMap<BasicBlockId, BlockNode>,
+9    insts: FxHashMap<InstId, InstNode>,
+10    entry_block: BasicBlockId,
+11    last_block: BasicBlockId,
+12}
+13impl BodyOrder {
+14    pub fn new(entry_block: BasicBlockId) -> Self {
+15        let entry_block_node = BlockNode::default();
+16        let mut blocks = FxHashMap::default();
+17        blocks.insert(entry_block, entry_block_node);
+18
+19        Self {
+20            blocks,
+21            insts: FxHashMap::default(),
+22            entry_block,
+23            last_block: entry_block,
+24        }
+25    }
+26
+27    /// Returns an entry block of a function body.
+28    pub fn entry(&self) -> BasicBlockId {
+29        self.entry_block
+30    }
+31
+32    /// Returns a last block of a function body.
+33    pub fn last_block(&self) -> BasicBlockId {
+34        self.last_block
+35    }
+36
+37    /// Returns `true` if a block doesn't contain any block.
+38    pub fn is_block_empty(&self, block: BasicBlockId) -> bool {
+39        self.first_inst(block).is_none()
+40    }
+41
+42    /// Returns `true` if a function body contains a given `block`.
+43    pub fn is_block_inserted(&self, block: BasicBlockId) -> bool {
+44        self.blocks.contains_key(&block)
+45    }
+46
+47    /// Returns a number of block in a function.
+48    pub fn block_num(&self) -> usize {
+49        self.blocks.len()
+50    }
+51
+52    /// Returns a previous block of a given block.
+53    ///
+54    /// # Panics
+55    /// Panics if `block` is not inserted yet.
+56    pub fn prev_block(&self, block: BasicBlockId) -> Option<BasicBlockId> {
+57        self.blocks[&block].prev
+58    }
+59
+60    /// Returns a next block of a given block.
+61    ///
+62    /// # Panics
+63    /// Panics if `block` is not inserted yet.
+64    pub fn next_block(&self, block: BasicBlockId) -> Option<BasicBlockId> {
+65        self.blocks[&block].next
+66    }
+67
+68    /// Returns `true` is a given `inst` is inserted.
+69    pub fn is_inst_inserted(&self, inst: InstId) -> bool {
+70        self.insts.contains_key(&inst)
+71    }
+72
+73    /// Returns first instruction of a block if exists.
+74    ///
+75    /// # Panics
+76    /// Panics if `block` is not inserted yet.
+77    pub fn first_inst(&self, block: BasicBlockId) -> Option<InstId> {
+78        self.blocks[&block].first_inst
+79    }
+80
+81    /// Returns a terminator instruction of a block.
+82    ///
+83    /// # Panics
+84    /// Panics if
+85    /// 1. `block` is not inserted yet.
+86    pub fn terminator(&self, store: &BodyDataStore, block: BasicBlockId) -> Option<InstId> {
+87        let last_inst = self.last_inst(block)?;
+88        if store.is_terminator(last_inst) {
+89            Some(last_inst)
+90        } else {
+91            None
+92        }
+93    }
+94
+95    /// Returns `true` if a `block` is terminated.
+96    pub fn is_terminated(&self, store: &BodyDataStore, block: BasicBlockId) -> bool {
+97        self.terminator(store, block).is_some()
+98    }
+99
+100    /// Returns a last instruction of a block.
+101    ///
+102    /// # Panics
+103    /// Panics if `block` is not inserted yet.
+104    pub fn last_inst(&self, block: BasicBlockId) -> Option<InstId> {
+105        self.blocks[&block].last_inst
+106    }
+107
+108    /// Returns a previous instruction of a given `inst`.
+109    ///
+110    /// # Panics
+111    /// Panics if `inst` is not inserted yet.
+112    pub fn prev_inst(&self, inst: InstId) -> Option<InstId> {
+113        self.insts[&inst].prev
+114    }
+115
+116    /// Returns a next instruction of a given `inst`.
+117    ///
+118    /// # Panics
+119    /// Panics if `inst` is not inserted yet.
+120    pub fn next_inst(&self, inst: InstId) -> Option<InstId> {
+121        self.insts[&inst].next
+122    }
+123
+124    /// Returns a block to which a given `inst` belongs.
+125    ///
+126    /// # Panics
+127    /// Panics if `inst` is not inserted yet.
+128    pub fn inst_block(&self, inst: InstId) -> BasicBlockId {
+129        self.insts[&inst].block
+130    }
+131
+132    /// Returns an iterator which iterates all basic blocks in a function body
+133    /// in pre-order.
+134    pub fn iter_block(&self) -> impl Iterator<Item = BasicBlockId> + '_ {
+135        BlockIter {
+136            next: Some(self.entry_block),
+137            blocks: &self.blocks,
+138        }
+139    }
+140
+141    /// Returns an iterator which iterates all instruction in a given `block` in
+142    /// pre-order.
+143    ///
+144    /// # Panics
+145    /// Panics if `block` is not inserted yet.
+146    pub fn iter_inst(&self, block: BasicBlockId) -> impl Iterator<Item = InstId> + '_ {
+147        InstIter {
+148            next: self.blocks[&block].first_inst,
+149            insts: &self.insts,
+150        }
+151    }
+152
+153    /// Appends a given `block` to a function body.
+154    ///
+155    /// # Panics
+156    /// Panics if a given `block` is already inserted to a function.
+157    pub fn append_block(&mut self, block: BasicBlockId) {
+158        debug_assert!(!self.is_block_inserted(block));
+159
+160        let mut block_node = BlockNode::default();
+161        let last_block = self.last_block;
+162        let last_block_node = &mut self.block_mut(last_block);
+163        last_block_node.next = Some(block);
+164        block_node.prev = Some(last_block);
+165
+166        self.blocks.insert(block, block_node);
+167        self.last_block = block;
+168    }
+169
+170    /// Inserts a given `block` before a `before` block.
+171    ///
+172    /// # Panics
+173    /// Panics if
+174    /// 1. a given `block` is already inserted.
+175    /// 2. a given `before` block is NOTE inserted yet.
+176    pub fn insert_block_before_block(&mut self, block: BasicBlockId, before: BasicBlockId) {
+177        debug_assert!(self.is_block_inserted(before));
+178        debug_assert!(!self.is_block_inserted(block));
+179
+180        let mut block_node = BlockNode::default();
+181
+182        match self.blocks[&before].prev {
+183            Some(prev) => {
+184                block_node.prev = Some(prev);
+185                self.block_mut(prev).next = Some(block);
+186            }
+187            None => self.entry_block = block,
+188        }
+189
+190        block_node.next = Some(before);
+191        self.block_mut(before).prev = Some(block);
+192        self.blocks.insert(block, block_node);
+193    }
+194
+195    /// Inserts a given `block` after a `after` block.
+196    ///
+197    /// # Panics
+198    /// Panics if
+199    /// 1. a given `block` is already inserted.
+200    /// 2. a given `after` block is NOTE inserted yet.
+201    pub fn insert_block_after_block(&mut self, block: BasicBlockId, after: BasicBlockId) {
+202        debug_assert!(self.is_block_inserted(after));
+203        debug_assert!(!self.is_block_inserted(block));
+204
+205        let mut block_node = BlockNode::default();
+206
+207        match self.blocks[&after].next {
+208            Some(next) => {
+209                block_node.next = Some(next);
+210                self.block_mut(next).prev = Some(block);
+211            }
+212            None => self.last_block = block,
+213        }
+214        block_node.prev = Some(after);
+215        self.block_mut(after).next = Some(block);
+216        self.blocks.insert(block, block_node);
+217    }
+218
+219    /// Remove a given `block` from a function. All instructions in a block are
+220    /// also removed.
+221    ///
+222    /// # Panics
+223    /// Panics if
+224    /// 1. a given `block` is NOT inserted.
+225    /// 2. a `block` is the last one block in a function.
+226    pub fn remove_block(&mut self, block: BasicBlockId) {
+227        debug_assert!(self.is_block_inserted(block));
+228        debug_assert!(self.block_num() > 1);
+229
+230        // Remove all insts in a `block`.
+231        let mut next_inst = self.first_inst(block);
+232        while let Some(inst) = next_inst {
+233            next_inst = self.next_inst(inst);
+234            self.remove_inst(inst);
+235        }
+236
+237        // Remove `block`.
+238        let block_node = &self.blocks[&block];
+239        let prev_block = block_node.prev;
+240        let next_block = block_node.next;
+241        match (prev_block, next_block) {
+242            // `block` is in the middle of a function.
+243            (Some(prev), Some(next)) => {
+244                self.block_mut(prev).next = Some(next);
+245                self.block_mut(next).prev = Some(prev);
+246            }
+247            // `block` is the last block of a function.
+248            (Some(prev), None) => {
+249                self.block_mut(prev).next = None;
+250                self.last_block = prev;
+251            }
+252            // `block` is the first block of a function.
+253            (None, Some(next)) => {
+254                self.block_mut(next).prev = None;
+255                self.entry_block = next
+256            }
+257            (None, None) => {
+258                unreachable!()
+259            }
+260        }
+261
+262        self.blocks.remove(&block);
+263    }
+264
+265    /// Appends `inst` to the end of a `block`
+266    ///
+267    /// # Panics
+268    /// Panics if
+269    /// 1. a given `block` is NOT inserted.
+270    /// 2. a given `inst` is already inserted.
+271    pub fn append_inst(&mut self, inst: InstId, block: BasicBlockId) {
+272        debug_assert!(self.is_block_inserted(block));
+273        debug_assert!(!self.is_inst_inserted(inst));
+274
+275        let mut inst_node = InstNode::new(block);
+276
+277        if let Some(last_inst) = self.blocks[&block].last_inst {
+278            inst_node.prev = Some(last_inst);
+279            self.inst_mut(last_inst).next = Some(inst);
+280        } else {
+281            self.block_mut(block).first_inst = Some(inst);
+282        }
+283
+284        self.block_mut(block).last_inst = Some(inst);
+285        self.insts.insert(inst, inst_node);
+286    }
+287
+288    /// Prepends `inst` to the beginning of a `block`
+289    ///
+290    /// # Panics
+291    /// Panics if
+292    /// 1. a given `block` is NOT inserted.
+293    /// 2. a given `inst` is already inserted.
+294    pub fn prepend_inst(&mut self, inst: InstId, block: BasicBlockId) {
+295        debug_assert!(self.is_block_inserted(block));
+296        debug_assert!(!self.is_inst_inserted(inst));
+297
+298        let mut inst_node = InstNode::new(block);
+299
+300        if let Some(first_inst) = self.blocks[&block].first_inst {
+301            inst_node.next = Some(first_inst);
+302            self.inst_mut(first_inst).prev = Some(inst);
+303        } else {
+304            self.block_mut(block).last_inst = Some(inst);
+305        }
+306
+307        self.block_mut(block).first_inst = Some(inst);
+308        self.insts.insert(inst, inst_node);
+309    }
+310
+311    /// Insert `inst` before `before` inst.
+312    ///
+313    /// # Panics
+314    /// Panics if
+315    /// 1. a given `before` is NOT inserted.
+316    /// 2. a given `inst` is already inserted.
+317    pub fn insert_inst_before_inst(&mut self, inst: InstId, before: InstId) {
+318        debug_assert!(self.is_inst_inserted(before));
+319        debug_assert!(!self.is_inst_inserted(inst));
+320
+321        let before_inst_node = &self.insts[&before];
+322        let block = before_inst_node.block;
+323        let mut inst_node = InstNode::new(block);
+324
+325        match before_inst_node.prev {
+326            Some(prev) => {
+327                inst_node.prev = Some(prev);
+328                self.inst_mut(prev).next = Some(inst);
+329            }
+330            None => self.block_mut(block).first_inst = Some(inst),
+331        }
+332        inst_node.next = Some(before);
+333        self.inst_mut(before).prev = Some(inst);
+334        self.insts.insert(inst, inst_node);
+335    }
+336
+337    /// Insert `inst` after `after` inst.
+338    ///
+339    /// # Panics
+340    /// Panics if
+341    /// 1. a given `after` is NOT inserted.
+342    /// 2. a given `inst` is already inserted.
+343    pub fn insert_inst_after(&mut self, inst: InstId, after: InstId) {
+344        debug_assert!(self.is_inst_inserted(after));
+345        debug_assert!(!self.is_inst_inserted(inst));
+346
+347        let after_inst_node = &self.insts[&after];
+348        let block = after_inst_node.block;
+349        let mut inst_node = InstNode::new(block);
+350
+351        match after_inst_node.next {
+352            Some(next) => {
+353                inst_node.next = Some(next);
+354                self.inst_mut(next).prev = Some(inst);
+355            }
+356            None => self.block_mut(block).last_inst = Some(inst),
+357        }
+358        inst_node.prev = Some(after);
+359        self.inst_mut(after).next = Some(inst);
+360        self.insts.insert(inst, inst_node);
+361    }
+362
+363    /// Remove instruction from the function body.
+364    ///
+365    /// # Panics
+366    /// Panics if a given `inst` is not inserted.
+367    pub fn remove_inst(&mut self, inst: InstId) {
+368        debug_assert!(self.is_inst_inserted(inst));
+369
+370        let inst_node = &self.insts[&inst];
+371        let inst_block = inst_node.block;
+372        let prev_inst = inst_node.prev;
+373        let next_inst = inst_node.next;
+374        match (prev_inst, next_inst) {
+375            (Some(prev), Some(next)) => {
+376                self.inst_mut(prev).next = Some(next);
+377                self.inst_mut(next).prev = Some(prev);
+378            }
+379            (Some(prev), None) => {
+380                self.inst_mut(prev).next = None;
+381                self.block_mut(inst_block).last_inst = Some(prev);
+382            }
+383            (None, Some(next)) => {
+384                self.inst_mut(next).prev = None;
+385                self.block_mut(inst_block).first_inst = Some(next);
+386            }
+387            (None, None) => {
+388                let block_node = self.block_mut(inst_block);
+389                block_node.first_inst = None;
+390                block_node.last_inst = None;
+391            }
+392        }
+393
+394        self.insts.remove(&inst);
+395    }
+396
+397    fn block_mut(&mut self, block: BasicBlockId) -> &mut BlockNode {
+398        self.blocks.get_mut(&block).unwrap()
+399    }
+400
+401    fn inst_mut(&mut self, inst: InstId) -> &mut InstNode {
+402        self.insts.get_mut(&inst).unwrap()
+403    }
+404}
+405
+406struct BlockIter<'a> {
+407    next: Option<BasicBlockId>,
+408    blocks: &'a FxHashMap<BasicBlockId, BlockNode>,
+409}
+410
+411impl<'a> Iterator for BlockIter<'a> {
+412    type Item = BasicBlockId;
+413
+414    fn next(&mut self) -> Option<BasicBlockId> {
+415        let next = self.next?;
+416        self.next = self.blocks[&next].next;
+417        Some(next)
+418    }
+419}
+420
+421struct InstIter<'a> {
+422    next: Option<InstId>,
+423    insts: &'a FxHashMap<InstId, InstNode>,
+424}
+425
+426impl<'a> Iterator for InstIter<'a> {
+427    type Item = InstId;
+428
+429    fn next(&mut self) -> Option<InstId> {
+430        let next = self.next?;
+431        self.next = self.insts[&next].next;
+432        Some(next)
+433    }
+434}
+435
+436#[derive(Default, Debug, Clone, PartialEq, Eq)]
+437/// A helper struct to track a basic block order in a function body.
+438struct BlockNode {
+439    /// A previous block.
+440    prev: Option<BasicBlockId>,
+441
+442    /// A next block.
+443    next: Option<BasicBlockId>,
+444
+445    /// A first instruction of a block.
+446    first_inst: Option<InstId>,
+447
+448    /// A last instruction of a block.
+449    last_inst: Option<InstId>,
+450}
+451
+452#[derive(Debug, Clone, PartialEq, Eq)]
+453/// A helper struct to track a instruction order in a basic block.
+454struct InstNode {
+455    /// An block to which a inst belongs.
+456    block: BasicBlockId,
+457
+458    /// A previous instruction.
+459    prev: Option<InstId>,
+460
+461    /// A next instruction.
+462    next: Option<InstId>,
+463}
+464
+465impl InstNode {
+466    fn new(block: BasicBlockId) -> Self {
+467        Self {
+468            block,
+469            prev: None,
+470            next: None,
+471        }
+472    }
+473}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/constant.rs.html b/compiler-docs/src/fe_mir/ir/constant.rs.html new file mode 100644 index 0000000000..5af6083245 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/constant.rs.html @@ -0,0 +1,47 @@ +constant.rs - source

fe_mir/ir/
constant.rs

1use fe_common::impl_intern_key;
+2use num_bigint::BigInt;
+3use smol_str::SmolStr;
+4
+5use fe_analyzer::{context, namespace::items as analyzer_items};
+6
+7use super::{SourceInfo, TypeId};
+8
+9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+10pub struct Constant {
+11    /// A name of a constant.
+12    pub name: SmolStr,
+13
+14    /// A value of a constant.
+15    pub value: ConstantValue,
+16
+17    /// A type of a constant.
+18    pub ty: TypeId,
+19
+20    /// A module where a constant is declared.
+21    pub module_id: analyzer_items::ModuleId,
+22
+23    /// A span where a constant is declared.
+24    pub source: SourceInfo,
+25}
+26
+27/// An interned Id for [`Constant`].
+28#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+29pub struct ConstantId(pub(crate) u32);
+30impl_intern_key!(ConstantId);
+31
+32#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+33pub enum ConstantValue {
+34    Immediate(BigInt),
+35    Str(SmolStr),
+36    Bool(bool),
+37}
+38
+39impl From<context::Constant> for ConstantValue {
+40    fn from(value: context::Constant) -> Self {
+41        match value {
+42            context::Constant::Int(num) | context::Constant::Address(num) => Self::Immediate(num),
+43            context::Constant::Str(s) => Self::Str(s),
+44            context::Constant::Bool(b) => Self::Bool(b),
+45        }
+46    }
+47}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/function.rs.html b/compiler-docs/src/fe_mir/ir/function.rs.html new file mode 100644 index 0000000000..79512819ed --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/function.rs.html @@ -0,0 +1,275 @@ +function.rs - source

fe_mir/ir/
function.rs

1use fe_analyzer::namespace::items as analyzer_items;
+2use fe_analyzer::namespace::types as analyzer_types;
+3use fe_common::impl_intern_key;
+4use fxhash::FxHashMap;
+5use id_arena::Arena;
+6use num_bigint::BigInt;
+7use smol_str::SmolStr;
+8use std::collections::BTreeMap;
+9
+10use super::{
+11    basic_block::BasicBlock,
+12    body_order::BodyOrder,
+13    inst::{BranchInfo, Inst, InstId, InstKind},
+14    types::TypeId,
+15    value::{AssignableValue, Local, Value, ValueId},
+16    BasicBlockId, SourceInfo,
+17};
+18
+19/// Represents function signature.
+20#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+21pub struct FunctionSignature {
+22    pub params: Vec<FunctionParam>,
+23    pub resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+24    pub return_type: Option<TypeId>,
+25    pub module_id: analyzer_items::ModuleId,
+26    pub analyzer_func_id: analyzer_items::FunctionId,
+27    pub linkage: Linkage,
+28}
+29
+30#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+31pub struct FunctionParam {
+32    pub name: SmolStr,
+33    pub ty: TypeId,
+34    pub source: SourceInfo,
+35}
+36
+37#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+38pub struct FunctionId(pub u32);
+39impl_intern_key!(FunctionId);
+40
+41#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+42pub enum Linkage {
+43    /// A function can only be called within the same module.
+44    Private,
+45
+46    /// A function can be called from other modules, but can NOT be called from
+47    /// other accounts and transactions.
+48    Public,
+49
+50    /// A function can be called from other modules, and also can be called from
+51    /// other accounts and transactions.
+52    Export,
+53}
+54
+55impl Linkage {
+56    pub fn is_exported(self) -> bool {
+57        self == Linkage::Export
+58    }
+59}
+60
+61/// A function body, which is not stored in salsa db to enable in-place
+62/// transformation.
+63#[derive(Debug, Clone, PartialEq, Eq)]
+64pub struct FunctionBody {
+65    pub fid: FunctionId,
+66
+67    pub store: BodyDataStore,
+68
+69    /// Tracks order of basic blocks and instructions in a function body.
+70    pub order: BodyOrder,
+71
+72    pub source: SourceInfo,
+73}
+74
+75impl FunctionBody {
+76    pub fn new(fid: FunctionId, source: SourceInfo) -> Self {
+77        let mut store = BodyDataStore::default();
+78        let entry_bb = store.store_block(BasicBlock {});
+79        Self {
+80            fid,
+81            store,
+82            order: BodyOrder::new(entry_bb),
+83            source,
+84        }
+85    }
+86}
+87
+88/// A collection of basic block, instructions and values appear in a function
+89/// body.
+90#[derive(Default, Debug, Clone, PartialEq, Eq)]
+91pub struct BodyDataStore {
+92    /// Instructions appear in a function body.
+93    insts: Arena<Inst>,
+94
+95    /// All values in a function.
+96    values: Arena<Value>,
+97
+98    blocks: Arena<BasicBlock>,
+99
+100    /// Maps an immediate to a value to ensure the same immediate results in the
+101    /// same value.
+102    immediates: FxHashMap<(BigInt, TypeId), ValueId>,
+103
+104    unit_value: Option<ValueId>,
+105
+106    /// Maps an instruction to a value.
+107    inst_results: FxHashMap<InstId, AssignableValue>,
+108
+109    /// All declared local variables in a function.
+110    locals: Vec<ValueId>,
+111}
+112
+113impl BodyDataStore {
+114    pub fn store_inst(&mut self, inst: Inst) -> InstId {
+115        self.insts.alloc(inst)
+116    }
+117
+118    pub fn inst_data(&self, inst: InstId) -> &Inst {
+119        &self.insts[inst]
+120    }
+121
+122    pub fn inst_data_mut(&mut self, inst: InstId) -> &mut Inst {
+123        &mut self.insts[inst]
+124    }
+125
+126    pub fn replace_inst(&mut self, inst: InstId, new: Inst) -> Inst {
+127        let old = &mut self.insts[inst];
+128        std::mem::replace(old, new)
+129    }
+130
+131    pub fn store_value(&mut self, value: Value) -> ValueId {
+132        match value {
+133            Value::Immediate { imm, ty } => self.store_immediate(imm, ty),
+134
+135            Value::Unit { .. } => {
+136                if let Some(unit_value) = self.unit_value {
+137                    unit_value
+138                } else {
+139                    let unit_value = self.values.alloc(value);
+140                    self.unit_value = Some(unit_value);
+141                    unit_value
+142                }
+143            }
+144
+145            Value::Local(ref local) => {
+146                let is_user_defined = !local.is_tmp;
+147                let value_id = self.values.alloc(value);
+148                if is_user_defined {
+149                    self.locals.push(value_id);
+150                }
+151                value_id
+152            }
+153
+154            _ => self.values.alloc(value),
+155        }
+156    }
+157
+158    pub fn is_nop(&self, inst: InstId) -> bool {
+159        matches!(&self.inst_data(inst).kind, InstKind::Nop)
+160    }
+161
+162    pub fn is_terminator(&self, inst: InstId) -> bool {
+163        self.inst_data(inst).is_terminator()
+164    }
+165
+166    pub fn branch_info(&self, inst: InstId) -> BranchInfo {
+167        self.inst_data(inst).branch_info()
+168    }
+169
+170    pub fn value_data(&self, value: ValueId) -> &Value {
+171        &self.values[value]
+172    }
+173
+174    pub fn value_data_mut(&mut self, value: ValueId) -> &mut Value {
+175        &mut self.values[value]
+176    }
+177
+178    pub fn values(&self) -> impl Iterator<Item = &Value> {
+179        self.values.iter().map(|(_, value_data)| value_data)
+180    }
+181
+182    pub fn values_mut(&mut self) -> impl Iterator<Item = &mut Value> {
+183        self.values.iter_mut().map(|(_, value_data)| value_data)
+184    }
+185
+186    pub fn store_block(&mut self, block: BasicBlock) -> BasicBlockId {
+187        self.blocks.alloc(block)
+188    }
+189
+190    /// Returns an instruction result
+191    pub fn inst_result(&self, inst: InstId) -> Option<&AssignableValue> {
+192        self.inst_results.get(&inst)
+193    }
+194
+195    pub fn map_result(&mut self, inst: InstId, result: AssignableValue) {
+196        self.inst_results.insert(inst, result);
+197    }
+198
+199    pub fn remove_inst_result(&mut self, inst: InstId) -> Option<AssignableValue> {
+200        self.inst_results.remove(&inst)
+201    }
+202
+203    pub fn rewrite_branch_dest(&mut self, inst: InstId, from: BasicBlockId, to: BasicBlockId) {
+204        match &mut self.inst_data_mut(inst).kind {
+205            InstKind::Jump { dest } => {
+206                if *dest == from {
+207                    *dest = to;
+208                }
+209            }
+210            InstKind::Branch { then, else_, .. } => {
+211                if *then == from {
+212                    *then = to;
+213                }
+214                if *else_ == from {
+215                    *else_ = to;
+216                }
+217            }
+218            _ => unreachable!("inst is not a branch"),
+219        }
+220    }
+221
+222    pub fn value_ty(&self, vid: ValueId) -> TypeId {
+223        self.values[vid].ty()
+224    }
+225
+226    pub fn locals(&self) -> &[ValueId] {
+227        &self.locals
+228    }
+229
+230    pub fn locals_mut(&mut self) -> &[ValueId] {
+231        &mut self.locals
+232    }
+233
+234    pub fn func_args(&self) -> impl Iterator<Item = ValueId> + '_ {
+235        self.locals()
+236            .iter()
+237            .filter(|value| match self.value_data(**value) {
+238                Value::Local(local) => local.is_arg,
+239                _ => unreachable!(),
+240            })
+241            .copied()
+242    }
+243
+244    pub fn func_args_mut(&mut self) -> impl Iterator<Item = &mut Value> {
+245        self.values_mut().filter(|value| match value {
+246            Value::Local(local) => local.is_arg,
+247            _ => false,
+248        })
+249    }
+250
+251    /// Returns Some(`local_name`) if value is `Value::Local`.
+252    pub fn local_name(&self, value: ValueId) -> Option<&str> {
+253        match self.value_data(value) {
+254            Value::Local(Local { name, .. }) => Some(name),
+255            _ => None,
+256        }
+257    }
+258
+259    pub fn replace_value(&mut self, value: ValueId, to: Value) -> Value {
+260        std::mem::replace(&mut self.values[value], to)
+261    }
+262
+263    fn store_immediate(&mut self, imm: BigInt, ty: TypeId) -> ValueId {
+264        if let Some(value) = self.immediates.get(&(imm.clone(), ty)) {
+265            *value
+266        } else {
+267            let id = self.values.alloc(Value::Immediate {
+268                imm: imm.clone(),
+269                ty,
+270            });
+271            self.immediates.insert((imm, ty), id);
+272            id
+273        }
+274    }
+275}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/inst.rs.html b/compiler-docs/src/fe_mir/ir/inst.rs.html new file mode 100644 index 0000000000..679a51b19e --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/inst.rs.html @@ -0,0 +1,764 @@ +inst.rs - source

fe_mir/ir/
inst.rs

1use std::fmt;
+2
+3use fe_analyzer::namespace::items::ContractId;
+4use id_arena::Id;
+5
+6use super::{basic_block::BasicBlockId, function::FunctionId, value::ValueId, SourceInfo, TypeId};
+7
+8pub type InstId = Id<Inst>;
+9
+10#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+11pub struct Inst {
+12    pub kind: InstKind,
+13    pub source: SourceInfo,
+14}
+15
+16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+17pub enum InstKind {
+18    /// This is not a real instruction, just used to tag a position where a
+19    /// local is declared.
+20    Declare {
+21        local: ValueId,
+22    },
+23
+24    /// Unary instruction.
+25    Unary {
+26        op: UnOp,
+27        value: ValueId,
+28    },
+29
+30    /// Binary instruction.
+31    Binary {
+32        op: BinOp,
+33        lhs: ValueId,
+34        rhs: ValueId,
+35    },
+36
+37    Cast {
+38        kind: CastKind,
+39        value: ValueId,
+40        to: TypeId,
+41    },
+42
+43    /// Constructs aggregate value, i.e. struct, tuple and array.
+44    AggregateConstruct {
+45        ty: TypeId,
+46        args: Vec<ValueId>,
+47    },
+48
+49    Bind {
+50        src: ValueId,
+51    },
+52
+53    MemCopy {
+54        src: ValueId,
+55    },
+56
+57    /// Load a primitive value from a ptr
+58    Load {
+59        src: ValueId,
+60    },
+61
+62    /// Access to aggregate fields or elements.
+63    /// # Example
+64    ///
+65    /// ```fe
+66    /// struct Foo:
+67    ///     x: i32
+68    ///     y: Array<i32, 8>
+69    /// ```
+70    /// `foo.y` is lowered into `AggregateAccess(foo, [1])' for example.
+71    AggregateAccess {
+72        value: ValueId,
+73        indices: Vec<ValueId>,
+74    },
+75
+76    MapAccess {
+77        key: ValueId,
+78        value: ValueId,
+79    },
+80
+81    Call {
+82        func: FunctionId,
+83        args: Vec<ValueId>,
+84        call_type: CallType,
+85    },
+86
+87    /// Unconditional jump instruction.
+88    Jump {
+89        dest: BasicBlockId,
+90    },
+91
+92    /// Conditional branching instruction.
+93    Branch {
+94        cond: ValueId,
+95        then: BasicBlockId,
+96        else_: BasicBlockId,
+97    },
+98
+99    Switch {
+100        disc: ValueId,
+101        table: SwitchTable,
+102        default: Option<BasicBlockId>,
+103    },
+104
+105    Revert {
+106        arg: Option<ValueId>,
+107    },
+108
+109    Emit {
+110        arg: ValueId,
+111    },
+112
+113    Return {
+114        arg: Option<ValueId>,
+115    },
+116
+117    Keccak256 {
+118        arg: ValueId,
+119    },
+120
+121    AbiEncode {
+122        arg: ValueId,
+123    },
+124
+125    Nop,
+126
+127    Create {
+128        value: ValueId,
+129        contract: ContractId,
+130    },
+131
+132    Create2 {
+133        value: ValueId,
+134        salt: ValueId,
+135        contract: ContractId,
+136    },
+137
+138    YulIntrinsic {
+139        op: YulIntrinsicOp,
+140        args: Vec<ValueId>,
+141    },
+142}
+143
+144#[derive(Debug, Clone, Default, PartialEq, Eq, Hash)]
+145pub struct SwitchTable {
+146    values: Vec<ValueId>,
+147    blocks: Vec<BasicBlockId>,
+148}
+149
+150impl SwitchTable {
+151    pub fn iter(&self) -> impl Iterator<Item = (ValueId, BasicBlockId)> + '_ {
+152        self.values.iter().copied().zip(self.blocks.iter().copied())
+153    }
+154
+155    pub fn len(&self) -> usize {
+156        debug_assert!(self.values.len() == self.blocks.len());
+157        self.values.len()
+158    }
+159
+160    pub fn is_empty(&self) -> bool {
+161        debug_assert!(self.values.len() == self.blocks.len());
+162        self.values.is_empty()
+163    }
+164
+165    pub fn add_arm(&mut self, value: ValueId, block: BasicBlockId) {
+166        self.values.push(value);
+167        self.blocks.push(block);
+168    }
+169}
+170
+171impl Inst {
+172    pub fn new(kind: InstKind, source: SourceInfo) -> Self {
+173        Self { kind, source }
+174    }
+175
+176    pub fn unary(op: UnOp, value: ValueId, source: SourceInfo) -> Self {
+177        let kind = InstKind::Unary { op, value };
+178        Self::new(kind, source)
+179    }
+180
+181    pub fn binary(op: BinOp, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> Self {
+182        let kind = InstKind::Binary { op, lhs, rhs };
+183        Self::new(kind, source)
+184    }
+185
+186    pub fn intrinsic(op: YulIntrinsicOp, args: Vec<ValueId>, source: SourceInfo) -> Self {
+187        let kind = InstKind::YulIntrinsic { op, args };
+188        Self::new(kind, source)
+189    }
+190
+191    pub fn nop() -> Self {
+192        Self {
+193            kind: InstKind::Nop,
+194            source: SourceInfo::dummy(),
+195        }
+196    }
+197
+198    pub fn is_terminator(&self) -> bool {
+199        match self.kind {
+200            InstKind::Jump { .. }
+201            | InstKind::Branch { .. }
+202            | InstKind::Switch { .. }
+203            | InstKind::Revert { .. }
+204            | InstKind::Return { .. } => true,
+205            InstKind::YulIntrinsic { op, .. } => op.is_terminator(),
+206            _ => false,
+207        }
+208    }
+209
+210    pub fn branch_info(&self) -> BranchInfo {
+211        match self.kind {
+212            InstKind::Jump { dest } => BranchInfo::Jump(dest),
+213            InstKind::Branch { cond, then, else_ } => BranchInfo::Branch(cond, then, else_),
+214            InstKind::Switch {
+215                disc,
+216                ref table,
+217                default,
+218            } => BranchInfo::Switch(disc, table, default),
+219            _ => BranchInfo::NotBranch,
+220        }
+221    }
+222
+223    pub fn args(&self) -> ValueIter {
+224        use InstKind::*;
+225        match &self.kind {
+226            Declare { local: arg }
+227            | Bind { src: arg }
+228            | MemCopy { src: arg }
+229            | Load { src: arg }
+230            | Unary { value: arg, .. }
+231            | Cast { value: arg, .. }
+232            | Emit { arg }
+233            | Keccak256 { arg }
+234            | AbiEncode { arg }
+235            | Create { value: arg, .. }
+236            | Branch { cond: arg, .. } => ValueIter::one(*arg),
+237
+238            Switch { disc, table, .. } => {
+239                ValueIter::one(*disc).chain(ValueIter::Slice(table.values.iter()))
+240            }
+241
+242            Binary { lhs, rhs, .. }
+243            | MapAccess {
+244                value: lhs,
+245                key: rhs,
+246            }
+247            | Create2 {
+248                value: lhs,
+249                salt: rhs,
+250                ..
+251            } => ValueIter::one(*lhs).chain(ValueIter::one(*rhs)),
+252
+253            Revert { arg } | Return { arg } => ValueIter::One(*arg),
+254
+255            Nop | Jump { .. } => ValueIter::Zero,
+256
+257            AggregateAccess { value, indices } => {
+258                ValueIter::one(*value).chain(ValueIter::Slice(indices.iter()))
+259            }
+260
+261            AggregateConstruct { args, .. } | Call { args, .. } | YulIntrinsic { args, .. } => {
+262                ValueIter::Slice(args.iter())
+263            }
+264        }
+265    }
+266
+267    pub fn args_mut(&mut self) -> ValueIterMut {
+268        use InstKind::*;
+269        match &mut self.kind {
+270            Declare { local: arg }
+271            | Bind { src: arg }
+272            | MemCopy { src: arg }
+273            | Load { src: arg }
+274            | Unary { value: arg, .. }
+275            | Cast { value: arg, .. }
+276            | Emit { arg }
+277            | Keccak256 { arg }
+278            | AbiEncode { arg }
+279            | Create { value: arg, .. }
+280            | Branch { cond: arg, .. } => ValueIterMut::one(arg),
+281
+282            Switch { disc, table, .. } => {
+283                ValueIterMut::one(disc).chain(ValueIterMut::Slice(table.values.iter_mut()))
+284            }
+285
+286            Binary { lhs, rhs, .. }
+287            | MapAccess {
+288                value: lhs,
+289                key: rhs,
+290            }
+291            | Create2 {
+292                value: lhs,
+293                salt: rhs,
+294                ..
+295            } => ValueIterMut::one(lhs).chain(ValueIterMut::one(rhs)),
+296
+297            Revert { arg } | Return { arg } => ValueIterMut::One(arg.as_mut()),
+298
+299            Nop | Jump { .. } => ValueIterMut::Zero,
+300
+301            AggregateAccess { value, indices } => {
+302                ValueIterMut::one(value).chain(ValueIterMut::Slice(indices.iter_mut()))
+303            }
+304
+305            AggregateConstruct { args, .. } | Call { args, .. } | YulIntrinsic { args, .. } => {
+306                ValueIterMut::Slice(args.iter_mut())
+307            }
+308        }
+309    }
+310}
+311
+312#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+313pub enum UnOp {
+314    /// `not` operator for logical inversion.
+315    Not,
+316    /// `-` operator for negation.
+317    Neg,
+318    /// `~` operator for bitwise inversion.
+319    Inv,
+320}
+321
+322impl fmt::Display for UnOp {
+323    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+324        match self {
+325            Self::Not => write!(w, "not"),
+326            Self::Neg => write!(w, "-"),
+327            Self::Inv => write!(w, "~"),
+328        }
+329    }
+330}
+331
+332#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+333pub enum BinOp {
+334    Add,
+335    Sub,
+336    Mul,
+337    Div,
+338    Mod,
+339    Pow,
+340    Shl,
+341    Shr,
+342    BitOr,
+343    BitXor,
+344    BitAnd,
+345    LogicalAnd,
+346    LogicalOr,
+347    Eq,
+348    Ne,
+349    Ge,
+350    Gt,
+351    Le,
+352    Lt,
+353}
+354
+355impl fmt::Display for BinOp {
+356    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+357        match self {
+358            Self::Add => write!(w, "+"),
+359            Self::Sub => write!(w, "-"),
+360            Self::Mul => write!(w, "*"),
+361            Self::Div => write!(w, "/"),
+362            Self::Mod => write!(w, "%"),
+363            Self::Pow => write!(w, "**"),
+364            Self::Shl => write!(w, "<<"),
+365            Self::Shr => write!(w, ">>"),
+366            Self::BitOr => write!(w, "|"),
+367            Self::BitXor => write!(w, "^"),
+368            Self::BitAnd => write!(w, "&"),
+369            Self::LogicalAnd => write!(w, "and"),
+370            Self::LogicalOr => write!(w, "or"),
+371            Self::Eq => write!(w, "=="),
+372            Self::Ne => write!(w, "!="),
+373            Self::Ge => write!(w, ">="),
+374            Self::Gt => write!(w, ">"),
+375            Self::Le => write!(w, "<="),
+376            Self::Lt => write!(w, "<"),
+377        }
+378    }
+379}
+380
+381#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+382pub enum CallType {
+383    Internal,
+384    External,
+385}
+386
+387impl fmt::Display for CallType {
+388    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+389        match self {
+390            Self::Internal => write!(w, "internal"),
+391            Self::External => write!(w, "external"),
+392        }
+393    }
+394}
+395
+396#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+397pub enum CastKind {
+398    /// A cast from a primitive type to a primitive type.
+399    Primitive,
+400
+401    /// A cast from an enum type to its underlying type.
+402    Untag,
+403}
+404
+405// TODO: We don't need all yul intrinsics.
+406#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+407pub enum YulIntrinsicOp {
+408    Stop,
+409    Add,
+410    Sub,
+411    Mul,
+412    Div,
+413    Sdiv,
+414    Mod,
+415    Smod,
+416    Exp,
+417    Not,
+418    Lt,
+419    Gt,
+420    Slt,
+421    Sgt,
+422    Eq,
+423    Iszero,
+424    And,
+425    Or,
+426    Xor,
+427    Byte,
+428    Shl,
+429    Shr,
+430    Sar,
+431    Addmod,
+432    Mulmod,
+433    Signextend,
+434    Keccak256,
+435    Pc,
+436    Pop,
+437    Mload,
+438    Mstore,
+439    Mstore8,
+440    Sload,
+441    Sstore,
+442    Msize,
+443    Gas,
+444    Address,
+445    Balance,
+446    Selfbalance,
+447    Caller,
+448    Callvalue,
+449    Calldataload,
+450    Calldatasize,
+451    Calldatacopy,
+452    Codesize,
+453    Codecopy,
+454    Extcodesize,
+455    Extcodecopy,
+456    Returndatasize,
+457    Returndatacopy,
+458    Extcodehash,
+459    Create,
+460    Create2,
+461    Call,
+462    Callcode,
+463    Delegatecall,
+464    Staticcall,
+465    Return,
+466    Revert,
+467    Selfdestruct,
+468    Invalid,
+469    Log0,
+470    Log1,
+471    Log2,
+472    Log3,
+473    Log4,
+474    Chainid,
+475    Basefee,
+476    Origin,
+477    Gasprice,
+478    Blockhash,
+479    Coinbase,
+480    Timestamp,
+481    Number,
+482    Prevrandao,
+483    Gaslimit,
+484}
+485impl YulIntrinsicOp {
+486    pub fn is_terminator(self) -> bool {
+487        matches!(
+488            self,
+489            Self::Return | Self::Revert | Self::Selfdestruct | Self::Invalid
+490        )
+491    }
+492}
+493
+494impl fmt::Display for YulIntrinsicOp {
+495    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+496        let op = match self {
+497            Self::Stop => "__stop",
+498            Self::Add => "__add",
+499            Self::Sub => "__sub",
+500            Self::Mul => "__mul",
+501            Self::Div => "__div",
+502            Self::Sdiv => "__sdiv",
+503            Self::Mod => "__mod",
+504            Self::Smod => "__smod",
+505            Self::Exp => "__exp",
+506            Self::Not => "__not",
+507            Self::Lt => "__lt",
+508            Self::Gt => "__gt",
+509            Self::Slt => "__slt",
+510            Self::Sgt => "__sgt",
+511            Self::Eq => "__eq",
+512            Self::Iszero => "__iszero",
+513            Self::And => "__and",
+514            Self::Or => "__or",
+515            Self::Xor => "__xor",
+516            Self::Byte => "__byte",
+517            Self::Shl => "__shl",
+518            Self::Shr => "__shr",
+519            Self::Sar => "__sar",
+520            Self::Addmod => "__addmod",
+521            Self::Mulmod => "__mulmod",
+522            Self::Signextend => "__signextend",
+523            Self::Keccak256 => "__keccak256",
+524            Self::Pc => "__pc",
+525            Self::Pop => "__pop",
+526            Self::Mload => "__mload",
+527            Self::Mstore => "__mstore",
+528            Self::Mstore8 => "__mstore8",
+529            Self::Sload => "__sload",
+530            Self::Sstore => "__sstore",
+531            Self::Msize => "__msize",
+532            Self::Gas => "__gas",
+533            Self::Address => "__address",
+534            Self::Balance => "__balance",
+535            Self::Selfbalance => "__selfbalance",
+536            Self::Caller => "__caller",
+537            Self::Callvalue => "__callvalue",
+538            Self::Calldataload => "__calldataload",
+539            Self::Calldatasize => "__calldatasize",
+540            Self::Calldatacopy => "__calldatacopy",
+541            Self::Codesize => "__codesize",
+542            Self::Codecopy => "__codecopy",
+543            Self::Extcodesize => "__extcodesize",
+544            Self::Extcodecopy => "__extcodecopy",
+545            Self::Returndatasize => "__returndatasize",
+546            Self::Returndatacopy => "__returndatacopy",
+547            Self::Extcodehash => "__extcodehash",
+548            Self::Create => "__create",
+549            Self::Create2 => "__create2",
+550            Self::Call => "__call",
+551            Self::Callcode => "__callcode",
+552            Self::Delegatecall => "__delegatecall",
+553            Self::Staticcall => "__staticcall",
+554            Self::Return => "__return",
+555            Self::Revert => "__revert",
+556            Self::Selfdestruct => "__selfdestruct",
+557            Self::Invalid => "__invalid",
+558            Self::Log0 => "__log0",
+559            Self::Log1 => "__log1",
+560            Self::Log2 => "__log2",
+561            Self::Log3 => "__log3",
+562            Self::Log4 => "__log4",
+563            Self::Chainid => "__chainid",
+564            Self::Basefee => "__basefee",
+565            Self::Origin => "__origin",
+566            Self::Gasprice => "__gasprice",
+567            Self::Blockhash => "__blockhash",
+568            Self::Coinbase => "__coinbase",
+569            Self::Timestamp => "__timestamp",
+570            Self::Number => "__number",
+571            Self::Prevrandao => "__prevrandao",
+572            Self::Gaslimit => "__gaslimit",
+573        };
+574
+575        write!(w, "{op}")
+576    }
+577}
+578
+579impl From<fe_analyzer::builtins::Intrinsic> for YulIntrinsicOp {
+580    fn from(val: fe_analyzer::builtins::Intrinsic) -> Self {
+581        use fe_analyzer::builtins::Intrinsic;
+582        match val {
+583            Intrinsic::__stop => Self::Stop,
+584            Intrinsic::__add => Self::Add,
+585            Intrinsic::__sub => Self::Sub,
+586            Intrinsic::__mul => Self::Mul,
+587            Intrinsic::__div => Self::Div,
+588            Intrinsic::__sdiv => Self::Sdiv,
+589            Intrinsic::__mod => Self::Mod,
+590            Intrinsic::__smod => Self::Smod,
+591            Intrinsic::__exp => Self::Exp,
+592            Intrinsic::__not => Self::Not,
+593            Intrinsic::__lt => Self::Lt,
+594            Intrinsic::__gt => Self::Gt,
+595            Intrinsic::__slt => Self::Slt,
+596            Intrinsic::__sgt => Self::Sgt,
+597            Intrinsic::__eq => Self::Eq,
+598            Intrinsic::__iszero => Self::Iszero,
+599            Intrinsic::__and => Self::And,
+600            Intrinsic::__or => Self::Or,
+601            Intrinsic::__xor => Self::Xor,
+602            Intrinsic::__byte => Self::Byte,
+603            Intrinsic::__shl => Self::Shl,
+604            Intrinsic::__shr => Self::Shr,
+605            Intrinsic::__sar => Self::Sar,
+606            Intrinsic::__addmod => Self::Addmod,
+607            Intrinsic::__mulmod => Self::Mulmod,
+608            Intrinsic::__signextend => Self::Signextend,
+609            Intrinsic::__keccak256 => Self::Keccak256,
+610            Intrinsic::__pc => Self::Pc,
+611            Intrinsic::__pop => Self::Pop,
+612            Intrinsic::__mload => Self::Mload,
+613            Intrinsic::__mstore => Self::Mstore,
+614            Intrinsic::__mstore8 => Self::Mstore8,
+615            Intrinsic::__sload => Self::Sload,
+616            Intrinsic::__sstore => Self::Sstore,
+617            Intrinsic::__msize => Self::Msize,
+618            Intrinsic::__gas => Self::Gas,
+619            Intrinsic::__address => Self::Address,
+620            Intrinsic::__balance => Self::Balance,
+621            Intrinsic::__selfbalance => Self::Selfbalance,
+622            Intrinsic::__caller => Self::Caller,
+623            Intrinsic::__callvalue => Self::Callvalue,
+624            Intrinsic::__calldataload => Self::Calldataload,
+625            Intrinsic::__calldatasize => Self::Calldatasize,
+626            Intrinsic::__calldatacopy => Self::Calldatacopy,
+627            Intrinsic::__codesize => Self::Codesize,
+628            Intrinsic::__codecopy => Self::Codecopy,
+629            Intrinsic::__extcodesize => Self::Extcodesize,
+630            Intrinsic::__extcodecopy => Self::Extcodecopy,
+631            Intrinsic::__returndatasize => Self::Returndatasize,
+632            Intrinsic::__returndatacopy => Self::Returndatacopy,
+633            Intrinsic::__extcodehash => Self::Extcodehash,
+634            Intrinsic::__create => Self::Create,
+635            Intrinsic::__create2 => Self::Create2,
+636            Intrinsic::__call => Self::Call,
+637            Intrinsic::__callcode => Self::Callcode,
+638            Intrinsic::__delegatecall => Self::Delegatecall,
+639            Intrinsic::__staticcall => Self::Staticcall,
+640            Intrinsic::__return => Self::Return,
+641            Intrinsic::__revert => Self::Revert,
+642            Intrinsic::__selfdestruct => Self::Selfdestruct,
+643            Intrinsic::__invalid => Self::Invalid,
+644            Intrinsic::__log0 => Self::Log0,
+645            Intrinsic::__log1 => Self::Log1,
+646            Intrinsic::__log2 => Self::Log2,
+647            Intrinsic::__log3 => Self::Log3,
+648            Intrinsic::__log4 => Self::Log4,
+649            Intrinsic::__chainid => Self::Chainid,
+650            Intrinsic::__basefee => Self::Basefee,
+651            Intrinsic::__origin => Self::Origin,
+652            Intrinsic::__gasprice => Self::Gasprice,
+653            Intrinsic::__blockhash => Self::Blockhash,
+654            Intrinsic::__coinbase => Self::Coinbase,
+655            Intrinsic::__timestamp => Self::Timestamp,
+656            Intrinsic::__number => Self::Number,
+657            Intrinsic::__prevrandao => Self::Prevrandao,
+658            Intrinsic::__gaslimit => Self::Gaslimit,
+659        }
+660    }
+661}
+662
+663pub enum BranchInfo<'a> {
+664    NotBranch,
+665    Jump(BasicBlockId),
+666    Branch(ValueId, BasicBlockId, BasicBlockId),
+667    Switch(ValueId, &'a SwitchTable, Option<BasicBlockId>),
+668}
+669
+670impl<'a> BranchInfo<'a> {
+671    pub fn is_not_a_branch(&self) -> bool {
+672        matches!(self, BranchInfo::NotBranch)
+673    }
+674
+675    pub fn block_iter(&self) -> BlockIter {
+676        match self {
+677            Self::NotBranch => BlockIter::Zero,
+678            Self::Jump(block) => BlockIter::one(*block),
+679            Self::Branch(_, then, else_) => BlockIter::one(*then).chain(BlockIter::one(*else_)),
+680            Self::Switch(_, table, default) => {
+681                BlockIter::Slice(table.blocks.iter()).chain(BlockIter::One(*default))
+682            }
+683        }
+684    }
+685}
+686
+687pub type BlockIter<'a> = IterBase<'a, BasicBlockId>;
+688pub type ValueIter<'a> = IterBase<'a, ValueId>;
+689pub type ValueIterMut<'a> = IterMutBase<'a, ValueId>;
+690
+691pub enum IterBase<'a, T> {
+692    Zero,
+693    One(Option<T>),
+694    Slice(std::slice::Iter<'a, T>),
+695    Chain(Box<IterBase<'a, T>>, Box<IterBase<'a, T>>),
+696}
+697
+698impl<'a, T> IterBase<'a, T> {
+699    fn one(value: T) -> Self {
+700        Self::One(Some(value))
+701    }
+702
+703    fn chain(self, rhs: Self) -> Self {
+704        Self::Chain(self.into(), rhs.into())
+705    }
+706}
+707
+708impl<'a, T> Iterator for IterBase<'a, T>
+709where
+710    T: Copy,
+711{
+712    type Item = T;
+713
+714    fn next(&mut self) -> Option<Self::Item> {
+715        match self {
+716            Self::Zero => None,
+717            Self::One(value) => value.take(),
+718            Self::Slice(s) => s.next().copied(),
+719            Self::Chain(first, second) => {
+720                if let Some(value) = first.next() {
+721                    Some(value)
+722                } else {
+723                    second.next()
+724                }
+725            }
+726        }
+727    }
+728}
+729
+730pub enum IterMutBase<'a, T> {
+731    Zero,
+732    One(Option<&'a mut T>),
+733    Slice(std::slice::IterMut<'a, T>),
+734    Chain(Box<IterMutBase<'a, T>>, Box<IterMutBase<'a, T>>),
+735}
+736
+737impl<'a, T> IterMutBase<'a, T> {
+738    fn one(value: &'a mut T) -> Self {
+739        Self::One(Some(value))
+740    }
+741
+742    fn chain(self, rhs: Self) -> Self {
+743        Self::Chain(self.into(), rhs.into())
+744    }
+745}
+746
+747impl<'a, T> Iterator for IterMutBase<'a, T> {
+748    type Item = &'a mut T;
+749
+750    fn next(&mut self) -> Option<Self::Item> {
+751        match self {
+752            Self::Zero => None,
+753            Self::One(value) => value.take(),
+754            Self::Slice(s) => s.next(),
+755            Self::Chain(first, second) => {
+756                if let Some(value) = first.next() {
+757                    Some(value)
+758                } else {
+759                    second.next()
+760                }
+761            }
+762        }
+763    }
+764}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/mod.rs.html b/compiler-docs/src/fe_mir/ir/mod.rs.html new file mode 100644 index 0000000000..f3225aa0b8 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/mod.rs.html @@ -0,0 +1,49 @@ +mod.rs - source

fe_mir/ir/
mod.rs

1use fe_common::Span;
+2use fe_parser::node::{Node, NodeId};
+3
+4pub mod basic_block;
+5pub mod body_builder;
+6pub mod body_cursor;
+7pub mod body_order;
+8pub mod constant;
+9pub mod function;
+10pub mod inst;
+11pub mod types;
+12pub mod value;
+13
+14pub use basic_block::{BasicBlock, BasicBlockId};
+15pub use constant::{Constant, ConstantId};
+16pub use function::{FunctionBody, FunctionId, FunctionParam, FunctionSignature};
+17pub use inst::{Inst, InstId};
+18pub use types::{Type, TypeId, TypeKind};
+19pub use value::{Value, ValueId};
+20
+21/// An original source information that indicates where `mir` entities derive
+22/// from. `SourceInfo` is mainly used for diagnostics.
+23#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+24pub struct SourceInfo {
+25    pub span: Span,
+26    pub id: NodeId,
+27}
+28
+29impl SourceInfo {
+30    pub fn dummy() -> Self {
+31        Self {
+32            span: Span::dummy(),
+33            id: NodeId::dummy(),
+34        }
+35    }
+36
+37    pub fn is_dummy(&self) -> bool {
+38        self == &Self::dummy()
+39    }
+40}
+41
+42impl<T> From<&Node<T>> for SourceInfo {
+43    fn from(node: &Node<T>) -> Self {
+44        Self {
+45            span: node.span,
+46            id: node.id,
+47        }
+48    }
+49}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/types.rs.html b/compiler-docs/src/fe_mir/ir/types.rs.html new file mode 100644 index 0000000000..733eec2e80 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/types.rs.html @@ -0,0 +1,120 @@ +types.rs - source

fe_mir/ir/
types.rs

1use fe_analyzer::namespace::items as analyzer_items;
+2use fe_analyzer::namespace::types as analyzer_types;
+3use fe_common::{impl_intern_key, Span};
+4use smol_str::SmolStr;
+5
+6#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+7pub struct Type {
+8    pub kind: TypeKind,
+9    pub analyzer_ty: Option<analyzer_types::TypeId>,
+10}
+11
+12impl Type {
+13    pub fn new(kind: TypeKind, analyzer_ty: Option<analyzer_types::TypeId>) -> Self {
+14        Self { kind, analyzer_ty }
+15    }
+16}
+17
+18#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+19pub enum TypeKind {
+20    I8,
+21    I16,
+22    I32,
+23    I64,
+24    I128,
+25    I256,
+26    U8,
+27    U16,
+28    U32,
+29    U64,
+30    U128,
+31    U256,
+32    Bool,
+33    Address,
+34    Unit,
+35    Array(ArrayDef),
+36    // TODO: we should consider whether we really need `String` type.
+37    String(usize),
+38    Tuple(TupleDef),
+39    Struct(StructDef),
+40    Enum(EnumDef),
+41    Contract(StructDef),
+42    Map(MapDef),
+43    MPtr(TypeId),
+44    SPtr(TypeId),
+45}
+46
+47/// An interned Id for [`ArrayDef`].
+48#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+49pub struct TypeId(pub u32);
+50impl_intern_key!(TypeId);
+51
+52/// A static array type definition.
+53#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+54pub struct ArrayDef {
+55    pub elem_ty: TypeId,
+56    pub len: usize,
+57}
+58
+59/// A tuple type definition.
+60#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+61pub struct TupleDef {
+62    pub items: Vec<TypeId>,
+63}
+64
+65/// A user defined struct type definition.
+66#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+67pub struct StructDef {
+68    pub name: SmolStr,
+69    pub fields: Vec<(SmolStr, TypeId)>,
+70    pub span: Span,
+71    pub module_id: analyzer_items::ModuleId,
+72}
+73
+74/// A user defined struct type definition.
+75#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+76pub struct EnumDef {
+77    pub name: SmolStr,
+78    pub variants: Vec<EnumVariant>,
+79    pub span: Span,
+80    pub module_id: analyzer_items::ModuleId,
+81}
+82
+83impl EnumDef {
+84    pub fn tag_type(&self) -> TypeKind {
+85        let variant_num = self.variants.len() as u64;
+86        if variant_num <= u8::MAX as u64 {
+87            TypeKind::U8
+88        } else if variant_num <= u16::MAX as u64 {
+89            TypeKind::U16
+90        } else if variant_num <= u32::MAX as u64 {
+91            TypeKind::U32
+92        } else {
+93            TypeKind::U64
+94        }
+95    }
+96}
+97
+98/// A user defined struct type definition.
+99#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+100pub struct EnumVariant {
+101    pub name: SmolStr,
+102    pub span: Span,
+103    pub ty: TypeId,
+104}
+105
+106/// A user defined struct type definition.
+107#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+108pub struct EventDef {
+109    pub name: SmolStr,
+110    pub fields: Vec<(SmolStr, TypeId, bool)>,
+111    pub span: Span,
+112    pub module_id: analyzer_items::ModuleId,
+113}
+114
+115/// A map type definition.
+116#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+117pub struct MapDef {
+118    pub key_ty: TypeId,
+119    pub value_ty: TypeId,
+120}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/value.rs.html b/compiler-docs/src/fe_mir/ir/value.rs.html new file mode 100644 index 0000000000..7d5e6fb3f5 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/value.rs.html @@ -0,0 +1,142 @@ +value.rs - source

fe_mir/ir/
value.rs

1use id_arena::Id;
+2use num_bigint::BigInt;
+3use smol_str::SmolStr;
+4
+5use crate::db::MirDb;
+6
+7use super::{
+8    constant::ConstantId,
+9    function::BodyDataStore,
+10    inst::InstId,
+11    types::{TypeId, TypeKind},
+12    SourceInfo,
+13};
+14
+15pub type ValueId = Id<Value>;
+16
+17#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+18pub enum Value {
+19    /// A value resulted from an instruction.
+20    Temporary { inst: InstId, ty: TypeId },
+21
+22    /// A local variable declared in a function body.
+23    Local(Local),
+24
+25    /// An immediate value.
+26    Immediate { imm: BigInt, ty: TypeId },
+27
+28    /// A constant value.
+29    Constant { constant: ConstantId, ty: TypeId },
+30
+31    /// A singleton value representing `Unit` type.
+32    Unit { ty: TypeId },
+33}
+34
+35impl Value {
+36    pub fn ty(&self) -> TypeId {
+37        match self {
+38            Self::Local(val) => val.ty,
+39            Self::Immediate { ty, .. }
+40            | Self::Temporary { ty, .. }
+41            | Self::Unit { ty }
+42            | Self::Constant { ty, .. } => *ty,
+43        }
+44    }
+45
+46    pub fn is_imm(&self) -> bool {
+47        matches!(self, Self::Immediate { .. })
+48    }
+49}
+50
+51#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+52pub enum AssignableValue {
+53    Value(ValueId),
+54    Aggregate {
+55        lhs: Box<AssignableValue>,
+56        idx: ValueId,
+57    },
+58    Map {
+59        lhs: Box<AssignableValue>,
+60        key: ValueId,
+61    },
+62}
+63
+64impl From<ValueId> for AssignableValue {
+65    fn from(value: ValueId) -> Self {
+66        Self::Value(value)
+67    }
+68}
+69
+70impl AssignableValue {
+71    pub fn ty(&self, db: &dyn MirDb, store: &BodyDataStore) -> TypeId {
+72        match self {
+73            Self::Value(value) => store.value_ty(*value),
+74            Self::Aggregate { lhs, idx } => {
+75                let lhs_ty = lhs.ty(db, store);
+76                lhs_ty.projection_ty(db, store.value_data(*idx))
+77            }
+78            Self::Map { lhs, .. } => {
+79                let lhs_ty = lhs.ty(db, store).deref(db);
+80                match lhs_ty.data(db).kind {
+81                    TypeKind::Map(def) => def.value_ty.make_sptr(db),
+82                    _ => unreachable!(),
+83                }
+84            }
+85        }
+86    }
+87
+88    pub fn value_id(&self) -> Option<ValueId> {
+89        match self {
+90            Self::Value(value) => Some(*value),
+91            _ => None,
+92        }
+93    }
+94}
+95
+96#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+97pub struct Local {
+98    /// An original name of a local variable.
+99    pub name: SmolStr,
+100
+101    pub ty: TypeId,
+102
+103    /// `true` if a local is a function argument.
+104    pub is_arg: bool,
+105
+106    /// `true` if a local is introduced in MIR.
+107    pub is_tmp: bool,
+108
+109    pub source: SourceInfo,
+110}
+111
+112impl Local {
+113    pub fn user_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local {
+114        Self {
+115            name,
+116            ty,
+117            is_arg: false,
+118            is_tmp: false,
+119            source,
+120        }
+121    }
+122
+123    pub fn arg_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local {
+124        Self {
+125            name,
+126            ty,
+127            is_arg: true,
+128            is_tmp: false,
+129            source,
+130        }
+131    }
+132
+133    pub fn tmp_local(name: SmolStr, ty: TypeId) -> Local {
+134        Self {
+135            name,
+136            ty,
+137            is_arg: false,
+138            is_tmp: true,
+139            source: SourceInfo::dummy(),
+140        }
+141    }
+142}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lib.rs.html b/compiler-docs/src/fe_mir/lib.rs.html new file mode 100644 index 0000000000..221d212dd5 --- /dev/null +++ b/compiler-docs/src/fe_mir/lib.rs.html @@ -0,0 +1,7 @@ +lib.rs - source

fe_mir/
lib.rs

1pub mod analysis;
+2pub mod db;
+3pub mod graphviz;
+4pub mod ir;
+5pub mod pretty_print;
+6
+7mod lower;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/function.rs.html b/compiler-docs/src/fe_mir/lower/function.rs.html new file mode 100644 index 0000000000..5a29da44ff --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/function.rs.html @@ -0,0 +1,1367 @@ +function.rs - source

fe_mir/lower/
function.rs

1use std::{collections::BTreeMap, rc::Rc, vec};
+2
+3use fe_analyzer::{
+4    builtins::{ContractTypeMethod, GlobalFunction, ValueMethod},
+5    constants::{EMITTABLE_TRAIT_NAME, EMIT_FN_NAME},
+6    context::{Adjustment, AdjustmentKind, CallType as AnalyzerCallType, NamedThing},
+7    namespace::{
+8        items as analyzer_items,
+9        types::{self as analyzer_types, Type},
+10    },
+11};
+12use fe_common::numeric::Literal;
+13use fe_parser::{ast, node::Node};
+14use fxhash::FxHashMap;
+15use id_arena::{Arena, Id};
+16use num_bigint::BigInt;
+17use smol_str::SmolStr;
+18
+19use crate::{
+20    db::MirDb,
+21    ir::{
+22        self,
+23        body_builder::BodyBuilder,
+24        constant::ConstantValue,
+25        function::Linkage,
+26        inst::{CallType, InstKind},
+27        value::{AssignableValue, Local},
+28        BasicBlockId, Constant, FunctionBody, FunctionId, FunctionParam, FunctionSignature, InstId,
+29        SourceInfo, TypeId, Value, ValueId,
+30    },
+31};
+32
+33type ScopeId = Id<Scope>;
+34
+35pub fn lower_func_signature(db: &dyn MirDb, func: analyzer_items::FunctionId) -> FunctionId {
+36    lower_monomorphized_func_signature(db, func, BTreeMap::new())
+37}
+38pub fn lower_monomorphized_func_signature(
+39    db: &dyn MirDb,
+40    func: analyzer_items::FunctionId,
+41    resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+42) -> FunctionId {
+43    // TODO: Remove this when an analyzer's function signature contains `self` type.
+44    let mut params = vec![];
+45
+46    if func.takes_self(db.upcast()) {
+47        let self_ty = func.self_type(db.upcast()).unwrap();
+48        let source = self_arg_source(db, func);
+49        params.push(make_param(db, "self", self_ty, source));
+50    }
+51    let analyzer_signature = func.signature(db.upcast());
+52
+53    for param in analyzer_signature.params.iter() {
+54        let source = arg_source(db, func, &param.name);
+55
+56        let param_type =
+57            if let Type::Generic(generic) = param.typ.clone().unwrap().deref_typ(db.upcast()) {
+58                *resolved_generics.get(&generic.name).unwrap()
+59            } else {
+60                param.typ.clone().unwrap()
+61            };
+62
+63        params.push(make_param(db, param.clone().name, param_type, source))
+64    }
+65
+66    let return_type = db.mir_lowered_type(analyzer_signature.return_type.clone().unwrap());
+67
+68    let linkage = if func.is_public(db.upcast()) {
+69        if func.is_contract_func(db.upcast()) && !func.is_constructor(db.upcast()) {
+70            Linkage::Export
+71        } else {
+72            Linkage::Public
+73        }
+74    } else {
+75        Linkage::Private
+76    };
+77
+78    let sig = FunctionSignature {
+79        params,
+80        resolved_generics,
+81        return_type: Some(return_type),
+82        module_id: func.module(db.upcast()),
+83        analyzer_func_id: func,
+84        linkage,
+85    };
+86
+87    db.mir_intern_function(sig.into())
+88}
+89
+90pub fn lower_func_body(db: &dyn MirDb, func: FunctionId) -> Rc<FunctionBody> {
+91    let analyzer_func = func.analyzer_func(db);
+92    let ast = &analyzer_func.data(db.upcast()).ast;
+93    let analyzer_body = analyzer_func.body(db.upcast());
+94
+95    BodyLowerHelper::new(db, func, ast, analyzer_body.as_ref())
+96        .lower()
+97        .into()
+98}
+99
+100pub(super) struct BodyLowerHelper<'db, 'a> {
+101    pub(super) db: &'db dyn MirDb,
+102    pub(super) builder: BodyBuilder,
+103    ast: &'a Node<ast::Function>,
+104    func: FunctionId,
+105    analyzer_body: &'a fe_analyzer::context::FunctionBody,
+106    scopes: Arena<Scope>,
+107    current_scope: ScopeId,
+108}
+109
+110impl<'db, 'a> BodyLowerHelper<'db, 'a> {
+111    pub(super) fn lower_stmt(&mut self, stmt: &Node<ast::FuncStmt>) {
+112        match &stmt.kind {
+113            ast::FuncStmt::Return { value } => {
+114                let value = if let Some(expr) = value {
+115                    self.lower_expr_to_value(expr)
+116                } else {
+117                    self.make_unit()
+118                };
+119                self.builder.ret(value, stmt.into());
+120                let next_block = self.builder.make_block();
+121                self.builder.move_to_block(next_block);
+122            }
+123
+124            ast::FuncStmt::VarDecl { target, value, .. } => {
+125                self.lower_var_decl(target, value.as_ref(), stmt.into());
+126            }
+127
+128            ast::FuncStmt::ConstantDecl { name, value, .. } => {
+129                let ty = self.lower_analyzer_type(self.analyzer_body.var_types[&name.id]);
+130
+131                let value = self.analyzer_body.expressions[&value.id]
+132                    .const_value
+133                    .clone()
+134                    .unwrap();
+135
+136                let constant =
+137                    self.make_local_constant(name.kind.clone(), ty, value.into(), stmt.into());
+138                self.scope_mut().declare_var(&name.kind, constant);
+139            }
+140
+141            ast::FuncStmt::Assign { target, value } => {
+142                let result = self.lower_assignable_value(target);
+143                let (expr, _ty) = self.lower_expr(value);
+144                self.builder.map_result(expr, result)
+145            }
+146
+147            ast::FuncStmt::AugAssign { target, op, value } => {
+148                let result = self.lower_assignable_value(target);
+149                let lhs = self.lower_expr_to_value(target);
+150                let rhs = self.lower_expr_to_value(value);
+151
+152                let inst = self.lower_binop(op.kind, lhs, rhs, stmt.into());
+153                self.builder.map_result(inst, result)
+154            }
+155
+156            ast::FuncStmt::For { target, iter, body } => self.lower_for_loop(target, iter, body),
+157
+158            ast::FuncStmt::While { test, body } => {
+159                let header_bb = self.builder.make_block();
+160                let exit_bb = self.builder.make_block();
+161
+162                let cond = self.lower_expr_to_value(test);
+163                self.builder
+164                    .branch(cond, header_bb, exit_bb, SourceInfo::dummy());
+165
+166                // Lower while body.
+167                self.builder.move_to_block(header_bb);
+168                self.enter_loop_scope(header_bb, exit_bb);
+169                for stmt in body {
+170                    self.lower_stmt(stmt);
+171                }
+172                let cond = self.lower_expr_to_value(test);
+173                self.builder
+174                    .branch(cond, header_bb, exit_bb, SourceInfo::dummy());
+175
+176                self.leave_scope();
+177
+178                // Move to while exit bb.
+179                self.builder.move_to_block(exit_bb);
+180            }
+181
+182            ast::FuncStmt::If {
+183                test,
+184                body,
+185                or_else,
+186            } => self.lower_if(test, body, or_else),
+187
+188            ast::FuncStmt::Match { expr, arms } => {
+189                let matrix = &self.analyzer_body.matches[&stmt.id];
+190                super::pattern_match::lower_match(self, matrix, expr, arms);
+191            }
+192
+193            ast::FuncStmt::Assert { test, msg } => {
+194                let then_bb = self.builder.make_block();
+195                let false_bb = self.builder.make_block();
+196
+197                let cond = self.lower_expr_to_value(test);
+198                self.builder
+199                    .branch(cond, then_bb, false_bb, SourceInfo::dummy());
+200
+201                self.builder.move_to_block(false_bb);
+202
+203                let msg = match msg {
+204                    Some(msg) => self.lower_expr_to_value(msg),
+205                    None => self.make_u256_imm(1),
+206                };
+207                self.builder.revert(Some(msg), stmt.into());
+208                self.builder.move_to_block(then_bb);
+209            }
+210
+211            ast::FuncStmt::Expr { value } => {
+212                self.lower_expr_to_value(value);
+213            }
+214
+215            ast::FuncStmt::Break => {
+216                let exit = self.scope().loop_exit(&self.scopes);
+217                self.builder.jump(exit, stmt.into());
+218                let next_block = self.builder.make_block();
+219                self.builder.move_to_block(next_block);
+220            }
+221
+222            ast::FuncStmt::Continue => {
+223                let entry = self.scope().loop_entry(&self.scopes);
+224                if let Some(loop_idx) = self.scope().loop_idx(&self.scopes) {
+225                    let imm_one = self.make_u256_imm(1u32);
+226                    let inc = self.builder.add(loop_idx, imm_one, SourceInfo::dummy());
+227                    self.builder.map_result(inc, loop_idx.into());
+228                    let maximum_iter_count = self.scope().maximum_iter_count(&self.scopes).unwrap();
+229                    let exit = self.scope().loop_exit(&self.scopes);
+230                    self.branch_eq(loop_idx, maximum_iter_count, exit, entry, stmt.into());
+231                } else {
+232                    self.builder.jump(entry, stmt.into());
+233                }
+234                let next_block = self.builder.make_block();
+235                self.builder.move_to_block(next_block);
+236            }
+237
+238            ast::FuncStmt::Revert { error } => {
+239                let error = error.as_ref().map(|err| self.lower_expr_to_value(err));
+240                self.builder.revert(error, stmt.into());
+241                let next_block = self.builder.make_block();
+242                self.builder.move_to_block(next_block);
+243            }
+244
+245            ast::FuncStmt::Unsafe(stmts) => {
+246                self.enter_scope();
+247                for stmt in stmts {
+248                    self.lower_stmt(stmt)
+249                }
+250                self.leave_scope()
+251            }
+252        }
+253    }
+254
+255    pub(super) fn lower_var_decl(
+256        &mut self,
+257        var: &Node<ast::VarDeclTarget>,
+258        init: Option<&Node<ast::Expr>>,
+259        source: SourceInfo,
+260    ) {
+261        match &var.kind {
+262            ast::VarDeclTarget::Name(name) => {
+263                let ty = self.lower_analyzer_type(self.analyzer_body.var_types[&var.id]);
+264                let value = self.declare_var(name, ty, var.into());
+265                if let Some(init) = init {
+266                    let (init, _init_ty) = self.lower_expr(init);
+267                    // debug_assert_eq!(ty.deref(self.db), init_ty, "vardecl init type mismatch: {} != {}",
+268                    //                  ty.as_string(self.db),
+269                    //                  init_ty.as_string(self.db));
+270                    self.builder.map_result(init, value.into());
+271                }
+272            }
+273
+274            ast::VarDeclTarget::Tuple(decls) => {
+275                if let Some(init) = init {
+276                    if let ast::Expr::Tuple { elts } = &init.kind {
+277                        debug_assert_eq!(decls.len(), elts.len());
+278                        for (decl, init_elem) in decls.iter().zip(elts.iter()) {
+279                            self.lower_var_decl(decl, Some(init_elem), source.clone());
+280                        }
+281                    } else {
+282                        let init_ty = self.expr_ty(init);
+283                        let init_value = self.lower_expr_to_value(init);
+284                        self.lower_var_decl_unpack(var, init_value, init_ty, source);
+285                    };
+286                } else {
+287                    for decl in decls {
+288                        self.lower_var_decl(decl, None, source.clone())
+289                    }
+290                }
+291            }
+292        }
+293    }
+294
+295    pub(super) fn declare_var(
+296        &mut self,
+297        name: &SmolStr,
+298        ty: TypeId,
+299        source: SourceInfo,
+300    ) -> ValueId {
+301        let local = Local::user_local(name.clone(), ty, source);
+302        let value = self.builder.declare(local);
+303        self.scope_mut().declare_var(name, value);
+304        value
+305    }
+306
+307    pub(super) fn lower_var_decl_unpack(
+308        &mut self,
+309        var: &Node<ast::VarDeclTarget>,
+310        init: ValueId,
+311        init_ty: TypeId,
+312        source: SourceInfo,
+313    ) {
+314        match &var.kind {
+315            ast::VarDeclTarget::Name(name) => {
+316                let ty = self.lower_analyzer_type(self.analyzer_body.var_types[&var.id]);
+317                let local = Local::user_local(name.clone(), ty, var.into());
+318
+319                let lhs = self.builder.declare(local);
+320                self.scope_mut().declare_var(name, lhs);
+321                let bind = self.builder.bind(init, source);
+322                self.builder.map_result(bind, lhs.into());
+323            }
+324
+325            ast::VarDeclTarget::Tuple(decls) => {
+326                for (index, decl) in decls.iter().enumerate() {
+327                    let elem_ty = init_ty.projection_ty_imm(self.db, index);
+328                    let index_value = self.make_u256_imm(index);
+329                    let elem_inst =
+330                        self.builder
+331                            .aggregate_access(init, vec![index_value], source.clone());
+332                    let elem_value = self.map_to_tmp(elem_inst, elem_ty);
+333                    self.lower_var_decl_unpack(decl, elem_value, elem_ty, source.clone())
+334                }
+335            }
+336        }
+337    }
+338
+339    pub(super) fn lower_expr(&mut self, expr: &Node<ast::Expr>) -> (InstId, TypeId) {
+340        let mut ty = self.expr_ty(expr);
+341        let mut inst = match &expr.kind {
+342            ast::Expr::Ternary {
+343                if_expr,
+344                test,
+345                else_expr,
+346            } => {
+347                let true_bb = self.builder.make_block();
+348                let false_bb = self.builder.make_block();
+349                let merge_bb = self.builder.make_block();
+350
+351                let tmp = self
+352                    .builder
+353                    .declare(Local::tmp_local("$ternary_tmp".into(), ty));
+354
+355                let cond = self.lower_expr_to_value(test);
+356                self.builder
+357                    .branch(cond, true_bb, false_bb, SourceInfo::dummy());
+358
+359                self.builder.move_to_block(true_bb);
+360                let (value, _) = self.lower_expr(if_expr);
+361                self.builder.map_result(value, tmp.into());
+362                self.builder.jump(merge_bb, SourceInfo::dummy());
+363
+364                self.builder.move_to_block(false_bb);
+365                let (value, _) = self.lower_expr(else_expr);
+366                self.builder.map_result(value, tmp.into());
+367                self.builder.jump(merge_bb, SourceInfo::dummy());
+368
+369                self.builder.move_to_block(merge_bb);
+370                self.builder.bind(tmp, SourceInfo::dummy())
+371            }
+372
+373            ast::Expr::BoolOperation { left, op, right } => {
+374                self.lower_bool_op(op.kind, left, right, ty)
+375            }
+376
+377            ast::Expr::BinOperation { left, op, right } => {
+378                let lhs = self.lower_expr_to_value(left);
+379                let rhs = self.lower_expr_to_value(right);
+380                self.lower_binop(op.kind, lhs, rhs, expr.into())
+381            }
+382
+383            ast::Expr::UnaryOperation { op, operand } => {
+384                let value = self.lower_expr_to_value(operand);
+385                match op.kind {
+386                    ast::UnaryOperator::Invert => self.builder.inv(value, expr.into()),
+387                    ast::UnaryOperator::Not => self.builder.not(value, expr.into()),
+388                    ast::UnaryOperator::USub => self.builder.neg(value, expr.into()),
+389                }
+390            }
+391
+392            ast::Expr::CompOperation { left, op, right } => {
+393                let lhs = self.lower_expr_to_value(left);
+394                let rhs = self.lower_expr_to_value(right);
+395                self.lower_comp_op(op.kind, lhs, rhs, expr.into())
+396            }
+397
+398            ast::Expr::Attribute { .. } => {
+399                let mut indices = vec![];
+400                let value = self.lower_aggregate_access(expr, &mut indices);
+401                self.builder.aggregate_access(value, indices, expr.into())
+402            }
+403
+404            ast::Expr::Subscript { value, index } => {
+405                let value_ty = self.expr_ty(value).deref(self.db);
+406                if value_ty.is_aggregate(self.db) {
+407                    let mut indices = vec![];
+408                    let value = self.lower_aggregate_access(expr, &mut indices);
+409                    self.builder.aggregate_access(value, indices, expr.into())
+410                } else if value_ty.is_map(self.db) {
+411                    let value = self.lower_expr_to_value(value);
+412                    let key = self.lower_expr_to_value(index);
+413                    self.builder.map_access(value, key, expr.into())
+414                } else {
+415                    unreachable!()
+416                }
+417            }
+418
+419            ast::Expr::Call {
+420                func,
+421                generic_args,
+422                args,
+423            } => {
+424                let ty = self.expr_ty(expr);
+425                self.lower_call(func, generic_args, &args.kind, ty, expr.into())
+426            }
+427
+428            ast::Expr::List { elts } | ast::Expr::Tuple { elts } => {
+429                let args = elts
+430                    .iter()
+431                    .map(|elem| self.lower_expr_to_value(elem))
+432                    .collect();
+433                let ty = self.expr_ty(expr);
+434                self.builder.aggregate_construct(ty, args, expr.into())
+435            }
+436
+437            ast::Expr::Repeat { value, len: _ } => {
+438                let array_type = if let Type::Array(array_type) = self.analyzer_body.expressions
+439                    [&expr.id]
+440                    .typ
+441                    .typ(self.db.upcast())
+442                {
+443                    array_type
+444                } else {
+445                    panic!("not an array");
+446                };
+447
+448                let args = vec![self.lower_expr_to_value(value); array_type.size];
+449                let ty = self.expr_ty(expr);
+450                self.builder.aggregate_construct(ty, args, expr.into())
+451            }
+452
+453            ast::Expr::Bool(b) => {
+454                let imm = self.builder.make_imm_from_bool(*b, ty);
+455                self.builder.bind(imm, expr.into())
+456            }
+457
+458            ast::Expr::Name(name) => {
+459                let value = self.resolve_name(name);
+460                self.builder.bind(value, expr.into())
+461            }
+462
+463            ast::Expr::Path(path) => {
+464                let value = self.resolve_path(path, expr.into());
+465                self.builder.bind(value, expr.into())
+466            }
+467
+468            ast::Expr::Num(num) => {
+469                let imm = Literal::new(num).parse().unwrap();
+470                let imm = self.builder.make_imm(imm, ty);
+471                self.builder.bind(imm, expr.into())
+472            }
+473
+474            ast::Expr::Str(s) => {
+475                let ty = self.expr_ty(expr);
+476                let const_value = self.make_local_constant(
+477                    "str_in_func".into(),
+478                    ty,
+479                    ConstantValue::Str(s.clone()),
+480                    expr.into(),
+481                );
+482                self.builder.bind(const_value, expr.into())
+483            }
+484
+485            ast::Expr::Unit => {
+486                let value = self.make_unit();
+487                self.builder.bind(value, expr.into())
+488            }
+489        };
+490
+491        for Adjustment { into, kind } in &self.analyzer_body.expressions[&expr.id].type_adjustments
+492        {
+493            let into_ty = self.lower_analyzer_type(*into);
+494
+495            match kind {
+496                AdjustmentKind::Copy => {
+497                    let val = self.inst_result_or_tmp(inst, ty);
+498                    inst = self.builder.mem_copy(val, expr.into());
+499                }
+500                AdjustmentKind::Load => {
+501                    let val = self.inst_result_or_tmp(inst, ty);
+502                    inst = self.builder.load(val, expr.into());
+503                }
+504                AdjustmentKind::IntSizeIncrease => {
+505                    let val = self.inst_result_or_tmp(inst, ty);
+506                    inst = self.builder.primitive_cast(val, into_ty, expr.into())
+507                }
+508                AdjustmentKind::StringSizeIncrease => {} // XXX
+509            }
+510            ty = into_ty;
+511        }
+512        (inst, ty)
+513    }
+514
+515    fn inst_result_or_tmp(&mut self, inst: InstId, ty: TypeId) -> ValueId {
+516        self.builder
+517            .inst_result(inst)
+518            .and_then(|r| r.value_id())
+519            .unwrap_or_else(|| self.map_to_tmp(inst, ty))
+520    }
+521
+522    pub(super) fn lower_expr_to_value(&mut self, expr: &Node<ast::Expr>) -> ValueId {
+523        let (inst, ty) = self.lower_expr(expr);
+524        self.map_to_tmp(inst, ty)
+525    }
+526
+527    pub(super) fn enter_scope(&mut self) {
+528        let new_scope = Scope::with_parent(self.current_scope);
+529        self.current_scope = self.scopes.alloc(new_scope);
+530    }
+531
+532    pub(super) fn leave_scope(&mut self) {
+533        self.current_scope = self.scopes[self.current_scope].parent.unwrap();
+534    }
+535
+536    pub(super) fn make_imm(&mut self, imm: impl Into<BigInt>, ty: TypeId) -> ValueId {
+537        self.builder.make_value(Value::Immediate {
+538            imm: imm.into(),
+539            ty,
+540        })
+541    }
+542
+543    pub(super) fn make_u256_imm(&mut self, value: impl Into<BigInt>) -> ValueId {
+544        let u256_ty = self.u256_ty();
+545        self.make_imm(value, u256_ty)
+546    }
+547
+548    pub(super) fn map_to_tmp(&mut self, inst: InstId, ty: TypeId) -> ValueId {
+549        match &self.builder.inst_data(inst).kind {
+550            InstKind::Bind { src } => {
+551                let value = *src;
+552                self.builder.remove_inst(inst);
+553                value
+554            }
+555            _ => {
+556                let tmp = Value::Temporary { inst, ty };
+557                let result = self.builder.make_value(tmp);
+558                self.builder.map_result(inst, result.into());
+559                result
+560            }
+561        }
+562    }
+563
+564    fn new(
+565        db: &'db dyn MirDb,
+566        func: FunctionId,
+567        ast: &'a Node<ast::Function>,
+568        analyzer_body: &'a fe_analyzer::context::FunctionBody,
+569    ) -> Self {
+570        let mut builder = BodyBuilder::new(func, ast.into());
+571        let mut scopes = Arena::new();
+572
+573        // Make a root scope. A root scope collects function parameters and module
+574        // constants.
+575        let root = Scope::root(db, func, &mut builder);
+576        let current_scope = scopes.alloc(root);
+577        Self {
+578            db,
+579            builder,
+580            ast,
+581            func,
+582            analyzer_body,
+583            scopes,
+584            current_scope,
+585        }
+586    }
+587
+588    fn lower_analyzer_type(&self, analyzer_ty: analyzer_types::TypeId) -> TypeId {
+589        // If the analyzer type is generic we first need to resolve it to its concrete
+590        // type before lowering to a MIR type
+591        if let analyzer_types::Type::Generic(generic) = analyzer_ty.deref_typ(self.db.upcast()) {
+592            let resolved_type = self
+593                .func
+594                .signature(self.db)
+595                .resolved_generics
+596                .get(&generic.name)
+597                .cloned()
+598                .expect("expected generic to be resolved");
+599
+600            return self.db.mir_lowered_type(resolved_type);
+601        }
+602
+603        self.db.mir_lowered_type(analyzer_ty)
+604    }
+605
+606    fn lower(mut self) -> FunctionBody {
+607        for stmt in &self.ast.kind.body {
+608            self.lower_stmt(stmt)
+609        }
+610
+611        let last_block = self.builder.current_block();
+612        if !self.builder.is_block_terminated(last_block) {
+613            let unit = self.make_unit();
+614            self.builder.ret(unit, SourceInfo::dummy());
+615        }
+616
+617        self.builder.build()
+618    }
+619
+620    fn branch_eq(
+621        &mut self,
+622        v1: ValueId,
+623        v2: ValueId,
+624        true_bb: BasicBlockId,
+625        false_bb: BasicBlockId,
+626        source: SourceInfo,
+627    ) {
+628        let cond = self.builder.eq(v1, v2, source.clone());
+629        let bool_ty = self.bool_ty();
+630        let cond = self.map_to_tmp(cond, bool_ty);
+631        self.builder.branch(cond, true_bb, false_bb, source);
+632    }
+633
+634    fn lower_if(
+635        &mut self,
+636        cond: &Node<ast::Expr>,
+637        then: &[Node<ast::FuncStmt>],
+638        else_: &[Node<ast::FuncStmt>],
+639    ) {
+640        let cond = self.lower_expr_to_value(cond);
+641
+642        if else_.is_empty() {
+643            let then_bb = self.builder.make_block();
+644            let merge_bb = self.builder.make_block();
+645
+646            self.builder
+647                .branch(cond, then_bb, merge_bb, SourceInfo::dummy());
+648
+649            // Lower then block.
+650            self.builder.move_to_block(then_bb);
+651            self.enter_scope();
+652            for stmt in then {
+653                self.lower_stmt(stmt);
+654            }
+655            self.builder.jump(merge_bb, SourceInfo::dummy());
+656            self.builder.move_to_block(merge_bb);
+657            self.leave_scope();
+658        } else {
+659            let then_bb = self.builder.make_block();
+660            let else_bb = self.builder.make_block();
+661
+662            self.builder
+663                .branch(cond, then_bb, else_bb, SourceInfo::dummy());
+664
+665            // Lower then block.
+666            self.builder.move_to_block(then_bb);
+667            self.enter_scope();
+668            for stmt in then {
+669                self.lower_stmt(stmt);
+670            }
+671            self.leave_scope();
+672            let then_block_end_bb = self.builder.current_block();
+673
+674            // Lower else_block.
+675            self.builder.move_to_block(else_bb);
+676            self.enter_scope();
+677            for stmt in else_ {
+678                self.lower_stmt(stmt);
+679            }
+680            self.leave_scope();
+681            let else_block_end_bb = self.builder.current_block();
+682
+683            let merge_bb = self.builder.make_block();
+684            if !self.builder.is_block_terminated(then_block_end_bb) {
+685                self.builder.move_to_block(then_block_end_bb);
+686                self.builder.jump(merge_bb, SourceInfo::dummy());
+687            }
+688            if !self.builder.is_block_terminated(else_block_end_bb) {
+689                self.builder.move_to_block(else_block_end_bb);
+690                self.builder.jump(merge_bb, SourceInfo::dummy());
+691            }
+692            self.builder.move_to_block(merge_bb);
+693        }
+694    }
+695
+696    // NOTE: we assume a type of `iter` is array.
+697    // TODO: Desugar to `loop` + `match` like rustc in HIR to generate better MIR.
+698    fn lower_for_loop(
+699        &mut self,
+700        loop_variable: &Node<SmolStr>,
+701        iter: &Node<ast::Expr>,
+702        body: &[Node<ast::FuncStmt>],
+703    ) {
+704        let preheader_bb = self.builder.make_block();
+705        let entry_bb = self.builder.make_block();
+706        let exit_bb = self.builder.make_block();
+707
+708        let iter_elem_ty = self.analyzer_body.var_types[&loop_variable.id];
+709        let iter_elem_ty = self.lower_analyzer_type(iter_elem_ty);
+710
+711        self.builder.jump(preheader_bb, SourceInfo::dummy());
+712
+713        // `For` has its scope from preheader block.
+714        self.enter_loop_scope(entry_bb, exit_bb);
+715
+716        /* Lower preheader. */
+717        self.builder.move_to_block(preheader_bb);
+718
+719        // Declare loop_variable.
+720        let loop_value = self.builder.declare(Local::user_local(
+721            loop_variable.kind.clone(),
+722            iter_elem_ty,
+723            loop_variable.into(),
+724        ));
+725        self.scope_mut()
+726            .declare_var(&loop_variable.kind, loop_value);
+727
+728        // Declare and initialize `loop_idx` to 0.
+729        let loop_idx = Local::tmp_local("$loop_idx_tmp".into(), self.u256_ty());
+730        let loop_idx = self.builder.declare(loop_idx);
+731        let imm_zero = self.make_u256_imm(0u32);
+732        let imm_zero = self.builder.bind(imm_zero, SourceInfo::dummy());
+733        self.builder.map_result(imm_zero, loop_idx.into());
+734
+735        // Evaluates loop variable.
+736        let iter_ty = self.expr_ty(iter);
+737        let iter = self.lower_expr_to_value(iter);
+738
+739        // Create maximum loop count.
+740        let maximum_iter_count = match &iter_ty.deref(self.db).data(self.db).kind {
+741            ir::TypeKind::Array(ir::types::ArrayDef { len, .. }) => *len,
+742            _ => unreachable!(),
+743        };
+744        let maximum_iter_count = self.make_u256_imm(maximum_iter_count);
+745        self.branch_eq(
+746            loop_idx,
+747            maximum_iter_count,
+748            exit_bb,
+749            entry_bb,
+750            SourceInfo::dummy(),
+751        );
+752        self.scope_mut().loop_idx = Some(loop_idx);
+753        self.scope_mut().maximum_iter_count = Some(maximum_iter_count);
+754
+755        /* Lower body. */
+756        self.builder.move_to_block(entry_bb);
+757
+758        // loop_variable = array[loop_idx]
+759        let iter_elem = self
+760            .builder
+761            .aggregate_access(iter, vec![loop_idx], SourceInfo::dummy());
+762        self.builder
+763            .map_result(iter_elem, AssignableValue::Value(loop_value));
+764
+765        for stmt in body {
+766            self.lower_stmt(stmt);
+767        }
+768
+769        // loop_idx += 1
+770        let imm_one = self.make_u256_imm(1u32);
+771        let inc = self.builder.add(loop_idx, imm_one, SourceInfo::dummy());
+772        self.builder
+773            .map_result(inc, AssignableValue::Value(loop_idx));
+774        self.branch_eq(
+775            loop_idx,
+776            maximum_iter_count,
+777            exit_bb,
+778            entry_bb,
+779            SourceInfo::dummy(),
+780        );
+781
+782        /* Move to exit bb */
+783        self.leave_scope();
+784        self.builder.move_to_block(exit_bb);
+785    }
+786
+787    fn lower_assignable_value(&mut self, expr: &Node<ast::Expr>) -> AssignableValue {
+788        match &expr.kind {
+789            ast::Expr::Attribute { value, attr } => {
+790                let idx = self.expr_ty(value).index_from_fname(self.db, &attr.kind);
+791                let idx = self.make_u256_imm(idx);
+792                let lhs = self.lower_assignable_value(value).into();
+793                AssignableValue::Aggregate { lhs, idx }
+794            }
+795            ast::Expr::Subscript { value, index } => {
+796                let lhs = self.lower_assignable_value(value).into();
+797                let attr = self.lower_expr_to_value(index);
+798                let value_ty = self.expr_ty(value).deref(self.db);
+799                if value_ty.is_aggregate(self.db) {
+800                    AssignableValue::Aggregate { lhs, idx: attr }
+801                } else if value_ty.is_map(self.db) {
+802                    AssignableValue::Map { lhs, key: attr }
+803                } else {
+804                    unreachable!()
+805                }
+806            }
+807            ast::Expr::Name(name) => self.resolve_name(name).into(),
+808            ast::Expr::Path(path) => self.resolve_path(path, expr.into()).into(),
+809            _ => self.lower_expr_to_value(expr).into(),
+810        }
+811    }
+812
+813    /// Returns the pre-adjustment type of the given `Expr`
+814    fn expr_ty(&self, expr: &Node<ast::Expr>) -> TypeId {
+815        let analyzer_ty = self.analyzer_body.expressions[&expr.id].typ;
+816        self.lower_analyzer_type(analyzer_ty)
+817    }
+818
+819    fn lower_bool_op(
+820        &mut self,
+821        op: ast::BoolOperator,
+822        lhs: &Node<ast::Expr>,
+823        rhs: &Node<ast::Expr>,
+824        ty: TypeId,
+825    ) -> InstId {
+826        let true_bb = self.builder.make_block();
+827        let false_bb = self.builder.make_block();
+828        let merge_bb = self.builder.make_block();
+829
+830        let lhs = self.lower_expr_to_value(lhs);
+831        let tmp = self
+832            .builder
+833            .declare(Local::tmp_local(format!("${op}_tmp").into(), ty));
+834
+835        match op {
+836            ast::BoolOperator::And => {
+837                self.builder
+838                    .branch(lhs, true_bb, false_bb, SourceInfo::dummy());
+839
+840                self.builder.move_to_block(true_bb);
+841                let (rhs, _rhs_ty) = self.lower_expr(rhs);
+842                self.builder.map_result(rhs, tmp.into());
+843                self.builder.jump(merge_bb, SourceInfo::dummy());
+844
+845                self.builder.move_to_block(false_bb);
+846                let false_imm = self.builder.make_imm_from_bool(false, ty);
+847                let false_imm_copy = self.builder.bind(false_imm, SourceInfo::dummy());
+848                self.builder.map_result(false_imm_copy, tmp.into());
+849                self.builder.jump(merge_bb, SourceInfo::dummy());
+850            }
+851
+852            ast::BoolOperator::Or => {
+853                self.builder
+854                    .branch(lhs, true_bb, false_bb, SourceInfo::dummy());
+855
+856                self.builder.move_to_block(true_bb);
+857                let true_imm = self.builder.make_imm_from_bool(true, ty);
+858                let true_imm_copy = self.builder.bind(true_imm, SourceInfo::dummy());
+859                self.builder.map_result(true_imm_copy, tmp.into());
+860                self.builder.jump(merge_bb, SourceInfo::dummy());
+861
+862                self.builder.move_to_block(false_bb);
+863                let (rhs, _rhs_ty) = self.lower_expr(rhs);
+864                self.builder.map_result(rhs, tmp.into());
+865                self.builder.jump(merge_bb, SourceInfo::dummy());
+866            }
+867        }
+868
+869        self.builder.move_to_block(merge_bb);
+870        self.builder.bind(tmp, SourceInfo::dummy())
+871    }
+872
+873    fn lower_binop(
+874        &mut self,
+875        op: ast::BinOperator,
+876        lhs: ValueId,
+877        rhs: ValueId,
+878        source: SourceInfo,
+879    ) -> InstId {
+880        match op {
+881            ast::BinOperator::Add => self.builder.add(lhs, rhs, source),
+882            ast::BinOperator::Sub => self.builder.sub(lhs, rhs, source),
+883            ast::BinOperator::Mult => self.builder.mul(lhs, rhs, source),
+884            ast::BinOperator::Div => self.builder.div(lhs, rhs, source),
+885            ast::BinOperator::Mod => self.builder.modulo(lhs, rhs, source),
+886            ast::BinOperator::Pow => self.builder.pow(lhs, rhs, source),
+887            ast::BinOperator::LShift => self.builder.shl(lhs, rhs, source),
+888            ast::BinOperator::RShift => self.builder.shr(lhs, rhs, source),
+889            ast::BinOperator::BitOr => self.builder.bit_or(lhs, rhs, source),
+890            ast::BinOperator::BitXor => self.builder.bit_xor(lhs, rhs, source),
+891            ast::BinOperator::BitAnd => self.builder.bit_and(lhs, rhs, source),
+892        }
+893    }
+894
+895    fn lower_comp_op(
+896        &mut self,
+897        op: ast::CompOperator,
+898        lhs: ValueId,
+899        rhs: ValueId,
+900        source: SourceInfo,
+901    ) -> InstId {
+902        match op {
+903            ast::CompOperator::Eq => self.builder.eq(lhs, rhs, source),
+904            ast::CompOperator::NotEq => self.builder.ne(lhs, rhs, source),
+905            ast::CompOperator::Lt => self.builder.lt(lhs, rhs, source),
+906            ast::CompOperator::LtE => self.builder.le(lhs, rhs, source),
+907            ast::CompOperator::Gt => self.builder.gt(lhs, rhs, source),
+908            ast::CompOperator::GtE => self.builder.ge(lhs, rhs, source),
+909        }
+910    }
+911
+912    fn resolve_generics_args(
+913        &mut self,
+914        method: &analyzer_items::FunctionId,
+915        args: &[Id<Value>],
+916    ) -> BTreeMap<SmolStr, analyzer_types::TypeId> {
+917        method
+918            .signature(self.db.upcast())
+919            .params
+920            .iter()
+921            .zip(args.iter().map(|val| {
+922                self.builder
+923                    .value_ty(*val)
+924                    .analyzer_ty(self.db)
+925                    .expect("invalid parameter")
+926            }))
+927            .filter_map(|(param, typ)| {
+928                if let Type::Generic(generic) =
+929                    param.typ.clone().unwrap().deref_typ(self.db.upcast())
+930                {
+931                    Some((generic.name, typ))
+932                } else {
+933                    None
+934                }
+935            })
+936            .collect::<BTreeMap<_, _>>()
+937    }
+938
+939    fn lower_function_id(
+940        &mut self,
+941        function: &analyzer_items::FunctionId,
+942        args: &[Id<Value>],
+943    ) -> FunctionId {
+944        let resolved_generics = self.resolve_generics_args(function, args);
+945        if function.is_generic(self.db.upcast()) {
+946            self.db
+947                .mir_lowered_monomorphized_func_signature(*function, resolved_generics)
+948        } else {
+949            self.db.mir_lowered_func_signature(*function)
+950        }
+951    }
+952
+953    fn lower_call(
+954        &mut self,
+955        func: &Node<ast::Expr>,
+956        _generic_args: &Option<Node<Vec<ast::GenericArg>>>,
+957        args: &[Node<ast::CallArg>],
+958        ty: TypeId,
+959        source: SourceInfo,
+960    ) -> InstId {
+961        let call_type = &self.analyzer_body.calls[&func.id];
+962
+963        let mut args: Vec<_> = args
+964            .iter()
+965            .map(|arg| self.lower_expr_to_value(&arg.kind.value))
+966            .collect();
+967
+968        match call_type {
+969            AnalyzerCallType::BuiltinFunction(GlobalFunction::Keccak256) => {
+970                self.builder.keccak256(args[0], source)
+971            }
+972
+973            AnalyzerCallType::Intrinsic(intrinsic) => {
+974                self.builder
+975                    .yul_intrinsic((*intrinsic).into(), args, source)
+976            }
+977
+978            AnalyzerCallType::BuiltinValueMethod { method, .. } => {
+979                let arg = self.lower_method_receiver(func);
+980                match method {
+981                    ValueMethod::ToMem => self.builder.mem_copy(arg, source),
+982                    ValueMethod::AbiEncode => self.builder.abi_encode(arg, source),
+983                }
+984            }
+985
+986            // We ignores `args[0]', which represents `context` and not used for now.
+987            AnalyzerCallType::BuiltinAssociatedFunction { contract, function } => match function {
+988                ContractTypeMethod::Create => self.builder.create(args[1], *contract, source),
+989                ContractTypeMethod::Create2 => {
+990                    self.builder.create2(args[1], args[2], *contract, source)
+991                }
+992            },
+993
+994            AnalyzerCallType::AssociatedFunction { function, .. }
+995            | AnalyzerCallType::Pure(function) => {
+996                let func_id = self.lower_function_id(function, &args);
+997                self.builder.call(func_id, args, CallType::Internal, source)
+998            }
+999
+1000            AnalyzerCallType::ValueMethod { method, .. } => {
+1001                let mut method_args = vec![self.lower_method_receiver(func)];
+1002                let func_id = self.lower_function_id(method, &args);
+1003
+1004                method_args.append(&mut args);
+1005
+1006                self.builder
+1007                    .call(func_id, method_args, CallType::Internal, source)
+1008            }
+1009            AnalyzerCallType::TraitValueMethod {
+1010                trait_id, method, ..
+1011            } if trait_id.is_std_trait(self.db.upcast(), EMITTABLE_TRAIT_NAME)
+1012                && method.name(self.db.upcast()) == EMIT_FN_NAME =>
+1013            {
+1014                let event = self.lower_method_receiver(func);
+1015                self.builder.emit(event, source)
+1016            }
+1017            AnalyzerCallType::TraitValueMethod {
+1018                method,
+1019                trait_id,
+1020                generic_type,
+1021                ..
+1022            } => {
+1023                let mut method_args = vec![self.lower_method_receiver(func)];
+1024                method_args.append(&mut args);
+1025
+1026                let concrete_type = self
+1027                    .func
+1028                    .signature(self.db)
+1029                    .resolved_generics
+1030                    .get(&generic_type.name)
+1031                    .cloned()
+1032                    .expect("unresolved generic type");
+1033
+1034                let impl_ = concrete_type
+1035                    .get_impl_for(self.db.upcast(), *trait_id)
+1036                    .expect("missing impl");
+1037
+1038                let function = impl_
+1039                    .function(self.db.upcast(), &method.name(self.db.upcast()))
+1040                    .expect("missing function");
+1041
+1042                let func_id = self.db.mir_lowered_func_signature(function);
+1043                self.builder
+1044                    .call(func_id, method_args, CallType::Internal, source)
+1045            }
+1046            AnalyzerCallType::External { function, .. } => {
+1047                let receiver = self.lower_method_receiver(func);
+1048                debug_assert!(self.builder.value_ty(receiver).is_address(self.db));
+1049
+1050                let mut method_args = vec![receiver];
+1051                method_args.append(&mut args);
+1052                let func_id = self.db.mir_lowered_func_signature(*function);
+1053                self.builder
+1054                    .call(func_id, method_args, CallType::External, source)
+1055            }
+1056
+1057            AnalyzerCallType::TypeConstructor(to_ty) => {
+1058                if to_ty.is_string(self.db.upcast()) {
+1059                    let arg = *args.last().unwrap();
+1060                    self.builder.mem_copy(arg, source)
+1061                } else if ty.is_primitive(self.db) {
+1062                    // TODO: Ignore `ctx` for now.
+1063                    let arg = *args.last().unwrap();
+1064                    let arg_ty = self.builder.value_ty(arg);
+1065                    if arg_ty == ty {
+1066                        self.builder.bind(arg, source)
+1067                    } else {
+1068                        debug_assert!(!arg_ty.is_ptr(self.db)); // Should be explicitly `Load`ed
+1069                        self.builder.primitive_cast(arg, ty, source)
+1070                    }
+1071                } else if ty.is_aggregate(self.db) {
+1072                    self.builder.aggregate_construct(ty, args, source)
+1073                } else {
+1074                    unreachable!()
+1075                }
+1076            }
+1077
+1078            AnalyzerCallType::EnumConstructor(variant) => {
+1079                let tag_type = ty.enum_disc_type(self.db);
+1080                let tag = self.make_imm(variant.disc(self.db.upcast()), tag_type);
+1081                let data_ty = ty.enum_variant_type(self.db, *variant);
+1082                let enum_args = if data_ty.is_unit(self.db) {
+1083                    vec![tag, self.make_unit()]
+1084                } else {
+1085                    std::iter::once(tag).chain(args).collect()
+1086                };
+1087                self.builder.aggregate_construct(ty, enum_args, source)
+1088            }
+1089        }
+1090    }
+1091
+1092    // FIXME: This is ugly hack to properly analyze method call. Remove this when  https://github.com/ethereum/fe/issues/670 is resolved.
+1093    fn lower_method_receiver(&mut self, receiver: &Node<ast::Expr>) -> ValueId {
+1094        match &receiver.kind {
+1095            ast::Expr::Attribute { value, .. } => self.lower_expr_to_value(value),
+1096            _ => unreachable!(),
+1097        }
+1098    }
+1099
+1100    fn lower_aggregate_access(
+1101        &mut self,
+1102        expr: &Node<ast::Expr>,
+1103        indices: &mut Vec<ValueId>,
+1104    ) -> ValueId {
+1105        match &expr.kind {
+1106            ast::Expr::Attribute { value, attr } => {
+1107                let index = self.expr_ty(value).index_from_fname(self.db, &attr.kind);
+1108                let value = self.lower_aggregate_access(value, indices);
+1109                indices.push(self.make_u256_imm(index));
+1110                value
+1111            }
+1112
+1113            ast::Expr::Subscript { value, index }
+1114                if self.expr_ty(value).deref(self.db).is_aggregate(self.db) =>
+1115            {
+1116                let value = self.lower_aggregate_access(value, indices);
+1117                indices.push(self.lower_expr_to_value(index));
+1118                value
+1119            }
+1120
+1121            _ => self.lower_expr_to_value(expr),
+1122        }
+1123    }
+1124
+1125    fn make_unit(&mut self) -> ValueId {
+1126        let unit_ty = analyzer_types::TypeId::unit(self.db.upcast());
+1127        let unit_ty = self.db.mir_lowered_type(unit_ty);
+1128        self.builder.make_unit(unit_ty)
+1129    }
+1130
+1131    fn make_local_constant(
+1132        &mut self,
+1133        name: SmolStr,
+1134        ty: TypeId,
+1135        value: ConstantValue,
+1136        source: SourceInfo,
+1137    ) -> ValueId {
+1138        let function_id = self.builder.func_id();
+1139        let constant = Constant {
+1140            name,
+1141            value,
+1142            ty,
+1143            module_id: function_id.module(self.db),
+1144            source,
+1145        };
+1146
+1147        let constant_id = self.db.mir_intern_const(constant.into());
+1148        self.builder.make_constant(constant_id, ty)
+1149    }
+1150
+1151    fn u256_ty(&mut self) -> TypeId {
+1152        self.db
+1153            .mir_intern_type(ir::Type::new(ir::TypeKind::U256, None).into())
+1154    }
+1155
+1156    fn bool_ty(&mut self) -> TypeId {
+1157        self.db
+1158            .mir_intern_type(ir::Type::new(ir::TypeKind::Bool, None).into())
+1159    }
+1160
+1161    fn enter_loop_scope(&mut self, entry: BasicBlockId, exit: BasicBlockId) {
+1162        let new_scope = Scope::loop_scope(self.current_scope, entry, exit);
+1163        self.current_scope = self.scopes.alloc(new_scope);
+1164    }
+1165
+1166    /// Resolve a name appeared in an expression.
+1167    /// NOTE: Don't call this to resolve method receiver.
+1168    fn resolve_name(&mut self, name: &str) -> ValueId {
+1169        if let Some(value) = self.scopes[self.current_scope].resolve_name(&self.scopes, name) {
+1170            // Name is defined in local.
+1171            value
+1172        } else {
+1173            // Name is defined in global.
+1174            let func_id = self.builder.func_id();
+1175            let module = func_id.module(self.db);
+1176            let constant = match module
+1177                .resolve_name(self.db.upcast(), name)
+1178                .unwrap()
+1179                .unwrap()
+1180            {
+1181                NamedThing::Item(analyzer_items::Item::Constant(id)) => {
+1182                    self.db.mir_lowered_constant(id)
+1183                }
+1184                _ => panic!("name defined in global must be constant"),
+1185            };
+1186            let ty = constant.ty(self.db);
+1187            self.builder.make_constant(constant, ty)
+1188        }
+1189    }
+1190
+1191    /// Resolve a path appeared in an expression.
+1192    /// NOTE: Don't call this to resolve method receiver.
+1193    fn resolve_path(&mut self, path: &ast::Path, source: SourceInfo) -> ValueId {
+1194        let func_id = self.builder.func_id();
+1195        let module = func_id.module(self.db);
+1196        match module.resolve_path(self.db.upcast(), path).value.unwrap() {
+1197            NamedThing::Item(analyzer_items::Item::Constant(id)) => {
+1198                let constant = self.db.mir_lowered_constant(id);
+1199                let ty = constant.ty(self.db);
+1200                self.builder.make_constant(constant, ty)
+1201            }
+1202            NamedThing::EnumVariant(variant) => {
+1203                let enum_ty = self
+1204                    .db
+1205                    .mir_lowered_type(variant.parent(self.db.upcast()).as_type(self.db.upcast()));
+1206                let tag_type = enum_ty.enum_disc_type(self.db);
+1207                let tag = self.make_imm(variant.disc(self.db.upcast()), tag_type);
+1208                let data = self.make_unit();
+1209                let enum_args = vec![tag, data];
+1210                let inst = self.builder.aggregate_construct(enum_ty, enum_args, source);
+1211                self.map_to_tmp(inst, enum_ty)
+1212            }
+1213            _ => panic!("path defined in global must be constant"),
+1214        }
+1215    }
+1216
+1217    fn scope(&self) -> &Scope {
+1218        &self.scopes[self.current_scope]
+1219    }
+1220
+1221    fn scope_mut(&mut self) -> &mut Scope {
+1222        &mut self.scopes[self.current_scope]
+1223    }
+1224}
+1225
+1226#[derive(Debug)]
+1227struct Scope {
+1228    parent: Option<ScopeId>,
+1229    loop_entry: Option<BasicBlockId>,
+1230    loop_exit: Option<BasicBlockId>,
+1231    variables: FxHashMap<SmolStr, ValueId>,
+1232    // TODO: Remove the below two fields when `for` loop desugaring is implemented.
+1233    loop_idx: Option<ValueId>,
+1234    maximum_iter_count: Option<ValueId>,
+1235}
+1236
+1237impl Scope {
+1238    fn root(db: &dyn MirDb, func: FunctionId, builder: &mut BodyBuilder) -> Self {
+1239        let mut root = Self {
+1240            parent: None,
+1241            loop_entry: None,
+1242            loop_exit: None,
+1243            variables: FxHashMap::default(),
+1244            loop_idx: None,
+1245            maximum_iter_count: None,
+1246        };
+1247
+1248        // Declare function parameters.
+1249        for param in &func.signature(db).params {
+1250            let local = Local::arg_local(param.name.clone(), param.ty, param.source.clone());
+1251            let value_id = builder.store_func_arg(local);
+1252            root.declare_var(&param.name, value_id)
+1253        }
+1254
+1255        root
+1256    }
+1257
+1258    fn with_parent(parent: ScopeId) -> Self {
+1259        Self {
+1260            parent: parent.into(),
+1261            loop_entry: None,
+1262            loop_exit: None,
+1263            variables: FxHashMap::default(),
+1264            loop_idx: None,
+1265            maximum_iter_count: None,
+1266        }
+1267    }
+1268
+1269    fn loop_scope(parent: ScopeId, loop_entry: BasicBlockId, loop_exit: BasicBlockId) -> Self {
+1270        Self {
+1271            parent: parent.into(),
+1272            loop_entry: loop_entry.into(),
+1273            loop_exit: loop_exit.into(),
+1274            variables: FxHashMap::default(),
+1275            loop_idx: None,
+1276            maximum_iter_count: None,
+1277        }
+1278    }
+1279
+1280    fn loop_entry(&self, scopes: &Arena<Scope>) -> BasicBlockId {
+1281        match self.loop_entry {
+1282            Some(entry) => entry,
+1283            None => scopes[self.parent.unwrap()].loop_entry(scopes),
+1284        }
+1285    }
+1286
+1287    fn loop_exit(&self, scopes: &Arena<Scope>) -> BasicBlockId {
+1288        match self.loop_exit {
+1289            Some(exit) => exit,
+1290            None => scopes[self.parent.unwrap()].loop_exit(scopes),
+1291        }
+1292    }
+1293
+1294    fn loop_idx(&self, scopes: &Arena<Scope>) -> Option<ValueId> {
+1295        match self.loop_idx {
+1296            Some(idx) => Some(idx),
+1297            None => scopes[self.parent?].loop_idx(scopes),
+1298        }
+1299    }
+1300
+1301    fn maximum_iter_count(&self, scopes: &Arena<Scope>) -> Option<ValueId> {
+1302        match self.maximum_iter_count {
+1303            Some(count) => Some(count),
+1304            None => scopes[self.parent?].maximum_iter_count(scopes),
+1305        }
+1306    }
+1307
+1308    fn declare_var(&mut self, name: &SmolStr, value: ValueId) {
+1309        debug_assert!(!self.variables.contains_key(name));
+1310
+1311        self.variables.insert(name.clone(), value);
+1312    }
+1313
+1314    fn resolve_name(&self, scopes: &Arena<Scope>, name: &str) -> Option<ValueId> {
+1315        match self.variables.get(name) {
+1316            Some(id) => Some(*id),
+1317            None => scopes[self.parent?].resolve_name(scopes, name),
+1318        }
+1319    }
+1320}
+1321
+1322fn self_arg_source(db: &dyn MirDb, func: analyzer_items::FunctionId) -> SourceInfo {
+1323    func.data(db.upcast())
+1324        .ast
+1325        .kind
+1326        .sig
+1327        .kind
+1328        .args
+1329        .iter()
+1330        .find(|arg| matches!(arg.kind, ast::FunctionArg::Self_ { .. }))
+1331        .unwrap()
+1332        .into()
+1333}
+1334
+1335fn arg_source(db: &dyn MirDb, func: analyzer_items::FunctionId, arg_name: &str) -> SourceInfo {
+1336    func.data(db.upcast())
+1337        .ast
+1338        .kind
+1339        .sig
+1340        .kind
+1341        .args
+1342        .iter()
+1343        .find_map(|arg| match &arg.kind {
+1344            ast::FunctionArg::Regular { name, .. } => {
+1345                if name.kind == arg_name {
+1346                    Some(name.into())
+1347                } else {
+1348                    None
+1349                }
+1350            }
+1351            ast::FunctionArg::Self_ { .. } => None,
+1352        })
+1353        .unwrap()
+1354}
+1355
+1356fn make_param(
+1357    db: &dyn MirDb,
+1358    name: impl Into<SmolStr>,
+1359    ty: analyzer_types::TypeId,
+1360    source: SourceInfo,
+1361) -> FunctionParam {
+1362    FunctionParam {
+1363        name: name.into(),
+1364        ty: db.mir_lowered_type(ty),
+1365        source,
+1366    }
+1367}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/mod.rs.html b/compiler-docs/src/fe_mir/lower/mod.rs.html new file mode 100644 index 0000000000..da96068652 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/mod.rs.html @@ -0,0 +1,4 @@ +mod.rs - source

fe_mir/lower/
mod.rs

1pub mod function;
+2pub mod types;
+3
+4mod pattern_match;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html b/compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html new file mode 100644 index 0000000000..32f1bbf19a --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html @@ -0,0 +1,576 @@ +decision_tree.rs - source

fe_mir/lower/pattern_match/
decision_tree.rs

1//! This module contains the decision tree definition and its construction
+2//! function.
+3//! The algorithm for efficient decision tree construction is mainly based on [Compiling pattern matching to good decision trees](https://dl.acm.org/doi/10.1145/1411304.1411311).
+4use std::io;
+5
+6use fe_analyzer::{
+7    pattern_analysis::{
+8        ConstructorKind, PatternMatrix, PatternRowVec, SigmaSet, SimplifiedPattern,
+9        SimplifiedPatternKind,
+10    },
+11    AnalyzerDb,
+12};
+13use indexmap::IndexMap;
+14use smol_str::SmolStr;
+15
+16use super::tree_vis::TreeRenderer;
+17
+18pub fn build_decision_tree(
+19    db: &dyn AnalyzerDb,
+20    pattern_matrix: &PatternMatrix,
+21    policy: ColumnSelectionPolicy,
+22) -> DecisionTree {
+23    let builder = DecisionTreeBuilder::new(policy);
+24    let simplified_arms = SimplifiedArmMatrix::new(pattern_matrix);
+25
+26    builder.build(db, simplified_arms)
+27}
+28
+29#[derive(Debug)]
+30pub enum DecisionTree {
+31    Leaf(LeafNode),
+32    Switch(SwitchNode),
+33}
+34
+35impl DecisionTree {
+36    #[allow(unused)]
+37    pub fn dump_dot<W>(&self, db: &dyn AnalyzerDb, w: &mut W) -> io::Result<()>
+38    where
+39        W: io::Write,
+40    {
+41        let renderer = TreeRenderer::new(db, self);
+42        dot2::render(&renderer, w).map_err(|err| match err {
+43            dot2::Error::Io(err) => err,
+44            _ => panic!("invalid graphviz id"),
+45        })
+46    }
+47}
+48
+49#[derive(Debug)]
+50pub struct LeafNode {
+51    pub arm_idx: usize,
+52    pub binds: IndexMap<(SmolStr, usize), Occurrence>,
+53}
+54
+55impl LeafNode {
+56    fn new(arm: SimplifiedArm, occurrences: &[Occurrence]) -> Self {
+57        let arm_idx = arm.body;
+58        let binds = arm.finalize_binds(occurrences);
+59        Self { arm_idx, binds }
+60    }
+61}
+62
+63#[derive(Debug)]
+64pub struct SwitchNode {
+65    pub occurrence: Occurrence,
+66    pub arms: Vec<(Case, DecisionTree)>,
+67}
+68
+69#[derive(Debug, Clone, Copy)]
+70pub enum Case {
+71    Ctor(ConstructorKind),
+72    Default,
+73}
+74
+75#[derive(Debug, Clone, Default)]
+76pub struct ColumnSelectionPolicy(Vec<ColumnScoringFunction>);
+77
+78impl ColumnSelectionPolicy {
+79    /// The score of column i is the sum of the negation of the arities of
+80    /// constructors in sigma(i).
+81    pub fn arity(&mut self) -> &mut Self {
+82        self.add_heuristic(ColumnScoringFunction::Arity)
+83    }
+84
+85    /// The score is the negation of the cardinal of sigma(i), C(Sigma(i)).
+86    /// If sigma(i) is NOT complete, the resulting score is C(Sigma(i)) - 1.
+87    pub fn small_branching(&mut self) -> &mut Self {
+88        self.add_heuristic(ColumnScoringFunction::SmallBranching)
+89    }
+90
+91    /// The score is the number of needed rows of column i in the necessity
+92    /// matrix.
+93    #[allow(unused)]
+94    pub fn needed_column(&mut self) -> &mut Self {
+95        self.add_heuristic(ColumnScoringFunction::NeededColumn)
+96    }
+97
+98    /// The score is the larger row index j such that column i is needed for all
+99    /// rows j′; 1 ≤ j′ ≤ j.
+100    pub fn needed_prefix(&mut self) -> &mut Self {
+101        self.add_heuristic(ColumnScoringFunction::NeededPrefix)
+102    }
+103
+104    fn select_column(&self, db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix) -> usize {
+105        let mut candidates: Vec<_> = (0..mat.ncols()).collect();
+106
+107        for scoring_fn in &self.0 {
+108            let mut max_score = i32::MIN;
+109            for col in std::mem::take(&mut candidates) {
+110                let score = scoring_fn.score(db, mat, col);
+111                match score.cmp(&max_score) {
+112                    std::cmp::Ordering::Less => {}
+113                    std::cmp::Ordering::Equal => {
+114                        candidates.push(col);
+115                    }
+116                    std::cmp::Ordering::Greater => {
+117                        candidates = vec![col];
+118                        max_score = score;
+119                    }
+120                }
+121            }
+122
+123            if candidates.len() == 1 {
+124                return candidates.pop().unwrap();
+125            }
+126        }
+127
+128        // If there are more than one candidates remained, filter the columns with the
+129        // shortest occurrences among the candidates, then select the rightmost one.
+130        // This heuristics corresponds to the R pseudo heuristic in the paper.
+131        let mut shortest_occurrences = usize::MAX;
+132        for col in std::mem::take(&mut candidates) {
+133            let occurrences = mat.occurrences[col].len();
+134            match occurrences.cmp(&shortest_occurrences) {
+135                std::cmp::Ordering::Less => {
+136                    candidates = vec![col];
+137                    shortest_occurrences = occurrences;
+138                }
+139                std::cmp::Ordering::Equal => {
+140                    candidates.push(col);
+141                }
+142                std::cmp::Ordering::Greater => {}
+143            }
+144        }
+145
+146        candidates.pop().unwrap()
+147    }
+148
+149    fn add_heuristic(&mut self, heuristic: ColumnScoringFunction) -> &mut Self {
+150        debug_assert!(!self.0.contains(&heuristic));
+151        self.0.push(heuristic);
+152        self
+153    }
+154}
+155
+156#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+157pub struct Occurrence(Vec<usize>);
+158
+159impl Occurrence {
+160    pub fn new() -> Self {
+161        Self(vec![])
+162    }
+163
+164    pub fn iter(&self) -> impl Iterator<Item = &usize> {
+165        self.0.iter()
+166    }
+167
+168    pub fn parent(&self) -> Option<Occurrence> {
+169        let mut inner = self.0.clone();
+170        inner.pop().map(|_| Occurrence(inner))
+171    }
+172
+173    pub fn last_index(&self) -> Option<usize> {
+174        self.0.last().cloned()
+175    }
+176
+177    fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Vec<Self> {
+178        let arity = ctor.arity(db);
+179        (0..arity)
+180            .map(|i| {
+181                let mut inner = self.0.clone();
+182                inner.push(i);
+183                Self(inner)
+184            })
+185            .collect()
+186    }
+187
+188    fn len(&self) -> usize {
+189        self.0.len()
+190    }
+191}
+192
+193struct DecisionTreeBuilder {
+194    policy: ColumnSelectionPolicy,
+195}
+196
+197impl DecisionTreeBuilder {
+198    fn new(policy: ColumnSelectionPolicy) -> Self {
+199        DecisionTreeBuilder { policy }
+200    }
+201
+202    fn build(&self, db: &dyn AnalyzerDb, mut mat: SimplifiedArmMatrix) -> DecisionTree {
+203        debug_assert!(mat.nrows() > 0, "unexhausted pattern matrix");
+204
+205        if mat.is_first_arm_satisfied() {
+206            mat.arms.truncate(1);
+207            return DecisionTree::Leaf(LeafNode::new(mat.arms.pop().unwrap(), &mat.occurrences));
+208        }
+209
+210        let col = self.policy.select_column(db, &mat);
+211        mat.swap(col);
+212
+213        let mut switch_arms = vec![];
+214        let occurrence = &mat.occurrences[0];
+215        let sigma_set = mat.sigma_set(0);
+216        for &ctor in sigma_set.iter() {
+217            let destructured_mat = mat.phi_specialize(db, ctor, occurrence);
+218            let subtree = self.build(db, destructured_mat);
+219            switch_arms.push((Case::Ctor(ctor), subtree));
+220        }
+221
+222        if !sigma_set.is_complete(db) {
+223            let destructured_mat = mat.d_specialize(db, occurrence);
+224            let subtree = self.build(db, destructured_mat);
+225            switch_arms.push((Case::Default, subtree));
+226        }
+227
+228        DecisionTree::Switch(SwitchNode {
+229            occurrence: occurrence.clone(),
+230            arms: switch_arms,
+231        })
+232    }
+233}
+234
+235#[derive(Clone, Debug)]
+236struct SimplifiedArmMatrix {
+237    arms: Vec<SimplifiedArm>,
+238    occurrences: Vec<Occurrence>,
+239}
+240
+241impl SimplifiedArmMatrix {
+242    fn new(mat: &PatternMatrix) -> Self {
+243        let cols = mat.ncols();
+244        let arms: Vec<_> = mat
+245            .rows()
+246            .iter()
+247            .enumerate()
+248            .map(|(body, pat)| SimplifiedArm::new(pat, body))
+249            .collect();
+250        let occurrences = vec![Occurrence::new(); cols];
+251
+252        SimplifiedArmMatrix { arms, occurrences }
+253    }
+254
+255    fn nrows(&self) -> usize {
+256        self.arms.len()
+257    }
+258
+259    fn ncols(&self) -> usize {
+260        self.arms[0].pat_vec.len()
+261    }
+262
+263    fn pat(&self, row: usize, col: usize) -> &SimplifiedPattern {
+264        self.arms[row].pat(col)
+265    }
+266
+267    fn necessity_matrix(&self, db: &dyn AnalyzerDb) -> NecessityMatrix {
+268        NecessityMatrix::from_mat(db, self)
+269    }
+270
+271    fn reduced_pat_mat(&self, col: usize) -> PatternMatrix {
+272        let mut rows = Vec::with_capacity(self.nrows());
+273        for arm in self.arms.iter() {
+274            let reduced_pat_vec = arm
+275                .pat_vec
+276                .pats()
+277                .iter()
+278                .enumerate()
+279                .filter(|(i, _)| (*i != col))
+280                .map(|(_, pat)| pat.clone())
+281                .collect();
+282            rows.push(PatternRowVec::new(reduced_pat_vec));
+283        }
+284
+285        PatternMatrix::new(rows)
+286    }
+287
+288    /// Returns the constructor set in the column i.
+289    fn sigma_set(&self, col: usize) -> SigmaSet {
+290        SigmaSet::from_rows(self.arms.iter().map(|arm| &arm.pat_vec), col)
+291    }
+292
+293    fn is_first_arm_satisfied(&self) -> bool {
+294        self.arms[0]
+295            .pat_vec
+296            .pats()
+297            .iter()
+298            .all(SimplifiedPattern::is_wildcard)
+299    }
+300
+301    fn phi_specialize(
+302        &self,
+303        db: &dyn AnalyzerDb,
+304        ctor: ConstructorKind,
+305        occurrence: &Occurrence,
+306    ) -> Self {
+307        let mut new_arms = Vec::new();
+308        for arm in &self.arms {
+309            new_arms.extend_from_slice(&arm.phi_specialize(db, ctor, occurrence));
+310        }
+311
+312        let mut new_occurrences = self.occurrences[0].phi_specialize(db, ctor);
+313        new_occurrences.extend_from_slice(&self.occurrences.as_slice()[1..]);
+314
+315        Self {
+316            arms: new_arms,
+317            occurrences: new_occurrences,
+318        }
+319    }
+320
+321    fn d_specialize(&self, db: &dyn AnalyzerDb, occurrence: &Occurrence) -> Self {
+322        let mut new_arms = Vec::new();
+323        for arm in &self.arms {
+324            new_arms.extend_from_slice(&arm.d_specialize(db, occurrence));
+325        }
+326
+327        Self {
+328            arms: new_arms,
+329            occurrences: self.occurrences.as_slice()[1..].to_vec(),
+330        }
+331    }
+332
+333    fn swap(&mut self, i: usize) {
+334        for arm in &mut self.arms {
+335            arm.swap(0, i)
+336        }
+337        self.occurrences.swap(0, i);
+338    }
+339}
+340
+341#[derive(Clone, Debug)]
+342struct SimplifiedArm {
+343    pat_vec: PatternRowVec,
+344    body: usize,
+345    binds: IndexMap<(SmolStr, usize), Occurrence>,
+346}
+347
+348impl SimplifiedArm {
+349    fn new(pat: &PatternRowVec, body: usize) -> Self {
+350        let pat = PatternRowVec::new(pat.inner.iter().map(generalize_pattern).collect());
+351        Self {
+352            pat_vec: pat,
+353            body,
+354            binds: IndexMap::new(),
+355        }
+356    }
+357
+358    fn len(&self) -> usize {
+359        self.pat_vec.len()
+360    }
+361
+362    fn pat(&self, col: usize) -> &SimplifiedPattern {
+363        &self.pat_vec.inner[col]
+364    }
+365
+366    fn phi_specialize(
+367        &self,
+368        db: &dyn AnalyzerDb,
+369        ctor: ConstructorKind,
+370        occurrence: &Occurrence,
+371    ) -> Vec<Self> {
+372        let body = self.body;
+373        let binds = self.new_binds(occurrence);
+374
+375        self.pat_vec
+376            .phi_specialize(db, ctor)
+377            .into_iter()
+378            .map(|pat| SimplifiedArm {
+379                pat_vec: pat,
+380                body,
+381                binds: binds.clone(),
+382            })
+383            .collect()
+384    }
+385
+386    fn d_specialize(&self, db: &dyn AnalyzerDb, occurrence: &Occurrence) -> Vec<Self> {
+387        let body = self.body;
+388        let binds = self.new_binds(occurrence);
+389
+390        self.pat_vec
+391            .d_specialize(db)
+392            .into_iter()
+393            .map(|pat| SimplifiedArm {
+394                pat_vec: pat,
+395                body,
+396                binds: binds.clone(),
+397            })
+398            .collect()
+399    }
+400
+401    fn new_binds(&self, occurrence: &Occurrence) -> IndexMap<(SmolStr, usize), Occurrence> {
+402        let mut binds = self.binds.clone();
+403        if let Some(SimplifiedPatternKind::WildCard(Some(bind))) =
+404            self.pat_vec.head().map(|pat| &pat.kind)
+405        {
+406            binds.entry(bind.clone()).or_insert(occurrence.clone());
+407        }
+408        binds
+409    }
+410
+411    fn finalize_binds(self, occurrences: &[Occurrence]) -> IndexMap<(SmolStr, usize), Occurrence> {
+412        debug_assert!(self.len() == occurrences.len());
+413
+414        let mut binds = self.binds;
+415        for (pat, occurrence) in self.pat_vec.pats().iter().zip(occurrences.iter()) {
+416            debug_assert!(pat.is_wildcard());
+417
+418            if let SimplifiedPatternKind::WildCard(Some(bind)) = &pat.kind {
+419                binds.entry(bind.clone()).or_insert(occurrence.clone());
+420            }
+421        }
+422
+423        binds
+424    }
+425
+426    fn swap(&mut self, i: usize, j: usize) {
+427        self.pat_vec.swap(i, j);
+428    }
+429}
+430
+431struct NecessityMatrix {
+432    data: Vec<bool>,
+433    ncol: usize,
+434    nrow: usize,
+435}
+436
+437impl NecessityMatrix {
+438    fn new(ncol: usize, nrow: usize) -> Self {
+439        let data = vec![false; ncol * nrow];
+440        Self { data, ncol, nrow }
+441    }
+442
+443    fn from_mat(db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix) -> Self {
+444        let nrow = mat.nrows();
+445        let ncol = mat.ncols();
+446        let mut necessity_mat = Self::new(ncol, nrow);
+447
+448        necessity_mat.compute(db, mat);
+449        necessity_mat
+450    }
+451
+452    fn compute(&mut self, db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix) {
+453        for row in 0..self.nrow {
+454            for col in 0..self.ncol {
+455                let pat = mat.pat(row, col);
+456                let pos = self.pos(row, col);
+457
+458                if !pat.is_wildcard() {
+459                    self.data[pos] = true;
+460                } else {
+461                    let reduced_pat_mat = mat.reduced_pat_mat(col);
+462                    self.data[pos] = !reduced_pat_mat.is_row_useful(db, row);
+463                }
+464            }
+465        }
+466    }
+467
+468    fn compute_needed_column_score(&self, col: usize) -> i32 {
+469        let mut num = 0;
+470        for i in 0..self.nrow {
+471            if self.data[self.pos(i, col)] {
+472                num += 1;
+473            }
+474        }
+475
+476        num
+477    }
+478
+479    fn compute_needed_prefix_score(&self, col: usize) -> i32 {
+480        let mut current_row = 0;
+481        for i in 0..self.nrow {
+482            if self.data[self.pos(i, col)] {
+483                current_row += 1;
+484            } else {
+485                return current_row;
+486            }
+487        }
+488
+489        current_row
+490    }
+491
+492    fn pos(&self, row: usize, col: usize) -> usize {
+493        self.ncol * row + col
+494    }
+495}
+496
+497#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+498enum ColumnScoringFunction {
+499    /// The score of column i is the sum of the negation of the arities of
+500    /// constructors in sigma(i).
+501    Arity,
+502
+503    /// The score is the negation of the cardinal of sigma(i), C(Sigma(i)).
+504    /// If sigma(i) is NOT complete, the resulting score is C(Sigma(i)) - 1.
+505    SmallBranching,
+506
+507    /// The score is the number of needed rows of column i in the necessity
+508    /// matrix.
+509    NeededColumn,
+510
+511    NeededPrefix,
+512}
+513
+514impl ColumnScoringFunction {
+515    fn score(&self, db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix, col: usize) -> i32 {
+516        match self {
+517            ColumnScoringFunction::Arity => mat
+518                .sigma_set(col)
+519                .iter()
+520                .map(|c| -(c.arity(db) as i32))
+521                .sum(),
+522
+523            ColumnScoringFunction::SmallBranching => {
+524                let sigma_set = mat.sigma_set(col);
+525                let score = -(mat.sigma_set(col).len() as i32);
+526                if sigma_set.is_complete(db) {
+527                    score
+528                } else {
+529                    score - 1
+530                }
+531            }
+532
+533            ColumnScoringFunction::NeededColumn => {
+534                mat.necessity_matrix(db).compute_needed_column_score(col)
+535            }
+536
+537            ColumnScoringFunction::NeededPrefix => {
+538                mat.necessity_matrix(db).compute_needed_prefix_score(col)
+539            }
+540        }
+541    }
+542}
+543
+544fn generalize_pattern(pat: &SimplifiedPattern) -> SimplifiedPattern {
+545    match &pat.kind {
+546        SimplifiedPatternKind::WildCard(_) => pat.clone(),
+547
+548        SimplifiedPatternKind::Constructor { kind, fields } => {
+549            let fields = fields.iter().map(generalize_pattern).collect();
+550            let kind = SimplifiedPatternKind::Constructor {
+551                kind: *kind,
+552                fields,
+553            };
+554            SimplifiedPattern::new(kind, pat.ty)
+555        }
+556
+557        SimplifiedPatternKind::Or(pats) => {
+558            let mut gen_pats = vec![];
+559            for pat in pats {
+560                let gen_pad = generalize_pattern(pat);
+561                if gen_pad.is_wildcard() {
+562                    gen_pats.push(gen_pad);
+563                    break;
+564                } else {
+565                    gen_pats.push(gen_pad);
+566                }
+567            }
+568
+569            if gen_pats.len() == 1 {
+570                gen_pats.pop().unwrap()
+571            } else {
+572                SimplifiedPattern::new(SimplifiedPatternKind::Or(gen_pats), pat.ty)
+573            }
+574        }
+575    }
+576}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html b/compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html new file mode 100644 index 0000000000..85765f29f3 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html @@ -0,0 +1,326 @@ +mod.rs - source

fe_mir/lower/pattern_match/
mod.rs

1use fe_analyzer::pattern_analysis::{ConstructorKind, PatternMatrix};
+2use fe_parser::{
+3    ast::{Expr, LiteralPattern, MatchArm},
+4    node::Node,
+5};
+6use fxhash::FxHashMap;
+7use id_arena::{Arena, Id};
+8use smol_str::SmolStr;
+9
+10use crate::ir::{
+11    body_builder::BodyBuilder, inst::SwitchTable, BasicBlockId, SourceInfo, TypeId, ValueId,
+12};
+13
+14use self::decision_tree::{
+15    Case, ColumnSelectionPolicy, DecisionTree, LeafNode, Occurrence, SwitchNode,
+16};
+17
+18use super::function::BodyLowerHelper;
+19
+20pub mod decision_tree;
+21mod tree_vis;
+22
+23pub(super) fn lower_match<'b>(
+24    helper: &'b mut BodyLowerHelper<'_, '_>,
+25    mat: &PatternMatrix,
+26    scrutinee: &Node<Expr>,
+27    arms: &'b [Node<MatchArm>],
+28) {
+29    let mut policy = ColumnSelectionPolicy::default();
+30    // PBA heuristics described in the paper.
+31    policy.needed_prefix().small_branching().arity();
+32
+33    let scrutinee = helper.lower_expr_to_value(scrutinee);
+34    let decision_tree = decision_tree::build_decision_tree(helper.db.upcast(), mat, policy);
+35
+36    DecisionTreeLowerHelper::new(helper, scrutinee, arms).lower(decision_tree);
+37}
+38
+39struct DecisionTreeLowerHelper<'db, 'a, 'b> {
+40    helper: &'b mut BodyLowerHelper<'db, 'a>,
+41    scopes: Arena<Scope>,
+42    current_scope: ScopeId,
+43    root_block: BasicBlockId,
+44    declared_vars: FxHashMap<(SmolStr, usize), ValueId>,
+45    arms: &'b [Node<MatchArm>],
+46    lowered_arms: FxHashMap<usize, BasicBlockId>,
+47    match_exit: BasicBlockId,
+48}
+49
+50impl<'db, 'a, 'b> DecisionTreeLowerHelper<'db, 'a, 'b> {
+51    fn new(
+52        helper: &'b mut BodyLowerHelper<'db, 'a>,
+53        scrutinee: ValueId,
+54        arms: &'b [Node<MatchArm>],
+55    ) -> Self {
+56        let match_exit = helper.builder.make_block();
+57
+58        let mut scope = Scope::default();
+59        scope.register_occurrence(Occurrence::new(), scrutinee);
+60        let mut scopes = Arena::new();
+61        let current_scope = scopes.alloc(scope);
+62
+63        let root_block = helper.builder.current_block();
+64
+65        DecisionTreeLowerHelper {
+66            helper,
+67            scopes,
+68            current_scope,
+69            root_block,
+70            declared_vars: FxHashMap::default(),
+71            arms,
+72            lowered_arms: FxHashMap::default(),
+73            match_exit,
+74        }
+75    }
+76
+77    fn lower(&mut self, tree: DecisionTree) {
+78        self.lower_tree(tree);
+79
+80        let match_exit = self.match_exit;
+81        self.builder().move_to_block(match_exit);
+82    }
+83
+84    fn lower_tree(&mut self, tree: DecisionTree) {
+85        match tree {
+86            DecisionTree::Leaf(leaf) => self.lower_leaf(leaf),
+87            DecisionTree::Switch(switch) => self.lower_switch(switch),
+88        }
+89    }
+90
+91    fn lower_leaf(&mut self, leaf: LeafNode) {
+92        for (var, occurrence) in leaf.binds {
+93            let occurrence_value = self.resolve_occurrence(&occurrence);
+94            let ty = self.builder().value_ty(occurrence_value);
+95            let var_value = self.declare_or_use_var(&var, ty);
+96
+97            let inst = self.builder().bind(occurrence_value, SourceInfo::dummy());
+98            self.builder().map_result(inst, var_value.into());
+99        }
+100
+101        let arm_body = self.lower_arm_body(leaf.arm_idx);
+102        self.builder().jump(arm_body, SourceInfo::dummy());
+103    }
+104
+105    fn lower_switch(&mut self, mut switch: SwitchNode) {
+106        let current_bb = self.builder().current_block();
+107        let occurrence_value = self.resolve_occurrence(&switch.occurrence);
+108
+109        if switch.arms.len() == 1 {
+110            let arm = switch.arms.pop().unwrap();
+111            let arm_bb = self.enter_arm(&switch.occurrence, &arm.0);
+112            self.lower_tree(arm.1);
+113            self.builder().move_to_block(current_bb);
+114            self.builder().jump(arm_bb, SourceInfo::dummy());
+115            return;
+116        }
+117
+118        let mut table = SwitchTable::default();
+119        let mut default_arm = None;
+120        let occurrence_ty = self.builder().value_ty(occurrence_value);
+121
+122        for (case, tree) in switch.arms {
+123            let arm_bb = self.enter_arm(&switch.occurrence, &case);
+124            self.lower_tree(tree);
+125            self.leave_arm();
+126
+127            if let Some(disc) = self.case_to_disc(&case, occurrence_ty) {
+128                table.add_arm(disc, arm_bb);
+129            } else {
+130                debug_assert!(default_arm.is_none());
+131                default_arm = Some(arm_bb);
+132            }
+133        }
+134
+135        self.builder().move_to_block(current_bb);
+136        let disc = self.extract_disc(occurrence_value);
+137        self.builder()
+138            .switch(disc, table, default_arm, SourceInfo::dummy());
+139    }
+140
+141    fn lower_arm_body(&mut self, index: usize) -> BasicBlockId {
+142        if let Some(block) = self.lowered_arms.get(&index) {
+143            *block
+144        } else {
+145            let current_bb = self.builder().current_block();
+146            let body_bb = self.builder().make_block();
+147
+148            self.builder().move_to_block(body_bb);
+149            for stmt in &self.arms[index].kind.body {
+150                self.helper.lower_stmt(stmt);
+151            }
+152
+153            if !self.builder().is_current_block_terminated() {
+154                let match_exit = self.match_exit;
+155                self.builder().jump(match_exit, SourceInfo::dummy());
+156            }
+157
+158            self.lowered_arms.insert(index, body_bb);
+159            self.builder().move_to_block(current_bb);
+160            body_bb
+161        }
+162    }
+163
+164    fn enter_arm(&mut self, occurrence: &Occurrence, case: &Case) -> BasicBlockId {
+165        self.helper.enter_scope();
+166
+167        let bb = self.builder().make_block();
+168        self.builder().move_to_block(bb);
+169
+170        let scope = Scope::with_parent(self.current_scope);
+171        self.current_scope = self.scopes.alloc(scope);
+172
+173        self.update_occurrence(occurrence, case);
+174        bb
+175    }
+176
+177    fn leave_arm(&mut self) {
+178        self.current_scope = self.scopes[self.current_scope].parent.unwrap();
+179        self.helper.leave_scope();
+180    }
+181
+182    fn case_to_disc(&mut self, case: &Case, occurrence_ty: TypeId) -> Option<ValueId> {
+183        match case {
+184            Case::Ctor(ConstructorKind::Enum(variant)) => {
+185                let disc_ty = occurrence_ty.enum_disc_type(self.helper.db);
+186                let disc = variant.disc(self.helper.db.upcast());
+187                Some(self.helper.make_imm(disc, disc_ty))
+188            }
+189
+190            Case::Ctor(ConstructorKind::Literal((LiteralPattern::Bool(b), ty))) => {
+191                let ty = self.helper.db.mir_lowered_type(*ty);
+192                Some(self.builder().make_imm_from_bool(*b, ty))
+193            }
+194
+195            Case::Ctor(ConstructorKind::Tuple(_))
+196            | Case::Ctor(ConstructorKind::Struct(_))
+197            | Case::Default => None,
+198        }
+199    }
+200
+201    fn update_occurrence(&mut self, occurrence: &Occurrence, case: &Case) {
+202        let old_value = self.resolve_occurrence(occurrence);
+203        let old_ty = self.builder().value_ty(old_value);
+204
+205        match case {
+206            Case::Ctor(ConstructorKind::Enum(variant)) => {
+207                let new_ty = old_ty.enum_variant_type(self.helper.db, *variant);
+208                let cast = self
+209                    .builder()
+210                    .untag_cast(old_value, new_ty, SourceInfo::dummy());
+211                let value = self.helper.map_to_tmp(cast, new_ty);
+212                self.current_scope_mut()
+213                    .register_occurrence(occurrence.clone(), value)
+214            }
+215
+216            Case::Ctor(ConstructorKind::Literal((LiteralPattern::Bool(b), _))) => {
+217                let value = self.builder().make_imm_from_bool(*b, old_ty);
+218                self.current_scope_mut()
+219                    .register_occurrence(occurrence.clone(), value)
+220            }
+221
+222            Case::Ctor(ConstructorKind::Tuple(_))
+223            | Case::Ctor(ConstructorKind::Struct(_))
+224            | Case::Default => {}
+225        }
+226    }
+227
+228    fn extract_disc(&mut self, value: ValueId) -> ValueId {
+229        let value_ty = self.builder().value_ty(value);
+230        match value_ty {
+231            _ if value_ty.deref(self.helper.db).is_enum(self.helper.db) => {
+232                let disc_ty = value_ty.enum_disc_type(self.helper.db);
+233                let disc_index = self.helper.make_u256_imm(0);
+234                let inst =
+235                    self.builder()
+236                        .aggregate_access(value, vec![disc_index], SourceInfo::dummy());
+237                self.helper.map_to_tmp(inst, disc_ty)
+238            }
+239
+240            _ => value,
+241        }
+242    }
+243
+244    fn declare_or_use_var(&mut self, var: &(SmolStr, usize), ty: TypeId) -> ValueId {
+245        if let Some(value) = self.declared_vars.get(var) {
+246            *value
+247        } else {
+248            let current_block = self.builder().current_block();
+249            let root_block = self.root_block;
+250            self.builder().move_to_block_top(root_block);
+251            let value = self.helper.declare_var(&var.0, ty, SourceInfo::dummy());
+252            self.builder().move_to_block(current_block);
+253            self.declared_vars.insert(var.clone(), value);
+254            value
+255        }
+256    }
+257
+258    fn builder(&mut self) -> &mut BodyBuilder {
+259        &mut self.helper.builder
+260    }
+261
+262    fn resolve_occurrence(&mut self, occurrence: &Occurrence) -> ValueId {
+263        if let Some(value) = self
+264            .current_scope()
+265            .resolve_occurrence(&self.scopes, occurrence)
+266        {
+267            return value;
+268        }
+269
+270        let parent = occurrence.parent().unwrap();
+271        let parent_value = self.resolve_occurrence(&parent);
+272        let parent_value_ty = self.builder().value_ty(parent_value);
+273
+274        let index = occurrence.last_index().unwrap();
+275        let index_value = self.helper.make_u256_imm(occurrence.last_index().unwrap());
+276        let inst =
+277            self.builder()
+278                .aggregate_access(parent_value, vec![index_value], SourceInfo::dummy());
+279
+280        let ty = parent_value_ty.projection_ty_imm(self.helper.db, index);
+281        let value = self.helper.map_to_tmp(inst, ty);
+282        self.current_scope_mut()
+283            .register_occurrence(occurrence.clone(), value);
+284        value
+285    }
+286
+287    fn current_scope(&self) -> &Scope {
+288        self.scopes.get(self.current_scope).unwrap()
+289    }
+290
+291    fn current_scope_mut(&mut self) -> &mut Scope {
+292        self.scopes.get_mut(self.current_scope).unwrap()
+293    }
+294}
+295
+296type ScopeId = Id<Scope>;
+297
+298#[derive(Debug, Default)]
+299struct Scope {
+300    parent: Option<ScopeId>,
+301    occurrences: FxHashMap<Occurrence, ValueId>,
+302}
+303
+304impl Scope {
+305    pub fn with_parent(parent: ScopeId) -> Self {
+306        Self {
+307            parent: Some(parent),
+308            ..Default::default()
+309        }
+310    }
+311
+312    pub fn register_occurrence(&mut self, occurrence: Occurrence, value: ValueId) {
+313        self.occurrences.insert(occurrence, value);
+314    }
+315
+316    pub fn resolve_occurrence(
+317        &self,
+318        arena: &Arena<Scope>,
+319        occurrence: &Occurrence,
+320    ) -> Option<ValueId> {
+321        match self.occurrences.get(occurrence) {
+322            Some(value) => Some(*value),
+323            None => arena[self.parent?].resolve_occurrence(arena, occurrence),
+324        }
+325    }
+326}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html b/compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html new file mode 100644 index 0000000000..403dfcd549 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html @@ -0,0 +1,150 @@ +tree_vis.rs - source

fe_mir/lower/pattern_match/
tree_vis.rs

1use std::fmt::Write;
+2
+3use dot2::{label::Text, Id};
+4use fe_analyzer::{pattern_analysis::ConstructorKind, AnalyzerDb};
+5use fxhash::FxHashMap;
+6use indexmap::IndexMap;
+7use smol_str::SmolStr;
+8
+9use super::decision_tree::{Case, DecisionTree, LeafNode, Occurrence, SwitchNode};
+10
+11pub(super) struct TreeRenderer<'db> {
+12    nodes: Vec<Node>,
+13    edges: FxHashMap<(usize, usize), Case>,
+14    db: &'db dyn AnalyzerDb,
+15}
+16
+17impl<'db> TreeRenderer<'db> {
+18    #[allow(unused)]
+19    pub(super) fn new(db: &'db dyn AnalyzerDb, tree: &DecisionTree) -> Self {
+20        let mut renderer = Self {
+21            nodes: Vec::new(),
+22            edges: FxHashMap::default(),
+23            db,
+24        };
+25
+26        match tree {
+27            DecisionTree::Leaf(leaf) => {
+28                renderer.nodes.push(Node::from(leaf));
+29            }
+30            DecisionTree::Switch(switch) => {
+31                renderer.nodes.push(Node::from(switch));
+32                let node_id = renderer.nodes.len() - 1;
+33                for arm in &switch.arms {
+34                    renderer.switch_from(&arm.1, node_id, arm.0);
+35                }
+36            }
+37        }
+38        renderer
+39    }
+40
+41    fn switch_from(&mut self, tree: &DecisionTree, node_id: usize, case: Case) {
+42        match tree {
+43            DecisionTree::Leaf(leaf) => {
+44                self.nodes.push(Node::from(leaf));
+45                self.edges.insert((node_id, self.nodes.len() - 1), case);
+46            }
+47
+48            DecisionTree::Switch(switch) => {
+49                self.nodes.push(Node::from(switch));
+50                let switch_id = self.nodes.len() - 1;
+51                self.edges.insert((node_id, switch_id), case);
+52                for arm in &switch.arms {
+53                    self.switch_from(&arm.1, switch_id, arm.0);
+54                }
+55            }
+56        }
+57    }
+58}
+59
+60impl<'db> dot2::Labeller<'db> for TreeRenderer<'db> {
+61    type Node = usize;
+62    type Edge = (Self::Node, Self::Node);
+63    type Subgraph = ();
+64
+65    fn graph_id(&self) -> dot2::Result<Id<'db>> {
+66        dot2::Id::new("DecisionTree")
+67    }
+68
+69    fn node_id(&self, n: &Self::Node) -> dot2::Result<Id<'db>> {
+70        dot2::Id::new(format!("N{}", *n))
+71    }
+72
+73    fn node_label(&self, n: &Self::Node) -> dot2::Result<Text<'db>> {
+74        let node = &self.nodes[*n];
+75        let label = match node {
+76            Node::Leaf { arm_idx, .. } => {
+77                format!("arm_idx: {arm_idx}")
+78            }
+79            Node::Switch(occurrence) => {
+80                let mut s = "expr".to_string();
+81                for num in occurrence.iter() {
+82                    write!(&mut s, ".{num}").unwrap();
+83                }
+84                s
+85            }
+86        };
+87
+88        Ok(Text::LabelStr(label.into()))
+89    }
+90
+91    fn edge_label(&self, e: &Self::Edge) -> Text<'db> {
+92        let label = match &self.edges[e] {
+93            Case::Ctor(ConstructorKind::Enum(variant)) => {
+94                variant.name_with_parent(self.db).to_string()
+95            }
+96            Case::Ctor(ConstructorKind::Tuple(_)) => "()".to_string(),
+97            Case::Ctor(ConstructorKind::Struct(sid)) => sid.name(self.db).into(),
+98            Case::Ctor(ConstructorKind::Literal((lit, _))) => lit.to_string(),
+99            Case::Default => "_".into(),
+100        };
+101
+102        Text::LabelStr(label.into())
+103    }
+104}
+105
+106impl<'db> dot2::GraphWalk<'db> for TreeRenderer<'db> {
+107    type Node = usize;
+108    type Edge = (Self::Node, Self::Node);
+109    type Subgraph = ();
+110
+111    fn nodes(&self) -> dot2::Nodes<'db, Self::Node> {
+112        (0..self.nodes.len()).collect()
+113    }
+114
+115    fn edges(&self) -> dot2::Edges<'db, Self::Edge> {
+116        self.edges.keys().cloned().collect::<Vec<_>>().into()
+117    }
+118
+119    fn source(&self, e: &Self::Edge) -> Self::Node {
+120        e.0
+121    }
+122
+123    fn target(&self, e: &Self::Edge) -> Self::Node {
+124        e.1
+125    }
+126}
+127
+128enum Node {
+129    Leaf {
+130        arm_idx: usize,
+131        #[allow(unused)]
+132        binds: IndexMap<(SmolStr, usize), Occurrence>,
+133    },
+134    Switch(Occurrence),
+135}
+136
+137impl From<&LeafNode> for Node {
+138    fn from(node: &LeafNode) -> Self {
+139        Node::Leaf {
+140            arm_idx: node.arm_idx,
+141            binds: node.binds.clone(),
+142        }
+143    }
+144}
+145
+146impl From<&SwitchNode> for Node {
+147    fn from(node: &SwitchNode) -> Self {
+148        Node::Switch(node.occurrence.clone())
+149    }
+150}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/types.rs.html b/compiler-docs/src/fe_mir/lower/types.rs.html new file mode 100644 index 0000000000..dab676fb43 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/types.rs.html @@ -0,0 +1,194 @@ +types.rs - source

fe_mir/lower/
types.rs

1use crate::{
+2    db::MirDb,
+3    ir::{
+4        types::{ArrayDef, EnumDef, EnumVariant, MapDef, StructDef, TupleDef},
+5        Type, TypeId, TypeKind,
+6    },
+7};
+8
+9use fe_analyzer::namespace::{
+10    items as analyzer_items,
+11    types::{self as analyzer_types, TraitOrType},
+12};
+13
+14pub fn lower_type(db: &dyn MirDb, analyzer_ty: analyzer_types::TypeId) -> TypeId {
+15    let ty_kind = match analyzer_ty.typ(db.upcast()) {
+16        analyzer_types::Type::SPtr(inner) => TypeKind::SPtr(lower_type(db, inner)),
+17
+18        // NOTE: this results in unexpected MIR TypeId inequalities
+19        //  (when different analyzer types map to the same MIR type).
+20        //  We could (should?) remove .analyzer_ty from Type.
+21        analyzer_types::Type::Mut(inner) => match inner.typ(db.upcast()) {
+22            analyzer_types::Type::SPtr(t) => TypeKind::SPtr(lower_type(db, t)),
+23            analyzer_types::Type::Base(t) => lower_base(t),
+24            analyzer_types::Type::Contract(_) => TypeKind::Address,
+25            _ => TypeKind::MPtr(lower_type(db, inner)),
+26        },
+27        analyzer_types::Type::SelfType(inner) => match inner {
+28            TraitOrType::TypeId(id) => return lower_type(db, id),
+29            TraitOrType::TraitId(_) => panic!("traits aren't lowered"),
+30        },
+31        analyzer_types::Type::Base(base) => lower_base(base),
+32        analyzer_types::Type::Array(arr) => lower_array(db, &arr),
+33        analyzer_types::Type::Map(map) => lower_map(db, &map),
+34        analyzer_types::Type::Tuple(tup) => lower_tuple(db, &tup),
+35        analyzer_types::Type::String(string) => TypeKind::String(string.max_size),
+36        analyzer_types::Type::Contract(_) => TypeKind::Address,
+37        analyzer_types::Type::SelfContract(contract) => lower_contract(db, contract),
+38        analyzer_types::Type::Struct(struct_) => lower_struct(db, struct_),
+39        analyzer_types::Type::Enum(enum_) => lower_enum(db, enum_),
+40        analyzer_types::Type::Generic(_) => {
+41            panic!("should be lowered in `lower_analyzer_type`")
+42        }
+43    };
+44
+45    intern_type(db, ty_kind, Some(analyzer_ty.deref(db.upcast())))
+46}
+47
+48fn lower_base(base: analyzer_types::Base) -> TypeKind {
+49    use analyzer_types::{Base, Integer};
+50
+51    match base {
+52        Base::Numeric(int_ty) => match int_ty {
+53            Integer::I8 => TypeKind::I8,
+54            Integer::I16 => TypeKind::I16,
+55            Integer::I32 => TypeKind::I32,
+56            Integer::I64 => TypeKind::I64,
+57            Integer::I128 => TypeKind::I128,
+58            Integer::I256 => TypeKind::I256,
+59            Integer::U8 => TypeKind::U8,
+60            Integer::U16 => TypeKind::U16,
+61            Integer::U32 => TypeKind::U32,
+62            Integer::U64 => TypeKind::U64,
+63            Integer::U128 => TypeKind::U128,
+64            Integer::U256 => TypeKind::U256,
+65        },
+66
+67        Base::Bool => TypeKind::Bool,
+68        Base::Address => TypeKind::Address,
+69        Base::Unit => TypeKind::Unit,
+70    }
+71}
+72
+73fn lower_array(db: &dyn MirDb, arr: &analyzer_types::Array) -> TypeKind {
+74    let len = arr.size;
+75    let elem_ty = db.mir_lowered_type(arr.inner);
+76
+77    let def = ArrayDef { elem_ty, len };
+78    TypeKind::Array(def)
+79}
+80
+81fn lower_map(db: &dyn MirDb, map: &analyzer_types::Map) -> TypeKind {
+82    let key_ty = db.mir_lowered_type(map.key);
+83    let value_ty = db.mir_lowered_type(map.value);
+84
+85    let def = MapDef { key_ty, value_ty };
+86    TypeKind::Map(def)
+87}
+88
+89fn lower_tuple(db: &dyn MirDb, tup: &analyzer_types::Tuple) -> TypeKind {
+90    let items = tup
+91        .items
+92        .iter()
+93        .map(|item| db.mir_lowered_type(*item))
+94        .collect();
+95
+96    let def = TupleDef { items };
+97    TypeKind::Tuple(def)
+98}
+99
+100fn lower_contract(db: &dyn MirDb, contract: analyzer_items::ContractId) -> TypeKind {
+101    let name = contract.name(db.upcast());
+102
+103    // Note: contract field types are wrapped in SPtr in TypeId::projection_ty
+104    let fields = contract
+105        .fields(db.upcast())
+106        .iter()
+107        .map(|(fname, fid)| {
+108            let analyzer_type = fid.typ(db.upcast()).unwrap();
+109            let ty = db.mir_lowered_type(analyzer_type);
+110            (fname.clone(), ty)
+111        })
+112        .collect();
+113
+114    // Obtain span.
+115    let span = contract.span(db.upcast());
+116
+117    let module_id = contract.module(db.upcast());
+118
+119    let def = StructDef {
+120        name,
+121        fields,
+122        span,
+123        module_id,
+124    };
+125    TypeKind::Contract(def)
+126}
+127
+128fn lower_struct(db: &dyn MirDb, id: analyzer_items::StructId) -> TypeKind {
+129    let name = id.name(db.upcast());
+130
+131    // Lower struct fields.
+132    let fields = id
+133        .fields(db.upcast())
+134        .iter()
+135        .map(|(fname, fid)| {
+136            let analyzer_types = fid.typ(db.upcast()).unwrap();
+137            let ty = db.mir_lowered_type(analyzer_types);
+138            (fname.clone(), ty)
+139        })
+140        .collect();
+141
+142    // obtain span.
+143    let span = id.span(db.upcast());
+144
+145    let module_id = id.module(db.upcast());
+146
+147    let def = StructDef {
+148        name,
+149        fields,
+150        span,
+151        module_id,
+152    };
+153    TypeKind::Struct(def)
+154}
+155
+156fn lower_enum(db: &dyn MirDb, id: analyzer_items::EnumId) -> TypeKind {
+157    let analyzer_variants = id.variants(db.upcast());
+158    let mut variants = Vec::with_capacity(analyzer_variants.len());
+159    for variant in analyzer_variants.values() {
+160        let variant_ty = match variant.kind(db.upcast()).unwrap() {
+161            analyzer_items::EnumVariantKind::Tuple(elts) => {
+162                let tuple_ty = analyzer_types::TypeId::tuple(db.upcast(), &elts);
+163                db.mir_lowered_type(tuple_ty)
+164            }
+165            analyzer_items::EnumVariantKind::Unit => {
+166                let unit_ty = analyzer_types::TypeId::unit(db.upcast());
+167                db.mir_lowered_type(unit_ty)
+168            }
+169        };
+170
+171        variants.push(EnumVariant {
+172            name: variant.name(db.upcast()),
+173            span: variant.span(db.upcast()),
+174            ty: variant_ty,
+175        });
+176    }
+177
+178    let def = EnumDef {
+179        name: id.name(db.upcast()),
+180        span: id.span(db.upcast()),
+181        variants,
+182        module_id: id.module(db.upcast()),
+183    };
+184
+185    TypeKind::Enum(def)
+186}
+187
+188fn intern_type(
+189    db: &dyn MirDb,
+190    ty_kind: TypeKind,
+191    analyzer_type: Option<analyzer_types::TypeId>,
+192) -> TypeId {
+193    db.mir_intern_type(Type::new(ty_kind, analyzer_type).into())
+194}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/inst.rs.html b/compiler-docs/src/fe_mir/pretty_print/inst.rs.html new file mode 100644 index 0000000000..48372c9de9 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/inst.rs.html @@ -0,0 +1,206 @@ +inst.rs - source

fe_mir/pretty_print/
inst.rs

1use std::fmt::{self, Write};
+2
+3use crate::{
+4    db::MirDb,
+5    ir::{function::BodyDataStore, inst::InstKind, InstId},
+6};
+7
+8use super::PrettyPrint;
+9
+10impl PrettyPrint for InstId {
+11    fn pretty_print<W: Write>(
+12        &self,
+13        db: &dyn MirDb,
+14        store: &BodyDataStore,
+15        w: &mut W,
+16    ) -> fmt::Result {
+17        if let Some(result) = store.inst_result(*self) {
+18            result.pretty_print(db, store, w)?;
+19            write!(w, ": ")?;
+20
+21            let result_ty = result.ty(db, store);
+22            result_ty.pretty_print(db, store, w)?;
+23            write!(w, " = ")?;
+24        }
+25
+26        match &store.inst_data(*self).kind {
+27            InstKind::Declare { local } => {
+28                write!(w, "let ")?;
+29                local.pretty_print(db, store, w)?;
+30                write!(w, ": ")?;
+31                store.value_ty(*local).pretty_print(db, store, w)
+32            }
+33
+34            InstKind::Unary { op, value } => {
+35                write!(w, "{op}")?;
+36                value.pretty_print(db, store, w)
+37            }
+38
+39            InstKind::Binary { op, lhs, rhs } => {
+40                lhs.pretty_print(db, store, w)?;
+41                write!(w, " {op} ")?;
+42                rhs.pretty_print(db, store, w)
+43            }
+44
+45            InstKind::Cast { value, to, .. } => {
+46                value.pretty_print(db, store, w)?;
+47                write!(w, " as ")?;
+48                to.pretty_print(db, store, w)
+49            }
+50
+51            InstKind::AggregateConstruct { ty, args } => {
+52                ty.pretty_print(db, store, w)?;
+53                write!(w, "{{")?;
+54                if args.is_empty() {
+55                    return write!(w, "}}");
+56                }
+57
+58                let arg_len = args.len();
+59                for (arg_idx, arg) in args.iter().enumerate().take(arg_len - 1) {
+60                    write!(w, "<{arg_idx}>: ")?;
+61                    arg.pretty_print(db, store, w)?;
+62                    write!(w, ", ")?;
+63                }
+64                let arg = args[arg_len - 1];
+65                write!(w, "<{}>: ", arg_len - 1)?;
+66                arg.pretty_print(db, store, w)?;
+67                write!(w, "}}")
+68            }
+69
+70            InstKind::Bind { src } => {
+71                write!(w, "bind ")?;
+72                src.pretty_print(db, store, w)
+73            }
+74
+75            InstKind::MemCopy { src } => {
+76                write!(w, "memcopy ")?;
+77                src.pretty_print(db, store, w)
+78            }
+79
+80            InstKind::Load { src } => {
+81                write!(w, "load ")?;
+82                src.pretty_print(db, store, w)
+83            }
+84
+85            InstKind::AggregateAccess { value, indices } => {
+86                value.pretty_print(db, store, w)?;
+87                for index in indices {
+88                    write!(w, ".<")?;
+89                    index.pretty_print(db, store, w)?;
+90                    write!(w, ">")?
+91                }
+92                Ok(())
+93            }
+94
+95            InstKind::MapAccess { value, key } => {
+96                value.pretty_print(db, store, w)?;
+97                write!(w, "{{")?;
+98                key.pretty_print(db, store, w)?;
+99                write!(w, "}}")
+100            }
+101
+102            InstKind::Call {
+103                func,
+104                args,
+105                call_type,
+106            } => {
+107                let name = func.debug_name(db);
+108                write!(w, "{name}@{call_type}(")?;
+109                args.as_slice().pretty_print(db, store, w)?;
+110                write!(w, ")")
+111            }
+112
+113            InstKind::Jump { dest } => {
+114                write!(w, "jump BB{}", dest.index())
+115            }
+116
+117            InstKind::Branch { cond, then, else_ } => {
+118                write!(w, "branch ")?;
+119                cond.pretty_print(db, store, w)?;
+120                write!(w, " then: BB{} else: BB{}", then.index(), else_.index())
+121            }
+122
+123            InstKind::Switch {
+124                disc,
+125                table,
+126                default,
+127            } => {
+128                write!(w, "switch ")?;
+129                disc.pretty_print(db, store, w)?;
+130                for (value, block) in table.iter() {
+131                    write!(w, " ")?;
+132                    value.pretty_print(db, store, w)?;
+133                    write!(w, ": BB{}", block.index())?;
+134                }
+135
+136                if let Some(default) = default {
+137                    write!(w, " default: BB{}", default.index())
+138                } else {
+139                    Ok(())
+140                }
+141            }
+142
+143            InstKind::Revert { arg } => {
+144                write!(w, "revert ")?;
+145                if let Some(arg) = arg {
+146                    arg.pretty_print(db, store, w)?;
+147                }
+148                Ok(())
+149            }
+150
+151            InstKind::Emit { arg } => {
+152                write!(w, "emit ")?;
+153                arg.pretty_print(db, store, w)
+154            }
+155
+156            InstKind::Return { arg } => {
+157                if let Some(arg) = arg {
+158                    write!(w, "return ")?;
+159                    arg.pretty_print(db, store, w)
+160                } else {
+161                    write!(w, "return")
+162                }
+163            }
+164
+165            InstKind::Keccak256 { arg } => {
+166                write!(w, "keccak256 ")?;
+167                arg.pretty_print(db, store, w)
+168            }
+169
+170            InstKind::AbiEncode { arg } => {
+171                write!(w, "abi_encode ")?;
+172                arg.pretty_print(db, store, w)
+173            }
+174
+175            InstKind::Nop => {
+176                write!(w, "nop")
+177            }
+178
+179            InstKind::Create { value, contract } => {
+180                write!(w, "create ")?;
+181                let contract_name = contract.name(db.upcast());
+182                write!(w, "{contract_name} ")?;
+183                value.pretty_print(db, store, w)
+184            }
+185
+186            InstKind::Create2 {
+187                value,
+188                salt,
+189                contract,
+190            } => {
+191                write!(w, "create2 ")?;
+192                let contract_name = contract.name(db.upcast());
+193                write!(w, "{contract_name} ")?;
+194                value.pretty_print(db, store, w)?;
+195                write!(w, " ")?;
+196                salt.pretty_print(db, store, w)
+197            }
+198
+199            InstKind::YulIntrinsic { op, args } => {
+200                write!(w, "{op}(")?;
+201                args.as_slice().pretty_print(db, store, w)?;
+202                write!(w, ")")
+203            }
+204        }
+205    }
+206}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/mod.rs.html b/compiler-docs/src/fe_mir/pretty_print/mod.rs.html new file mode 100644 index 0000000000..cce97a3ea5 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/mod.rs.html @@ -0,0 +1,22 @@ +mod.rs - source

fe_mir/pretty_print/
mod.rs

1use std::fmt;
+2
+3use crate::{db::MirDb, ir::function::BodyDataStore};
+4
+5mod inst;
+6mod types;
+7mod value;
+8
+9pub trait PrettyPrint {
+10    fn pretty_print<W: fmt::Write>(
+11        &self,
+12        db: &dyn MirDb,
+13        store: &BodyDataStore,
+14        w: &mut W,
+15    ) -> fmt::Result;
+16
+17    fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String {
+18        let mut s = String::new();
+19        self.pretty_print(db, store, &mut s).unwrap();
+20        s
+21    }
+22}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/types.rs.html b/compiler-docs/src/fe_mir/pretty_print/types.rs.html new file mode 100644 index 0000000000..cc535f0e72 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/types.rs.html @@ -0,0 +1,19 @@ +types.rs - source

fe_mir/pretty_print/
types.rs

1use std::fmt::{self, Write};
+2
+3use crate::{
+4    db::MirDb,
+5    ir::{function::BodyDataStore, TypeId},
+6};
+7
+8use super::PrettyPrint;
+9
+10impl PrettyPrint for TypeId {
+11    fn pretty_print<W: Write>(
+12        &self,
+13        db: &dyn MirDb,
+14        _store: &BodyDataStore,
+15        w: &mut W,
+16    ) -> fmt::Result {
+17        self.print(db, w)
+18    }
+19}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/value.rs.html b/compiler-docs/src/fe_mir/pretty_print/value.rs.html new file mode 100644 index 0000000000..06cd8c2c53 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/value.rs.html @@ -0,0 +1,81 @@ +value.rs - source

fe_mir/pretty_print/
value.rs

1use std::fmt::{self, Write};
+2
+3use crate::{
+4    db::MirDb,
+5    ir::{
+6        constant::ConstantValue, function::BodyDataStore, value::AssignableValue, Value, ValueId,
+7    },
+8};
+9
+10use super::PrettyPrint;
+11
+12impl PrettyPrint for ValueId {
+13    fn pretty_print<W: Write>(
+14        &self,
+15        db: &dyn MirDb,
+16        store: &BodyDataStore,
+17        w: &mut W,
+18    ) -> fmt::Result {
+19        match store.value_data(*self) {
+20            Value::Temporary { .. } | Value::Local(_) => write!(w, "_{}", self.index()),
+21            Value::Immediate { imm, .. } => write!(w, "{imm}"),
+22            Value::Constant { constant, .. } => {
+23                let const_value = constant.data(db);
+24                write!(w, "const ")?;
+25                match &const_value.value {
+26                    ConstantValue::Immediate(num) => write!(w, "{num}"),
+27                    ConstantValue::Str(s) => write!(w, r#""{s}""#),
+28                    ConstantValue::Bool(b) => write!(w, "{b}"),
+29                }
+30            }
+31            Value::Unit { .. } => write!(w, "()"),
+32        }
+33    }
+34}
+35
+36impl PrettyPrint for &[ValueId] {
+37    fn pretty_print<W: Write>(
+38        &self,
+39        db: &dyn MirDb,
+40        store: &BodyDataStore,
+41        w: &mut W,
+42    ) -> fmt::Result {
+43        if self.is_empty() {
+44            return Ok(());
+45        }
+46
+47        let arg_len = self.len();
+48        for arg in self.iter().take(arg_len - 1) {
+49            arg.pretty_print(db, store, w)?;
+50            write!(w, ", ")?;
+51        }
+52        let arg = self[arg_len - 1];
+53        arg.pretty_print(db, store, w)
+54    }
+55}
+56
+57impl PrettyPrint for AssignableValue {
+58    fn pretty_print<W: Write>(
+59        &self,
+60        db: &dyn MirDb,
+61        store: &BodyDataStore,
+62        w: &mut W,
+63    ) -> fmt::Result {
+64        match self {
+65            Self::Value(value) => value.pretty_print(db, store, w),
+66            Self::Aggregate { lhs, idx } => {
+67                lhs.pretty_print(db, store, w)?;
+68                write!(w, ".<")?;
+69                idx.pretty_print(db, store, w)?;
+70                write!(w, ">")
+71            }
+72
+73            Self::Map { lhs, key } => {
+74                lhs.pretty_print(db, store, w)?;
+75                write!(w, "{{")?;
+76                key.pretty_print(db, store, w)?;
+77                write!(w, "}}")
+78            }
+79        }
+80    }
+81}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/ast.rs.html b/compiler-docs/src/fe_parser/ast.rs.html new file mode 100644 index 0000000000..a0444a4788 --- /dev/null +++ b/compiler-docs/src/fe_parser/ast.rs.html @@ -0,0 +1,1421 @@ +ast.rs - source

fe_parser/
ast.rs

1use crate::node::Node;
+2use fe_common::{Span, Spanned};
+3use indenter::indented;
+4use serde::{Deserialize, Serialize};
+5pub use smol_str::SmolStr;
+6use std::fmt;
+7use std::fmt::Formatter;
+8use std::fmt::Write;
+9use vec1::Vec1;
+10
+11#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+12pub struct Module {
+13    pub body: Vec<ModuleStmt>,
+14}
+15
+16#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+17pub enum ModuleStmt {
+18    Pragma(Node<Pragma>),
+19    Use(Node<Use>),
+20    TypeAlias(Node<TypeAlias>),
+21    Contract(Node<Contract>),
+22    Constant(Node<ConstantDecl>),
+23    Struct(Node<Struct>),
+24    Enum(Node<Enum>),
+25    Trait(Node<Trait>),
+26    Impl(Node<Impl>),
+27    Function(Node<Function>),
+28    Attribute(Node<SmolStr>),
+29    ParseError(Span),
+30}
+31
+32#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+33pub struct Pragma {
+34    pub version_requirement: Node<SmolStr>,
+35}
+36
+37#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+38pub struct Path {
+39    pub segments: Vec<Node<SmolStr>>,
+40}
+41
+42impl Path {
+43    pub fn remove_last(&self) -> Path {
+44        Path {
+45            segments: self.segments[0..self.segments.len() - 1].to_vec(),
+46        }
+47    }
+48}
+49
+50#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+51pub struct Use {
+52    pub tree: Node<UseTree>,
+53}
+54
+55#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+56pub enum UseTree {
+57    Glob {
+58        prefix: Path,
+59    },
+60    Nested {
+61        prefix: Path,
+62        children: Vec<Node<UseTree>>,
+63    },
+64    Simple {
+65        path: Path,
+66        rename: Option<Node<SmolStr>>,
+67    },
+68}
+69
+70#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+71pub struct ConstantDecl {
+72    pub name: Node<SmolStr>,
+73    pub typ: Node<TypeDesc>,
+74    pub value: Node<Expr>,
+75    pub pub_qual: Option<Span>,
+76}
+77
+78#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+79pub struct TypeAlias {
+80    pub name: Node<SmolStr>,
+81    pub typ: Node<TypeDesc>,
+82    pub pub_qual: Option<Span>,
+83}
+84
+85#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+86pub struct Contract {
+87    pub name: Node<SmolStr>,
+88    pub fields: Vec<Node<Field>>,
+89    pub body: Vec<ContractStmt>,
+90    pub pub_qual: Option<Span>,
+91}
+92
+93#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+94pub struct Struct {
+95    pub name: Node<SmolStr>,
+96    pub fields: Vec<Node<Field>>,
+97    pub functions: Vec<Node<Function>>,
+98    pub pub_qual: Option<Span>,
+99}
+100
+101#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+102pub struct Enum {
+103    pub name: Node<SmolStr>,
+104    pub variants: Vec<Node<Variant>>,
+105    pub functions: Vec<Node<Function>>,
+106    pub pub_qual: Option<Span>,
+107}
+108
+109#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+110pub struct Trait {
+111    pub name: Node<SmolStr>,
+112    pub functions: Vec<Node<FunctionSignature>>,
+113    pub pub_qual: Option<Span>,
+114}
+115
+116#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+117pub struct Impl {
+118    pub impl_trait: Node<SmolStr>,
+119    pub receiver: Node<TypeDesc>,
+120    pub functions: Vec<Node<Function>>,
+121}
+122
+123#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+124pub enum TypeDesc {
+125    Unit,
+126    // TODO: replace with `Name(SmolStr)`, or eliminate in favor of `Path`?
+127    Base {
+128        base: SmolStr,
+129    },
+130    Path(Path),
+131    Tuple {
+132        items: Vec1<Node<TypeDesc>>,
+133    },
+134    Generic {
+135        // TODO: when we support user-defined generic types,
+136        // this will have to be a `Path`
+137        base: Node<SmolStr>,
+138        args: Node<Vec<GenericArg>>,
+139    },
+140    SelfType,
+141}
+142
+143#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+144pub enum GenericArg {
+145    TypeDesc(Node<TypeDesc>),
+146    Int(Node<usize>),
+147    ConstExpr(Node<Expr>),
+148}
+149
+150impl Spanned for GenericArg {
+151    fn span(&self) -> Span {
+152        match self {
+153            GenericArg::TypeDesc(node) => node.span,
+154            GenericArg::Int(node) => node.span,
+155            GenericArg::ConstExpr(node) => node.span,
+156        }
+157    }
+158}
+159
+160#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+161pub enum GenericParameter {
+162    Unbounded(Node<SmolStr>),
+163    Bounded {
+164        name: Node<SmolStr>,
+165        bound: Node<TypeDesc>,
+166    },
+167}
+168
+169impl GenericParameter {
+170    pub fn name(&self) -> SmolStr {
+171        self.name_node().kind
+172    }
+173
+174    pub fn name_node(&self) -> Node<SmolStr> {
+175        match self {
+176            GenericParameter::Unbounded(node) => node.clone(),
+177            GenericParameter::Bounded { name, .. } => name.clone(),
+178        }
+179    }
+180}
+181
+182impl Spanned for GenericParameter {
+183    fn span(&self) -> Span {
+184        match self {
+185            GenericParameter::Unbounded(node) => node.span,
+186            GenericParameter::Bounded { name, bound } => name.span + bound.span,
+187        }
+188    }
+189}
+190
+191/// struct or contract field, with optional 'pub' and 'const' qualifiers
+192#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+193pub struct Field {
+194    pub is_pub: bool,
+195    pub is_const: bool,
+196    pub attributes: Vec<Node<SmolStr>>,
+197    pub name: Node<SmolStr>,
+198    pub typ: Node<TypeDesc>,
+199    pub value: Option<Node<Expr>>,
+200}
+201
+202/// Enum variant definition.
+203#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+204pub struct Variant {
+205    pub name: Node<SmolStr>,
+206    pub kind: VariantKind,
+207}
+208
+209/// Enum variant kind.
+210#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+211pub enum VariantKind {
+212    /// Unit variant.
+213    /// E.g., `Bar` in
+214    ///
+215    /// ```fe
+216    /// enum Foo {
+217    ///     Bar
+218    ///     Baz(u32, i32)
+219    /// }
+220    /// ```
+221    Unit,
+222
+223    /// Tuple variant.
+224    /// E.g., `Baz(u32, i32)` in
+225    ///
+226    /// ```fe
+227    /// enum Foo {
+228    ///     Bar
+229    ///     Baz(u32, i32)
+230    /// }
+231    /// ```
+232    Tuple(Vec<Node<TypeDesc>>),
+233}
+234
+235#[allow(clippy::large_enum_variant)]
+236#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+237pub enum ContractStmt {
+238    Function(Node<Function>),
+239}
+240
+241#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+242pub struct FunctionSignature {
+243    // qualifier order: `pub unsafe fn`
+244    pub pub_: Option<Span>,
+245    pub unsafe_: Option<Span>,
+246    pub name: Node<SmolStr>,
+247    pub generic_params: Node<Vec<GenericParameter>>,
+248    pub args: Vec<Node<FunctionArg>>,
+249    pub return_type: Option<Node<TypeDesc>>,
+250}
+251
+252#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+253pub struct Function {
+254    pub sig: Node<FunctionSignature>,
+255    pub body: Vec<Node<FuncStmt>>,
+256}
+257
+258#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+259#[allow(clippy::large_enum_variant)]
+260pub enum FunctionArg {
+261    Regular {
+262        mut_: Option<Span>,
+263        label: Option<Node<SmolStr>>,
+264        name: Node<SmolStr>,
+265        typ: Node<TypeDesc>,
+266    },
+267    Self_ {
+268        mut_: Option<Span>,
+269    },
+270}
+271impl FunctionArg {
+272    pub fn label_span(&self) -> Option<Span> {
+273        match self {
+274            Self::Regular { label, .. } => label.as_ref().map(|label| label.span),
+275            Self::Self_ { .. } => None,
+276        }
+277    }
+278
+279    pub fn name_span(&self) -> Option<Span> {
+280        match self {
+281            Self::Regular { name, .. } => Some(name.span),
+282            Self::Self_ { .. } => None,
+283        }
+284    }
+285
+286    pub fn typ_span(&self) -> Option<Span> {
+287        match self {
+288            Self::Regular { typ, .. } => Some(typ.span),
+289            Self::Self_ { .. } => None,
+290        }
+291    }
+292}
+293
+294#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+295pub enum FuncStmt {
+296    Return {
+297        value: Option<Node<Expr>>,
+298    },
+299    VarDecl {
+300        mut_: Option<Span>,
+301        target: Node<VarDeclTarget>,
+302        typ: Node<TypeDesc>,
+303        value: Option<Node<Expr>>,
+304    },
+305    ConstantDecl {
+306        name: Node<SmolStr>,
+307        typ: Node<TypeDesc>,
+308        value: Node<Expr>,
+309    },
+310    Assign {
+311        target: Node<Expr>,
+312        value: Node<Expr>,
+313    },
+314    AugAssign {
+315        target: Node<Expr>,
+316        op: Node<BinOperator>,
+317        value: Node<Expr>,
+318    },
+319    For {
+320        target: Node<SmolStr>,
+321        iter: Node<Expr>,
+322        body: Vec<Node<FuncStmt>>,
+323    },
+324    While {
+325        test: Node<Expr>,
+326        body: Vec<Node<FuncStmt>>,
+327    },
+328    If {
+329        test: Node<Expr>,
+330        body: Vec<Node<FuncStmt>>,
+331        or_else: Vec<Node<FuncStmt>>,
+332    },
+333    Match {
+334        expr: Node<Expr>,
+335        arms: Vec<Node<MatchArm>>,
+336    },
+337    Assert {
+338        test: Node<Expr>,
+339        msg: Option<Node<Expr>>,
+340    },
+341    Expr {
+342        value: Node<Expr>,
+343    },
+344    Break,
+345    Continue,
+346    Revert {
+347        error: Option<Node<Expr>>,
+348    },
+349    Unsafe(Vec<Node<FuncStmt>>),
+350}
+351
+352#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+353pub struct MatchArm {
+354    pub pat: Node<Pattern>,
+355    pub body: Vec<Node<FuncStmt>>,
+356}
+357
+358#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+359pub enum Pattern {
+360    /// Represents a wildcard pattern `_`.
+361    WildCard,
+362    /// Rest pattern. e.g., `..`
+363    Rest,
+364    /// Represents a literal pattern. e.g., `true`.
+365    Literal(Node<LiteralPattern>),
+366    /// Represents tuple destructuring pattern. e.g., `(x, y, z)`.
+367    Tuple(Vec<Node<Pattern>>),
+368    /// Represents unit variant pattern. e.g., `Enum::Unit`.
+369    Path(Node<Path>),
+370    /// Represents tuple variant pattern. e.g., `Enum::Tuple(x, y, z)`.
+371    PathTuple(Node<Path>, Vec<Node<Pattern>>),
+372    /// Represents struct or struct variant destructuring pattern. e.g.,
+373    /// `MyStruct {x: pat1, y: pat2}}`.
+374    PathStruct {
+375        path: Node<Path>,
+376        fields: Vec<(Node<SmolStr>, Node<Pattern>)>,
+377        has_rest: bool,
+378    },
+379    /// Represents or pattern. e.g., `EnumUnit | EnumTuple(_, _, _)`
+380    Or(Vec<Node<Pattern>>),
+381}
+382
+383impl Pattern {
+384    pub fn is_rest(&self) -> bool {
+385        matches!(self, Pattern::Rest)
+386    }
+387}
+388
+389#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+390pub enum LiteralPattern {
+391    Bool(bool),
+392}
+393
+394#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+395pub enum VarDeclTarget {
+396    Name(SmolStr),
+397    Tuple(Vec<Node<VarDeclTarget>>),
+398}
+399
+400#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+401pub enum Expr {
+402    Ternary {
+403        if_expr: Box<Node<Expr>>,
+404        test: Box<Node<Expr>>,
+405        else_expr: Box<Node<Expr>>,
+406    },
+407    BoolOperation {
+408        left: Box<Node<Expr>>,
+409        op: Node<BoolOperator>,
+410        right: Box<Node<Expr>>,
+411    },
+412    BinOperation {
+413        left: Box<Node<Expr>>,
+414        op: Node<BinOperator>,
+415        right: Box<Node<Expr>>,
+416    },
+417    UnaryOperation {
+418        op: Node<UnaryOperator>,
+419        operand: Box<Node<Expr>>,
+420    },
+421    CompOperation {
+422        left: Box<Node<Expr>>,
+423        op: Node<CompOperator>,
+424        right: Box<Node<Expr>>,
+425    },
+426    Attribute {
+427        value: Box<Node<Expr>>,
+428        attr: Node<SmolStr>,
+429    },
+430    Subscript {
+431        value: Box<Node<Expr>>,
+432        index: Box<Node<Expr>>,
+433    },
+434    Call {
+435        func: Box<Node<Expr>>,
+436        generic_args: Option<Node<Vec<GenericArg>>>,
+437        args: Node<Vec<Node<CallArg>>>,
+438    },
+439    List {
+440        elts: Vec<Node<Expr>>,
+441    },
+442    Repeat {
+443        value: Box<Node<Expr>>,
+444        len: Box<Node<GenericArg>>,
+445    },
+446    Tuple {
+447        elts: Vec<Node<Expr>>,
+448    },
+449    Bool(bool),
+450    Name(SmolStr),
+451    Path(Path),
+452    Num(SmolStr),
+453    Str(SmolStr),
+454    Unit,
+455}
+456
+457#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+458pub struct CallArg {
+459    pub label: Option<Node<SmolStr>>,
+460    pub value: Node<Expr>,
+461}
+462
+463#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+464pub enum BoolOperator {
+465    And,
+466    Or,
+467}
+468
+469#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+470pub enum BinOperator {
+471    Add,
+472    Sub,
+473    Mult,
+474    Div,
+475    Mod,
+476    Pow,
+477    LShift,
+478    RShift,
+479    BitOr,
+480    BitXor,
+481    BitAnd,
+482}
+483
+484#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+485pub enum UnaryOperator {
+486    Invert,
+487    Not,
+488    USub,
+489}
+490
+491#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+492pub enum CompOperator {
+493    Eq,
+494    NotEq,
+495    Lt,
+496    LtE,
+497    Gt,
+498    GtE,
+499}
+500
+501impl Node<Contract> {
+502    pub fn name(&self) -> &str {
+503        &self.kind.name.kind
+504    }
+505}
+506
+507impl Node<Struct> {
+508    pub fn name(&self) -> &str {
+509        &self.kind.name.kind
+510    }
+511}
+512
+513impl Node<Enum> {
+514    pub fn name(&self) -> &str {
+515        &self.kind.name.kind
+516    }
+517}
+518
+519impl Node<Variant> {
+520    pub fn name(&self) -> &str {
+521        &self.kind.name.kind
+522    }
+523}
+524
+525impl Node<Trait> {
+526    pub fn name(&self) -> &str {
+527        &self.kind.name.kind
+528    }
+529}
+530
+531impl Node<Field> {
+532    pub fn name(&self) -> &str {
+533        &self.kind.name.kind
+534    }
+535}
+536
+537impl Node<Function> {
+538    pub fn name(&self) -> &str {
+539        &self.kind.sig.kind.name.kind
+540    }
+541}
+542
+543impl Node<FunctionArg> {
+544    pub fn name(&self) -> &str {
+545        match &self.kind {
+546            FunctionArg::Regular { name, .. } => &name.kind,
+547            FunctionArg::Self_ { .. } => "self",
+548        }
+549    }
+550
+551    pub fn name_span(&self) -> Span {
+552        match &self.kind {
+553            FunctionArg::Regular { name, .. } => name.span,
+554            FunctionArg::Self_ { .. } => self.span,
+555        }
+556    }
+557}
+558
+559impl Node<TypeAlias> {
+560    pub fn name(&self) -> &str {
+561        &self.kind.name.kind
+562    }
+563}
+564
+565impl Spanned for ModuleStmt {
+566    fn span(&self) -> Span {
+567        match self {
+568            ModuleStmt::Pragma(inner) => inner.span,
+569            ModuleStmt::Use(inner) => inner.span,
+570            ModuleStmt::Trait(inner) => inner.span,
+571            ModuleStmt::Impl(inner) => inner.span,
+572            ModuleStmt::TypeAlias(inner) => inner.span,
+573            ModuleStmt::Contract(inner) => inner.span,
+574            ModuleStmt::Constant(inner) => inner.span,
+575            ModuleStmt::Struct(inner) => inner.span,
+576            ModuleStmt::Enum(inner) => inner.span,
+577            ModuleStmt::Function(inner) => inner.span,
+578            ModuleStmt::Attribute(inner) => inner.span,
+579            ModuleStmt::ParseError(span) => *span,
+580        }
+581    }
+582}
+583
+584impl Spanned for ContractStmt {
+585    fn span(&self) -> Span {
+586        match self {
+587            ContractStmt::Function(inner) => inner.span,
+588        }
+589    }
+590}
+591
+592impl fmt::Display for Module {
+593    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+594        let (uses, rest): (Vec<&ModuleStmt>, Vec<&ModuleStmt>) = self
+595            .body
+596            .iter()
+597            .partition(|&stmt| matches!(stmt, ModuleStmt::Use(_) | ModuleStmt::Pragma(_)));
+598        for stmt in &uses {
+599            writeln!(f, "{stmt}")?;
+600        }
+601        if !uses.is_empty() && !rest.is_empty() {
+602            writeln!(f)?;
+603        }
+604        let mut delim = "";
+605        for stmt in rest {
+606            writeln!(f, "{delim}{stmt}")?;
+607            delim = "\n";
+608        }
+609        Ok(())
+610    }
+611}
+612
+613impl fmt::Display for ModuleStmt {
+614    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+615        match self {
+616            ModuleStmt::Pragma(node) => write!(f, "{}", node.kind),
+617            ModuleStmt::Use(node) => write!(f, "{}", node.kind),
+618            ModuleStmt::Trait(node) => write!(f, "{}", node.kind),
+619            ModuleStmt::Impl(node) => write!(f, "{}", node.kind),
+620            ModuleStmt::TypeAlias(node) => write!(f, "{}", node.kind),
+621            ModuleStmt::Contract(node) => write!(f, "{}", node.kind),
+622            ModuleStmt::Constant(node) => write!(f, "{}", node.kind),
+623            ModuleStmt::Struct(node) => write!(f, "{}", node.kind),
+624            ModuleStmt::Enum(node) => write!(f, "{}", node.kind),
+625            ModuleStmt::Function(node) => write!(f, "{}", node.kind),
+626            ModuleStmt::Attribute(node) => writeln!(f, "#{}", node.kind),
+627            ModuleStmt::ParseError(span) => {
+628                write!(f, "# PARSE ERROR: {}..{}", span.start, span.end)
+629            }
+630        }
+631    }
+632}
+633
+634impl fmt::Display for Pragma {
+635    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+636        write!(f, "pragma {}", self.version_requirement.kind)
+637    }
+638}
+639
+640impl fmt::Display for Use {
+641    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+642        // TODO pub use
+643        write!(f, "use {}", self.tree.kind)
+644    }
+645}
+646
+647impl fmt::Display for UseTree {
+648    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+649        match self {
+650            UseTree::Glob { prefix } => write!(f, "{prefix}::*"),
+651            UseTree::Simple { path, rename } => {
+652                if let Some(rename) = rename {
+653                    write!(f, "{} as {}", path, rename.kind)
+654                } else {
+655                    write!(f, "{path}")
+656                }
+657            }
+658            UseTree::Nested { prefix, children } => {
+659                write!(f, "{}::{{{}}}", prefix, node_comma_joined(children))
+660            }
+661        }
+662    }
+663}
+664
+665impl fmt::Display for Path {
+666    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+667        let joined_names = self
+668            .segments
+669            .iter()
+670            .map(|name| name.kind.as_ref())
+671            .collect::<Vec<_>>()
+672            .join("::");
+673        write!(f, "{joined_names}")?;
+674
+675        Ok(())
+676    }
+677}
+678
+679impl fmt::Display for ConstantDecl {
+680    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+681        let ConstantDecl {
+682            name,
+683            typ,
+684            value,
+685            pub_qual,
+686        } = self;
+687        if pub_qual.is_some() {
+688            write!(f, "pub ")?;
+689        }
+690        write!(f, "const {}: {} = {}", name.kind, typ.kind, value.kind)
+691    }
+692}
+693
+694impl fmt::Display for Trait {
+695    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+696        writeln!(f, "trait {}:", self.name.kind)?;
+697
+698        Ok(())
+699    }
+700}
+701
+702impl fmt::Display for Impl {
+703    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+704        writeln!(
+705            f,
+706            "impl {} for {}",
+707            self.impl_trait.kind, self.receiver.kind
+708        )?;
+709
+710        Ok(())
+711    }
+712}
+713
+714impl fmt::Display for TypeAlias {
+715    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+716        let TypeAlias {
+717            name,
+718            typ,
+719            pub_qual,
+720        } = self;
+721        if pub_qual.is_some() {
+722            write!(f, "pub ")?;
+723        }
+724        write!(f, "type {} = {}", name.kind, typ.kind)
+725    }
+726}
+727
+728impl fmt::Display for Contract {
+729    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+730        let Contract {
+731            name,
+732            fields,
+733            body,
+734            pub_qual,
+735        } = self;
+736
+737        if pub_qual.is_some() {
+738            write!(f, "pub ")?;
+739        }
+740        write!(f, "contract {} {{", name.kind)?;
+741
+742        if !fields.is_empty() {
+743            for field in fields {
+744                writeln!(f)?;
+745                write!(indented(f), "{}", field.kind)?;
+746            }
+747            writeln!(f)?;
+748        }
+749        if !body.is_empty() {
+750            writeln!(f)?;
+751            write!(indented(f), "{}", double_line_joined(body))?;
+752            writeln!(f)?;
+753        }
+754        write!(f, "}}")
+755    }
+756}
+757
+758impl fmt::Display for Struct {
+759    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+760        let Struct {
+761            name,
+762            fields,
+763            functions,
+764            pub_qual,
+765        } = self;
+766
+767        if pub_qual.is_some() {
+768            write!(f, "pub ")?;
+769        }
+770        write!(f, "struct {} ", name.kind)?;
+771        write!(f, "{{")?;
+772        write_nodes_line_wrapped(&mut indented(f), fields)?;
+773
+774        if !self.fields.is_empty() && !functions.is_empty() {
+775            writeln!(f)?;
+776        }
+777        if !functions.is_empty() {
+778            writeln!(indented(f), "{}", double_line_joined(functions))?;
+779        }
+780        write!(f, "}}")
+781    }
+782}
+783
+784impl fmt::Display for Enum {
+785    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+786        let Enum {
+787            name,
+788            variants,
+789            functions,
+790            pub_qual,
+791        } = self;
+792
+793        if pub_qual.is_some() {
+794            write!(f, "pub ")?;
+795        }
+796
+797        write!(f, "enum {} ", name.kind)?;
+798        write!(f, "{{")?;
+799        write_nodes_line_wrapped(&mut indented(f), variants)?;
+800
+801        if !functions.is_empty() {
+802            writeln!(indented(f), "{}", double_line_joined(functions))?;
+803        }
+804        write!(f, "}}")
+805    }
+806}
+807
+808impl fmt::Display for TypeDesc {
+809    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+810        match self {
+811            TypeDesc::Unit => write!(f, "()"),
+812            TypeDesc::Base { base } => write!(f, "{base}"),
+813            TypeDesc::Path(path) => write!(f, "{path}"),
+814            TypeDesc::Tuple { items } => {
+815                if items.len() == 1 {
+816                    write!(f, "({},)", items[0].kind)
+817                } else {
+818                    write!(f, "({})", node_comma_joined(items))
+819                }
+820            }
+821            TypeDesc::Generic { base, args } => {
+822                write!(f, "{}<{}>", base.kind, comma_joined(args.kind.iter()))
+823            }
+824            TypeDesc::SelfType => write!(f, "Self"),
+825        }
+826    }
+827}
+828
+829impl fmt::Display for GenericParameter {
+830    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+831        match self {
+832            GenericParameter::Unbounded(name) => write!(f, "{}", name.kind),
+833            GenericParameter::Bounded { name, bound } => write!(f, "{}: {}", name.kind, bound.kind),
+834        }
+835    }
+836}
+837
+838impl fmt::Display for GenericArg {
+839    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+840        match self {
+841            GenericArg::TypeDesc(node) => write!(f, "{}", node.kind),
+842            GenericArg::Int(node) => write!(f, "{}", node.kind),
+843            GenericArg::ConstExpr(node) => write!(f, "{{ {} }}", node.kind),
+844        }
+845    }
+846}
+847
+848impl fmt::Display for Field {
+849    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+850        if self.is_pub {
+851            write!(f, "pub ")?;
+852        }
+853        if self.is_const {
+854            write!(f, "const ")?;
+855        }
+856        write!(f, "{}: {}", self.name.kind, self.typ.kind)
+857    }
+858}
+859
+860impl fmt::Display for Variant {
+861    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+862        write!(f, "{}", self.name.kind)?;
+863        match &self.kind {
+864            VariantKind::Unit => Ok(()),
+865            VariantKind::Tuple(elts) => {
+866                write!(f, "({})", node_comma_joined(elts))
+867            }
+868        }
+869    }
+870}
+871
+872impl fmt::Display for ContractStmt {
+873    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+874        match self {
+875            ContractStmt::Function(node) => write!(f, "{}", node.kind),
+876        }
+877    }
+878}
+879
+880impl fmt::Display for Node<Function> {
+881    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+882        self.kind.fmt(f)
+883    }
+884}
+885
+886impl fmt::Display for Function {
+887    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+888        let FunctionSignature {
+889            pub_,
+890            unsafe_,
+891            name,
+892            generic_params,
+893            args,
+894            return_type,
+895        } = &self.sig.kind;
+896
+897        if pub_.is_some() {
+898            write!(f, "pub ")?;
+899        }
+900        if unsafe_.is_some() {
+901            write!(f, "unsafe ")?;
+902        }
+903        write!(f, "fn {}", name.kind)?;
+904        if !generic_params.kind.is_empty() {
+905            write!(f, "<{}>", comma_joined(generic_params.kind.iter()))?;
+906        }
+907        write!(f, "({})", node_comma_joined(args))?;
+908
+909        if let Some(return_type) = return_type.as_ref() {
+910            write!(f, " -> {}", return_type.kind)?;
+911        }
+912        write!(f, " {{")?;
+913        write_nodes_line_wrapped(&mut indented(f), &self.body)?;
+914        write!(f, "}}")
+915    }
+916}
+917
+918impl fmt::Display for FunctionArg {
+919    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+920        match self {
+921            FunctionArg::Regular {
+922                mut_,
+923                label,
+924                name,
+925                typ,
+926            } => {
+927                if mut_.is_some() {
+928                    write!(f, "mut ")?
+929                }
+930                if let Some(label) = label {
+931                    write!(f, "{} ", label.kind)?
+932                }
+933
+934                write!(f, "{}: {}", name.kind, typ.kind)
+935            }
+936            FunctionArg::Self_ { mut_ } => {
+937                if mut_.is_some() {
+938                    write!(f, "mut ")?;
+939                }
+940                write!(f, "self")
+941            }
+942        }
+943    }
+944}
+945
+946impl fmt::Display for FuncStmt {
+947    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+948        match self {
+949            FuncStmt::Return { value } => {
+950                if let Some(value) = value {
+951                    write!(f, "return {}", value.kind)
+952                } else {
+953                    write!(f, "return")
+954                }
+955            }
+956            FuncStmt::VarDecl {
+957                mut_,
+958                target,
+959                typ,
+960                value,
+961            } => {
+962                let mut_ = if mut_.is_some() { "mut " } else { "" };
+963                if let Some(value) = value {
+964                    write!(
+965                        f,
+966                        "let {}{}: {} = {}",
+967                        mut_, target.kind, typ.kind, value.kind
+968                    )
+969                } else {
+970                    write!(f, "let {}{}: {}", mut_, target.kind, typ.kind)
+971                }
+972            }
+973            FuncStmt::ConstantDecl { name, typ, value } => {
+974                write!(f, "const {}: {} = {}", name.kind, typ.kind, value.kind)
+975            }
+976            FuncStmt::Assign { target, value } => write!(f, "{} = {}", target.kind, value.kind),
+977            FuncStmt::AugAssign { target, op, value } => {
+978                write!(f, "{} {}= {}", target.kind, op.kind, value.kind)
+979            }
+980            FuncStmt::For { target, iter, body } => {
+981                write!(f, "for {} in {} {{", target.kind, iter.kind)?;
+982                write_nodes_line_wrapped(&mut indented(f), body)?;
+983                write!(f, "}}")
+984            }
+985            FuncStmt::While { test, body } => {
+986                write!(f, "while {} {{", test.kind)?;
+987                write_nodes_line_wrapped(&mut indented(f), body)?;
+988                write!(f, "}}")
+989            }
+990            FuncStmt::If {
+991                test,
+992                body,
+993                or_else,
+994            } => {
+995                write!(f, "if {} {{", test.kind)?;
+996                write_nodes_line_wrapped(&mut indented(f), body)?;
+997
+998                if or_else.is_empty() {
+999                    write!(f, "}}")
+1000                } else {
+1001                    if body.is_empty() {
+1002                        writeln!(f)?;
+1003                    }
+1004
+1005                    if matches!(
+1006                        &or_else[..],
+1007                        &[Node {
+1008                            kind: FuncStmt::If { .. },
+1009                            ..
+1010                        }]
+1011                    ) {
+1012                        write!(f, "}} else ")?;
+1013                        write!(f, "{}", or_else[0].kind)
+1014                    } else {
+1015                        write!(f, "}} else {{")?;
+1016                        write_nodes_line_wrapped(&mut indented(f), or_else)?;
+1017                        write!(f, "}}")
+1018                    }
+1019                }
+1020            }
+1021            FuncStmt::Match { expr, arms } => {
+1022                write!(f, "match {} {{", expr.kind)?;
+1023                write_nodes_line_wrapped(&mut indented(f), arms)?;
+1024                write!(f, "}}")
+1025            }
+1026            FuncStmt::Assert { test, msg } => {
+1027                if let Some(msg) = msg {
+1028                    write!(f, "assert {}, {}", test.kind, msg.kind)
+1029                } else {
+1030                    write!(f, "assert {}", test.kind)
+1031                }
+1032            }
+1033            FuncStmt::Expr { value } => write!(f, "{}", value.kind),
+1034            FuncStmt::Break => write!(f, "break"),
+1035            FuncStmt::Continue => write!(f, "continue"),
+1036            FuncStmt::Revert { error } => {
+1037                if let Some(error) = error {
+1038                    write!(f, "revert {}", error.kind)
+1039                } else {
+1040                    write!(f, "revert")
+1041                }
+1042            }
+1043            FuncStmt::Unsafe(body) => {
+1044                write!(f, "unsafe {{")?;
+1045                write_nodes_line_wrapped(&mut indented(f), body)?;
+1046                write!(f, "}}")
+1047            }
+1048        }
+1049    }
+1050}
+1051
+1052impl fmt::Display for VarDeclTarget {
+1053    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+1054        match self {
+1055            VarDeclTarget::Name(name) => write!(f, "{name}"),
+1056            VarDeclTarget::Tuple(elts) => {
+1057                if elts.len() == 1 {
+1058                    write!(f, "({},)", elts[0].kind)
+1059                } else {
+1060                    write!(f, "({})", node_comma_joined(elts))
+1061                }
+1062            }
+1063        }
+1064    }
+1065}
+1066
+1067impl fmt::Display for Expr {
+1068    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+1069        match self {
+1070            Expr::Ternary {
+1071                if_expr,
+1072                test,
+1073                else_expr,
+1074            } => write!(
+1075                f,
+1076                "{} if {} else {}",
+1077                if_expr.kind, test.kind, else_expr.kind
+1078            ),
+1079            Expr::BoolOperation { left, op, right } => {
+1080                let left = maybe_fmt_left_with_parens(&op.kind, &left.kind);
+1081                let right = maybe_fmt_right_with_parens(&op.kind, &right.kind);
+1082                write!(f, "{} {} {}", left, op.kind, right)
+1083            }
+1084            Expr::BinOperation { left, op, right } => {
+1085                let left = maybe_fmt_left_with_parens(&op.kind, &left.kind);
+1086                let right = maybe_fmt_right_with_parens(&op.kind, &right.kind);
+1087                write!(f, "{} {} {}", left, op.kind, right)
+1088            }
+1089            Expr::UnaryOperation { op, operand } => {
+1090                let operand = maybe_fmt_operand_with_parens(&op.kind, &operand.kind);
+1091                if op.kind == UnaryOperator::Not {
+1092                    write!(f, "{} {}", op.kind, operand)
+1093                } else {
+1094                    write!(f, "{}{}", op.kind, operand)
+1095                }
+1096            }
+1097            Expr::CompOperation { left, op, right } => {
+1098                let left = maybe_fmt_left_with_parens(&op.kind, &left.kind);
+1099                let right = maybe_fmt_right_with_parens(&op.kind, &right.kind);
+1100                write!(f, "{} {} {}", left, op.kind, right)
+1101            }
+1102            Expr::Attribute { value, attr } => write!(f, "{}.{}", value.kind, attr.kind),
+1103            Expr::Subscript { value, index } => write!(f, "{}[{}]", value.kind, index.kind),
+1104            Expr::Call {
+1105                func,
+1106                generic_args,
+1107                args,
+1108            } => {
+1109                write!(f, "{}", func.kind)?;
+1110                if let Some(generic_args) = generic_args {
+1111                    write!(f, "<{}>", comma_joined(generic_args.kind.iter()))?;
+1112                }
+1113                write!(f, "({})", node_comma_joined(&args.kind))
+1114            }
+1115            Expr::List { elts } => write!(f, "[{}]", node_comma_joined(elts)),
+1116            Expr::Repeat { value: elt, len } => write!(f, "[{}; {}]", elt.kind, len.kind),
+1117            Expr::Tuple { elts } => {
+1118                if elts.len() == 1 {
+1119                    write!(f, "({},)", elts[0].kind)
+1120                } else {
+1121                    write!(f, "({})", node_comma_joined(elts))
+1122                }
+1123            }
+1124            Expr::Bool(bool) => write!(f, "{bool}"),
+1125            Expr::Name(name) => write!(f, "{name}"),
+1126            Expr::Path(path) => write!(f, "{path}"),
+1127            Expr::Num(num) => write!(f, "{num}"),
+1128            Expr::Str(str) => write!(f, "\"{str}\""),
+1129            Expr::Unit => write!(f, "()"),
+1130        }
+1131    }
+1132}
+1133
+1134impl fmt::Display for CallArg {
+1135    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+1136        if let Some(label) = &self.label {
+1137            if let Expr::Name(var_name) = &self.value.kind {
+1138                if var_name == &label.kind {
+1139                    return write!(f, "{var_name}");
+1140                }
+1141            }
+1142            write!(f, "{}: {}", label.kind, self.value.kind)
+1143        } else {
+1144            write!(f, "{}", self.value.kind)
+1145        }
+1146    }
+1147}
+1148
+1149impl fmt::Display for BoolOperator {
+1150    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1151        use BoolOperator::*;
+1152        match self {
+1153            And => write!(f, "and"),
+1154            Or => write!(f, "or"),
+1155        }
+1156    }
+1157}
+1158
+1159impl fmt::Display for BinOperator {
+1160    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1161        use BinOperator::*;
+1162        match self {
+1163            Add => write!(f, "+"),
+1164            Sub => write!(f, "-"),
+1165            Mult => write!(f, "*"),
+1166            Div => write!(f, "/"),
+1167            Mod => write!(f, "%"),
+1168            Pow => write!(f, "**"),
+1169            LShift => write!(f, "<<"),
+1170            RShift => write!(f, ">>"),
+1171            BitOr => write!(f, "|"),
+1172            BitXor => write!(f, "^"),
+1173            BitAnd => write!(f, "&"),
+1174        }
+1175    }
+1176}
+1177
+1178impl fmt::Display for UnaryOperator {
+1179    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1180        use UnaryOperator::*;
+1181        match self {
+1182            Invert => write!(f, "~"),
+1183            Not => write!(f, "not"),
+1184            USub => write!(f, "-"),
+1185        }
+1186    }
+1187}
+1188
+1189impl fmt::Display for CompOperator {
+1190    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1191        use CompOperator::*;
+1192        match self {
+1193            Eq => write!(f, "=="),
+1194            NotEq => write!(f, "!="),
+1195            Lt => write!(f, "<"),
+1196            LtE => write!(f, "<="),
+1197            Gt => write!(f, ">"),
+1198            GtE => write!(f, ">="),
+1199        }
+1200    }
+1201}
+1202
+1203impl fmt::Display for MatchArm {
+1204    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1205        write!(f, "{} => {{", self.pat.kind)?;
+1206        write_nodes_line_wrapped(&mut indented(f), &self.body)?;
+1207        write!(f, "}}")
+1208    }
+1209}
+1210
+1211impl fmt::Display for Pattern {
+1212    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1213        match self {
+1214            Self::WildCard => write!(f, "_"),
+1215            Self::Rest => write!(f, ".."),
+1216            Self::Literal(pat) => write!(f, "{}", pat.kind),
+1217            Self::Path(path) => write!(f, "{}", path.kind),
+1218            Self::PathTuple(path, elts) => {
+1219                write!(f, "{}", path.kind)?;
+1220                write!(f, "({})", node_comma_joined(elts))
+1221            }
+1222            Self::Tuple(elts) => {
+1223                write!(f, "({})", node_comma_joined(elts))
+1224            }
+1225            Self::PathStruct {
+1226                path,
+1227                fields,
+1228                has_rest: is_rest,
+1229            } => {
+1230                write!(f, "{}", path.kind)?;
+1231                let fields = fields
+1232                    .iter()
+1233                    .map(|(name, pat)| format!("{}: {}", name.kind, pat.kind));
+1234                let fields = comma_joined(fields);
+1235                if *is_rest {
+1236                    write!(f, "{{{fields}, ..}}")
+1237                } else {
+1238                    write!(f, "{{{fields}}}")
+1239                }
+1240            }
+1241            Self::Or(pats) => {
+1242                write!(f, "{}", node_delim_joined(pats, "| "))
+1243            }
+1244        }
+1245    }
+1246}
+1247
+1248impl fmt::Display for LiteralPattern {
+1249    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1250        match self {
+1251            Self::Bool(b) => write!(f, "{b}"),
+1252        }
+1253    }
+1254}
+1255
+1256fn node_comma_joined(nodes: &[Node<impl fmt::Display>]) -> String {
+1257    node_delim_joined(nodes, ", ")
+1258}
+1259
+1260fn node_delim_joined(nodes: &[Node<impl fmt::Display>], delim: &str) -> String {
+1261    delim_joined(nodes.iter().map(|node| &node.kind), delim)
+1262}
+1263
+1264fn comma_joined<T>(items: impl Iterator<Item = T>) -> String
+1265where
+1266    T: fmt::Display,
+1267{
+1268    delim_joined(items, ", ")
+1269}
+1270
+1271fn delim_joined<T>(items: impl Iterator<Item = T>, delim: &str) -> String
+1272where
+1273    T: fmt::Display,
+1274{
+1275    items
+1276        .map(|item| format!("{item}"))
+1277        .collect::<Vec<_>>()
+1278        .join(delim)
+1279}
+1280
+1281fn write_nodes_line_wrapped(f: &mut impl Write, nodes: &[Node<impl fmt::Display>]) -> fmt::Result {
+1282    if !nodes.is_empty() {
+1283        writeln!(f)?;
+1284    }
+1285    for n in nodes {
+1286        writeln!(f, "{}", n.kind)?;
+1287    }
+1288    Ok(())
+1289}
+1290
+1291fn double_line_joined(items: &[impl fmt::Display]) -> String {
+1292    items
+1293        .iter()
+1294        .map(|item| format!("{item}"))
+1295        .collect::<Vec<_>>()
+1296        .join("\n\n")
+1297}
+1298
+1299trait InfixBindingPower {
+1300    fn infix_binding_power(&self) -> (u8, u8);
+1301}
+1302
+1303trait PrefixBindingPower {
+1304    fn prefix_binding_power(&self) -> u8;
+1305}
+1306
+1307impl InfixBindingPower for BoolOperator {
+1308    fn infix_binding_power(&self) -> (u8, u8) {
+1309        use BoolOperator::*;
+1310
+1311        match self {
+1312            Or => (50, 51),
+1313            And => (60, 61),
+1314        }
+1315    }
+1316}
+1317
+1318impl InfixBindingPower for BinOperator {
+1319    fn infix_binding_power(&self) -> (u8, u8) {
+1320        use BinOperator::*;
+1321
+1322        match self {
+1323            Add | Sub => (120, 121),
+1324            Mult | Div | Mod => (130, 131),
+1325            Pow => (141, 140),
+1326            LShift | RShift => (110, 111),
+1327            BitOr => (80, 81),
+1328            BitXor => (90, 91),
+1329            BitAnd => (100, 101),
+1330        }
+1331    }
+1332}
+1333
+1334impl InfixBindingPower for CompOperator {
+1335    fn infix_binding_power(&self) -> (u8, u8) {
+1336        (70, 71)
+1337    }
+1338}
+1339
+1340impl PrefixBindingPower for UnaryOperator {
+1341    fn prefix_binding_power(&self) -> u8 {
+1342        use UnaryOperator::*;
+1343
+1344        match self {
+1345            Not => 65,
+1346            Invert | USub => 135,
+1347        }
+1348    }
+1349}
+1350
+1351fn maybe_fmt_left_with_parens(op: &impl InfixBindingPower, expr: &Expr) -> String {
+1352    if expr_right_binding_power(expr) < op.infix_binding_power().0 {
+1353        format!("({expr})")
+1354    } else {
+1355        format!("{expr}")
+1356    }
+1357}
+1358
+1359fn maybe_fmt_right_with_parens(op: &impl InfixBindingPower, expr: &Expr) -> String {
+1360    if op.infix_binding_power().1 > expr_left_binding_power(expr) {
+1361        format!("({expr})")
+1362    } else {
+1363        format!("{expr}")
+1364    }
+1365}
+1366
+1367fn maybe_fmt_operand_with_parens(op: &impl PrefixBindingPower, expr: &Expr) -> String {
+1368    if op.prefix_binding_power() > expr_left_binding_power(expr) {
+1369        format!("({expr})")
+1370    } else {
+1371        format!("{expr}")
+1372    }
+1373}
+1374
+1375fn expr_left_binding_power(expr: &Expr) -> u8 {
+1376    let max_power = u8::MAX;
+1377
+1378    match expr {
+1379        Expr::Ternary { .. } => max_power,
+1380        Expr::BoolOperation { op, .. } => op.kind.infix_binding_power().0,
+1381        Expr::BinOperation { op, .. } => op.kind.infix_binding_power().0,
+1382        Expr::UnaryOperation { op, .. } => op.kind.prefix_binding_power(),
+1383        Expr::CompOperation { op, .. } => op.kind.infix_binding_power().0,
+1384        Expr::Attribute { .. } => max_power,
+1385        Expr::Subscript { .. } => max_power,
+1386        Expr::Call { .. } => max_power,
+1387        Expr::List { .. } => max_power,
+1388        Expr::Repeat { .. } => max_power,
+1389        Expr::Tuple { .. } => max_power,
+1390        Expr::Bool(_) => max_power,
+1391        Expr::Name(_) => max_power,
+1392        Expr::Path(_) => max_power,
+1393        Expr::Num(_) => max_power,
+1394        Expr::Str(_) => max_power,
+1395        Expr::Unit => max_power,
+1396    }
+1397}
+1398
+1399fn expr_right_binding_power(expr: &Expr) -> u8 {
+1400    let max_power = u8::MAX;
+1401
+1402    match expr {
+1403        Expr::Ternary { .. } => max_power,
+1404        Expr::BoolOperation { op, .. } => op.kind.infix_binding_power().1,
+1405        Expr::BinOperation { op, .. } => op.kind.infix_binding_power().1,
+1406        Expr::UnaryOperation { op, .. } => op.kind.prefix_binding_power(),
+1407        Expr::CompOperation { op, .. } => op.kind.infix_binding_power().1,
+1408        Expr::Attribute { .. } => max_power,
+1409        Expr::Subscript { .. } => max_power,
+1410        Expr::Call { .. } => max_power,
+1411        Expr::List { .. } => max_power,
+1412        Expr::Repeat { .. } => max_power,
+1413        Expr::Tuple { .. } => max_power,
+1414        Expr::Bool(_) => max_power,
+1415        Expr::Name(_) => max_power,
+1416        Expr::Path(_) => max_power,
+1417        Expr::Num(_) => max_power,
+1418        Expr::Str(_) => max_power,
+1419        Expr::Unit => max_power,
+1420    }
+1421}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar.rs.html b/compiler-docs/src/fe_parser/grammar.rs.html new file mode 100644 index 0000000000..c1426ad55f --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar.rs.html @@ -0,0 +1,5 @@ +grammar.rs - source

fe_parser/
grammar.rs

1pub mod contracts;
+2pub mod expressions;
+3pub mod functions;
+4pub mod module;
+5pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/contracts.rs.html b/compiler-docs/src/fe_parser/grammar/contracts.rs.html new file mode 100644 index 0000000000..3bf030d9f2 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/contracts.rs.html @@ -0,0 +1,91 @@ +contracts.rs - source

fe_parser/grammar/
contracts.rs

1use super::functions::parse_fn_def;
+2use super::types::{parse_field, parse_opt_qualifier};
+3
+4use crate::ast::{Contract, ContractStmt};
+5use crate::node::{Node, Span};
+6use crate::{ParseFailed, ParseResult, Parser, TokenKind};
+7
+8// Rule: all "statement" level parse functions consume their trailing
+9// newline(s), either directly or via a function they call.
+10// This is required to parse an `if` block, because we need to peek past the
+11// trailing newlines to check whether it's followed by an `else` block, and is
+12// done for all statements for consistency.
+13
+14/// Parse a contract definition.
+15/// # Panics
+16/// Panics if the next token isn't `contract`.
+17pub fn parse_contract_def(
+18    par: &mut Parser,
+19    contract_pub_qual: Option<Span>,
+20) -> ParseResult<Node<Contract>> {
+21    let contract_tok = par.assert(TokenKind::Contract);
+22    let contract_name = par.expect_with_notes(
+23        TokenKind::Name,
+24        "failed to parse contract definition",
+25        |_| vec!["Note: `contract` must be followed by a name, which must start with a letter and contain only letters, numbers, or underscores".into()],
+26    )?;
+27
+28    let mut span = contract_tok.span + contract_name.span;
+29    par.enter_block(span, "contract definition")?;
+30
+31    let mut fields = vec![];
+32    let mut defs = vec![];
+33
+34    loop {
+35        par.eat_newlines();
+36        let mut pub_qual = parse_opt_qualifier(par, TokenKind::Pub);
+37        let const_qual = parse_opt_qualifier(par, TokenKind::Const);
+38        if pub_qual.is_none() && const_qual.is_some() && par.peek() == Some(TokenKind::Pub) {
+39            pub_qual = parse_opt_qualifier(par, TokenKind::Pub);
+40            par.error(
+41                pub_qual.unwrap() + const_qual,
+42                "`const pub` should be written `pub const`",
+43            );
+44        }
+45
+46        match par.peek_or_err()? {
+47            TokenKind::Name => {
+48                let field = parse_field(par, vec![], pub_qual, const_qual)?;
+49                if !defs.is_empty() {
+50                    par.error(
+51                        field.span,
+52                        "contract field definitions must come before any function definitions",
+53                    );
+54                }
+55                fields.push(field);
+56            }
+57            TokenKind::Fn | TokenKind::Unsafe => {
+58                if let Some(span) = const_qual {
+59                    par.error(
+60                        span,
+61                        "`const` qualifier can't be used with function definitions",
+62                    );
+63                }
+64                defs.push(ContractStmt::Function(parse_fn_def(par, pub_qual)?));
+65            }
+66            TokenKind::BraceClose => {
+67                span += par.next()?.span;
+68                break;
+69            }
+70            _ => {
+71                let tok = par.next()?;
+72                par.unexpected_token_error(
+73                    &tok,
+74                    "failed to parse contract definition body",
+75                    vec![],
+76                );
+77                return Err(ParseFailed);
+78            }
+79        };
+80    }
+81
+82    Ok(Node::new(
+83        Contract {
+84            name: Node::new(contract_name.text.into(), contract_name.span),
+85            fields,
+86            body: defs,
+87            pub_qual: contract_pub_qual,
+88        },
+89        span,
+90    ))
+91}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/expressions.rs.html b/compiler-docs/src/fe_parser/grammar/expressions.rs.html new file mode 100644 index 0000000000..deb9c5aaa7 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/expressions.rs.html @@ -0,0 +1,677 @@ +expressions.rs - source

fe_parser/grammar/
expressions.rs

1use crate::ast::{self, CallArg, Expr, GenericArg, Path};
+2use crate::node::Node;
+3use crate::{Label, ParseFailed, ParseResult, Parser, Token, TokenKind};
+4
+5use super::types::parse_generic_args;
+6
+7use if_chain::if_chain;
+8
+9// Expressions are parsed in Pratt's top-down operator precedence style.
+10// See this article for a nice explanation:
+11// <https://matklad.github.io/2020/04/13/simple-but-powerful-pratt-parsing.html>
+12
+13/// Parse an expression, starting with the next token.
+14pub fn parse_expr(par: &mut Parser) -> ParseResult<Node<Expr>> {
+15    parse_expr_with_min_bp(par, 0)
+16}
+17
+18/// Parse an expression, stopping if/when we reach an operator that binds less
+19/// tightly than given binding power.
+20pub fn parse_expr_with_min_bp(par: &mut Parser, min_bp: u8) -> ParseResult<Node<Expr>> {
+21    let mut expr_head = parse_expr_head(par)?;
+22
+23    while let Some(op) = par.peek() {
+24        if let Some(lbp) = postfix_binding_power(op) {
+25            if lbp < min_bp {
+26                break;
+27            }
+28
+29            expr_head = match op {
+30                TokenKind::ParenOpen => {
+31                    let args = parse_call_args(par)?;
+32                    let span = expr_head.span + args.span;
+33                    Node::new(
+34                        Expr::Call {
+35                            func: Box::new(expr_head),
+36                            generic_args: None,
+37                            args,
+38                        },
+39                        span,
+40                    )
+41                }
+42                TokenKind::BracketOpen => {
+43                    par.next()?;
+44                    let index = parse_expr(par)?;
+45                    let rbracket = par.expect(
+46                        TokenKind::BracketClose,
+47                        "failed to parse subscript expression",
+48                    )?;
+49                    let span = expr_head.span + rbracket.span;
+50                    Node::new(
+51                        Expr::Subscript {
+52                            value: Box::new(expr_head),
+53                            index: Box::new(index),
+54                        },
+55                        span,
+56                    )
+57                }
+58                TokenKind::If => {
+59                    par.next()?;
+60                    let test = parse_expr(par)?;
+61                    par.expect(
+62                        TokenKind::Else,
+63                        "failed to parse ternary `if-else` expression",
+64                    )?;
+65                    let else_val = parse_expr(par)?;
+66                    let span = expr_head.span + else_val.span;
+67                    Node::new(
+68                        Expr::Ternary {
+69                            if_expr: Box::new(expr_head),
+70                            test: Box::new(test),
+71                            else_expr: Box::new(else_val),
+72                        },
+73                        span,
+74                    )
+75                }
+76                _ => unreachable!(), // patterns above must match those in `postfix_binding_power`
+77            };
+78            continue;
+79        }
+80
+81        if matches!(op, TokenKind::Lt) {
+82            let mut bt_par = par.as_bt_parser();
+83            if_chain! {
+84                if let Ok(generic_args) = parse_generic_args(&mut bt_par);
+85                if matches!(bt_par.peek(), Some(TokenKind::ParenOpen));
+86                if let Ok(args) = parse_call_args(&mut bt_par);
+87                then {
+88                    let span = expr_head.span + args.span;
+89                    expr_head = Node::new(
+90                        Expr::Call {
+91                            func: Box::new(expr_head),
+92                            generic_args: Some(generic_args),
+93                            args,
+94                        },
+95                        span,
+96                    );
+97                    bt_par.accept();
+98                    continue;
+99                }
+100            }
+101        }
+102
+103        if let Some((lbp, rbp)) = infix_binding_power(op) {
+104            if lbp < min_bp {
+105                break;
+106            }
+107
+108            let op_tok = par.next()?;
+109            let rhs = parse_expr_with_min_bp(par, rbp)?;
+110            expr_head = infix_op(par, expr_head, &op_tok, rhs)?;
+111            continue;
+112        }
+113        break;
+114    }
+115
+116    Ok(expr_head)
+117}
+118
+119/// Parse call arguments
+120pub fn parse_call_args(par: &mut Parser) -> ParseResult<Node<Vec<Node<CallArg>>>> {
+121    use TokenKind::*;
+122    let lparen = par.assert(ParenOpen);
+123    let mut args = vec![];
+124    let mut span = lparen.span;
+125    loop {
+126        if par.peek_or_err()? == ParenClose {
+127            span += par.next()?.span;
+128            break;
+129        }
+130
+131        let arg = parse_expr(par)?;
+132        match par.peek_or_err()? {
+133            TokenKind::Eq => {
+134                let eq = par.next()?;
+135                if let Expr::Name(name) = arg.kind {
+136                    par.fancy_error(
+137                        "Syntax error in argument list",
+138                        vec![Label::primary(eq.span, "unexpected `=`".to_string())],
+139                        vec![
+140                            "Argument labels should be followed by `:`.".to_string(),
+141                            format!("Hint: try `{name}:`"),
+142                            "If this is a variable assignment, it must be a standalone statement."
+143                                .to_string(),
+144                        ],
+145                    );
+146                    let value = parse_expr(par)?;
+147                    let span = arg.span + value.span;
+148                    args.push(Node::new(
+149                        CallArg {
+150                            label: Some(Node::new(name, arg.span)),
+151                            value,
+152                        },
+153                        span,
+154                    ));
+155                } else {
+156                    par.fancy_error(
+157                        "Syntax error in argument list",
+158                        vec![Label::primary(eq.span, "unexpected `=`".to_string())],
+159                        vec![],
+160                    );
+161                }
+162            }
+163
+164            TokenKind::Colon => {
+165                let sep_tok = par.next()?;
+166                let value = parse_expr(par)?;
+167                if let Expr::Name(name) = arg.kind {
+168                    let span = arg.span + value.span;
+169                    args.push(Node::new(
+170                        CallArg {
+171                            label: Some(Node::new(name, arg.span)),
+172                            value,
+173                        },
+174                        span,
+175                    ));
+176                } else {
+177                    par.fancy_error(
+178                        "Syntax error in function call argument list",
+179                        vec![
+180                            Label::primary(
+181                                sep_tok.span,
+182                                "In a function call, `:` is used for named arguments".to_string(),
+183                            ),
+184                            Label::secondary(
+185                                arg.span,
+186                                "this should be a function parameter name".to_string(),
+187                            ),
+188                        ],
+189                        vec![],
+190                    );
+191                    return Err(ParseFailed);
+192                }
+193            }
+194            _ => {
+195                let span = arg.span;
+196                args.push(Node::new(
+197                    CallArg {
+198                        label: None,
+199                        value: arg,
+200                    },
+201                    span,
+202                ));
+203            }
+204        }
+205        if par.peek_or_err()? == Comma {
+206            par.next()?;
+207        } else {
+208            span += par
+209                .expect(ParenClose, "failed to parse function call argument list")?
+210                .span;
+211            break;
+212        }
+213    }
+214
+215    Ok(Node::new(args, span))
+216}
+217
+218/// Try to build an expression starting with the given token.
+219fn parse_expr_head(par: &mut Parser) -> ParseResult<Node<Expr>> {
+220    use TokenKind::*;
+221
+222    match par.peek_or_err()? {
+223        Name | SelfValue | Int | Hex | Octal | Binary | Text | True | False => {
+224            let tok = par.next()?;
+225            Ok(atom(par, &tok))
+226        }
+227        Plus | Minus | Not | Tilde => {
+228            let op = par.next()?;
+229            let operand = parse_expr_with_min_bp(par, prefix_binding_power(op.kind))?;
+230            unary_op(par, &op, operand)
+231        }
+232        ParenOpen => parse_group_or_tuple(par),
+233        BracketOpen => parse_list_or_repeat(par),
+234        _ => {
+235            let tok = par.next()?;
+236            par.unexpected_token_error(
+237                &tok,
+238                format!("Unexpected token while parsing expression: `{}`", tok.text),
+239                vec![],
+240            );
+241            Err(ParseFailed)
+242        }
+243    }
+244}
+245
+246/// Specifies how tightly a prefix unary operator binds to its operand.
+247fn prefix_binding_power(op: TokenKind) -> u8 {
+248    use TokenKind::*;
+249    match op {
+250        Not => 65,
+251        Plus | Minus | Tilde => 135,
+252        _ => panic!("Unexpected unary op token: {op:?}"),
+253    }
+254}
+255
+256/// Specifies how tightly does an infix operator bind to its left and right
+257/// operands. See https://docs.python.org/3/reference/expressions.html#operator-precedence
+258fn infix_binding_power(op: TokenKind) -> Option<(u8, u8)> {
+259    use TokenKind::*;
+260
+261    let bp = match op {
+262        // assignment expr `:=`?
+263        // lambda?
+264        // Comma => (40, 41),
+265        Or => (50, 51),
+266        And => (60, 61),
+267        // prefix Not => 65
+268
+269        // all comparisons are the same
+270        Lt | LtEq | Gt | GtEq | NotEq | EqEq => (70, 71),
+271
+272        Pipe => (80, 81),
+273        Hat => (90, 91),
+274        Amper => (100, 101),
+275        LtLt | GtGt => (110, 111),
+276        Plus | Minus => (120, 121),
+277        Star | Slash | Percent => (130, 131),
+278        // Prefix Plus | Minus | Tilde => 135
+279        StarStar => (141, 140),
+280        Dot => (150, 151),
+281        ColonColon => (160, 161),
+282        _ => return None,
+283    };
+284    Some(bp)
+285}
+286
+287/// Specifies how tightly a postfix operator binds to its operand.
+288/// We don't have any "real" postfix operators (like `?` in rust),
+289/// but we treat `[`, `(`, and ternary `if` as though they're postfix
+290/// operators.
+291fn postfix_binding_power(op: TokenKind) -> Option<u8> {
+292    use TokenKind::*;
+293    match op {
+294        If => Some(35), // ternary
+295        BracketOpen | ParenOpen => Some(150),
+296        _ => None,
+297    }
+298}
+299
+300/// Parse a square-bracket list expression, eg. `[1, 2, x]` or `[true; 42]`
+301fn parse_list_or_repeat(par: &mut Parser) -> ParseResult<Node<Expr>> {
+302    let lbracket = par.assert(TokenKind::BracketOpen);
+303    let elts = parse_expr_list(par, &[TokenKind::BracketClose, TokenKind::Semi], None)?;
+304
+305    if elts.len() == 1 {
+306        if par.peek() == Some(TokenKind::BracketClose) {
+307            let rbracket = par.assert(TokenKind::BracketClose);
+308            let span = lbracket.span + rbracket.span;
+309            Ok(Node::new(Expr::List { elts }, span))
+310        } else if par.peek() == Some(TokenKind::Semi) {
+311            par.assert(TokenKind::Semi);
+312
+313            let len = if par.peek() == Some(TokenKind::BraceOpen) {
+314                // handle `{ ... }` const expression
+315                let brace_open = par.next()?;
+316                let expr = parse_expr(par)?;
+317                if !matches!(par.peek(), Some(TokenKind::BraceClose)) {
+318                    par.error(brace_open.span, "missing closing delimiter `}`");
+319                    return Err(ParseFailed);
+320                }
+321                let brace_close = par.assert(TokenKind::BraceClose);
+322                let span = brace_open.span + brace_close.span;
+323                Box::new(Node::new(GenericArg::ConstExpr(expr), span))
+324            } else {
+325                // handle const expression without braces
+326                let expr = parse_expr(par)?;
+327                let span = expr.span;
+328                Box::new(Node::new(GenericArg::ConstExpr(expr), span))
+329            };
+330
+331            let rbracket = par.assert(TokenKind::BracketClose);
+332            let span = lbracket.span + rbracket.span;
+333            Ok(Node::new(
+334                Expr::Repeat {
+335                    value: Box::new(elts[0].clone()),
+336                    len,
+337                },
+338                span,
+339            ))
+340        } else {
+341            par.error(lbracket.span, "expected `]` or `;`");
+342            Err(ParseFailed)
+343        }
+344    } else {
+345        let rbracket = par.assert(TokenKind::BracketClose);
+346        let span = lbracket.span + rbracket.span;
+347        Ok(Node::new(Expr::List { elts }, span))
+348    }
+349}
+350
+351/// Parse a paren-wrapped expression, which might turn out to be a tuple
+352/// if it contains commas.
+353fn parse_group_or_tuple(par: &mut Parser) -> ParseResult<Node<Expr>> {
+354    use TokenKind::*;
+355    let lparen = par.assert(ParenOpen);
+356    if par.peek_or_err()? == ParenClose {
+357        let rparen = par.next()?;
+358        let span = lparen.span + rparen.span;
+359        return Ok(Node::new(Expr::Unit, span));
+360    }
+361
+362    let elem = parse_expr(par)?;
+363    match par.peek_or_err()? {
+364        ParenClose => {
+365            // expr wrapped in parens
+366            let rparen = par.next()?;
+367            let span = lparen.span + rparen.span;
+368            Ok(Node::new(elem.kind, span))
+369        }
+370        Comma => {
+371            // tuple
+372            par.next()?;
+373            let elts = parse_expr_list(par, &[ParenClose], Some(elem))?;
+374            let rparen = par.expect(ParenClose, "failed to parse tuple expression")?;
+375            let span = lparen.span + rparen.span;
+376            Ok(Node::new(Expr::Tuple { elts }, span))
+377        }
+378        _ => {
+379            let tok = par.next()?;
+380            par.unexpected_token_error(
+381                &tok,
+382                "Unexpected token while parsing expression in parentheses",
+383                vec![],
+384            );
+385            Err(ParseFailed)
+386        }
+387    }
+388}
+389
+390/// Parse some number of comma-separated expressions, until `end_marker` is
+391/// `peek()`ed.
+392fn parse_expr_list(
+393    par: &mut Parser,
+394    end_markers: &[TokenKind],
+395    head: Option<Node<Expr>>,
+396) -> ParseResult<Vec<Node<Expr>>> {
+397    let mut elts = vec![];
+398    if let Some(elem) = head {
+399        elts.push(elem);
+400    }
+401    loop {
+402        let next = par.peek_or_err()?;
+403        if end_markers.contains(&next) {
+404            break;
+405        }
+406        elts.push(parse_expr(par)?);
+407        match par.peek_or_err()? {
+408            TokenKind::Comma => {
+409                par.next()?;
+410            }
+411            tk if end_markers.contains(&tk) => break,
+412            _ => {
+413                let tok = par.next()?;
+414                par.unexpected_token_error(
+415                    &tok,
+416                    "Unexpected token while parsing list of expressions",
+417                    vec![],
+418                );
+419                return Err(ParseFailed);
+420            }
+421        }
+422    }
+423
+424    Ok(elts)
+425}
+426
+427/* node building utils */
+428
+429/// Create an "atom" expr from the given `Token` (`Name`, `Num`, `Bool`, etc)
+430fn atom(par: &mut Parser, tok: &Token) -> Node<Expr> {
+431    use TokenKind::*;
+432
+433    let expr = match tok.kind {
+434        Name | SelfValue => Expr::Name(tok.text.into()),
+435        Int | Hex | Octal | Binary => Expr::Num(tok.text.into()),
+436        True | False => Expr::Bool(tok.kind == True),
+437        Text => {
+438            if let Some(string) = unescape_string(tok.text) {
+439                Expr::Str(string.into())
+440            } else {
+441                par.error(tok.span, "String contains an invalid escape sequence");
+442                Expr::Str(tok.text.into())
+443            }
+444        }
+445        _ => panic!("Unexpected atom token: {tok:?}"),
+446    };
+447    Node::new(expr, tok.span)
+448}
+449
+450fn unescape_string(quoted_string: &str) -> Option<String> {
+451    let inner = &quoted_string[1..quoted_string.len() - 1];
+452    unescape::unescape(inner)
+453}
+454
+455/// Create an expr from the given infix operator and operands.
+456fn infix_op(
+457    par: &mut Parser,
+458    left: Node<Expr>,
+459    op: &Token,
+460    right: Node<Expr>,
+461) -> ParseResult<Node<Expr>> {
+462    use TokenKind::*;
+463    let expr = match op.kind {
+464        Or | And => bool_op(left, op, right),
+465
+466        Amper | Hat | Pipe | LtLt | GtGt | Plus | Minus | Star | Slash | Percent | StarStar => {
+467            bin_op(left, op, right)
+468        }
+469
+470        Lt | LtEq | Gt | GtEq | NotEq | EqEq => comp_op(left, op, right),
+471
+472        Dot => {
+473            let span = left.span + right.span;
+474            match right.kind {
+475                Expr::Name(name) => Node::new(
+476                    Expr::Attribute {
+477                        value: Box::new(left),
+478                        attr: Node::new(name, right.span),
+479                    },
+480                    span,
+481                ),
+482                Expr::Num(_num) => {
+483                    par.error(span, "floats not supported");
+484                    return Err(ParseFailed);
+485                }
+486                Expr::Call {
+487                    func,
+488                    generic_args,
+489                    args,
+490                } => {
+491                    let func_span = left.span + func.span;
+492                    let func = Box::new(Node::new(
+493                        Expr::Attribute {
+494                            value: Box::new(left),
+495                            attr: {
+496                                if let Expr::Name(name) = func.kind {
+497                                    Node::new(name, func.span)
+498                                } else {
+499                                    par.fancy_error(
+500                                        "failed to parse attribute expression",
+501                                        vec![Label::primary(func.span, "expected a name")],
+502                                        vec![],
+503                                    );
+504                                    return Err(ParseFailed);
+505                                }
+506                            },
+507                        },
+508                        func_span,
+509                    ));
+510
+511                    Node::new(
+512                        Expr::Call {
+513                            func,
+514                            generic_args,
+515                            args,
+516                        },
+517                        span,
+518                    )
+519                }
+520                _ => {
+521                    par.fancy_error(
+522                        "failed to parse attribute expression",
+523                        vec![Label::primary(right.span, "expected a name")],
+524                        vec![],
+525                    );
+526                    return Err(ParseFailed);
+527                }
+528            }
+529        }
+530        ColonColon => {
+531            let mut path = match left.kind {
+532                Expr::Name(name) => Path {
+533                    segments: vec![Node::new(name, left.span)],
+534                },
+535                Expr::Path(path) => path,
+536                _ => {
+537                    par.fancy_error(
+538                        "failed to parse path expression",
+539                        vec![
+540                            Label::secondary(op.span, "path delimiter".to_string()),
+541                            Label::primary(left.span, "expected a name"),
+542                        ],
+543                        vec![],
+544                    );
+545                    return Err(ParseFailed);
+546                }
+547            };
+548
+549            // `right` can't be a Path (rbp > lbp); only valid option is `Name`
+550            match right.kind {
+551                Expr::Name(name) => {
+552                    path.segments.push(Node::new(name, right.span));
+553                    Node::new(Expr::Path(path), left.span + right.span)
+554                }
+555                _ => {
+556                    par.fancy_error(
+557                        "failed to parse path expression",
+558                        vec![
+559                            Label::secondary(op.span, "path delimiter".to_string()),
+560                            Label::primary(right.span, "expected a name"),
+561                        ],
+562                        vec![],
+563                    );
+564                    return Err(ParseFailed);
+565                }
+566            }
+567        }
+568        _ => panic!("Unexpected infix op token: {op:?}"),
+569    };
+570    Ok(expr)
+571}
+572
+573/// Create an `Expr::BoolOperation` node for the given operator and operands.
+574fn bool_op(left: Node<Expr>, op: &Token, right: Node<Expr>) -> Node<Expr> {
+575    use TokenKind::*;
+576    let astop = match op.kind {
+577        And => ast::BoolOperator::And,
+578        Or => ast::BoolOperator::Or,
+579        _ => panic!(),
+580    };
+581
+582    let span = left.span + right.span;
+583    Node::new(
+584        Expr::BoolOperation {
+585            left: Box::new(left),
+586            op: Node::new(astop, op.span),
+587            right: Box::new(right),
+588        },
+589        span,
+590    )
+591}
+592
+593/// Create an `Expr::BinOperation` node for the given operator and operands.
+594fn bin_op(left: Node<Expr>, op: &Token, right: Node<Expr>) -> Node<Expr> {
+595    use ast::BinOperator::*;
+596    use TokenKind::*;
+597
+598    let astop = match op.kind {
+599        Amper => BitAnd,
+600        Hat => BitXor,
+601        Pipe => BitOr,
+602        LtLt => LShift,
+603        GtGt => RShift,
+604        Plus => Add,
+605        Minus => Sub,
+606        Star => Mult,
+607        Slash => Div,
+608        Percent => Mod,
+609        StarStar => Pow,
+610        _ => panic!(),
+611    };
+612
+613    let span = left.span + right.span;
+614    Node::new(
+615        Expr::BinOperation {
+616            left: Box::new(left),
+617            op: Node::new(astop, op.span),
+618            right: Box::new(right),
+619        },
+620        span,
+621    )
+622}
+623
+624/// Create an `Expr::UnaryOperation` node for the given operator and operands.
+625fn unary_op(par: &mut Parser, op: &Token, operand: Node<Expr>) -> ParseResult<Node<Expr>> {
+626    use ast::UnaryOperator;
+627    use TokenKind::*;
+628
+629    let astop = match op.kind {
+630        Tilde => UnaryOperator::Invert,
+631        Not => UnaryOperator::Not,
+632        Minus => UnaryOperator::USub,
+633        Plus => {
+634            par.fancy_error(
+635                "unary plus not supported",
+636                vec![Label::primary(op.span, "consider removing the '+'")],
+637                vec![],
+638            );
+639            return Err(ParseFailed);
+640        }
+641        _ => panic!(),
+642    };
+643
+644    let span = op.span + operand.span;
+645    Ok(Node::new(
+646        Expr::UnaryOperation {
+647            op: Node::new(astop, op.span),
+648            operand: Box::new(operand),
+649        },
+650        span,
+651    ))
+652}
+653
+654/// Create an `Expr::CompOperation` node for the given operator and operands.
+655fn comp_op(left: Node<Expr>, op: &Token, right: Node<Expr>) -> Node<Expr> {
+656    use ast::CompOperator;
+657    use TokenKind::*;
+658    let astop = match op.kind {
+659        In => todo!("in"), // CompOperator::In,
+660        Lt => CompOperator::Lt,
+661        LtEq => CompOperator::LtE,
+662        Gt => CompOperator::Gt,
+663        GtEq => CompOperator::GtE,
+664        NotEq => CompOperator::NotEq,
+665        EqEq => CompOperator::Eq,
+666        _ => panic!(),
+667    };
+668    let span = left.span + right.span;
+669    Node::new(
+670        Expr::CompOperation {
+671            left: Box::new(left),
+672            op: Node::new(astop, op.span),
+673            right: Box::new(right),
+674        },
+675        span,
+676    )
+677}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/functions.rs.html b/compiler-docs/src/fe_parser/grammar/functions.rs.html new file mode 100644 index 0000000000..c38edf9bf0 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/functions.rs.html @@ -0,0 +1,914 @@ +functions.rs - source

fe_parser/grammar/
functions.rs

1use super::expressions::parse_expr;
+2use super::types::parse_type_desc;
+3
+4use crate::ast::{
+5    BinOperator, Expr, FuncStmt, Function, FunctionArg, FunctionSignature, GenericParameter,
+6    LiteralPattern, MatchArm, Path, Pattern, TypeDesc, VarDeclTarget,
+7};
+8use crate::node::{Node, Span};
+9use crate::{Label, ParseFailed, ParseResult, Parser, TokenKind};
+10
+11/// Parse a function definition without a body. The optional `pub` qualifier
+12/// must be parsed by the caller, and passed in. Next token must be `unsafe` or
+13/// `fn`.
+14pub fn parse_fn_sig(
+15    par: &mut Parser,
+16    mut pub_qual: Option<Span>,
+17) -> ParseResult<Node<FunctionSignature>> {
+18    let unsafe_qual = par.optional(TokenKind::Unsafe).map(|tok| tok.span);
+19    if let Some(pub_) = par.optional(TokenKind::Pub) {
+20        let unsafe_span =
+21            unsafe_qual.expect("caller must verify that next token is `unsafe` or `fn`");
+22
+23        par.fancy_error(
+24            "`pub` visibility modifier must come before `unsafe`",
+25            vec![Label::primary(
+26                unsafe_span + pub_.span,
+27                "use `pub unsafe` here",
+28            )],
+29            vec![],
+30        );
+31        pub_qual = pub_qual.or(Some(pub_.span));
+32    }
+33    let fn_tok = par.expect(TokenKind::Fn, "failed to parse function definition")?;
+34    let name = par.expect(TokenKind::Name, "failed to parse function definition")?;
+35
+36    let mut span = fn_tok.span + name.span + unsafe_qual + pub_qual;
+37
+38    let generic_params = if par.peek() == Some(TokenKind::Lt) {
+39        parse_generic_params(par)?
+40    } else {
+41        Node::new(vec![], name.span)
+42    };
+43
+44    let args = match par.peek_or_err()? {
+45        TokenKind::ParenOpen => {
+46            let node = parse_fn_param_list(par)?;
+47            span += node.span;
+48            node.kind
+49        }
+50        TokenKind::BraceOpen | TokenKind::Arrow => {
+51            par.fancy_error(
+52                "function definition requires a list of parameters",
+53                vec![Label::primary(
+54                    name.span,
+55                    "function name must be followed by `(`",
+56                )],
+57                vec![
+58                    format!(
+59                        "Note: if the function `{}` takes no parameters, use an empty set of parentheses.",
+60                        name.text
+61                    ),
+62                    format!("Example: fn {}()", name.text),
+63                    "Note: each parameter must have a name and a type.".into(),
+64                    format!("Example: fn {}(my_value: u256, x: bool)", name.text),
+65                ],
+66            );
+67            vec![]
+68        }
+69        _ => {
+70            let tok = par.next()?;
+71            par.unexpected_token_error(
+72                &tok,
+73                "failed to parse function definition",
+74                vec![
+75                    "function name must be followed by a list of parameters".into(),
+76                    "Example: `fn foo(x: address, y: u256)` or `fn f()`".into(),
+77                ],
+78            );
+79            return Err(ParseFailed);
+80        }
+81    };
+82    let return_type = if par.peek() == Some(TokenKind::Arrow) {
+83        par.next()?;
+84        let typ = parse_type_desc(par)?;
+85        span += typ.span;
+86        Some(typ)
+87    } else {
+88        None
+89    };
+90
+91    Ok(Node::new(
+92        FunctionSignature {
+93            pub_: pub_qual,
+94            unsafe_: unsafe_qual,
+95            name: name.into(),
+96            args,
+97            generic_params,
+98            return_type,
+99        },
+100        span,
+101    ))
+102}
+103
+104/// Parse a function definition. The optional `pub` qualifier must be parsed by
+105/// the caller, and passed in. Next token must be `unsafe` or `fn`.
+106pub fn parse_fn_def(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<Function>> {
+107    let sig = parse_fn_sig(par, pub_qual)?;
+108
+109    // TODO: allow multi-line return type? `fn f()\n ->\n u8`
+110    par.enter_block(sig.span, "function definition")?;
+111    let body = parse_block_stmts(par)?;
+112    let rbrace = par.expect(TokenKind::BraceClose, "missing `}` in fn definition")?;
+113
+114    Ok(Node::new(
+115        Function {
+116            sig: sig.clone(),
+117            body,
+118        },
+119        sig.span + rbrace.span,
+120    ))
+121}
+122
+123/// Parse a single generic function parameter (eg. `T:SomeTrait` in `fn foo<T:
+124/// SomeTrait>(some_arg: u256) -> bool`). # Panics
+125/// Panics if the first token isn't `Name`.
+126pub fn parse_generic_param(par: &mut Parser) -> ParseResult<GenericParameter> {
+127    use TokenKind::*;
+128
+129    let name = par.assert(Name);
+130    match par.optional(Colon) {
+131        Some(_) => {
+132            let bound = par.expect(TokenKind::Name, "failed to parse generic bound")?;
+133            Ok(GenericParameter::Bounded {
+134                name: Node::new(name.text.into(), name.span),
+135                bound: Node::new(
+136                    TypeDesc::Base {
+137                        base: bound.text.into(),
+138                    },
+139                    bound.span,
+140                ),
+141            })
+142        }
+143        None => Ok(GenericParameter::Unbounded(Node::new(
+144            name.text.into(),
+145            name.span,
+146        ))),
+147    }
+148}
+149
+150/// Parse an angle-bracket-wrapped list of generic arguments (eg. `<T, R:
+151/// SomeTrait>` in `fn foo<T, R: SomeTrait>(some_arg: u256) -> bool`). # Panics
+152/// Panics if the first token isn't `<`.
+153pub fn parse_generic_params(par: &mut Parser) -> ParseResult<Node<Vec<GenericParameter>>> {
+154    use TokenKind::*;
+155    let mut span = par.assert(Lt).span;
+156
+157    let mut args = vec![];
+158
+159    let expect_end = |par: &mut Parser| {
+160        // If there's no comma, the next token must be `>`
+161        match par.peek_or_err()? {
+162            Gt => Ok(par.next()?.span),
+163            _ => {
+164                let tok = par.next()?;
+165                par.unexpected_token_error(
+166                    &tok,
+167                    "Unexpected token while parsing generic arg list",
+168                    vec!["Expected a `>` here".to_string()],
+169                );
+170                Err(ParseFailed)
+171            }
+172        }
+173    };
+174
+175    loop {
+176        match par.peek_or_err()? {
+177            Gt => {
+178                span += par.next()?.span;
+179                break;
+180            }
+181            Name => {
+182                let typ = parse_generic_param(par)?;
+183                args.push(typ);
+184                if par.peek() == Some(Comma) {
+185                    par.next()?;
+186                } else {
+187                    span += expect_end(par)?;
+188                    break;
+189                }
+190            }
+191
+192            // Invalid generic argument.
+193            _ => {
+194                let tok = par.next()?;
+195                par.unexpected_token_error(
+196                    &tok,
+197                    "failed to parse list of generic function parameters",
+198                    vec!["Expected a generic parameter name such as `T` here".to_string()],
+199                );
+200                return Err(ParseFailed);
+201            }
+202        }
+203    }
+204    Ok(Node::new(args, span))
+205}
+206
+207fn parse_fn_param_list(par: &mut Parser) -> ParseResult<Node<Vec<Node<FunctionArg>>>> {
+208    let mut span = par.assert(TokenKind::ParenOpen).span;
+209    let mut params = vec![];
+210    loop {
+211        match par.peek_or_err()? {
+212            TokenKind::ParenClose => {
+213                span += par.next()?.span;
+214                break;
+215            }
+216            TokenKind::Mut | TokenKind::Name | TokenKind::SelfValue => {
+217                params.push(parse_fn_param(par)?);
+218
+219                if par.peek() == Some(TokenKind::Comma) {
+220                    par.next()?;
+221                } else {
+222                    span += par
+223                        .expect(
+224                            TokenKind::ParenClose,
+225                            "unexpected token while parsing function parameter list",
+226                        )?
+227                        .span;
+228                    break;
+229                }
+230            }
+231            _ => {
+232                let tok = par.next()?;
+233                par.unexpected_token_error(&tok, "failed to parse function parameter list", vec![]);
+234                return Err(ParseFailed);
+235            }
+236        }
+237    }
+238    Ok(Node::new(params, span))
+239}
+240
+241fn parse_fn_param(par: &mut Parser) -> ParseResult<Node<FunctionArg>> {
+242    let mut_ = par.optional(TokenKind::Mut).map(|tok| tok.span);
+243
+244    match par.peek_or_err()? {
+245        TokenKind::SelfValue => Ok(Node::new(FunctionArg::Self_ { mut_ }, par.next()?.span)),
+246        TokenKind::Name => {
+247            let ident = par.next()?;
+248
+249            // Parameter can have an optional label specifier. Example:
+250            //     fn transfer(from sender: address, to recipient: address, _ val: u256)
+251            //     transfer(from: me, to: you, 100)
+252
+253            let (label, name) = match par.optional(TokenKind::Name) {
+254                Some(name) => (Some(ident), name),
+255                None => (None, ident),
+256            };
+257            par.expect_with_notes(
+258                TokenKind::Colon,
+259                "failed to parse function parameter",
+260                |_| {
+261                    vec![
+262                        "Note: parameter name must be followed by a colon and a type description"
+263                            .into(),
+264                        format!("Example: `{}: u256`", name.text),
+265                    ]
+266                },
+267            )?;
+268            let typ = parse_type_desc(par)?;
+269            let param_span = name.span + typ.span + mut_ + label.as_ref();
+270            Ok(Node::new(
+271                FunctionArg::Regular {
+272                    mut_,
+273                    label: label.map(Node::from),
+274                    name: name.into(),
+275                    typ,
+276                },
+277                param_span,
+278            ))
+279        }
+280        _ => {
+281            let tok = par.next()?;
+282            par.unexpected_token_error(&tok, "failed to parse function parameter list", vec![]);
+283            Err(ParseFailed)
+284        }
+285    }
+286}
+287
+288/// Parse (function) statements until a `}` or end-of-file is reached.
+289fn parse_block_stmts(par: &mut Parser) -> ParseResult<Vec<Node<FuncStmt>>> {
+290    let mut body = vec![];
+291    loop {
+292        par.eat_newlines();
+293        match par.peek_or_err()? {
+294            TokenKind::BraceClose => break,
+295            _ => body.push(parse_stmt(par)?),
+296        }
+297    }
+298    Ok(body)
+299}
+300
+301fn aug_assign_op(tk: TokenKind) -> Option<BinOperator> {
+302    use BinOperator::*;
+303    use TokenKind::*;
+304
+305    let op = match tk {
+306        PlusEq => Add,
+307        MinusEq => Sub,
+308        StarEq => Mult,
+309        SlashEq => Div,
+310        PercentEq => Mod,
+311        StarStarEq => Pow,
+312        LtLtEq => LShift,
+313        GtGtEq => RShift,
+314        PipeEq => BitOr,
+315        HatEq => BitXor,
+316        AmperEq => BitAnd,
+317        _ => return None,
+318    };
+319    Some(op)
+320}
+321
+322/// Parse a `continue`, `break`, `pass`, or `revert` statement.
+323///
+324/// # Panics
+325/// Panics if the next token isn't one of the above.
+326pub fn parse_single_word_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+327    let tok = par.next()?;
+328    par.expect_stmt_end(tok.kind.describe())?;
+329    let stmt = match tok.kind {
+330        TokenKind::Continue => FuncStmt::Continue,
+331        TokenKind::Break => FuncStmt::Break,
+332        _ => panic!(),
+333    };
+334    Ok(Node::new(stmt, tok.span))
+335}
+336
+337/// Parse a function-level statement.
+338pub fn parse_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+339    use TokenKind::*;
+340
+341    // rule: stmt parsing fns eat the trailing separator (newline, semi)
+342    match par.peek_or_err()? {
+343        For => parse_for_stmt(par),
+344        If => parse_if_stmt(par),
+345        Match => parse_match_stmt(par),
+346        While => parse_while_stmt(par),
+347        Return => parse_return_stmt(par),
+348        Assert => parse_assert_stmt(par),
+349        Revert => parse_revert_stmt(par),
+350        Continue | Break => parse_single_word_stmt(par),
+351        Let => parse_var_decl(par),
+352        Const => parse_const_decl(par),
+353        Unsafe => parse_unsafe_block(par),
+354        _ => parse_expr_stmt(par),
+355    }
+356}
+357
+358fn parse_var_decl(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+359    let let_tkn = par.assert(TokenKind::Let);
+360    let mut_ = par.optional(TokenKind::Mut).map(|t| t.span);
+361    let expr = parse_expr(par)?;
+362    let target = expr_to_vardecl_target(par, expr.clone())?;
+363    let node = match par.peek() {
+364        Some(TokenKind::Colon) => {
+365            par.next()?;
+366            let typ = parse_type_desc(par)?;
+367            let value = if par.peek() == Some(TokenKind::Eq) {
+368                par.next()?;
+369                Some(parse_expr(par)?)
+370            } else {
+371                None
+372            };
+373            let span = let_tkn.span + target.span + typ.span + value.as_ref();
+374            par.expect_stmt_end("variable declaration")?;
+375            Node::new(
+376                FuncStmt::VarDecl {
+377                    mut_,
+378                    target,
+379                    typ,
+380                    value,
+381                },
+382                span,
+383            )
+384        }
+385        _ => {
+386            par.fancy_error(
+387                "failed to parse variable declaration",
+388                vec![Label::primary(
+389                    expr.span,
+390                    "Must be followed by type annotation",
+391                )],
+392                vec!["Example: `let x: u8 = 1`".into()],
+393            );
+394            return Err(ParseFailed);
+395        }
+396    };
+397    Ok(node)
+398}
+399
+400fn parse_const_decl(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+401    let const_tok = par.assert(TokenKind::Const);
+402    let name = par.expect(TokenKind::Name, "failed to parse constant declaration")?;
+403    par.expect_with_notes(
+404        TokenKind::Colon,
+405        "failed to parse constant declaration",
+406        |_| {
+407            vec![
+408                "Note: constant name must be followed by a colon and a type description".into(),
+409                format!("Example: let `{}: u256 = 1000`", name.text),
+410            ]
+411        },
+412    )?;
+413    let typ = parse_type_desc(par)?;
+414    par.expect_with_notes(
+415        TokenKind::Eq,
+416        "failed to parse constant declaration",
+417        |_| {
+418            vec![
+419            "Note: the type of a constant must be followed by an equals sign and a value assignment"
+420                .into(),
+421                format!(
+422                    "Example: let `{}: u256 = 1000`",
+423                    name.text
+424                ),
+425        ]
+426        },
+427    )?;
+428
+429    let value = parse_expr(par)?;
+430    par.expect_stmt_end("variable declaration")?;
+431
+432    let span = const_tok.span + value.span;
+433    Ok(Node::new(
+434        FuncStmt::ConstantDecl {
+435            name: name.into(),
+436            typ,
+437            value,
+438        },
+439        span,
+440    ))
+441}
+442
+443/// Parse a (function) statement that begins with an expression. This might be
+444/// a `VarDecl`, `Assign`, or an expression.
+445fn parse_expr_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+446    use TokenKind::*;
+447    let expr = parse_expr(par)?;
+448    let node = match par.peek() {
+449        None | Some(Newline | Semi | BraceClose) => {
+450            let span = expr.span;
+451            Node::new(FuncStmt::Expr { value: expr }, span)
+452        }
+453        Some(Colon) => {
+454            par.fancy_error(
+455                "Variable declaration must begin with `let`",
+456                vec![Label::primary(expr.span, "invalid variable declaration")],
+457                vec!["Example: `let x: u8 = 1`".into()],
+458            );
+459            return Err(ParseFailed);
+460        }
+461        Some(Eq) => {
+462            par.next()?;
+463            let value = parse_expr(par)?;
+464            let span = expr.span + value.span;
+465            // TODO: should `x = y = z` be allowed?
+466            Node::new(
+467                FuncStmt::Assign {
+468                    target: expr,
+469                    value,
+470                },
+471                span,
+472            )
+473        }
+474        Some(tk) => {
+475            let tok = par.next()?;
+476            if let Some(op) = aug_assign_op(tk) {
+477                let value = parse_expr(par)?;
+478                let span = expr.span + value.span;
+479                Node::new(
+480                    FuncStmt::AugAssign {
+481                        target: expr,
+482                        op: Node::new(op, tok.span),
+483                        value,
+484                    },
+485                    span,
+486                )
+487            } else {
+488                par.unexpected_token_error(&tok, "invalid syntax in function body", vec![]);
+489                return Err(ParseFailed);
+490            }
+491        }
+492    };
+493    par.expect_stmt_end("statement")?;
+494    Ok(node)
+495}
+496
+497fn expr_to_vardecl_target(par: &mut Parser, expr: Node<Expr>) -> ParseResult<Node<VarDeclTarget>> {
+498    match expr.kind {
+499        Expr::Name(name) => Ok(Node::new(VarDeclTarget::Name(name), expr.span)),
+500        Expr::Tuple { elts } if !elts.is_empty() => Ok(Node::new(
+501            VarDeclTarget::Tuple(
+502                elts.into_iter()
+503                    .map(|elt| expr_to_vardecl_target(par, elt))
+504                    .collect::<ParseResult<Vec<_>>>()?,
+505            ),
+506            expr.span,
+507        )),
+508        _ => {
+509            par.fancy_error(
+510                "failed to parse variable declaration",
+511                vec![Label::primary(
+512                    expr.span,
+513                    "invalid variable declaration target",
+514                )],
+515                vec![
+516                    "The left side of a variable declaration can be either a name\nor a non-empty tuple."
+517                        .into(),
+518                ],
+519            );
+520            Err(ParseFailed)
+521        }
+522    }
+523}
+524
+525/// Parse an `if` statement.
+526///
+527/// # Panics
+528/// Panics if the next token isn't `if`.
+529pub fn parse_if_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+530    let if_tok = par.assert(TokenKind::If);
+531    let test = parse_expr(par)?;
+532    par.enter_block(if_tok.span + test.span, "`if` statement")?;
+533    let body = parse_block_stmts(par)?;
+534    par.expect(TokenKind::BraceClose, "`if` statement")?;
+535    par.eat_newlines();
+536
+537    let else_block = match par.peek() {
+538        Some(TokenKind::Else) => {
+539            let else_tok = par.next()?;
+540            if par.peek() == Some(TokenKind::If) {
+541                vec![parse_if_stmt(par)?]
+542            } else {
+543                par.enter_block(else_tok.span, "`if` statement `else` branch")?;
+544                let else_body = parse_block_stmts(par)?;
+545                par.expect(TokenKind::BraceClose, "`if` statement")?;
+546                else_body
+547            }
+548        }
+549        _ => vec![],
+550    };
+551
+552    let span = if_tok.span + test.span + body.last() + else_block.last();
+553    Ok(Node::new(
+554        FuncStmt::If {
+555            test,
+556            body,
+557            or_else: else_block,
+558        },
+559        span,
+560    ))
+561}
+562
+563/// Parse a `match` statement.
+564///
+565/// # Panics
+566/// Panics if the next token isn't `match`.
+567pub fn parse_match_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+568    let match_tok = par.assert(TokenKind::Match);
+569    let expr = parse_expr(par)?;
+570    par.enter_block(match_tok.span + expr.span, "`match` statement")?;
+571    let arms = parse_match_arms(par)?;
+572    let end = par.expect(TokenKind::BraceClose, "`match` statement")?;
+573
+574    let span = match_tok.span + end.span;
+575    Ok(Node::new(FuncStmt::Match { expr, arms }, span))
+576}
+577
+578pub fn parse_match_arms(par: &mut Parser) -> ParseResult<Vec<Node<MatchArm>>> {
+579    let mut arms = vec![];
+580    par.eat_newlines();
+581    while par.peek_or_err()? != TokenKind::BraceClose {
+582        let pat = parse_pattern(par)?;
+583
+584        par.expect(TokenKind::FatArrow, "`match arm`")?;
+585
+586        par.enter_block(pat.span, "`match` arm")?;
+587        let body = parse_block_stmts(par)?;
+588        let end = par.expect(TokenKind::BraceClose, "`match` arm")?;
+589
+590        let span = pat.span + end.span;
+591        arms.push(Node::new(MatchArm { pat, body }, span));
+592        par.eat_newlines();
+593    }
+594
+595    Ok(arms)
+596}
+597
+598pub fn parse_pattern(par: &mut Parser) -> ParseResult<Node<Pattern>> {
+599    let mut left_pat = parse_pattern_atom(par)?;
+600    let mut span = left_pat.span;
+601    while let Some(TokenKind::Pipe) = par.peek() {
+602        par.next().unwrap();
+603        let right_pat = parse_pattern_atom(par)?;
+604        span += right_pat.span;
+605        let patterns = match left_pat.kind {
+606            Pattern::Or(mut patterns) => {
+607                patterns.push(right_pat);
+608                patterns
+609            }
+610            _ => {
+611                vec![left_pat, right_pat]
+612            }
+613        };
+614        left_pat = Node::new(Pattern::Or(patterns), span);
+615    }
+616
+617    Ok(left_pat)
+618}
+619
+620/// Parse a `while` statement.
+621///
+622/// # Panics
+623/// Panics if the next token isn't `while`.
+624pub fn parse_while_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+625    let while_tok = par.assert(TokenKind::While);
+626
+627    let test = parse_expr(par)?;
+628    par.enter_block(while_tok.span + test.span, "`while` statement")?;
+629    let body = parse_block_stmts(par)?;
+630    let end = par.expect(TokenKind::BraceClose, "`while` statement")?;
+631    let span = while_tok.span + test.span + end.span;
+632
+633    Ok(Node::new(FuncStmt::While { test, body }, span))
+634}
+635
+636/// Parse a `for` statement.
+637///
+638/// # Panics
+639/// Panics if the next token isn't `for`.
+640pub fn parse_for_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+641    let for_tok = par.assert(TokenKind::For);
+642
+643    let target = par
+644        .expect(TokenKind::Name, "failed to parse `for` statement")?
+645        .into();
+646    par.expect(TokenKind::In, "failed to parse `for` statement")?;
+647    let iter = parse_expr(par)?;
+648    par.enter_block(for_tok.span + iter.span, "`for` statement")?;
+649    let body = parse_block_stmts(par)?;
+650    let end = par.expect(TokenKind::BraceClose, "`for` statement")?;
+651    par.expect_stmt_end("`for` statement")?;
+652    let span = for_tok.span + iter.span + end.span;
+653
+654    Ok(Node::new(FuncStmt::For { target, iter, body }, span))
+655}
+656
+657/// Parse a `return` statement.
+658///
+659/// # Panics
+660/// Panics if the next token isn't `return`.
+661pub fn parse_return_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+662    let ret = par.assert(TokenKind::Return);
+663    let value = match par.peek() {
+664        None | Some(TokenKind::Newline) => None,
+665        Some(_) => Some(parse_expr(par)?),
+666    };
+667    par.expect_stmt_end("return statement")?;
+668    let span = ret.span + value.as_ref();
+669    Ok(Node::new(FuncStmt::Return { value }, span))
+670}
+671
+672/// Parse an `assert` statement.
+673///
+674/// # Panics
+675/// Panics if the next token isn't `assert`.
+676pub fn parse_assert_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+677    let assert_tok = par.assert(TokenKind::Assert);
+678    let test = parse_expr(par)?;
+679    let msg = match par.peek() {
+680        None | Some(TokenKind::Newline) => None,
+681        Some(TokenKind::Comma) => {
+682            par.next()?;
+683            Some(parse_expr(par)?)
+684        }
+685        Some(_) => {
+686            let tok = par.next()?;
+687            par.unexpected_token_error(&tok, "failed to parse `assert` statement", vec![]);
+688            return Err(ParseFailed);
+689        }
+690    };
+691    par.expect_stmt_end("assert statement")?;
+692    let span = assert_tok.span + test.span + msg.as_ref();
+693    Ok(Node::new(FuncStmt::Assert { test, msg }, span))
+694}
+695
+696/// Parse a `revert` statement.
+697///
+698/// # Panics
+699/// Panics if the next token isn't `revert`.
+700pub fn parse_revert_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+701    let revert_tok = par.assert(TokenKind::Revert);
+702    let error = match par.peek() {
+703        None | Some(TokenKind::Newline) => None,
+704        Some(_) => Some(parse_expr(par)?),
+705    };
+706    par.expect_stmt_end("revert statement")?;
+707    let span = revert_tok.span + error.as_ref();
+708    Ok(Node::new(FuncStmt::Revert { error }, span))
+709}
+710
+711/// Parse an `unsafe` block.
+712///
+713/// # Panics
+714/// Panics if the next token isn't `unsafe`.
+715pub fn parse_unsafe_block(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+716    let kw_tok = par.assert(TokenKind::Unsafe);
+717    par.enter_block(kw_tok.span, "`unsafe` block")?;
+718    let body = parse_block_stmts(par)?;
+719    let end = par.expect(TokenKind::BraceClose, "`unsafe` block")?;
+720    let span = kw_tok.span + end.span;
+721
+722    Ok(Node::new(FuncStmt::Unsafe(body), span))
+723}
+724
+725fn parse_pattern_atom(par: &mut Parser) -> ParseResult<Node<Pattern>> {
+726    match par.peek() {
+727        Some(TokenKind::ParenOpen) => return parse_tuple_pattern(par, None),
+728        Some(TokenKind::True) => {
+729            let span = par.next().unwrap().span;
+730            let literal_pat = Node::new(LiteralPattern::Bool(true), span);
+731            return Ok(Node::new(Pattern::Literal(literal_pat), span));
+732        }
+733        Some(TokenKind::False) => {
+734            let span = par.next().unwrap().span;
+735            let literal_pat = Node::new(LiteralPattern::Bool(false), span);
+736            return Ok(Node::new(Pattern::Literal(literal_pat), span));
+737        }
+738        Some(TokenKind::DotDot) => {
+739            let span = par.next().unwrap().span;
+740            return Ok(Node::new(Pattern::Rest, span));
+741        }
+742        _ => {}
+743    }
+744
+745    let mut pattern = parse_path_pattern_segment(par)?;
+746
+747    while let Some(TokenKind::ColonColon) = par.peek() {
+748        par.next().unwrap();
+749        let right = parse_path_pattern_segment(par)?;
+750        pattern = try_merge_path_pattern(par, pattern, right)?;
+751    }
+752
+753    if let Some(TokenKind::ParenOpen) = par.peek() {
+754        match pattern.kind {
+755            Pattern::Path(path) => parse_tuple_pattern(par, Some(path)),
+756            Pattern::WildCard => {
+757                invalid_pattern(par, "can't use wildcard with tuple pattern", pattern.span)
+758            }
+759            _ => unreachable!(),
+760        }
+761    } else if let Some(TokenKind::BraceOpen) = par.peek() {
+762        match pattern.kind {
+763            Pattern::Path(path) => parse_struct_pattern(par, path),
+764            Pattern::WildCard => {
+765                invalid_pattern(par, "can't use wildcard with struct pattern", pattern.span)
+766            }
+767            _ => unreachable!(),
+768        }
+769    } else {
+770        Ok(pattern)
+771    }
+772}
+773
+774fn parse_tuple_pattern(par: &mut Parser, path: Option<Node<Path>>) -> ParseResult<Node<Pattern>> {
+775    if let Some(TokenKind::ParenOpen) = par.peek() {
+776        par.eat_newlines();
+777        let paren_span = par.next().unwrap().span;
+778
+779        let (elts, last_span) = if let Some(TokenKind::ParenClose) = par.peek() {
+780            (vec![], par.next().unwrap().span)
+781        } else {
+782            par.eat_newlines();
+783            let mut elts = vec![parse_pattern(par)?];
+784            while let Some(TokenKind::Comma) = par.peek() {
+785                par.next().unwrap();
+786                elts.push(parse_pattern(par)?);
+787                par.eat_newlines();
+788            }
+789            let last_span = par.expect(TokenKind::ParenClose, "pattern")?.span;
+790            (elts, last_span)
+791        };
+792
+793        if let Some(path) = path {
+794            let span = path.span + last_span;
+795            Ok(Node::new(Pattern::PathTuple(path, elts), span))
+796        } else {
+797            let span = paren_span + last_span;
+798            Ok(Node::new(Pattern::Tuple(elts), span))
+799        }
+800    } else {
+801        unreachable!()
+802    }
+803}
+804
+805fn parse_struct_pattern(par: &mut Parser, path: Node<Path>) -> ParseResult<Node<Pattern>> {
+806    if let Some(TokenKind::BraceOpen) = par.peek() {
+807        par.eat_newlines();
+808        let mut span = par.next().unwrap().span;
+809
+810        let mut fields = vec![];
+811        let mut has_rest = false;
+812        loop {
+813            par.eat_newlines();
+814            match par.peek_or_err()? {
+815                TokenKind::Name => {
+816                    let name = par.next().unwrap();
+817                    let field_name = Node::new(name.text.into(), name.span);
+818                    par.expect(TokenKind::Colon, "failed to parse struct pattern")?;
+819                    let pat = parse_pattern(par)?;
+820                    fields.push((field_name, pat));
+821                    if par.peek() == Some(TokenKind::Comma) {
+822                        par.next()?;
+823                    } else {
+824                        span += par
+825                            .expect(TokenKind::BraceClose, "failed to parse struct pattern")?
+826                            .span;
+827                        break;
+828                    }
+829                }
+830
+831                TokenKind::DotDot => {
+832                    par.next().unwrap();
+833                    has_rest = true;
+834                    par.eat_newlines();
+835                    span += par
+836                        .expect(
+837                            TokenKind::BraceClose,
+838                            "`..` pattern should be the last position in the struct pattern",
+839                        )?
+840                        .span;
+841                    break;
+842                }
+843
+844                TokenKind::BraceClose => {
+845                    span += par.next().unwrap().span;
+846                    break;
+847                }
+848
+849                _ => {
+850                    let tok = par.next()?;
+851                    par.unexpected_token_error(&tok, "failed to parse struct pattern", vec![]);
+852                    return Err(ParseFailed);
+853                }
+854            }
+855        }
+856
+857        Ok(Node::new(
+858            Pattern::PathStruct {
+859                path,
+860                fields,
+861                has_rest,
+862            },
+863            span,
+864        ))
+865    } else {
+866        unreachable!()
+867    }
+868}
+869
+870fn try_merge_path_pattern(
+871    par: &mut Parser,
+872    left: Node<Pattern>,
+873    right: Node<Pattern>,
+874) -> ParseResult<Node<Pattern>> {
+875    let span = left.span + right.span;
+876
+877    match (left.kind, right.kind) {
+878        (Pattern::Path(mut left_path), Pattern::Path(right_path)) => {
+879            left_path
+880                .kind
+881                .segments
+882                .extend_from_slice(&right_path.kind.segments);
+883            left_path.span = span;
+884            let span = left.span + right.span;
+885            Ok(Node::new(Pattern::Path(left_path), span))
+886        }
+887        _ => invalid_pattern(par, "invalid pattern here", span),
+888    }
+889}
+890
+891fn parse_path_pattern_segment(par: &mut Parser) -> ParseResult<Node<Pattern>> {
+892    let tok = par.expect(TokenKind::Name, "failed to parse pattern")?;
+893    let text = tok.text;
+894    if text == "_" {
+895        Ok(Node::new(Pattern::WildCard, tok.span))
+896    } else {
+897        let path = Path {
+898            segments: vec![Node::new(text.into(), tok.span)],
+899        };
+900        Ok(Node::new(
+901            Pattern::Path(Node::new(path, tok.span)),
+902            tok.span,
+903        ))
+904    }
+905}
+906
+907fn invalid_pattern(par: &mut Parser, message: &str, span: Span) -> ParseResult<Node<Pattern>> {
+908    par.fancy_error(
+909        "invalid pattern",
+910        vec![Label::primary(span, message)],
+911        vec![],
+912    );
+913    Err(ParseFailed)
+914}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/module.rs.html b/compiler-docs/src/fe_parser/grammar/module.rs.html new file mode 100644 index 0000000000..15677e6072 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/module.rs.html @@ -0,0 +1,281 @@ +module.rs - source

fe_parser/grammar/
module.rs

1use super::expressions::parse_expr;
+2use super::functions::parse_fn_def;
+3use super::types::{
+4    parse_impl_def, parse_path_tail, parse_struct_def, parse_trait_def, parse_type_alias,
+5    parse_type_desc,
+6};
+7use super::{contracts::parse_contract_def, types::parse_enum_def};
+8use crate::ast::{ConstantDecl, Module, ModuleStmt, Pragma, Use, UseTree};
+9use crate::node::{Node, Span};
+10use crate::{Label, ParseFailed, ParseResult, Parser, TokenKind};
+11
+12use semver::VersionReq;
+13
+14/// Parse a [`Module`].
+15pub fn parse_module(par: &mut Parser) -> Node<Module> {
+16    let mut body = vec![];
+17    loop {
+18        match par.peek() {
+19            Some(TokenKind::Newline) => {
+20                par.next().unwrap();
+21            }
+22            None => break,
+23            Some(_) => {
+24                match parse_module_stmt(par) {
+25                    Ok(stmt) => body.push(stmt),
+26                    Err(_) => {
+27                        // TODO: capture a real span here
+28                        body.push(ModuleStmt::ParseError(Span::zero(par.file_id)));
+29                        break;
+30                    }
+31                };
+32            }
+33        }
+34    }
+35    let span = Span::zero(par.file_id) + body.first() + body.last();
+36    Node::new(Module { body }, span)
+37}
+38
+39/// Parse a [`ModuleStmt`].
+40pub fn parse_module_stmt(par: &mut Parser) -> ParseResult<ModuleStmt> {
+41    let stmt = match par.peek_or_err()? {
+42        TokenKind::Pragma => ModuleStmt::Pragma(parse_pragma(par)?),
+43        TokenKind::Use => ModuleStmt::Use(parse_use(par)?),
+44        TokenKind::Contract => ModuleStmt::Contract(parse_contract_def(par, None)?),
+45        TokenKind::Struct => ModuleStmt::Struct(parse_struct_def(par, None)?),
+46        TokenKind::Enum => ModuleStmt::Enum(parse_enum_def(par, None)?),
+47        TokenKind::Trait => ModuleStmt::Trait(parse_trait_def(par, None)?),
+48        TokenKind::Impl => ModuleStmt::Impl(parse_impl_def(par)?),
+49        TokenKind::Type => ModuleStmt::TypeAlias(parse_type_alias(par, None)?),
+50        TokenKind::Const => ModuleStmt::Constant(parse_constant(par, None)?),
+51        TokenKind::Pub => {
+52            let pub_span = par.next()?.span;
+53            match par.peek_or_err()? {
+54                TokenKind::Fn | TokenKind::Unsafe => {
+55                    ModuleStmt::Function(parse_fn_def(par, Some(pub_span))?)
+56                }
+57                TokenKind::Struct => ModuleStmt::Struct(parse_struct_def(par, Some(pub_span))?),
+58                TokenKind::Enum => ModuleStmt::Enum(parse_enum_def(par, Some(pub_span))?),
+59                TokenKind::Trait => ModuleStmt::Trait(parse_trait_def(par, Some(pub_span))?),
+60                TokenKind::Type => ModuleStmt::TypeAlias(parse_type_alias(par, Some(pub_span))?),
+61                TokenKind::Const => ModuleStmt::Constant(parse_constant(par, Some(pub_span))?),
+62                TokenKind::Contract => {
+63                    ModuleStmt::Contract(parse_contract_def(par, Some(pub_span))?)
+64                }
+65                _ => {
+66                    let tok = par.next()?;
+67                    par.unexpected_token_error(
+68                        &tok,
+69                        "failed to parse module",
+70                        vec!["Note: expected `fn`".into()],
+71                    );
+72                    return Err(ParseFailed);
+73                }
+74            }
+75        }
+76        TokenKind::Fn | TokenKind::Unsafe => ModuleStmt::Function(parse_fn_def(par, None)?),
+77        TokenKind::Hash => {
+78            let attr = par.expect(TokenKind::Hash, "expected `#`")?;
+79            let attr_name = par.expect_with_notes(TokenKind::Name, "failed to parse attribute definition", |_|
+80                vec!["Note: an attribute name must start with a letter or underscore, and contain letters, numbers, or underscores".into()])?;
+81            ModuleStmt::Attribute(Node::new(attr_name.text.into(), attr.span + attr_name.span))
+82        }
+83        _ => {
+84            let tok = par.next()?;
+85            par.unexpected_token_error(
+86                &tok,
+87                "failed to parse module",
+88                vec!["Note: expected import, contract, struct, type or const".into()],
+89            );
+90            return Err(ParseFailed);
+91        }
+92    };
+93    Ok(stmt)
+94}
+95
+96/// Parse a constant, e.g. `const MAGIC_NUMBER: u256 = 4711`.
+97/// # Panics
+98/// Panics if the next token isn't `const`.
+99pub fn parse_constant(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<ConstantDecl>> {
+100    let const_tok = par.assert(TokenKind::Const);
+101    let name = par.expect(TokenKind::Name, "failed to parse constant declaration")?;
+102    par.expect_with_notes(
+103        TokenKind::Colon,
+104        "failed to parse constant declaration",
+105        |_| {
+106            vec![
+107                "Note: constant name must be followed by a colon and a type description".into(),
+108                format!("Example: let `{}: u256 = 1000`", name.text),
+109            ]
+110        },
+111    )?;
+112    let typ = parse_type_desc(par)?;
+113    par.expect_with_notes(
+114        TokenKind::Eq,
+115        "failed to parse constant declaration",
+116        |_| {
+117            vec![
+118            "Note: the type of a constant must be followed by an equals sign and a value assignment"
+119                .into(),
+120                format!(
+121                    "Example: let `{}: u256 = 1000`",
+122                    name.text
+123                ),
+124        ]
+125        },
+126    )?;
+127
+128    let exp = parse_expr(par)?;
+129
+130    let span = const_tok.span + exp.span;
+131    Ok(Node::new(
+132        ConstantDecl {
+133            name: name.into(),
+134            typ,
+135            value: exp,
+136            pub_qual,
+137        },
+138        span,
+139    ))
+140}
+141
+142/// Parse a `use` statement.
+143/// # Panics
+144/// Panics if the next token isn't `use`.
+145pub fn parse_use(par: &mut Parser) -> ParseResult<Node<Use>> {
+146    let use_tok = par.assert(TokenKind::Use);
+147
+148    let tree = parse_use_tree(par)?;
+149    let tree_span = tree.span;
+150
+151    Ok(Node::new(Use { tree }, use_tok.span + tree_span))
+152}
+153
+154/// Parse a `use` tree.
+155pub fn parse_use_tree(par: &mut Parser) -> ParseResult<Node<UseTree>> {
+156    let (path, path_span, trailing_delim) = {
+157        let path_head =
+158            par.expect_with_notes(TokenKind::Name, "failed to parse `use` statement", |_| {
+159                vec![
+160                    "Note: `use` paths must start with a name".into(),
+161                    "Example: `use foo::bar`".into(),
+162                ]
+163            })?;
+164        parse_path_tail(par, path_head.into())
+165    };
+166
+167    if trailing_delim.is_some() {
+168        match par.peek() {
+169            Some(TokenKind::BraceOpen) => {
+170                par.next()?;
+171
+172                let mut children = vec![];
+173                let close_brace_span;
+174
+175                loop {
+176                    children.push(parse_use_tree(par)?);
+177                    let tok = par.next()?;
+178                    match tok.kind {
+179                        TokenKind::Comma => {
+180                            continue;
+181                        }
+182                        TokenKind::BraceClose => {
+183                            close_brace_span = tok.span;
+184                            break;
+185                        }
+186                        _ => {
+187                            par.unexpected_token_error(
+188                                &tok,
+189                                "failed to parse `use` tree",
+190                                vec!["Note: expected a `,` or `}` token".to_string()],
+191                            );
+192                            return Err(ParseFailed);
+193                        }
+194                    }
+195                }
+196
+197                Ok(Node::new(
+198                    UseTree::Nested {
+199                        prefix: path,
+200                        children,
+201                    },
+202                    close_brace_span,
+203                ))
+204            }
+205            Some(TokenKind::Star) => {
+206                par.next()?;
+207                Ok(Node::new(UseTree::Glob { prefix: path }, path_span))
+208            }
+209            _ => {
+210                let tok = par.next()?;
+211                par.unexpected_token_error(
+212                    &tok,
+213                    "failed to parse `use` tree",
+214                    vec!["Note: expected a `*`, `{` or name token".to_string()],
+215                );
+216                Err(ParseFailed)
+217            }
+218        }
+219    } else if par.peek() == Some(TokenKind::As) {
+220        par.next()?;
+221
+222        let rename_tok = par.expect(TokenKind::Name, "failed to parse `use` tree")?;
+223        let span = path_span + rename_tok.span;
+224        let rename = Some(rename_tok.into());
+225
+226        Ok(Node::new(UseTree::Simple { path, rename }, span))
+227    } else {
+228        Ok(Node::new(UseTree::Simple { path, rename: None }, path_span))
+229    }
+230}
+231
+232/// Parse a `pragma <version-requirement>` statement.
+233pub fn parse_pragma(par: &mut Parser) -> ParseResult<Node<Pragma>> {
+234    let tok = par.assert(TokenKind::Pragma);
+235    assert_eq!(tok.text, "pragma");
+236
+237    let mut version_string = String::new();
+238    let mut tokens = vec![];
+239    loop {
+240        match par.peek() {
+241            Some(TokenKind::Newline) => break,
+242            None => break,
+243            _ => {
+244                let tok = par.next()?;
+245                version_string.push_str(tok.text);
+246                tokens.push(tok);
+247            }
+248        }
+249    }
+250
+251    let version_requirement_span = match (tokens.first(), tokens.last()) {
+252        (Some(first), Some(last)) => first.span + last.span,
+253        _ => {
+254            par.error(
+255                tok.span,
+256                "failed to parse pragma statement: missing version requirement",
+257            );
+258            return Err(ParseFailed);
+259        }
+260    };
+261
+262    match VersionReq::parse(&version_string) {
+263        Ok(_) => Ok(Node::new(
+264            Pragma {
+265                version_requirement: Node::new(version_string.into(), version_requirement_span),
+266            },
+267            tok.span + version_requirement_span,
+268        )),
+269        Err(err) => {
+270            par.fancy_error(
+271                format!("failed to parse pragma statement: {err}"),
+272                vec![Label::primary(
+273                    version_requirement_span,
+274                    "Invalid version requirement",
+275                )],
+276                vec!["Example: `^0.5.0`".into()],
+277            );
+278            Err(ParseFailed)
+279        }
+280    }
+281}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/types.rs.html b/compiler-docs/src/fe_parser/grammar/types.rs.html new file mode 100644 index 0000000000..840c7a216e --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/types.rs.html @@ -0,0 +1,680 @@ +types.rs - source

fe_parser/grammar/
types.rs

1use crate::ast::{
+2    self, Enum, Field, GenericArg, Impl, Path, Trait, TypeAlias, TypeDesc, Variant, VariantKind,
+3};
+4use crate::grammar::expressions::parse_expr;
+5use crate::grammar::functions::{parse_fn_def, parse_fn_sig};
+6use crate::node::{Node, Span};
+7use crate::Token;
+8use crate::{ParseFailed, ParseResult, Parser, TokenKind};
+9use fe_common::diagnostics::Label;
+10use if_chain::if_chain;
+11use smol_str::SmolStr;
+12use vec1::Vec1;
+13
+14/// Parse a [`ModuleStmt::Struct`].
+15/// # Panics
+16/// Panics if the next token isn't `struct`.
+17pub fn parse_struct_def(
+18    par: &mut Parser,
+19    pub_qual: Option<Span>,
+20) -> ParseResult<Node<ast::Struct>> {
+21    let struct_tok = par.assert(TokenKind::Struct);
+22    let name = par.expect_with_notes(TokenKind::Name, "failed to parse struct definition", |_| {
+23        vec!["Note: a struct name must start with a letter or underscore, and contain letters, numbers, or underscores".into()]
+24    })?;
+25
+26    let mut span = struct_tok.span + name.span;
+27    let mut fields = vec![];
+28    let mut functions = vec![];
+29    par.enter_block(span, "struct body must start with `{`")?;
+30
+31    loop {
+32        par.eat_newlines();
+33
+34        let attributes = if let Some(attr) = par.optional(TokenKind::Hash) {
+35            let attr_name = par.expect_with_notes(TokenKind::Name, "failed to parse attribute definition", |_|
+36                vec!["Note: an attribute name must start with a letter or underscore, and contain letters, numbers, or underscores".into()])?;
+37            // This hints to a future where we would support multiple attributes per field. For now we don't need it.
+38            vec![Node::new(attr_name.text.into(), attr.span + attr_name.span)]
+39        } else {
+40            vec![]
+41        };
+42
+43        par.eat_newlines();
+44
+45        let pub_qual = par.optional(TokenKind::Pub).map(|tok| tok.span);
+46        match par.peek_or_err()? {
+47            TokenKind::Name => {
+48                let field = parse_field(par, attributes, pub_qual, None)?;
+49                if !functions.is_empty() {
+50                    par.error(
+51                        field.span,
+52                        "struct field definitions must come before any function definitions",
+53                    );
+54                }
+55                fields.push(field);
+56            }
+57            TokenKind::Fn | TokenKind::Unsafe => {
+58                functions.push(parse_fn_def(par, pub_qual)?);
+59            }
+60            TokenKind::BraceClose if pub_qual.is_none() => {
+61                span += par.next()?.span;
+62                break;
+63            }
+64            _ => {
+65                let tok = par.next()?;
+66                par.unexpected_token_error(&tok, "failed to parse struct definition", vec![]);
+67                return Err(ParseFailed);
+68            }
+69        }
+70    }
+71    Ok(Node::new(
+72        ast::Struct {
+73            name: name.into(),
+74            fields,
+75            functions,
+76            pub_qual,
+77        },
+78        span,
+79    ))
+80}
+81
+82#[allow(clippy::unnecessary_literal_unwrap)]
+83/// Parse a [`ModuleStmt::Enum`].
+84/// # Panics
+85/// Panics if the next token isn't [`TokenKind::Enum`].
+86pub fn parse_enum_def(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<Enum>> {
+87    let enum_tok = par.assert(TokenKind::Enum);
+88    let name = par.expect_with_notes(
+89        TokenKind::Name,
+90        "failed to parse enum definition",
+91        |_| vec!["Note: `enum` must be followed by a name, which must start with a letter and contain only letters, numbers, or underscores".into()],
+92    )?;
+93
+94    let mut span = enum_tok.span + name.span;
+95    let mut variants = vec![];
+96    let mut functions = vec![];
+97
+98    par.enter_block(span, "enum definition")?;
+99    loop {
+100        par.eat_newlines();
+101        match par.peek_or_err()? {
+102            TokenKind::Name => {
+103                let variant = parse_variant(par)?;
+104                if !functions.is_empty() {
+105                    par.error(
+106                        variant.span,
+107                        "enum variant definitions must come before any function definitions",
+108                    );
+109                }
+110                variants.push(variant);
+111            }
+112
+113            TokenKind::Fn | TokenKind::Unsafe => {
+114                functions.push(parse_fn_def(par, None)?);
+115            }
+116
+117            TokenKind::Pub => {
+118                let pub_qual = Some(par.next().unwrap().span);
+119                match par.peek() {
+120                    Some(TokenKind::Fn | TokenKind::Unsafe) => {
+121                        functions.push(parse_fn_def(par, pub_qual)?);
+122                    }
+123
+124                    _ => {
+125                        par.error(
+126                            pub_qual.unwrap(),
+127                            "expected `fn` or `unsafe fn` after `pub`",
+128                        );
+129                    }
+130                }
+131            }
+132
+133            TokenKind::BraceClose => {
+134                span += par.next()?.span;
+135                break;
+136            }
+137
+138            _ => {
+139                let tok = par.next()?;
+140                par.unexpected_token_error(&tok, "failed to parse enum definition body", vec![]);
+141                return Err(ParseFailed);
+142            }
+143        };
+144    }
+145
+146    Ok(Node::new(
+147        ast::Enum {
+148            name: name.into(),
+149            variants,
+150            functions,
+151            pub_qual,
+152        },
+153        span,
+154    ))
+155}
+156
+157/// Parse a trait definition.
+158/// # Panics
+159/// Panics if the next token isn't `trait`.
+160pub fn parse_trait_def(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<Trait>> {
+161    let trait_tok = par.assert(TokenKind::Trait);
+162
+163    // trait Event {}
+164    let trait_name = par.expect_with_notes(
+165        TokenKind::Name,
+166        "failed to parse trait definition",
+167        |_| vec!["Note: `trait` must be followed by a name, which must start with a letter and contain only letters, numbers, or underscores".into()],
+168    )?;
+169
+170    let header_span = trait_tok.span + trait_name.span;
+171    let mut functions = vec![];
+172    par.enter_block(header_span, "trait definition")?;
+173
+174    loop {
+175        match par.peek_or_err()? {
+176            TokenKind::Fn => {
+177                // TODO: Traits should also be allowed to have functions that do contain a body.
+178                functions.push(parse_fn_sig(par, None)?);
+179                par.expect_with_notes(
+180                    TokenKind::Semi,
+181                    "failed to parse trait definition",
+182                    |_| vec!["Note: trait functions must appear without body and followed by a semicolon.".into()],
+183                )?;
+184                par.eat_newlines();
+185            }
+186            TokenKind::BraceClose => {
+187                par.next()?;
+188                break;
+189            }
+190            _ => {
+191                let tok = par.next()?;
+192                par.unexpected_token_error(&tok, "failed to parse trait definition body", vec![]);
+193                return Err(ParseFailed);
+194            }
+195        };
+196    }
+197
+198    let span = header_span + pub_qual;
+199    Ok(Node::new(
+200        Trait {
+201            name: Node::new(trait_name.text.into(), trait_name.span),
+202            functions,
+203            pub_qual,
+204        },
+205        span,
+206    ))
+207}
+208
+209/// Parse an impl block.
+210/// # Panics
+211/// Panics if the next token isn't `impl`.
+212pub fn parse_impl_def(par: &mut Parser) -> ParseResult<Node<Impl>> {
+213    let impl_tok = par.assert(TokenKind::Impl);
+214
+215    // impl SomeTrait for SomeType {}
+216    let trait_name =
+217        par.expect_with_notes(TokenKind::Name, "failed to parse `impl` definition", |_| {
+218            vec!["Note: `impl` must be followed by the name of a trait".into()]
+219        })?;
+220
+221    let for_tok =
+222        par.expect_with_notes(TokenKind::For, "failed to parse `impl` definition", |_| {
+223            vec![format!(
+224                "Note: `impl {}` must be followed by the keyword `for`",
+225                trait_name.text
+226            )]
+227        })?;
+228
+229    let receiver = parse_type_desc(par)?;
+230    let mut functions = vec![];
+231
+232    let header_span = impl_tok.span + trait_name.span + for_tok.span + receiver.span;
+233
+234    par.enter_block(header_span, "impl definition")?;
+235
+236    loop {
+237        par.eat_newlines();
+238        match par.peek_or_err()? {
+239            TokenKind::Fn => {
+240                functions.push(parse_fn_def(par, None)?);
+241            }
+242            TokenKind::BraceClose => {
+243                par.next()?;
+244                break;
+245            }
+246            _ => {
+247                let tok = par.next()?;
+248                par.unexpected_token_error(&tok, "failed to parse `impl` definition body", vec![]);
+249                return Err(ParseFailed);
+250            }
+251        };
+252    }
+253
+254    Ok(Node::new(
+255        Impl {
+256            impl_trait: Node::new(trait_name.text.into(), trait_name.span),
+257            receiver,
+258            functions,
+259        },
+260        header_span,
+261    ))
+262}
+263
+264/// Parse a type alias definition, e.g. `type MyMap = Map<u8, address>`.
+265/// # Panics
+266/// Panics if the next token isn't `type`.
+267pub fn parse_type_alias(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<TypeAlias>> {
+268    let type_tok = par.assert(TokenKind::Type);
+269    let name = par.expect(TokenKind::Name, "failed to parse type declaration")?;
+270    par.expect_with_notes(TokenKind::Eq, "failed to parse type declaration", |_| {
+271        vec![
+272            "Note: a type alias name must be followed by an equals sign and a type description"
+273                .into(),
+274            format!("Example: `type {} = Map<address, u64>`", name.text),
+275        ]
+276    })?;
+277    let typ = parse_type_desc(par)?;
+278    let span = type_tok.span + pub_qual + typ.span;
+279    Ok(Node::new(
+280        TypeAlias {
+281            name: name.into(),
+282            typ,
+283            pub_qual,
+284        },
+285        span,
+286    ))
+287}
+288
+289/// Parse a field for a struct or contract. The leading optional `pub` and
+290/// `const` qualifiers must be parsed by the caller, and passed in.
+291pub fn parse_field(
+292    par: &mut Parser,
+293    attributes: Vec<Node<SmolStr>>,
+294    pub_qual: Option<Span>,
+295    const_qual: Option<Span>,
+296) -> ParseResult<Node<Field>> {
+297    let name = par.expect(TokenKind::Name, "failed to parse field definition")?;
+298    par.expect_with_notes(
+299        TokenKind::Colon,
+300        "failed to parse field definition",
+301        |next| {
+302            let mut notes = vec![];
+303            if name.text == "def" && next.kind == TokenKind::Name {
+304                notes.push("Hint: use `fn` to define a function".into());
+305                notes.push(format!(
+306                    "Example: `{}fn {}( ...`",
+307                    if pub_qual.is_some() { "pub " } else { "" },
+308                    next.text
+309                ));
+310            }
+311            notes
+312                .push("Note: field name must be followed by a colon and a type description".into());
+313            notes.push(format!(
+314                "Example: {}{}{}: address",
+315                if pub_qual.is_some() { "pub " } else { "" },
+316                if const_qual.is_some() { "const " } else { "" },
+317                name.text
+318            ));
+319            notes
+320        },
+321    )?;
+322
+323    let typ = parse_type_desc(par)?;
+324    let value = if par.peek() == Some(TokenKind::Eq) {
+325        par.next()?;
+326        Some(parse_expr(par)?)
+327    } else {
+328        None
+329    };
+330    par.expect_stmt_end("field definition")?;
+331    let span = name.span + pub_qual + const_qual + &typ;
+332    Ok(Node::new(
+333        Field {
+334            is_pub: pub_qual.is_some(),
+335            is_const: const_qual.is_some(),
+336            attributes,
+337            name: name.into(),
+338            typ,
+339            value,
+340        },
+341        span,
+342    ))
+343}
+344
+345/// Parse a variant for a enum definition.
+346/// # Panics
+347/// Panics if the next token isn't [`TokenKind::Name`].
+348pub fn parse_variant(par: &mut Parser) -> ParseResult<Node<Variant>> {
+349    let name = par.expect(TokenKind::Name, "failed to parse enum variant")?;
+350    let mut span = name.span;
+351
+352    let kind = match par.peek_or_err()? {
+353        TokenKind::ParenOpen => {
+354            span += par.next().unwrap().span;
+355            let mut tys = vec![];
+356            loop {
+357                match par.peek_or_err()? {
+358                    TokenKind::ParenClose => {
+359                        span += par.next().unwrap().span;
+360                        break;
+361                    }
+362
+363                    _ => {
+364                        let ty = parse_type_desc(par)?;
+365                        span += ty.span;
+366                        tys.push(ty);
+367                        if par.peek_or_err()? == TokenKind::Comma {
+368                            par.next()?;
+369                        } else {
+370                            span += par
+371                                .expect(
+372                                    TokenKind::ParenClose,
+373                                    "unexpected token while parsing enum variant",
+374                                )?
+375                                .span;
+376                            break;
+377                        }
+378                    }
+379                }
+380            }
+381
+382            VariantKind::Tuple(tys)
+383        }
+384
+385        _ => VariantKind::Unit,
+386    };
+387
+388    par.expect_stmt_end("enum variant")?;
+389    Ok(Node::new(
+390        Variant {
+391            name: name.into(),
+392            kind,
+393        },
+394        span,
+395    ))
+396}
+397
+398/// Parse an optional qualifier (`pub`, `const`, or `idx`).
+399pub fn parse_opt_qualifier(par: &mut Parser, tk: TokenKind) -> Option<Span> {
+400    if par.peek() == Some(tk) {
+401        let tok = par.next().unwrap();
+402        Some(tok.span)
+403    } else {
+404        None
+405    }
+406}
+407
+408/// Parse an angle-bracket-wrapped list of generic arguments (eg. the tail end
+409/// of `Map<address, u256>`).
+410/// # Panics
+411/// Panics if the first token isn't `<`.
+412pub fn parse_generic_args(par: &mut Parser) -> ParseResult<Node<Vec<GenericArg>>> {
+413    use TokenKind::*;
+414    let mut span = par.assert(Lt).span;
+415
+416    let mut args = vec![];
+417
+418    let expect_end = |par: &mut Parser| {
+419        // If there's no comma, the next token must be `>`
+420        match par.peek_or_err()? {
+421            Gt => Ok(par.next()?.span),
+422            GtGt => Ok(par.split_next()?.span),
+423            _ => {
+424                let tok = par.next()?;
+425                par.unexpected_token_error(
+426                    &tok,
+427                    "Unexpected token while parsing generic arg list",
+428                    vec![],
+429                );
+430                Err(ParseFailed)
+431            }
+432        }
+433    };
+434
+435    loop {
+436        match par.peek_or_err()? {
+437            Gt => {
+438                span += par.next()?.span;
+439                break;
+440            }
+441            GtGt => {
+442                span += par.split_next()?.span;
+443                break;
+444            }
+445            // Parse non-constant generic argument.
+446            Name | ParenOpen => {
+447                let typ = parse_type_desc(par)?;
+448                args.push(GenericArg::TypeDesc(Node::new(typ.kind, typ.span)));
+449                if par.peek() == Some(Comma) {
+450                    par.next()?;
+451                } else {
+452                    span += expect_end(par)?;
+453                    break;
+454                }
+455            }
+456            // Parse literal-type constant generic argument.
+457            Int => {
+458                let tok = par.next()?;
+459                if let Ok(num) = tok.text.parse() {
+460                    args.push(GenericArg::Int(Node::new(num, tok.span)));
+461                    if par.peek() == Some(Comma) {
+462                        par.next()?;
+463                    } else {
+464                        span += expect_end(par)?;
+465                        break;
+466                    }
+467                } else {
+468                    par.error(tok.span, "failed to parse integer literal");
+469                    return Err(ParseFailed);
+470                }
+471            }
+472            // Parse expr-type constant generic argument.
+473            BraceOpen => {
+474                let brace_open = par.next()?;
+475                let expr = parse_expr(par)?;
+476                if !matches!(par.next()?.kind, BraceClose) {
+477                    par.error(brace_open.span, "missing closing delimiter `}`");
+478                    return Err(ParseFailed);
+479                }
+480
+481                args.push(GenericArg::ConstExpr(expr));
+482
+483                if par.peek() == Some(Comma) {
+484                    par.next()?;
+485                } else {
+486                    span += expect_end(par)?;
+487                    break;
+488                }
+489            }
+490
+491            // Invalid generic argument.
+492            _ => {
+493                let tok = par.next()?;
+494                par.unexpected_token_error(
+495                    &tok,
+496                    "failed to parse generic type argument list",
+497                    vec![],
+498                );
+499                return Err(ParseFailed);
+500            }
+501        }
+502    }
+503    Ok(Node::new(args, span))
+504}
+505
+506/// Returns path and trailing `::` token, if present.
+507pub fn parse_path_tail<'a>(
+508    par: &mut Parser<'a>,
+509    head: Node<SmolStr>,
+510) -> (Path, Span, Option<Token<'a>>) {
+511    let mut span = head.span;
+512    let mut segments = vec![head];
+513    while let Some(delim) = par.optional(TokenKind::ColonColon) {
+514        if let Some(name) = par.optional(TokenKind::Name) {
+515            span += name.span;
+516            segments.push(name.into());
+517        } else {
+518            return (Path { segments }, span, Some(delim));
+519        }
+520    }
+521    (Path { segments }, span, None)
+522}
+523
+524/// Parse a type description, e.g. `u8` or `Map<address, u256>`.
+525pub fn parse_type_desc(par: &mut Parser) -> ParseResult<Node<TypeDesc>> {
+526    use TokenKind::*;
+527    let mut typ = match par.peek_or_err()? {
+528        SelfType => {
+529            let _self = par.next()?;
+530            Node::new(TypeDesc::SelfType, _self.span)
+531        }
+532        Name => {
+533            let name = par.next()?;
+534            match par.peek() {
+535                Some(ColonColon) => {
+536                    let (path, span, trailing_delim) = parse_path_tail(par, name.into());
+537                    if let Some(colons) = trailing_delim {
+538                        let next = par.next()?;
+539                        par.fancy_error(
+540                            "failed to parse type description",
+541                            vec![
+542                                Label::secondary(colons.span, "path delimiter"),
+543                                Label::primary(next.span, "expected a name"),
+544                            ],
+545                            vec![],
+546                        );
+547                        return Err(ParseFailed);
+548                    }
+549                    Node::new(TypeDesc::Path(path), span)
+550                }
+551                Some(Lt) => {
+552                    let args = parse_generic_args(par)?;
+553                    let span = name.span + args.span;
+554                    Node::new(
+555                        TypeDesc::Generic {
+556                            base: name.into(),
+557                            args,
+558                        },
+559                        span,
+560                    )
+561                }
+562                _ => Node::new(
+563                    TypeDesc::Base {
+564                        base: name.text.into(),
+565                    },
+566                    name.span,
+567                ),
+568            }
+569        }
+570        ParenOpen => {
+571            let mut span = par.next()?.span;
+572            let mut items = vec![];
+573            loop {
+574                match par.peek_or_err()? {
+575                    ParenClose => {
+576                        span += par.next()?.span;
+577                        break;
+578                    }
+579
+580                    Name | ParenOpen => {
+581                        let item = parse_type_desc(par)?;
+582                        span += item.span;
+583                        items.push(item);
+584                        if par.peek_or_err()? == Comma {
+585                            par.next()?;
+586                        } else {
+587                            span += par
+588                                .expect(
+589                                    ParenClose,
+590                                    "Unexpected token while parsing tuple type description",
+591                                )?
+592                                .span;
+593                            break;
+594                        }
+595                    }
+596
+597                    _ => {
+598                        let tok = par.next()?;
+599                        par.unexpected_token_error(
+600                            &tok,
+601                            "failed to parse type description",
+602                            vec![],
+603                        );
+604                        return Err(ParseFailed);
+605                    }
+606                }
+607            }
+608            if items.is_empty() {
+609                Node::new(TypeDesc::Unit, span)
+610            } else {
+611                Node::new(
+612                    TypeDesc::Tuple {
+613                        items: Vec1::try_from_vec(items).expect("couldn't convert vec to vec1"),
+614                    },
+615                    span,
+616                )
+617            }
+618        }
+619        _ => {
+620            let tok = par.next()?;
+621            par.unexpected_token_error(&tok, "failed to parse type description", vec![]);
+622            return Err(ParseFailed);
+623        }
+624    };
+625
+626    while par.peek() == Some(BracketOpen) {
+627        let l_brack = par.next()?.span;
+628
+629        if_chain! {
+630            if let Some(size_token) = par.optional(TokenKind::Int);
+631            if let Ok(dimension) = size_token.text.parse::<usize>();
+632            if let Some(r_brack) = par.optional(TokenKind::BracketClose);
+633            then {
+634                let span = typ.span + l_brack + r_brack.span;
+635                par.fancy_error(
+636                    "Outdated array syntax",
+637                    vec![
+638                        Label::primary(
+639                            span,
+640                            ""
+641                        )
+642                    ],
+643                    vec![
+644                        format!("Hint: Use `Array<{}, {}>`", typ.kind, dimension)
+645                    ]
+646                );
+647                typ = Node::new(
+648                    TypeDesc::Generic {
+649                        base: Node::new("Array".into(), typ.span),
+650                        args: Node::new(vec![
+651                            GenericArg::TypeDesc(
+652                                Node::new(typ.kind, typ.span)
+653                            ),
+654                            GenericArg::Int(
+655                                Node::new(dimension, size_token.span)
+656                            )
+657                        ], span)
+658                    },
+659                    span,
+660                );
+661            } else {
+662                par.fancy_error(
+663                    "Unexpected token while parsing type description",
+664                    vec![
+665                        Label::primary(
+666                            l_brack,
+667                            "Unexpected token"
+668                        )
+669                    ],
+670                    vec![
+671                        format!("Hint: To define an array type use `Array<{}, 10>`", typ.kind)
+672                    ]
+673                );
+674                return Err(ParseFailed);
+675            }
+676        }
+677    }
+678
+679    Ok(typ)
+680}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/lexer.rs.html b/compiler-docs/src/fe_parser/lexer.rs.html new file mode 100644 index 0000000000..48b27adb7d --- /dev/null +++ b/compiler-docs/src/fe_parser/lexer.rs.html @@ -0,0 +1,102 @@ +lexer.rs - source

fe_parser/
lexer.rs

1mod token;
+2use crate::node::Span;
+3use fe_common::files::SourceFileId;
+4use logos::Logos;
+5pub use token::{Token, TokenKind};
+6
+7#[derive(Clone)]
+8pub struct Lexer<'a> {
+9    file_id: SourceFileId,
+10    inner: logos::Lexer<'a, TokenKind>,
+11}
+12
+13impl<'a> Lexer<'a> {
+14    /// Create a new lexer with the given source code string.
+15    pub fn new(file_id: SourceFileId, src: &'a str) -> Lexer {
+16        Lexer {
+17            file_id,
+18            inner: TokenKind::lexer(src),
+19        }
+20    }
+21
+22    /// Return the full source code string that's being tokenized.
+23    pub fn source(&self) -> &'a str {
+24        self.inner.source()
+25    }
+26}
+27
+28impl<'a> Iterator for Lexer<'a> {
+29    type Item = Token<'a>;
+30
+31    fn next(&mut self) -> Option<Self::Item> {
+32        let kind = self.inner.next()?;
+33        let text = self.inner.slice();
+34        let span = self.inner.span();
+35        Some(Token {
+36            kind,
+37            text,
+38            span: Span {
+39                file_id: self.file_id,
+40                start: span.start,
+41                end: span.end,
+42            },
+43        })
+44    }
+45}
+46
+47#[cfg(test)]
+48mod tests {
+49    use crate::lexer::{Lexer, TokenKind};
+50    use fe_common::files::SourceFileId;
+51    use TokenKind::*;
+52
+53    fn check(input: &str, expected: &[TokenKind]) {
+54        let lex = Lexer::new(SourceFileId::dummy_file(), input);
+55
+56        let actual = lex.map(|t| t.kind).collect::<Vec<_>>();
+57
+58        assert!(
+59            actual.iter().eq(expected.iter()),
+60            "\nexpected: {expected:?}\n  actual: {actual:?}"
+61        );
+62    }
+63
+64    #[test]
+65    fn basic() {
+66        check(
+67            "contract Foo:\n  x: u32\n  fn f() -> u32: not x",
+68            &[
+69                Contract, Name, Colon, Newline, Name, Colon, Name, Newline, Fn, Name, ParenOpen,
+70                ParenClose, Arrow, Name, Colon, Not, Name,
+71            ],
+72        );
+73    }
+74
+75    #[test]
+76    fn strings() {
+77        let rawstr = r#""string \t with \n escapes \" \"""#;
+78        let mut lex = Lexer::new(SourceFileId::dummy_file(), rawstr);
+79        let lexedstr = lex.next().unwrap();
+80        assert!(lexedstr.kind == Text);
+81        assert!(lexedstr.text == rawstr);
+82        assert!(lex.next().is_none());
+83    }
+84
+85    #[test]
+86    fn errors() {
+87        check(
+88            "contract Foo@ 5u8 \n  self.bar",
+89            &[
+90                Contract, Name, Error, Int, Name, Newline, SelfValue, Dot, Name,
+91            ],
+92        );
+93    }
+94
+95    #[test]
+96    fn tabs_and_comment() {
+97        check(
+98            "\n\t \tcontract\n\tFoo // hi mom!\n ",
+99            &[Newline, Contract, Newline, Name, Newline],
+100        );
+101    }
+102}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/lexer/token.rs.html b/compiler-docs/src/fe_parser/lexer/token.rs.html new file mode 100644 index 0000000000..ab74787082 --- /dev/null +++ b/compiler-docs/src/fe_parser/lexer/token.rs.html @@ -0,0 +1,316 @@ +token.rs - source

fe_parser/lexer/
token.rs

1use crate::node::Node;
+2use crate::node::Span;
+3use logos::Logos;
+4use smol_str::SmolStr;
+5use std::ops::Add;
+6
+7#[derive(Debug, PartialEq, Eq, Clone)]
+8pub struct Token<'a> {
+9    pub kind: TokenKind,
+10    pub text: &'a str,
+11    pub span: Span,
+12}
+13
+14impl<'a> From<Token<'a>> for Node<SmolStr> {
+15    fn from(tok: Token<'a>) -> Node<SmolStr> {
+16        Node::new(tok.text.into(), tok.span)
+17    }
+18}
+19
+20impl<'a> Add<&Token<'a>> for Span {
+21    type Output = Self;
+22
+23    fn add(self, other: &Token<'a>) -> Self {
+24        self + other.span
+25    }
+26}
+27
+28#[derive(Debug, Copy, Clone, PartialEq, Eq, Logos)]
+29pub enum TokenKind {
+30    // Ignoring comments and spaces/tabs for now.
+31    // If we implement an auto-formatting tool, we'll probably want to change this.
+32    #[regex(r"//[^\n]*", logos::skip)]
+33    #[regex("[ \t]+", logos::skip)]
+34    #[error]
+35    Error,
+36
+37    #[regex(r"\n[ \t]*")]
+38    Newline,
+39
+40    #[regex("[a-zA-Z_][a-zA-Z0-9_]*")]
+41    Name,
+42    #[regex("[0-9]+(?:_[0-9]+)*")]
+43    Int,
+44    #[regex("0[xX][0-9a-fA-F]+")]
+45    Hex,
+46    #[regex("0[oO][0-7]+")]
+47    Octal,
+48    #[regex("0[bB][0-1]+")]
+49    Binary,
+50    // Float,
+51    #[regex(r#""([^"\\]|\\.)*""#)]
+52    #[regex(r#"'([^'\\]|\\.)*'"#)]
+53    Text,
+54    #[token("true")]
+55    True,
+56    #[token("false")]
+57    False,
+58    // #[token("None")] // ?
+59    // None,
+60    #[token("assert")]
+61    Assert,
+62    #[token("break")]
+63    Break,
+64    #[token("continue")]
+65    Continue,
+66    #[token("contract")]
+67    Contract,
+68    #[token("fn")]
+69    Fn,
+70    #[token("const")]
+71    Const,
+72    #[token("else")]
+73    Else,
+74    #[token("idx")]
+75    Idx,
+76    #[token("if")]
+77    If,
+78    #[token("match")]
+79    Match,
+80    #[token("impl")]
+81    Impl,
+82    #[token("pragma")]
+83    Pragma,
+84    #[token("for")]
+85    For,
+86    #[token("pub")]
+87    Pub,
+88    #[token("return")]
+89    Return,
+90    #[token("revert")]
+91    Revert,
+92    #[token("Self")]
+93    SelfType,
+94    #[token("self")]
+95    SelfValue,
+96    #[token("struct")]
+97    Struct,
+98    #[token("enum")]
+99    Enum,
+100    #[token("trait")]
+101    Trait,
+102    #[token("type")]
+103    Type,
+104    #[token("unsafe")]
+105    Unsafe,
+106    #[token("while")]
+107    While,
+108
+109    #[token("and")]
+110    And,
+111    #[token("as")]
+112    As,
+113    #[token("in")]
+114    In,
+115    #[token("not")]
+116    Not,
+117    #[token("or")]
+118    Or,
+119    #[token("let")]
+120    Let,
+121    #[token("mut")]
+122    Mut,
+123    #[token("use")]
+124    Use,
+125    // Symbols
+126    #[token("(")]
+127    ParenOpen,
+128    #[token(")")]
+129    ParenClose,
+130    #[token("[")]
+131    BracketOpen,
+132    #[token("]")]
+133    BracketClose,
+134    #[token("{")]
+135    BraceOpen,
+136    #[token("}")]
+137    BraceClose,
+138    #[token(":")]
+139    Colon,
+140    #[token("::")]
+141    ColonColon,
+142    #[token(",")]
+143    Comma,
+144    #[token("#")]
+145    Hash,
+146    #[token(";")]
+147    Semi,
+148    #[token("+")]
+149    Plus,
+150    #[token("-")]
+151    Minus,
+152    #[token("*")]
+153    Star,
+154    #[token("/")]
+155    Slash,
+156    #[token("|")]
+157    Pipe,
+158    #[token("&")]
+159    Amper,
+160    #[token("<")]
+161    Lt,
+162    #[token("<<")]
+163    LtLt,
+164    #[token(">")]
+165    Gt,
+166    #[token(">>")]
+167    GtGt,
+168    #[token("=")]
+169    Eq,
+170    #[token(".")]
+171    Dot,
+172    #[token("..")]
+173    DotDot,
+174    #[token("%")]
+175    Percent,
+176    #[token("==")]
+177    EqEq,
+178    #[token("!=")]
+179    NotEq,
+180    #[token("<=")]
+181    LtEq,
+182    #[token(">=")]
+183    GtEq,
+184    #[token("~")]
+185    Tilde,
+186    #[token("^")]
+187    Hat,
+188    #[token("**")]
+189    StarStar,
+190    #[token("**=")]
+191    StarStarEq,
+192    #[token("+=")]
+193    PlusEq,
+194    #[token("-=")]
+195    MinusEq,
+196    #[token("*=")]
+197    StarEq,
+198    #[token("/=")]
+199    SlashEq,
+200    #[token("%=")]
+201    PercentEq,
+202    #[token("&=")]
+203    AmperEq,
+204    #[token("|=")]
+205    PipeEq,
+206    #[token("^=")]
+207    HatEq,
+208    #[token("<<=")]
+209    LtLtEq,
+210    #[token(">>=")]
+211    GtGtEq,
+212    #[token("->")]
+213    Arrow,
+214    #[token("=>")]
+215    FatArrow,
+216}
+217
+218impl TokenKind {
+219    /// Return a user-friendly description of the token kind. E.g.
+220    /// TokenKind::Newline => "a newline"
+221    /// TokenKind::Colon => "`:`"
+222    pub fn describe(&self) -> &str {
+223        use TokenKind::*;
+224        match self {
+225            Newline => "a newline",
+226            Name => "a name",
+227            Int => "a number",
+228            Hex => "a hexadecimal number",
+229            Octal => "an octal number",
+230            Binary => "a binary number",
+231            Text => "a string",
+232
+233            True => "keyword `true`",
+234            False => "keyword `false`",
+235            Assert => "keyword `assert`",
+236            Break => "keyword `break`",
+237            Continue => "keyword `continue`",
+238            Contract => "keyword `contract`",
+239            Fn => "keyword `fn`",
+240            Const => "keyword `const`",
+241            Let => "keyword `let`",
+242            Mut => "keyword `mut`",
+243            Else => "keyword `else`",
+244            Idx => "keyword `idx`",
+245            If => "keyword `if`",
+246            Match => "keyword `match`",
+247            Impl => "keyword `impl`",
+248            Pragma => "keyword `pragma`",
+249            For => "keyword `for`",
+250            Pub => "keyword `pub`",
+251            Return => "keyword `return`",
+252            Revert => "keyword `revert`",
+253            SelfType => "keyword `Self`",
+254            SelfValue => "keyword `self`",
+255            Struct => "keyword `struct`",
+256            Enum => "keyword `enum`",
+257            Trait => "keyword `trait`",
+258            Type => "keyword `type`",
+259            Unsafe => "keyword `unsafe`",
+260            While => "keyword `while`",
+261            And => "keyword `and`",
+262            As => "keyword `as`",
+263            In => "keyword `in`",
+264            Not => "keyword `not`",
+265            Or => "keyword `or`",
+266            Use => "keyword `use`",
+267            ParenOpen => "symbol `(`",
+268            ParenClose => "symbol `)`",
+269            BracketOpen => "symbol `[`",
+270            BracketClose => "symbol `]`",
+271            BraceOpen => "symbol `{`",
+272            BraceClose => "symbol `}`",
+273            Colon => "symbol `:`",
+274            ColonColon => "symbol `::`",
+275            Comma => "symbol `,`",
+276            Hash => "symbol `#`",
+277            Semi => "symbol `;`",
+278            Plus => "symbol `+`",
+279            Minus => "symbol `-`",
+280            Star => "symbol `*`",
+281            Slash => "symbol `/`",
+282            Pipe => "symbol `|`",
+283            Amper => "symbol `&`",
+284            Lt => "symbol `<`",
+285            LtLt => "symbol `<<`",
+286            Gt => "symbol `>`",
+287            GtGt => "symbol `>>`",
+288            Eq => "symbol `=`",
+289            Dot => "symbol `.`",
+290            DotDot => "symbol `..`",
+291            Percent => "symbol `%`",
+292            EqEq => "symbol `==`",
+293            NotEq => "symbol `!=`",
+294            LtEq => "symbol `<=`",
+295            GtEq => "symbol `>=`",
+296            Tilde => "symbol `~`",
+297            Hat => "symbol `^`",
+298            StarStar => "symbol `**`",
+299            StarStarEq => "symbol `**=`",
+300            PlusEq => "symbol `+=`",
+301            MinusEq => "symbol `-=`",
+302            StarEq => "symbol `*=`",
+303            SlashEq => "symbol `/=`",
+304            PercentEq => "symbol `%=`",
+305            AmperEq => "symbol `&=`",
+306            PipeEq => "symbol `|=`",
+307            HatEq => "symbol `^=`",
+308            LtLtEq => "symbol `<<=`",
+309            GtGtEq => "symbol `>>=`",
+310            Arrow => "symbol `->`",
+311            FatArrow => "symbol `=>`",
+312
+313            Error => unreachable!(), // TODO this is reachable
+314        }
+315    }
+316}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/lib.rs.html b/compiler-docs/src/fe_parser/lib.rs.html new file mode 100644 index 0000000000..16cc3ac5c0 --- /dev/null +++ b/compiler-docs/src/fe_parser/lib.rs.html @@ -0,0 +1,30 @@ +lib.rs - source

fe_parser/
lib.rs

1pub mod ast;
+2pub mod grammar;
+3pub mod lexer;
+4pub use lexer::{Token, TokenKind};
+5mod parser;
+6pub use parser::{Label, ParseFailed, ParseResult, Parser};
+7pub mod node;
+8
+9use ast::Module;
+10use fe_common::diagnostics::Diagnostic;
+11use fe_common::files::SourceFileId;
+12
+13/// Parse a [`Module`] from the file content string.
+14///
+15/// Returns a `Module` (which may be incomplete), and a vec of [`Diagnostic`]s
+16/// (which may be empty) to display to the user. If any of the returned
+17/// diagnostics are errors, the compilation of this file should ultimately fail.
+18///
+19/// If a fatal parse error occurred, the last element of the `Module::body` will
+20/// be a `ModuleStmt::ParseError`. The parser currently has very limited ability
+21/// to recover from syntax errors; this is just a first meager attempt at returning a
+22/// useful AST when there are syntax errors.
+23///
+24/// A [`SourceFileId`] is required to associate any diagnostics with the
+25/// underlying file.
+26pub fn parse_file(file_id: SourceFileId, src: &str) -> (Module, Vec<Diagnostic>) {
+27    let mut parser = Parser::new(file_id, src);
+28    let node = crate::grammar::module::parse_module(&mut parser);
+29    (node.kind, parser.diagnostics)
+30}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/node.rs.html b/compiler-docs/src/fe_parser/node.rs.html new file mode 100644 index 0000000000..678c3c3a80 --- /dev/null +++ b/compiler-docs/src/fe_parser/node.rs.html @@ -0,0 +1,66 @@ +node.rs - source

fe_parser/
node.rs

1pub use fe_common::{Span, Spanned};
+2use serde::{Deserialize, Serialize};
+3use std::sync::atomic::{AtomicU32, Ordering};
+4
+5#[derive(Debug, PartialEq, Copy, Clone, Hash, Eq, Default, PartialOrd, Ord)]
+6pub struct NodeId(u32);
+7
+8impl NodeId {
+9    pub fn create() -> Self {
+10        static NEXT_ID: AtomicU32 = AtomicU32::new(0);
+11        Self(NEXT_ID.fetch_add(1, Ordering::Relaxed))
+12    }
+13
+14    pub fn dummy() -> Self {
+15        Self(u32::MAX)
+16    }
+17
+18    pub fn is_dummy(self) -> bool {
+19        self == Self::dummy()
+20    }
+21}
+22
+23#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+24pub struct Node<T> {
+25    pub kind: T,
+26    #[serde(skip_serializing, skip_deserializing)]
+27    pub id: NodeId,
+28    pub span: Span,
+29}
+30
+31impl<T> Node<T> {
+32    pub fn new(kind: T, span: Span) -> Self {
+33        let id = NodeId::create();
+34        Self { kind, id, span }
+35    }
+36}
+37
+38impl<T> Spanned for Node<T> {
+39    fn span(&self) -> Span {
+40        self.span
+41    }
+42}
+43
+44impl<T> From<&Node<T>> for Span {
+45    fn from(node: &Node<T>) -> Self {
+46        node.span
+47    }
+48}
+49
+50impl<T> From<&Box<Node<T>>> for Span {
+51    fn from(node: &Box<Node<T>>) -> Self {
+52        node.span
+53    }
+54}
+55
+56impl<T> From<&Node<T>> for NodeId {
+57    fn from(node: &Node<T>) -> Self {
+58        node.id
+59    }
+60}
+61
+62impl<T> From<&Box<Node<T>>> for NodeId {
+63    fn from(node: &Box<Node<T>>) -> Self {
+64        node.id
+65    }
+66}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/parser.rs.html b/compiler-docs/src/fe_parser/parser.rs.html new file mode 100644 index 0000000000..75ad52b979 --- /dev/null +++ b/compiler-docs/src/fe_parser/parser.rs.html @@ -0,0 +1,429 @@ +parser.rs - source

fe_parser/
parser.rs

1pub use fe_common::diagnostics::Label;
+2use fe_common::diagnostics::{Diagnostic, Severity};
+3use fe_common::files::SourceFileId;
+4
+5use crate::lexer::{Lexer, Token, TokenKind};
+6use crate::node::Span;
+7use std::{error, fmt};
+8
+9#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone)]
+10pub struct ParseFailed;
+11impl fmt::Display for ParseFailed {
+12    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+13        write!(fmt, "ParseFailed")
+14    }
+15}
+16impl error::Error for ParseFailed {}
+17
+18pub type ParseResult<T> = Result<T, ParseFailed>;
+19
+20/// `Parser` maintains the parsing state, such as the token stream,
+21/// "enclosure" (paren, brace, ..) stack, diagnostics, etc.
+22/// Syntax parsing logic is in the [`crate::grammar`] module.
+23///
+24/// See [`BTParser`] if you need backtrackable parser.
+25pub struct Parser<'a> {
+26    pub file_id: SourceFileId,
+27    lexer: Lexer<'a>,
+28
+29    /// Tokens that have been "peeked", or split from a larger token.
+30    /// Eg. `>>` may be split into two `>` tokens when parsing the end of a
+31    /// generic type parameter list (eg. `Map<u256, Map<u256, address>>`).
+32    buffered: Vec<Token<'a>>,
+33
+34    enclosure_stack: Vec<Enclosure>,
+35
+36    /// The diagnostics (errors and warnings) emitted during parsing.
+37    pub diagnostics: Vec<Diagnostic>,
+38}
+39
+40impl<'a> Parser<'a> {
+41    /// Create a new parser for a source code string and associated file id.
+42    pub fn new(file_id: SourceFileId, content: &'a str) -> Self {
+43        Parser {
+44            file_id,
+45            lexer: Lexer::new(file_id, content),
+46            buffered: vec![],
+47            enclosure_stack: vec![],
+48            diagnostics: vec![],
+49        }
+50    }
+51
+52    /// Returns back tracking parser.
+53    pub fn as_bt_parser<'b>(&'b mut self) -> BTParser<'a, 'b> {
+54        BTParser::new(self)
+55    }
+56
+57    /// Return the next token, or an error if we've reached the end of the file.
+58    #[allow(clippy::should_implement_trait)] // next() is a nice short name for a common task
+59    pub fn next(&mut self) -> ParseResult<Token<'a>> {
+60        self.eat_newlines_if_in_nonblock_enclosure();
+61        if let Some(tok) = self.next_raw() {
+62            if is_enclosure_open(tok.kind) {
+63                self.enclosure_stack
+64                    .push(Enclosure::non_block(tok.kind, tok.span));
+65            } else if is_enclosure_close(tok.kind) {
+66                if let Some(open) = self.enclosure_stack.pop() {
+67                    if !enclosure_tokens_match(open.token_kind, tok.kind) {
+68                        // TODO: we should search the enclosure_stack
+69                        //  for the last matching enclosure open token.
+70                        //  If any enclosures are unclosed, we should emit an
+71                        //  error, and somehow close their respective ast nodes.
+72                        //  We could synthesize the correct close token, or emit
+73                        //  a special TokenKind::UnclosedEnclosure or whatever.
+74                        todo!()
+75                    }
+76                } else {
+77                    self.error(tok.span, format!("Unmatched `{}`", tok.text));
+78                }
+79            }
+80            Ok(tok)
+81        } else {
+82            self.error(
+83                Span::new(
+84                    self.file_id,
+85                    self.lexer.source().len(),
+86                    self.lexer.source().len(),
+87                ),
+88                "unexpected end of file",
+89            );
+90            Err(ParseFailed)
+91        }
+92    }
+93
+94    fn next_raw(&mut self) -> Option<Token<'a>> {
+95        self.buffered.pop().or_else(|| self.lexer.next())
+96    }
+97
+98    /// Take a peek at the next token kind without consuming it, or return an
+99    /// error if we've reached the end of the file.
+100    pub fn peek_or_err(&mut self) -> ParseResult<TokenKind> {
+101        self.eat_newlines_if_in_nonblock_enclosure();
+102        if let Some(tk) = self.peek_raw() {
+103            Ok(tk)
+104        } else {
+105            let index = self.lexer.source().len();
+106            self.error(
+107                Span::new(self.file_id, index, index),
+108                "unexpected end of file",
+109            );
+110            Err(ParseFailed)
+111        }
+112    }
+113
+114    /// Take a peek at the next token kind. Returns `None` if we've reached the
+115    /// end of the file.
+116    pub fn peek(&mut self) -> Option<TokenKind> {
+117        self.eat_newlines_if_in_nonblock_enclosure();
+118        self.peek_raw()
+119    }
+120
+121    fn peek_raw(&mut self) -> Option<TokenKind> {
+122        if self.buffered.is_empty() {
+123            if let Some(tok) = self.lexer.next() {
+124                self.buffered.push(tok);
+125            } else {
+126                return None;
+127            }
+128        }
+129        Some(self.buffered.last().unwrap().kind)
+130    }
+131
+132    fn eat_newlines_if_in_nonblock_enclosure(&mut self) {
+133        // TODO: allow newlines inside angle brackets?
+134        //   eg `fn f(x: map\n <\n u8\n, ...`
+135        if let Some(enc) = self.enclosure_stack.last() {
+136            if !enc.is_block {
+137                self.eat_newlines();
+138            }
+139        }
+140    }
+141
+142    /// Split the next token into two tokens, returning the first. Only supports
+143    /// splitting the `>>` token into two `>` tokens, specifically for
+144    /// parsing the closing angle bracket of a generic type argument list
+145    /// (`Map<x, Map<y, z>>`).
+146    ///
+147    /// # Panics
+148    /// Panics if the next token isn't `>>`
+149    pub fn split_next(&mut self) -> ParseResult<Token<'a>> {
+150        let gtgt = self.next()?;
+151        assert_eq!(gtgt.kind, TokenKind::GtGt);
+152
+153        let (gt1, gt2) = gtgt.text.split_at(1);
+154        self.buffered.push(Token {
+155            kind: TokenKind::Gt,
+156            text: gt2,
+157            span: Span::new(self.file_id, gtgt.span.start + 1, gtgt.span.end),
+158        });
+159
+160        Ok(Token {
+161            kind: TokenKind::Gt,
+162            text: gt1,
+163            span: Span::new(self.file_id, gtgt.span.start, gtgt.span.end - 1),
+164        })
+165    }
+166
+167    /// Returns `true` if the parser has reached the end of the file.
+168    pub fn done(&mut self) -> bool {
+169        self.peek_raw().is_none()
+170    }
+171
+172    pub fn eat_newlines(&mut self) {
+173        while self.peek_raw() == Some(TokenKind::Newline) {
+174            self.next_raw();
+175        }
+176    }
+177
+178    /// Assert that the next token kind it matches the expected token
+179    /// kind, and return it. This should be used in cases where the next token
+180    /// kind is expected to have been checked already.
+181    ///
+182    /// # Panics
+183    /// Panics if the next token kind isn't `tk`.
+184    pub fn assert(&mut self, tk: TokenKind) -> Token<'a> {
+185        let tok = self.next().unwrap();
+186        assert_eq!(tok.kind, tk, "internal parser error");
+187        tok
+188    }
+189
+190    /// If the next token matches the expected kind, return it. Otherwise emit
+191    /// an error diagnostic with the given message and return an error.
+192    pub fn expect<S: Into<String>>(
+193        &mut self,
+194        expected: TokenKind,
+195        message: S,
+196    ) -> ParseResult<Token<'a>> {
+197        self.expect_with_notes(expected, message, |_| Vec::new())
+198    }
+199
+200    /// Like [`Parser::expect`], but with additional notes to be appended to the
+201    /// bottom of the diagnostic message. The notes are provided by a
+202    /// function that returns a `Vec<String>`, to avoid allocations in the
+203    /// case where the token is as expected.
+204    pub fn expect_with_notes<Str, NotesFn>(
+205        &mut self,
+206        expected: TokenKind,
+207        message: Str,
+208        notes_fn: NotesFn,
+209    ) -> ParseResult<Token<'a>>
+210    where
+211        Str: Into<String>,
+212        NotesFn: FnOnce(&Token) -> Vec<String>,
+213    {
+214        let tok = self.next()?;
+215        if tok.kind == expected {
+216            Ok(tok)
+217        } else {
+218            self.fancy_error(
+219                message.into(),
+220                vec![Label::primary(
+221                    tok.span,
+222                    format!(
+223                        "expected {}, found {}",
+224                        expected.describe(),
+225                        tok.kind.describe()
+226                    ),
+227                )],
+228                notes_fn(&tok),
+229            );
+230            Err(ParseFailed)
+231        }
+232    }
+233
+234    /// If the next token matches the expected kind, return it. Otherwise return
+235    /// None.
+236    pub fn optional(&mut self, kind: TokenKind) -> Option<Token<'a>> {
+237        if self.peek() == Some(kind) {
+238            Some(self.next().unwrap())
+239        } else {
+240            None
+241        }
+242    }
+243
+244    /// Emit an "unexpected token" error diagnostic with the given message.
+245    pub fn unexpected_token_error<S: Into<String>>(
+246        &mut self,
+247        tok: &Token,
+248        message: S,
+249        notes: Vec<String>,
+250    ) {
+251        self.fancy_error(
+252            message,
+253            vec![Label::primary(tok.span, "unexpected token")],
+254            notes,
+255        );
+256    }
+257
+258    /// Enter a "block", which is a brace-enclosed list of statements,
+259    /// separated by newlines and/or semicolons.
+260    /// This checks for and consumes the `{` that precedes the block.
+261    pub fn enter_block(&mut self, context_span: Span, context_name: &str) -> ParseResult<()> {
+262        if self.peek_raw() == Some(TokenKind::BraceOpen) {
+263            let tok = self.next_raw().unwrap();
+264            self.enclosure_stack.push(Enclosure::block(tok.span));
+265            self.eat_newlines();
+266            Ok(())
+267        } else {
+268            self.fancy_error(
+269                format!("{context_name} must start with `{{`"),
+270                vec![Label::primary(
+271                    Span::new(self.file_id, context_span.end, context_span.end),
+272                    "expected `{` here",
+273                )],
+274                vec![],
+275            );
+276            Err(ParseFailed)
+277        }
+278    }
+279
+280    /// Consumes newlines and semicolons. Returns Ok if one or more newlines or
+281    /// semicolons are consumed, or if the next token is a `}`.
+282    pub fn expect_stmt_end(&mut self, context_name: &str) -> ParseResult<()> {
+283        let mut newline = false;
+284        while matches!(self.peek_raw(), Some(TokenKind::Newline | TokenKind::Semi)) {
+285            newline = true;
+286            self.next_raw().unwrap();
+287        }
+288        if newline {
+289            return Ok(());
+290        }
+291        match self.peek_raw() {
+292            Some(TokenKind::BraceClose) => Ok(()),
+293            Some(_) => {
+294                let tok = self.next()?;
+295                self.unexpected_token_error(
+296                    &tok,
+297                    format!("unexpected token while parsing {context_name}"),
+298                    vec![format!(
+299                        "expected a newline; found {} instead",
+300                        tok.kind.describe()
+301                    )],
+302                );
+303                Err(ParseFailed)
+304            }
+305            None => Ok(()), // unexpect eof error will be generated be parent block
+306        }
+307    }
+308
+309    /// Emit an error diagnostic, but don't stop parsing
+310    pub fn error<S: Into<String>>(&mut self, span: Span, message: S) {
+311        self.diagnostics.push(Diagnostic {
+312            severity: Severity::Error,
+313            message: message.into(),
+314            labels: vec![Label::primary(span, "")],
+315            notes: vec![],
+316        })
+317    }
+318
+319    /// Emit a "fancy" error diagnostic with any number of labels and notes,
+320    /// but don't stop parsing.
+321    pub fn fancy_error<S: Into<String>>(
+322        &mut self,
+323        message: S,
+324        labels: Vec<Label>,
+325        notes: Vec<String>,
+326    ) {
+327        self.diagnostics.push(Diagnostic {
+328            severity: Severity::Error,
+329            message: message.into(),
+330            labels,
+331            notes,
+332        })
+333    }
+334}
+335
+336/// A thin wrapper that makes [`Parser`] backtrackable.
+337pub struct BTParser<'a, 'b> {
+338    snapshot: &'b mut Parser<'a>,
+339    parser: Parser<'a>,
+340}
+341
+342impl<'a, 'b> BTParser<'a, 'b> {
+343    pub fn new(snapshot: &'b mut Parser<'a>) -> Self {
+344        let parser = Parser {
+345            file_id: snapshot.file_id,
+346            lexer: snapshot.lexer.clone(),
+347            buffered: snapshot.buffered.clone(),
+348            enclosure_stack: snapshot.enclosure_stack.clone(),
+349            diagnostics: Vec::new(),
+350        };
+351        Self { snapshot, parser }
+352    }
+353
+354    pub fn accept(self) {
+355        self.snapshot.lexer = self.parser.lexer;
+356        self.snapshot.buffered = self.parser.buffered;
+357        self.snapshot.enclosure_stack = self.parser.enclosure_stack;
+358        self.snapshot.diagnostics.extend(self.parser.diagnostics);
+359    }
+360}
+361
+362impl<'a, 'b> std::ops::Deref for BTParser<'a, 'b> {
+363    type Target = Parser<'a>;
+364
+365    fn deref(&self) -> &Self::Target {
+366        &self.parser
+367    }
+368}
+369
+370impl<'a, 'b> std::ops::DerefMut for BTParser<'a, 'b> {
+371    fn deref_mut(&mut self) -> &mut Self::Target {
+372        &mut self.parser
+373    }
+374}
+375
+376/// The start position of a chunk of code enclosed by (), [], or {}.
+377/// (This has nothing to do with "closures".)
+378///
+379/// Note that <> isn't currently considered an enclosure, as `<` might be
+380/// a less-than operator, while the rest are unambiguous.
+381///
+382/// A `{}` enclosure may or may not be a block. A block contains a list of
+383/// statements, separated by newlines or semicolons (or both).
+384/// Semicolons and newlines are consumed by `par.expect_stmt_end()`.
+385///
+386/// Non-block enclosures contains zero or more expressions, maybe separated by
+387/// commas. When the top-most enclosure is a non-block, newlines are ignored
+388/// (by `par.next()`), and semicolons are just normal tokens that'll be
+389/// rejected by the parsing fns in grammar/.
+390#[derive(Clone, Debug)]
+391struct Enclosure {
+392    token_kind: TokenKind,
+393    _token_span: Span, // TODO: mark mismatched tokens
+394    is_block: bool,
+395}
+396impl Enclosure {
+397    pub fn block(token_span: Span) -> Self {
+398        Self {
+399            token_kind: TokenKind::BraceOpen,
+400            _token_span: token_span,
+401            is_block: true,
+402        }
+403    }
+404    pub fn non_block(token_kind: TokenKind, token_span: Span) -> Self {
+405        Self {
+406            token_kind,
+407            _token_span: token_span,
+408            is_block: false,
+409        }
+410    }
+411}
+412
+413fn is_enclosure_open(tk: TokenKind) -> bool {
+414    use TokenKind::*;
+415    matches!(tk, ParenOpen | BraceOpen | BracketOpen)
+416}
+417
+418fn is_enclosure_close(tk: TokenKind) -> bool {
+419    use TokenKind::*;
+420    matches!(tk, ParenClose | BraceClose | BracketClose)
+421}
+422
+423fn enclosure_tokens_match(open: TokenKind, close: TokenKind) -> bool {
+424    use TokenKind::*;
+425    matches!(
+426        (open, close),
+427        (ParenOpen, ParenClose) | (BraceOpen, BraceClose) | (BracketOpen, BracketClose)
+428    )
+429}
\ No newline at end of file diff --git a/compiler-docs/src/fe_test_files/lib.rs.html b/compiler-docs/src/fe_test_files/lib.rs.html new file mode 100644 index 0000000000..d2c6721052 --- /dev/null +++ b/compiler-docs/src/fe_test_files/lib.rs.html @@ -0,0 +1,44 @@ +lib.rs - source

fe_test_files/
lib.rs

1use include_dir::{include_dir, Dir};
+2
+3const FIXTURES: Dir = include_dir!("$CARGO_MANIFEST_DIR/fixtures");
+4
+5const NEW_FIXTURES: Dir = include_dir!("$CARGO_MANIFEST_DIR/../tests/fixtures");
+6
+7pub fn fixture(path: &str) -> &'static str {
+8    FIXTURES
+9        .get_file(path)
+10        .unwrap_or_else(|| panic!("bad fixture file path {path}"))
+11        .contents_utf8()
+12        .expect("fixture file isn't utf8")
+13}
+14
+15pub fn fixture_bytes(path: &str) -> &'static [u8] {
+16    FIXTURES
+17        .get_file(path)
+18        .unwrap_or_else(|| panic!("bad fixture file path {path}"))
+19        .contents()
+20}
+21
+22pub fn fixture_dir(path: &str) -> &Dir<'static> {
+23    FIXTURES
+24        .get_dir(path)
+25        .unwrap_or_else(|| panic!("no fixture dir named \"{path}\""))
+26}
+27
+28/// Returns `(file_path, file_content)`
+29pub fn fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)> {
+30    let dir = FIXTURES
+31        .get_dir(path)
+32        .unwrap_or_else(|| panic!("no fixture dir named \"{path}\""));
+33
+34    fe_library::static_dir_files(dir)
+35}
+36
+37/// Returns `(file_path, file_content)`
+38pub fn new_fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)> {
+39    let dir = NEW_FIXTURES
+40        .get_dir(path)
+41        .unwrap_or_else(|| panic!("no fixture dir named \"{path}\""));
+42
+43    fe_library::static_dir_files(dir)
+44}
\ No newline at end of file diff --git a/compiler-docs/src/fe_test_runner/lib.rs.html b/compiler-docs/src/fe_test_runner/lib.rs.html new file mode 100644 index 0000000000..3aa56b96a9 --- /dev/null +++ b/compiler-docs/src/fe_test_runner/lib.rs.html @@ -0,0 +1,191 @@ +lib.rs - source

fe_test_runner/
lib.rs

1use colored::Colorize;
+2use ethabi::{Event, Hash, RawLog};
+3use indexmap::IndexMap;
+4use revm::primitives::{
+5    AccountInfo, Address, Bytecode, Bytes, Env, ExecutionResult, TransactTo, B256, U256,
+6};
+7use std::{fmt::Display, str::FromStr};
+8
+9pub use ethabi;
+10
+11#[derive(Debug)]
+12pub struct TestSink {
+13    success_count: usize,
+14    failure_details: Vec<String>,
+15    logs_details: Vec<String>,
+16    collect_logs: bool,
+17}
+18
+19impl TestSink {
+20    pub fn new(collect_logs: bool) -> Self {
+21        Self {
+22            success_count: 0,
+23            failure_details: vec![],
+24            logs_details: vec![],
+25            collect_logs,
+26        }
+27    }
+28
+29    pub fn test_count(&self) -> usize {
+30        self.failure_count() + self.success_count()
+31    }
+32
+33    pub fn failure_count(&self) -> usize {
+34        self.failure_details.len()
+35    }
+36
+37    pub fn logs_count(&self) -> usize {
+38        self.logs_details.len()
+39    }
+40
+41    pub fn success_count(&self) -> usize {
+42        self.success_count
+43    }
+44
+45    pub fn insert_failure(&mut self, name: &str, reason: &str) {
+46        self.failure_details
+47            .push(format!("{}\n{}", name, reason.red()))
+48    }
+49
+50    pub fn insert_logs(&mut self, name: &str, logs: &str) {
+51        if self.collect_logs {
+52            self.logs_details.push(format!(
+53                "{} produced the following logs:\n{}\n",
+54                name,
+55                logs.bright_yellow()
+56            ))
+57        }
+58    }
+59
+60    pub fn inc_success_count(&mut self) {
+61        self.success_count += 1
+62    }
+63
+64    pub fn failure_details(&self) -> String {
+65        self.failure_details.join("\n")
+66    }
+67
+68    pub fn logs_details(&self) -> String {
+69        self.logs_details.join("\n")
+70    }
+71}
+72
+73impl Display for TestSink {
+74    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+75        if self.logs_count() != 0 {
+76            writeln!(f, "{}", self.logs_details())?;
+77            writeln!(f)?;
+78        }
+79
+80        if self.failure_count() != 0 {
+81            writeln!(f, "{}", self.failure_details())?;
+82            writeln!(f)?;
+83            if self.collect_logs {
+84                writeln!(f, "note: failed tests do not produce logs")?;
+85                writeln!(f)?;
+86            }
+87        }
+88
+89        let test_description = |n: usize, status: &dyn Display| -> String {
+90            if n == 1 {
+91                format!("1 test {status}")
+92            } else {
+93                format!("{n} tests {status}")
+94            }
+95        };
+96
+97        write!(
+98            f,
+99            "{}; ",
+100            test_description(self.success_count(), &"passed".green())
+101        )?;
+102        write!(
+103            f,
+104            "{}; ",
+105            test_description(self.failure_count(), &"failed".red())
+106        )?;
+107        write!(f, "{}", test_description(self.test_count(), &"executed"))
+108    }
+109}
+110
+111pub fn execute(name: &str, events: &[Event], bytecode: &str, sink: &mut TestSink) -> bool {
+112    let events: IndexMap<_, _> = events
+113        .iter()
+114        .map(|event| (event.signature(), event))
+115        .collect();
+116    let bytecode = Bytecode::new_raw(Bytes::copy_from_slice(&hex::decode(bytecode).unwrap()));
+117
+118    let mut database = revm::InMemoryDB::default();
+119    let test_address = Address::from_str("0000000000000000000000000000000000000042").unwrap();
+120    let test_info = AccountInfo::new(U256::ZERO, 0, B256::default(), bytecode);
+121    database.insert_account_info(test_address, test_info);
+122
+123    let mut env = Env::default();
+124    env.tx.transact_to = TransactTo::Call(test_address);
+125
+126    let builder = revm::EvmBuilder::default()
+127        .with_db(database)
+128        .with_env(Box::new(env));
+129    let mut evm = builder.build();
+130    let result = evm.transact_commit().expect("evm failure");
+131
+132    if let ExecutionResult::Success { logs, .. } = result {
+133        let logs: Vec<_> = logs
+134            .iter()
+135            .map(|log| {
+136                if let Some(Some(event)) = log
+137                    .topics()
+138                    .first()
+139                    .map(|sig| events.get(&Hash::from_slice(sig.as_slice())))
+140                {
+141                    let topics = log
+142                        .topics()
+143                        .iter()
+144                        .map(|topic| Hash::from_slice(topic.as_slice()))
+145                        .collect();
+146                    let data = log.data.data.clone().to_vec();
+147                    let raw_log = RawLog { topics, data };
+148                    if let Ok(parsed_event) = event.parse_log(raw_log) {
+149                        format!(
+150                            "  {} emitted by {} with the following parameters [{}]",
+151                            event.name,
+152                            log.address,
+153                            parsed_event
+154                                .params
+155                                .iter()
+156                                .map(|param| format!("{}: {}", param.name, param.value))
+157                                .collect::<Vec<String>>()
+158                                .join(", "),
+159                        )
+160                    } else {
+161                        format!("  {:?}", log)
+162                    }
+163                } else {
+164                    format!("  {:?}", log)
+165                }
+166            })
+167            .collect();
+168
+169        if !logs.is_empty() {
+170            sink.insert_logs(name, &logs.join("\n"))
+171        }
+172
+173        sink.inc_success_count();
+174        true
+175    } else if let ExecutionResult::Revert { output, .. } = result {
+176        sink.insert_failure(
+177            name,
+178            &if output.is_empty() {
+179                "  reverted".to_string()
+180            } else {
+181                format!(
+182                    "  reverted with the following output: {}",
+183                    hex::encode(output)
+184                )
+185            },
+186        );
+187        false
+188    } else {
+189        panic!("test halted")
+190    }
+191}
\ No newline at end of file diff --git a/compiler-docs/src/fe_yulc/lib.rs.html b/compiler-docs/src/fe_yulc/lib.rs.html new file mode 100644 index 0000000000..8ddea57cf9 --- /dev/null +++ b/compiler-docs/src/fe_yulc/lib.rs.html @@ -0,0 +1,96 @@ +lib.rs - source

fe_yulc/
lib.rs

1use indexmap::map::IndexMap;
+2
+3#[derive(Debug)]
+4pub struct YulcError(pub String);
+5
+6pub struct ContractBytecode {
+7    pub bytecode: String,
+8    pub runtime_bytecode: String,
+9}
+10
+11/// Compile a map of Yul contracts to a map of bytecode contracts.
+12///
+13/// Returns a `contract_name -> hex_encoded_bytecode` map.
+14pub fn compile(
+15    contracts: impl Iterator<Item = (impl AsRef<str>, impl AsRef<str>)>,
+16    optimize: bool,
+17) -> Result<IndexMap<String, ContractBytecode>, YulcError> {
+18    contracts
+19        .map(|(name, yul_src)| {
+20            compile_single_contract(name.as_ref(), yul_src.as_ref(), optimize, true)
+21                .map(|bytecode| (name.as_ref().to_string(), bytecode))
+22        })
+23        .collect()
+24}
+25
+26#[cfg(feature = "solc-backend")]
+27/// Compiles a single Yul contract to bytecode.
+28pub fn compile_single_contract(
+29    name: &str,
+30    yul_src: &str,
+31    optimize: bool,
+32    verify_runtime_bytecode: bool,
+33) -> Result<ContractBytecode, YulcError> {
+34    let solc_temp = include_str!("solc_temp.json");
+35    let input = solc_temp
+36        .replace("{optimizer_enabled}", &optimize.to_string())
+37        .replace("{src}", yul_src);
+38    let raw_output = solc::compile(&input);
+39    let output: serde_json::Value = serde_json::from_str(&raw_output)
+40        .map_err(|_| YulcError("JSON serialization error".into()))?;
+41
+42    let bytecode = output["contracts"]["input.yul"][name]["evm"]["bytecode"]["object"]
+43        .to_string()
+44        .replace('"', "");
+45
+46    let runtime_bytecode = output["contracts"]["input.yul"][name]["evm"]["deployedBytecode"]
+47        ["object"]
+48        .to_string()
+49        .replace('"', "");
+50
+51    if bytecode == "null" {
+52        return Err(YulcError(output.to_string()));
+53    }
+54    if verify_runtime_bytecode && runtime_bytecode == "null" {
+55        return Err(YulcError(output.to_string()));
+56    }
+57
+58    Ok(ContractBytecode {
+59        bytecode,
+60        runtime_bytecode,
+61    })
+62}
+63
+64#[cfg(not(feature = "solc-backend"))]
+65/// Compiles a single Yul contract to bytecode.
+66pub fn compile_single_contract(
+67    _name: &str,
+68    _yul_src: &str,
+69    _optimize: bool,
+70    _verify_runtime_bytecode: bool,
+71) -> Result<ContractBytecode, YulcError> {
+72    // This is ugly, but required (as far as I can tell) to make
+73    // `cargo test --workspace` work without solc.
+74    panic!("fe-yulc requires 'solc-backend' feature")
+75}
+76
+77#[cfg(feature = "solc-backend")]
+78#[test]
+79fn test_solc_sanity() {
+80    let yul_src = "{ sstore(0,0) }";
+81    let solc_temp = include_str!("solc_temp.json");
+82    let input = solc_temp
+83        .replace("{optimizer_enabled}", "false")
+84        .replace("{src}", yul_src);
+85
+86    let raw_output = solc::compile(&input);
+87    let output: serde_json::Value = serde_json::from_str(&raw_output).unwrap();
+88
+89    let bytecode = output["contracts"]["input.yul"]["object"]["evm"]["bytecode"]["object"]
+90        .to_string()
+91        .replace('"', "");
+92
+93    // solc 0.8.4: push1 0; push1 0; sstore  "6000600055"
+94    // solc 0.8.7: push1 0; dup1;    sstore  "60008055"
+95    assert_eq!(bytecode, "60008055", "incorrect bytecode",);
+96}
\ No newline at end of file diff --git a/compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt b/compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt new file mode 100644 index 0000000000..752dab0a34 --- /dev/null +++ b/compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt @@ -0,0 +1,71 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2, SourceSerif4-Semibold.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +* Nanum Barun Gothic Font (NanumBarunGothic.woff2) + + Copyright 2010, NAVER Corporation (http://www.nhncorp.com) + with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, + NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, + Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, + Naver NanumMyeongjoEco, NanumMyeongjoEco, Naver NanumGothicLight, + NanumGothicLight, NanumBarunGothic, Naver NanumBarunGothic. + + https://hangeul.naver.com/2017/nanum + https://github.com/hiun/NanumBarunGothic + + Licensed under the SIL Open Font License, Version 1.1. + See NanumBarunGothic-LICENSE.txt. + +* Rust logos (rust-logo.svg, favicon.svg, favicon-32x32.png) + + Copyright 2025 Rust Foundation. + Licensed under the Creative Commons Attribution license (CC-BY). + https://rustfoundation.org/policy/rust-trademark-policy/ + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/FiraMono-Medium-86f75c8c.woff2 b/compiler-docs/static.files/FiraMono-Medium-86f75c8c.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..610e9b2071ec1d6c47a7815010acb20f0abbdd98 GIT binary patch literal 64572 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 N?7!cn*`i$bGXP%$q+|d9 literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/FiraMono-Regular-87c26294.woff2 b/compiler-docs/static.files/FiraMono-Regular-87c26294.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa44b7cc2d38680bc14df07ddf3f6b320740da5 GIT binary patch literal 64868 zcmV)4K+3;&Pew8T0RR910R3bD5dZ)H0;&W60Q~;|12nt<00000000000000000000 z0000QfdCt|ARMZC24Dd9WC(#036~cU2nvUwB!-eA0X7081Fkd+mmB~DAO(y?2kLta zfgoExRkAJi)+&$U&~uB)eTGu)SZQ`LggY&U^S zG~?VC9b8;WW_HzcAYBVq{G>qYx-Gg%rJM+-<=-CY#T`5DAB?Z{4iX;eeI)g16di8E(b zsA9pE@uqU<{cb{?lIp9oqbc^b|2Q_|&4q7eqkyV)o)ybRk{au!Xy2usyGC4z&pL^l zn=7nd@p_k`D>9V^hKN>a4sqTVuuy2@vEfs{NWk*81 zMX_@jJ8oexRos&mPjuDOtzRj6xuM?KSaE7jZD5JAoPz%tl9nD?&ie@^(gR7ga8fbc zq>Z(Svm51N{SPg%R^hKoV{Jv_g5G%#nUuDqzdyunXo+dPB^cR-@XIZnzlrs!^lsv{ zmbfc7lEZMv1{1rJ(kHQgd&!)Us;uoa6^iQo!Ku)7UE8)l9F6>2)Ji1mOJRBNA}`|E zKiOoJpG$~E{C_2x7OtxhVpP{<6;-t&ZxF}r1t6s8M(DvrEwafWm#jzoBZML@cDwTn zH37e2om*W!D>AjRjsB)eAv==h@lX4~v(B6OwOb5Du$a2F2!cgp z-?DY?|LpJaPOUG=Ptb>amK@T4ex2_hC!RUfu)NS+jo#N}1J1PrTOfR&<$k@f<@qi;ifMHCxV5PAR$Agu*L3&BFSlnS;E zcF3PP|LJ7~>=x`2sGG7J#~Xr~khy-<=Tr19D~WPd0E5Yi;(4@4A>8rrUf} z00C^ujJFVo0RL^-jy7B9O>Q#iF_PSaKF}vv)?R6fBI&mD$vIF%i(d$?Zm@&?$qvxw znhOTYWCeqb0fQd&!5wg9t%|X3SLTe(s#pJg_0`RM`>p)aexqLBsHxv-ef#Mo&m+(7 z)QL+5mw1e!nOCOyAiJAxTt3!m#p@oAS}A2n{3=6%hTmud}}Q zhQTbxFq@is(hql6=2SGo7NEDn=45$O_XBtzgd8qv5(2c{*Yc$M!?834<7(~DP1tEy zVIBZNczFOGxK;t+p?pnNZ4f;C_rKq7-o0nf%*PX+EL0M!<4IH#)J7r|aROLQkD1fd z98&e~-krkBwsHzzb@jQr%GVUiq@b?8La9?Zg&ts@;Cyqv%>reK0+UP#CbS{^h^m$K zHMY*LafPFIP+%NYO*&aXodx8tc>vi20RjMfoLsy=PalWm{`aq89WMc@1*mBzA^{6( zVyBwum8AkNaFe+}fwZnws?hu2|Lg2qYwd8(l?cY@VuHFep%cSQ2J-?mRg%vOp5&s` z!sT~;Ck2)L{nMXqs;QDoZ3N}QTP7cVx1A~dEB2%V0H9#Q|D*b@4I^|fS3KyJH@a#1 z4SLcgs+2a&8D?+OkyC*%)v6v604e9jao20kxbVWuK2p`^hyjzS|5aEI5k`OmVB_#Z z3}w6R?w$XiuGjm9L@*;>mKN|6m}KA$Q3rf_7fq@hcWtV4VFI%GVHK!ktH{AUcp#|y zfr!;Cibh5?S#!?y-C3MkhoI4+cK>gb**%!+sENLgPPCQ+;Zd)*&K#t5G;@vNJYqRfN=j)SMEO@MT)X*y0ndTK;8{$0sw#0y*FDG z33tHL1KCI9u!;~k3JRcLVw}xPWw)3Gr3Ux~jLeb(0&Q&~YiGMAYy)96-Gv^%>VK_e z|J(QM5+}1XA%LE4BjWTqKnXxQ!p{;EL(Ei;Fe;dYZ#^#sBaB zpUC`~31ub#DzT6PKuRJ($^yVeBqY_(1Vkr5%0*Ht2W7cBK{8 zl*^XX%eJ3p<|KQTbvgBU4kuU5y4~h9*SQ?$e4NW|;6HcsZ~5B}?U-(HYk^UyfxrPC zV4B4P|NFW6&%2wqRj=C%p{=O_p%wA08u7@XB;cQ1rt~z@vpZT>=7ok%;hv-Dw5#2# z->nO!)Pj5pA{7RZ3NwK`7zLi^*M3#z9?XXHCqybe!MwrV!7paJ&8(WGxFs#Y(|)Pl z3Gb-@)pcF%H?C3!=pAp%66njwxDr`Xx(-maC*(O-p6{Ey^K@@i7Kg+*ylLAvsuT4G zMNqCDBe6(?<}m*{(^U$gT>zXqY`|-`4r_<$OXq_x`D*J}R>*P52Q`Ikhwp;GmVJFs zI%p(2V4VZDg9_F~fRSkG)V*uB0eP6V4l}Q7q2l*WO_LaR@#x5{bk0XaSf4IBaq|zyTWNIBFgE!QdaF2`xh-zBWuba^aIcCCKyd|fF z@GQ+|os;Ag@v%E(XEqiZ8yXqFgO3w?0L?%G#OD80x#dI2CM1N80`eKW=F~AZVWIUG z(laVFWQC%J&gavGiL*!F0cptnQ~G#}z-9c=+T-vDg+mzN|G%XZYLO0Kn(+i<^7rs) zdlj=rj*F$tr2SN?5v2=R9X1k)@pu^!*#Y~uQ&9niLCQ$f2N~^_Yz&_@Alj(^_iuG) z+Ybi`gKrSi7?F-KgNT{TU;Q>Rf1dK!->!;RTCyygE+S&uAcKg6h|;N7Y7Ia^s_5s! zhiv-4Luy7@#_%QqqG(N~@0&*8Z@J#GB`fw-u{h$7$nKNExz zM!3SLt`OQZJ?^jb@Hgu(6jn;*o_M>6rdY5TGa1;w_amFhFSMLk_h+5g0u(7y2uX;& z*xkPPA)D2v?TVjD1w3dF4N=IzzZ3s++YI|jFqti4D1t?-8inJP57-{?(@(_Hzzq&W z7DS;d#7r-kF}K3JD|>|eX^+fyxFx6k|GVS6FI8mtkwg2_VCUOng8s(?{ zpGN0lHTL0eJ@O|%6a&C^ho9EqVe>7Wy+NRUsBE&O(+J+11lo+? zznO*i2*I0qz9AO1okgH+*}=_u?B3ZqZ;89|E-iESQM9{sit;K8!}=8*8-xQv6_Oe> zT2F-oKGLy)D7wV`=&1CvrcGq+7!}o?fHtdzcPlQD2=mg{pvX!ch z)Bmfr0|O8^|0f{?^5dIF!=_G;nJH!#h?bv7nq5Kb6IOSz}*<&DZnO3 zE7G%CX{6$ns%(rxSo#vaC>$5hL3LS;8U=!k#d>n{f!ZNH497LtW{So|Xvt3cXpYor zg!~%oUaWj>eybqV0*^9H6*jU?inj1wo|p42*BKlae$@YkyjVt(HSq_~*u>pW2iB~j2Yy4RI3f)?HePE#cg1-Lk&A7@AqAf56M z?^+dG^W&x28eniM^|+`(FBK&Q@?Qx7h}5~GTf4_e1Y@M1zcQC%Do79DIgfy5ffV)2 zV#uXCz~$Yb0LWn`nPVjnW79T_i1sQ+Gk7< z&}J^3*L+mZ%~TIWNi_L(@SYqVZ{Nn@>3B00q{LHCF`IIjC7B6fl_15S6rRqboww8X z%uMB^n;Hxov_7zQ1{$Je3VUs87);e>1mo!W99$>PsqYn2&Bdw}7{-i*2XH{010B5a zcDC%9^g3-MVK}qzf9iE&MkCi&FvCqhX{n*1uLIgz>n7=-+u?oPRL_;7?1nGP+=`|L zrWhf>yqf!(!=hD2liJ$6F$?_)Km9YL0^Nt|H^hZl#p@1oj|l-#Zf@+zUsz(e{d!Q` z_y7|GN;I&h6G;zvozgHB2UE06R2n-{435)vSe}fbwLDfnoOWU6Xj~z>ft6LWgHN`x z=bW=+F#LM^O6wz5P!2intjlh??`iL~m&cg>=#b;iy6mR=o|f0-@;&{{E=-bqPo<|l zR$$kn&jf=dJ1#>nUzgmE>{|4hV6bGzW!F|c1mR*O%apJ5Emi$iuScsc{YGD%&RMX= zCOZcEuILeo$?_c>aT3FMSKaPCyrx|`{yclVBTiyC@2cC)hyK<-v%!C|%={1RKSNYP zI{u=7LM;azlmKa(=l`uHeDno1rJTi=hJ(u&gjt=wVA)U(x5q7MyT<>uJatHW#iuuq z^l)~BwKpUZ&xAv``P<;V1VBWJmnyqk*!GEZf}f*CBc1?=Nbyo-D=b)uO7s{sjTuMb{VAX776Jr7dsUXQ-|Cvz(k!As$AI2^tMv===ihjcPMXRcy29NgqogACyT zRP?a^j}j6H0({Iz^E*x$q8Ne?0cY@lKT;x~#YCDR9wjku_n{B*96bA$)O6&vBg$;xDExbju1s&JutwbHyx zalNPS*QnrB9n2>LKF$3LTJxLUq#fCQ?X%722(!|r2Hlj=aIJ%`U&C%|060U4W$1>L8w82s&LF`%FbtW5-v zS;nK8f|xa!W3hcDOZa8bpHWXOF{}Y!-}TkMhcHo&*q7&RAOM@P@`AkBY<;Zx?z~Tz z39vBD9E;Lf`2U66rUh=-=us>PdzBC`I`xJ zA8UR)?{9tmfD=>J9J%uqEK-|pKv(x3;&P^>DRYT6ffjsJjd#us|Cf8}NRnC;Os>w>AZ;XpscJd^|Ju>J0;C&F5#|n#$U1zMLi#cINUG>|fjMm!YU(CDeZ92E*$@ z{0bozqAR3+k+J7)<8)d~P2%h)i>9{#d%it) zTgff%M7JF6Fbs)w2C!Di_;csI@8N&ZTbw*Kx=gTe3oZwEf`p5gE+3yjs~*G2bh)X_ zd&xRm>~a9v8<@u-fhNe(!7eUGxFO$x@<0ml0abIjpU#@!@jf0Tu)mEm68$ z#c{=PV^N8Z0H)uhC7bL)I`5{(@!QL~l4_st;cpQkOp-hmTJ)L3jO&(~Mua6hF1+{& z5iVA;O!<@2n_n|T71V3hrQfJ&3)a|V$7J74TxN(PaN1?JJ@(q?@Vn?MOqx=x_0Uq> z*JOL1q;*->*UbaGfH5y@h3>rsRnyh>LKl9xJyBt6|?V{`MdhDh5tzVz8 zvCj8*vCu|FP#J74+DF1_78TOfd1;Q3GY*U7wypPTpnJX?lEwxgxNdMVxk3^ZoN>pps>5LOD zxaEmAzW5UYV`BUyh7=|Y$nZF)HvAa>yB;64_ul&K`x^Uilz;|QXqa&EZj!wdBi&A# zum7Z~?DA*1%SL*<<#T!Aw&&~VqvlVYbuhQYEB{f25~o(5*wvE$x?OMQ+&%t3ZOj0h z+J)xiSQ$Tt@Q-!4^aI0GC-rl*Uo8b{N%`)2@bItSBXoRi|L?mRHD5z-Y7zz|BQmjO& zGUZ$Dt#3nH+y4gMa2Qz~$n|lc0TWXThn8@|p`TXH1xNW7fB+-2ZKE_I zU8~85Q0-K~;c2V$7_Hm{Zx-UL8rSQtNd zadzKSr?stpvzEWY6|ZbntGk+&O?UjqF6@oCJK1kav8uT7$UR!{$SxQx20_YdR!4 z?Ky3sP0xTtXPnm_5Z7~lLz4lph+KArxq6Di59SIS{9J!o|!-)uvNWzOso@|wo#0qBla@2>D zjV%M4qkPGIoypNhfTuakzmPw zw&iEx!<=%BSa7jbIdII@*iv|=2}s_jyL08Kt09 zl!oqm(Hn{nl_XgT3@jYHH0cPKSh9RsSx7_-0FjY<^<7cZ(9+Q}FtM<*JN_cS;%kbM z)s4LAk+G~G zxkkl3{=qm54kW&84MF_Y5{}303<$g`jTmMk9azqtg1d$TF{jlWM%-Xh_LgzkT8!EA z(XStzxpr>&nrQ@h9SpX%N{-hlEZgNbXdI{7w~U>14pg z_hrI$Zoq<xQ8XYRp~;HFDYYmYAe@>7kN`;y6>#f*(I+_j5d>k7 z$|OL5a0^cgIJGH+05^S40O8;gfYU$#-Qu}IOad0bp{hNe zz6kUmAKMmziZc!S8TN-Ck10X3uJaS!_1OIx(tYvW`*>X6*S7qw4bTJ6qPX`hPv>qc zyx(5EDl8Lm>Pr!-;K85=`e6!YU=CJV5caT6!{ ziJID`mQ!ctRn^#R^ElqX+{VBDOBiQAziEhf%Mq*%Ev!(3Ev}L^q^BLu5;D>&PnJu& z+B>f4p)f+(`rWU7%c+e)Bo&gRfB9W`YkSv-FMZc9YT;TO8+<=vCNd%f3R-rSy)`$+ z@kUp+`#y4So~%+agD;dYp*zz`8Cc*iz#}L1?FbgZCOE`Q#}5tSciA%j+QEOmBE#3- zuT$kuEQ=2MkYIojcG%;9BR-Y@?i4M?2CbvGB|Vn;uxNkG=Z$1R`eK4EG1NOou zESSnH_B_i!Hj3G`S$iPz4Bd105dtY8CgLFer5*dEC%d-myq@d3*&a62QfsWU(Pqzi zrfKecwH#?r6w$+XQ_^juAg^$gVAKRSX~@Z z;Djnor25@*&(hZ5mG`7_x!rhUkrg(mG!Al_t5mU`9qi*QX0V=3l(9#6QV^AXIhA}V zkmd4HzT{iu9Xe}XE85U5?a@sw(lY0{(TVH09(P-B_~DoNe#vs3a8jKnEo9{Sm)5rS z(z5NxgR`qU|HBMy))q}_g;rwaR@MIM&?Eo&zhZ^;z#9z0G@M0S`BxS61|2;3T_Msu zVBaHU8bdej9cPb&US!B}QmuMTB+mPJ`|x3IV5`JxY{kJi8pqYj&WM|?%`Ty@a-xVx z#3LPfC`BzHkQ_nL?GMM(`En~+Cb1ILnzb8r+r-+=(Oa;7C!Nr8`<7TEOHLiSnVsx^ zQxD&zJP|9ppyUWGTe`e$p_Xn-XA4K3=~w&dQsgO7tDg9aE1TPKUUdVZBjwtUm7Z3X zS>--tWOROKdHNq1b_LX#0Mo~VVOD^8!8*D2+dJ)B)xb=XYijyA%XaNmTz%#+5fVEG zph4aOFWUKRvXP0Id2610Au0qGg@jDO0Fx~p3M?Bd%Q2uqpG+TKgddhIpnU;_mTuGJq`0$ZO%^{4nrb}6R!uBvK9ijx zR@tY7YC+`r&tHJ4UA{NKf7_b+5!&eeFQZg^8gd}v$A9oV_ZGm6i^diW66zswWr*7& z2$fI_g^$0Ve*7*W{k=fOUoa4QCIC&o(R36gqn@poO}(yc>cjf7zAY4;Ki1D?RzJE1 ze%HSyaj;I7uuf$eI#%>~flAj!*K#8RE3f(N@&H`d&73EiySbNP<{>mF;^79$11yOi zI~QrHWA|IA5gqf0PCaPvA;{5CF@j^u>fvVVgmAiQ;!X}#_lZz9;Np)4-mNM2ZnCC9 zGD7!%+;TW3oG;;N8X57c8x?qkN&9jM=u7U`SK#pBL!x6AdE7@S0||6su{UHJXk@bV zF~E`gGBokBjQ^Cd*-&vWZnHVS3nQaKNJgz#9M8IQ0ci{Djjg=hiN$Us#;ix}<$+x~_M{=$d?e|H|3T)0-Bz&Tm=Y zvAW$YSzxbucAIId`SzG&v*~tOg z74B{n4_7jQ9trkDkjFwj6XB(BFNAq6)_XDDiS|~e-&XoziO*L1Wrgon`Dp{=wl9<@ zudFgdMHK@*x_G%Q(kpR3Y`^_1)T@OB?e@)Yio`$rTx>6bT2i89|_Y^4I6> zUcA-5e09$@PHNc~ShIpJe*s>KCI-f)MrQu`EG~z~7m0Fbh zD+LCtfhbxt5Hu7#5;7J#5jLIOTAMQ$z7Vk#xw3Ap+Q994Yir5QZBHN237?t&SN6u; z`G@dypL{6t0M7voA^is6%oRb15lE0o(U74dr-Z@=r5Ke2wG@pEtt~n^dc**Xs0C(; zTM^czjl!fft8CSF8hfpS&Qb4Va5lP7uCyED&U$d3CNDd0dmjh>d$;wzm!=b@;-?U& zwSSDb98AK#%hzbnQ&07D&)Rm)*LqFYx7*T~GxzN6eb#lT zDCQG2LofuX!(Evl6@K;H>D(D9@oMd>!W>SQ7HvB8=+&)NyH0j6HY*K*s5rk$?f8<- z8@Ko=#{VgP2GgR???8fHztm-u{ZR%d`qvoh$HI`0Q~hTsjbwfhQ?dTW&wjMIz9t*@ z{z;p^D=BPd{guA>7U<7h(xx)Kep}Qk_TtN}e=Ev{nwhh(K4xmdkOWTAg03E7WXu~F za+Ve%yOd6QFdjXn!pz-pl8%DT{8g~>SKi89IV*c*E%7Q}6{~V(uKo?IZ-Z-Fy{lgB zt77*a1pwPi;4QUglK_Fi3YfgXo<^7p}2w+i7QX3aGVRIa9m9R57!XsTub!CbwrHo zPbuOm7D&f%BPj|uoucm*UEf0Ia4V!-+(ul8+evG22fBefNd>qI4dZSK__&9t#J%Vk z?mMYyHWtuvJRl(H5gv5WnGq!5VG09}xa2GeiU5yM0(hKKz!OveJV_nEQ?414+@9t;l;r+Wu z4!;5TpA>@W_>2i&LKDEOAXqtd|8zn=5#_`>9n1zoo}9)4<`sH5cXxHLfGFbvQNe=3 zz=guZe8R$c!p0)P!6l-KMMVvl3b!n`i#lB^e6WNFaD}L28PUKsqKV~23)hPfONutG z6dkNAy0}^Nu#)KGCNaROVu)MC2&;%OZV?l#A*Q%P%&@wc<94yY#$t&_#0ndVH69Wh ztRuF#N2cJVWj;iKJrEV z91_5BNC;+-2#!Hwuz&zK0ZAUPgy19uf(-=08At|pkQ~lKieNKga1K(!Sx6NeN;S9u zX}|;0!c9mQNIkd$8Sc235pF;x@PW*57qUPgWQ9kN4T2#%Jb@e#1Uca`lntR!4m^W$ zAp**Smry>0Lj~{xDhxKW2t0?1Ar>lu_fY8rF%Z0i%7Z#x;4M@EnUEWPLzR#QRlyIa zI*>I^e9o#1$bjnL7gQhA*#N#nje%?eKcQyGg<8OfS`8A#P+Ryw?F}VRN1`0+3>4Ir zsD!%1AL>a|K)vAyjfur1HS`}0^g#bZ7xWptpf7M6kyA9`0T3}7L`JiK$R9cwgo=R-Rr4>aVbDRdf!w8eK3%>&j{p)h4Uk6n2GVIVpi(ud(a}K<12SkTAd@Bla%dtTj~)Qz(?ft}^dO)) z-3RDMGXQ7Mbinzv8PJ1D05=gTa5MQ7xP=4;Zk@>I7#p}P=VbR7jKG7m1@I7+0w$7Wfk_if5SR>@3S@cUVY-}b=a+D=kCcBhvC_+A zr8M6fCsVVzD7C5ET$%bbKE6*AXf(}3Zz7QuLl<%$^dcANbuQA|T%uRGOz(1KC^T1V z5Y-=PjR@7x zdWBGh)Hj6cS6k?aZ>2DXRCvY%neWXKmmjH!{JbU1^St<7kqOt?ng1KoOhnP8h!s3$ zT50pH@ie67Whs$2fqW`y%c>yxcYp$ZJYM`Y!2*aVkkSPaOYlkpA;L?!5|MvZat@c+ zQme$-l`_P`mPlbdab-)vYvM|)IP$s>RCsI>OOk-ak`TFqns9|uGJFFSqYaqSerPjx zjcI5bp8ZC<@PX~AM-5~hmEB!c$0c&dM909CouHC$LuY6}r)jH8^|yh(U+QTCV_T(p z*K~!MHnGq})`>2#aderp**J7g4(MmOv|Aoc%BLd==#)azD59&1NvnjeDJ7jUx~`n` zTy#SP8Mx`DN;0aVTdK*VhHk4RvpV`sJy|r+9gSqwM0YilO$*)AN_K5@UpqN;&;#9U zDzVgQq(vVlr8=Fm(ix;oAEB&uCehbfq*`Z_z|JAhJD05PJTlVxMAQXjw8dmi7m^oU zM1s1QyzHYSxQ~%neVl~!3G%v2NNAUmH(f@;`s763cDb%lcDjBC51g&1K1~}0}hx&nmQttV-9pe zYNrziIm>ycbI~A;OAdBLTGt%nhIDQ@)E(*FbC?G*c;s+TWc17tUdZH?BfXK?J4g8- zi%*XBMONP&6N~4-GFi%<3QVtd=k9sP=G8NHC46G81X5wI-c(jrLn@B+vfIK0>~- z2az71r+^apG^vfxkox#+q`TP*G@bj91NS3G9z^y$bfa8&n9m7`e4Z}~nS6;N`JI;$ z33&yPuzr53^5Q!;YAN64dqM@@=Lf<`eng}$eoX4-CpV@Ze##>h&ZGQ-R`E+h zYx&iUisIM&Mrh}^{7#VadzuJM{DD78r}z_*&hl5ZjlZE-9z)ytJKD-WZq#1>iGL9q z_&5GbIKvY}>gCBMb;$I6rKlk@h(ei*6ablrCdqs>K^CCDWQ|6nvgT1Jkw4EmvaXD- ztfwL}comxlvZ1sgji8&d8M-6eHF23d>o~hquj~$qWpDIc-qdKwnzdtdXKpF)0%per zXUW|f_&7fIVcSA0$6JRx(Jvw6f_M30SyOP zBS6G(R6kX)%>bk`1j)=$^UP7>EKtj=QPVDeQtS7XUY85?VHMX_JccLz%!^Y5&>4Xo zEQnEpIa&yv6B?f-!?3S#juJsC_Y(=u^w>uJqi1hvIfW`P<-~3VH`PgC^!@xA4(+_ zQ8AI4F*Ho2HK`F7)HKoc*>QZi{2V5#j@Zv`IRnlu!^hz~7*1!~voT-V)nwg=6 z*;<*Ujp^DsRtKYXa=b2%(9KLeoTZoJ^l=gi{+oycz{3y?(vYO0NI{c~Aqh(&js*NA z-Re=m#i~@_CC_w+E7&v(j zC9-m^B5i^5q!;7@sSaEw?SU)#id!pHfvb=k5@XygYo$4G8*)cV9OoY7LG~NxA>>KM z8|NwHS?U|-Ib<|Z#Jw1-Qyjd4yh|)`pRALbz-QoFKH0+<@MBaGjDbDs7c=|o&jsoq zAXkg6RJ-Rw3;(a4QMKS-XF-C*pEA@yZ28Y}uhk`>Jqk|my9@+E- zdJgo5Q~X>gekUFlJ!0QZKL&JTT{W-#>`5MRl2m0Ee-%E4ym3NtiiEuQ{*S{+gXw%e z_M3cQv|w+e4!$3OoxnG7mZUG22%le2Z$BfKYgX_1NW(V~rscow{O!&5ZLe_-`~aTY zbObr(;2|)Hk32tk(1G}Wi12eO*~YKv%r(RJ;`6oW=u;zZz0uqEq&mx$16ENQ za>c1-b4n%suS$YxA4B0jVvcE(bj|fb*V6U=oOCk{WGNZ=JRYXx;SdW~Xpv?`$+d`- zfRZ5l^aRBo0aK}52UVs)sf06jr^DmfKK$m=4p4&;+ncDT)j1-p$Gp~*jT9|m+N;bUlv*7N3k@)uO84cSeE^t3{V%0UEtL zBgx0we8)zwRgR)-%%#W96QHtE#II%Q2|-jQ;q!A=^fDqL5rpI~<)G3NLB!QDtV`iC zkw0vN%o=_ap#<~9__7tN$fxNpL1D+91Yg$Um(2vLal^3QJw-*t?P%1SLrEaA1fIh* zRDUf8t3fjpT-Rc)xM75bp=mKs_vS1M^YsRY$sMK>HI+hLsID$je444A#(RSbgxeG% zcs!DzoqiE$ELC99RwR<38J+}OfyY4^O3vcJGJ5VFh97HM+w$Q_b0>KWD)bXihDu1v zLrf|{Tq;9CszOq#LrQ8wmNW?2(lF$#v4%S6+q1EyzwlQ2|3*E+64KO@$MQ&?U_+fM zfYljRTda0ionv)@)g@L}IJ)D#&ImJUUz&+yP3$wDxFSz6yIA{+<^cA_{^mJ>w2&9_ zR$dr{)z3s>G~hXP%}O-mbcQiE1Fhn~v%NnBtFjC!~*WIbb29{DM5 z|Kfq(+KYPbv&WuGsMkW)zm&l9^1^e4?ndvq=F36c=iTH6mATnHby|Qns*ijcKH_G# zC_?&8CP>0~?P+@TvF8>bN9aA!SH$6y!{H!OKXengqdDq!BSJ_JNQobF{rG-8p0LB} zr0FffYMnwbVN*jZ_%dyt5lo}eEXaU<1;%_}aFzpFj>j==3zEMZtF^NpxJb@kxQ6VH?1x~w(n1#7ck_-V_nwOI13<<5p)aiAbcYiwQz z!H$D@o<|q6EDo$;Q?D*TNL$~yU$oV(Xb8i9Cl-;1$Bs*j)f;?>zD~F#pZ3xaO!v^M zgtLn3pr|Xq*0aR4N95pZa;4+)=6ORp^0uv@XBJmD_pasUS$aPm`OMU5K1e{f_OT5` zi}w%NEcv7zT?wqGvTI0^+g$?L9X2G7POwoug(P`#QN01lrxPqxUm;0;TvUHR3g`qY zHBd-W5EnHVkU~1aRt*)B6vjmj2c(Ejuv8<3Bt>yiqk+RQV9|Z7#V%Qx&cboB8IOM{ zp-MKF5@L%_s3ihCX@>D+xGkl$EzwdtfTz_MPlrhvZA-Px4&Yfe#26R{ndSy3pb_*Oy7y%tf%*qH< z4EieLz~9rILZsFNn>T3}SI;Zpz0?7$MTkBVR?0ajRN<#I)kDd25JO`00%sgWwVrOI zsy8uR&0_SwKaqhlsL`hhicBXpJ1A06v6zxQU`^)`CG(Eu$FP&9MPZ^e9?_ zRcO7A#j7gM%nYP5Q99;Xp95ZOdwq}Nmn!qbaA9g5=Y>QTg7*t;@|dlrzt+9@GYH}y zAn3z;D*9T^hsYP<<=qt5inr1Cg^wUj2#={N2&W#EyN19)>?Gm%U-+Y(G(O%l+Y_$C zAAL#ulu&Rj&Mc(Wp63@rvRyBhud&Y60Ayb&>t;U0^jMnVa`=ZS}tz-5+3dxFGy zf`zTb6uD22k;By?95F>ORwJTuE((5awq5JIRwOjO*6>~feCFV})r5Ul@nYaNg=YBB z-p~6KHYZIRbTc-w@!HfIV@0sq4Fe&qEh**uxCn|d8P14F@aE!E$7MKVfw8N-wbzUw z<5i12Kces%r#B~gwSI=RzMQ%QJ`bT+ygNxa?_4$ zpEjis_i*j55MmjJe8`Wyw|~H5DOoMTY?rxndUGe!{xV+H+L>(9*>P`zEQnTkc{GLd zX|(res8s8)hz#>D1dO}Olnv(|VvbsKjArOP+4_fEw#C9;+v{!6U{g z=@mZ(2XZ_fE!%Wf$0D1u>EfiPT-8WDTZf`-0M z6%&f2)E~*&=~TX-pa|W&XP^W*X)&hBwabb3X&x~n;5_Agnw{*KUh$IZDq~xOdf3q` z(h|sZGibPa5w_}h7UU{WL%3z%Er6)2XiacD9*2s`!cIb78pvhWADxtz!kX8VchDvMKq=A7m3}OScP@5&GQMNJ~ zbDUOIS-4Cc`35-P5dw7eBFij}X=x1-Dp;}#)$WezM`STV_<3#j|%z9^>{u8?0{|`W6 z26A)6zw}5Ea8#ZPRP(^$r=JOJlS8qz0hJ8ti8SEru%a|~kuj-YdLTUVn%WN_R88Zh zM{Y1hg;b;&98CGppBb!sLoV1xRk;N$@Ss|vm8B-W*!m^_6FgWlzpw%z3LKUR*A~c2 zfQ{yDBfT-5#c(aPDd&9}2tfD@Y=SAyyOtG%EcgSd%1;GnS17@QSLI6O^#fJPqEQ;g zX+XrCV4x~AIVtSj-ys=xp4TG97VJpD3CfW}!gFRhWRQ-=Mg7@jDZ$_&yM%IDCThZa z`c8ovldX}$nJtyF(GWJ#K%p+E- z&v++2Dxh5^UZvYP0#~j`MOFV>73~ITa&$r^i!OGmz>lPL{Dt1}QO{$Yets)5!s0}4}; zM2f$nAb1nZdMM%HPd#sD&2IN&H60d5fHvE7#T0TF56xgIe>Bof?iE)rwx*{}n^O+| zo5Oam%E>u@;o<$lq2o7S3{ai02RAvr)NoB8D-9zpkM+klsw;l3f^j*y)_Dh?2sYqM zbXl3LkxNov@V6!$__AMz=E89{0T&5UdqP5f5N|U!5j%UxUo>p>g?*s4+P?rdcSwD! zI8yh1zISJ2U3!8NWICCSgp3+Ez^p&L4npFH!7wM(nUOVtFD63NrH(&$@PhGvIP_~S!DvV;{?YaZBwMfWlODz&wyIx=(SX2!-33-y}W>3CYvaU!cvDUP$P?j`BI|_|?=G{cgHE zX2UstB{c8>jzcdJ{O4Fvya|WEoT_hwGECFZ_`PGh$H+(PbSe)z)5}D)|7`0r^AS}4 zdXbi-NANsjo!4aFA)l1=t2kjq1?~xci(xU@L%N~}sic9=M|54XDy};&w{Q}xN2>@~ zueTYFpAuv71ZM@$m^@$B#umHAe0w}C7G{rhGaXHNQtfSzRY!YAXCJ5r{!~GA1z=Li z4K&agAk>8K8j7640(om;zuDp{1)h>2yn$7tFwOOB3+nJubMMF=F$Spf3{MBJc_ks{ z2$fX^GEg_XXJjgPMTc)@Cx?c$WtAkOdMeDA=lWl(w2?@87|#Ni^h#s_B-lU%UW(pf z_;r6v_Z@_rJYU#ERvkGus}Tt=9r0$4&KAatyQ*O)lr+z^ee4>>Y=9}?;L8{VMp}to zWv)J*0|>q()8+x7wc`rNQ_|Ih3Jc%Pq_r}U+Ps~Sx&%>$E%;M=9>@^i^j$J>mK_!k zD}@~Nk*cr}4!_}!Y;uoVg$IkKRudP>#6W_C7pHWo1FN+DtOpB?epmKx-4kBob2<;| zg=1TBkH$8fxK*+2sCakVi`sGpsfE*Tl9SSql}JW3_==a=Be~RJh=jG5Hw0T)^qOSO zPJz|ZoQQ8`(d?xE3%zU23^`Z4V>81pMV4f`Ja*`O(0-cv+Sa#n<9jqJBq-V)B(e;p zcviZC0mA%=I|P?}Ad>Z+W~~=H9*h#_pNu^0xtx#>n*XXZVkCo+V%mE{6uc zmmT5fSqXO*Kk`7`V}rOscqRoE_GxC(R7G2*h7oaGka4)^%5Fbxw*y2n03cv2%B%Ol z@lBr@R*Do0&O|7ayMpzIaOtpdgW2KRIh##-UFd*mBNbtA%kvS%te z3r~RJvKcMBz4J0_U8P%dwBn>#Rpc&*9I^rqp|n zQJsM&_L&kgLG&Yo1~6cpJX3_?^)SMu7q|ojeGL44IJiA|Qv|qaq_}bC6w_TbzSBRm zgIiAQxPR^4dHabGU)=s6Ou8py)|QPA9+R#Juq3U&_RTrGUt~sgWzMYzmsB^7OKHqN zKzIR@K?YC86Q9Wt{EP%=?Q6gMxC%`w)sdloPfQ!S33FvSA4x3Y9^G*|^dG=QZ|@CQ z_SyGWess_3xPY#Xn}u9wIeyuds<#yG1{MduyM&@D7YWGO^Xl{~>gL^2MCVzYHz*|N z9^CWiRfLSD6X&^Hs-{XnDSDpl3Js2NN)Dic{mvYa`QbUcwD<@BR}{&s@AWU?aF%2l zBcHptR1WGwhGk`n3zq4M};+n%B5pJhm78{P?XA5jZ9k6Q8Nwkg?8O9yo6;1MEKrhT5TxLoO8|<)iRkH-{qK+VGfdC=;(#uZ4HKp zk!E)%V!mccS+f}4ou?NVUFX#c9#LG#IR%Z!dDCsjCeHuV<}u~(+K$ZgU7oNVGpu*{ zi@xOeZf*CHoYxiYa3?goWa&Hr8)-e`O;+(Wmo{pbfrEY39$t|GX58dD1MoY8THJd> zLy)YNx_u0v+ALk`{5DdAfT0fr2ImPVZU)q-<=EI@W2E_+Ofc11$x6ba)Ddzy@gvC0 zAE7P@X_k~*ijfmU;Ot0)rw4~mM<`)@ ze-@tFE15Xk1tZ3%t0(zjSEDrJi%B1x;>3hkW7ZRr70&ovk_?=|{G0yY=r>OiW`+c9 z_<_PO2;u;wNkvRtvA2rPHSwCBN&5T|B2n4=%**G-85#K|bzxWSNf44EJAw}dq*5o_WqwqlQFas>?%mJm zNV5`#-H+CJH!H_leBEWpXBSM)wmrR#ph=3k*rQo$)2D+^z}h^v_?sKlqTiZGY{ zAB=^9y%zDPG8CpQSc~?)0BUJN*lR4H!i19eMWGI`_`4x7LVXcz{>3QO^u|F(W!$*{ zSE@0KbHPMP*F}|_mp)<@WN{uWu}Xc0%SBC}y^78eWx9!t46IQ62wYk*jqHT5 z#?%&r7I+H@r{EX1Gk4+r?N5?n6J)NChe66A0nzOLY<7f+F)yYsDqvt407ZS%Da9o#gc6okL zd~N;0Ry6MR1_l3~)nVb$K_~1Bh2}gAx#}#%7!kJ`gbR9@Vz~Gi*M-hB6HF>FaY~IW z^A!sVE!`Ca)&zm1N!BU+vfGO`vZ>C40%wJ~`W`w#30UZ3%;BVFA4e%&=rE!@evGP; z$dDgLqb_)XqZ4{kEhBftD7G0G+TB@wV>2D06O<5878j-lciD@xVAEyH-qAa}%9*7q z%+JS8HZj)EPj^5e2egziSCUU^@Y&YM7NBpZ+(I%8I@=$Hv9@O;Dyakg9$|F#TkF}s zQf18U>OEhVuBU*)#LX9k=V>vFTS}TrV`|HCvIAPIMEWN>uDmng>{#G|OUzn?gd2kx zgiP>vHMsgo!yQFAyg(VXkpj);xj=t-N3a$+qq&4}i~%}p6|HJdV1fV47J|b^vkam& zOnr-@psCoggEhP4p(?9@&Q=nAy}uWX@m1nd46C-p%ROo{-y!sqMX;g1s~TF5zcUfA zCdM?vun5qAd4~fcc&74@3@&EDj-&ad{N^-w%5I>|<7utW&h@MoGPqkc-)Uy2*(;_7 zALV3y#cH}G)!~YB7^d(`p9V+UX<5yP{|7-;P47_lFNyT8zQ=|1xl}jZl^o(w@x|XTH zgeIW0;YYy7h8`W*p+5Z&fEp)oI{c}$^*(uIrq7Q~P~(>jv2?0BvC@Tn4$Q~Jcrz!ZB+Ci+<1 zR~ekG32Uq5V4bQTLxD-xyV|EarR;t&oI28S;sxGFY5ZXH&D0XpFRI@Dy39?yEt<7xKkipW9X#niR6+bUOYKh%YJ zVK3pCH?Q0xbV@}PRx;b9vl(OSvZ^<;-5I*^vtT1;5Z|eyaPP%{(luj_3Zzcb;pXO5 zff2=gbIvo7&@K-(IW>OiTOt;r>8s#03(a-)q(M4@eAdF+%+-~MM+kmCV-?suAo=bz zU{wPc2)^C*>B%-)sB(G6GgVPqN!cwY=P0K(`M(ZT&EdmWjy0x{Syn_Nvw57^IM%rQ z@@bw|L#Y>@$_1tf@NHy3A=lgdkV&r3hPuX*DB4}ds z)Hs|jWpp5O1d-$90@?}yAvbKN2U8Tkm_+~jq8{!9OA~4Y zI|lI0gK!iyYpajJ0l2k)*0N87HYVg)0hYL0t8VK}$GV(8&4z|A?@7#_BgAh%s25!5%T2#4xMQdzR%^<yTpRF$mxQEg=zWsMROxQND%msiYMRr}kL`3lt5f#exz#>ZVfgxqwr&ZD43 z7T-U&q6zX7v7N8{A29RkjMIt--#dBSTK@ie^eyZUPpqwlAFPiWADY9D_et>V$dFuI z>n~p~yibF=*V@Kt4M=pN$wA2}bdj6^<55MTDO#3%VNmp|IWcm9I*&ASi=J z#o^Xiv6_Tv0v1h&wlNEg{eUe>-){*GS_`&SQIC0(*tJ*60 z&F9_0<%?JmfPdCcvI4T8nn!!t?EcRlgWVs2RUDHK0T5WR2ziD3pg2G?RMW>5(9hFy zO4($-)u#fX%z7FWFf|+zG9bJSM#aAqxmGioFC@raoo=i4*v9(-h_O9M#Ve27*PH8Y zx2H}qLyr1g(-CcCjBi5+8Dm#LUg_(I)@6L#)_ZNLPn>Z%*Lw&OYqcb0S?Vq9jLG# zeR-f!qKB-!8N8I<;t&3$8U2z)t1CCjr-k!se_YMu4<#wj#+NPi@)Bq;g0!d$azasF zCYtlE<+-7JznAc6(8Tfk!zouTr<9r_exW=eYv(^kGHGW1_;@xpe{D$Qx?n^X9hBQI&{J341y^%^~!T2yM()Ydt+QnQ9|eG%Cf zys3Tt6CEgTts%g3vhPR%2RR4S1jyxjaohX7;6Dbza8}Tmy z@`SQHcQFtr3~5^!9`Bq4%8j%WD8Hf^ea@r{@2Syt`~^z9sE|A@9xRgr(^xTQ$_`p= zFJn4>ZfKmKu6rwEon6kcN1Yf-m8;Ougwessi#3ST$CPoT&@scz2nbnvLdHP_ENBsn zJ<%(_HeKk{=wcKye4{!hQL>Of4eD+*Q( z+9U}DiU46*@lJ*|2{!r#B^q)fDs+ZGGF;126W;+|#S(H4A;&aRP^HcNP0$zJG+9KO zNHwFcD-c=r0G#{D<*6bVZ9L`yfa9&=(47!zOiOlh1Q_OsHpMbQm)>)9T;|{sa!ut` zB#AZU7~=*9eta{dzqPMpptn7?tf!CnL) zy~!BB!u0qAW?+y$h6Q*=faL?>L@U!em6CB$gd$F3vUFy|CP`u5?=2gJNZ;1PT!5Ix zaGi+_NCTgSwjpyP?)+Hk<*$Lg;lv+#cQe_GZqr?MZGkQ*Z<2N8RP%1UE|%fy zdqI$Siz1zZ=}8>&k*U>jiZ7xUmi*~VrftuvDU#}o)7Wf(*l!Bvw%t^1yL(xeU_&eK ztOgU!VRmEnL~UkR-vN3R+T!&OS6_VKgq^D<_At=;! zw%fOQ+YJ)e=!$H6Y>IK|dtMt0Zq&(EOZ3TMCpa}SGRbZ!x4 z|D0;MM-Sv|N2W_Jb5s|qAbot4nm0u@otYn)^fx;#N?jN6-rSefUwzzk`*c(>->)?w z(|ohSv+-y)IKACNa^{tpmb|G3#?(moeD>J0SzGy_Y^N7Vp6XxP9GMHZ?$UC0kXi(k z6NK_(N#DpcJ}F8006a%1=?pV_$+noxlU{?wNr7tCttDr7M?nBE1O>P(kavCjiP`{X z&<_qJXbogRh&_zQ;v^vtD1t5E?6Q3L?!$p=j!|9x8mgFQo}hm2S(|7G@<@yP}`KB?gJtvnZU*?=<5d|R843OioIdH$5FkOraF1>Z`-<}$gHyz(s z%&?g;N?Wp$p{Fn1*cVH6ESu}~Ywe1i6J>(7iMj>RzI|qaf+!w7)5G+-(bG->PUs506CSNdtBk%oi?k) zAyilQ*HGsc{^9wLYcd;8=ELpA{*nx*&ap?~JQARw!8|v0!m}PYZbx%v-Qd?&+v7@>u8LtTfpV=;r^-t$bz^s_BshzMN zfVUyL_l1=zdml)I^Ti9ze0fhflwR|-C_YN91R%p5;OfxPXMx1s)ZzK7rPc9NIr3-( ztR*k*Xm<30yt+!<46R-#u>#dd<&zUm^NU6bvQk$;cjG?VQPQyIS zR?qSHDRrkXv)e73|J>BnAN`ET6wrF%HB9eWE~ zOau-_q}ve>Xtg*eDgjl`b@ucj9qLD#P24ol(#qisjH*RA7^yE0j+ojI#!K|U4$>zN z0wpYR-jU=HsjCXw!Ewf~!n8qlyBN0q_uuGpL4ilcCA@2wz ztNAT`MYm8|!+fjat6_RkZBXjWrU*KtRDm9yP!jD+e?IJOhk8n{{;v}^c6LtU1yCZc zic`$#T7iLW~Zn{9?msNL96RExPd1&+nzbMQR|VjAIijixK`8{lYh31QZ7A zTojoPGlGLt8^VNx84|c|2YZL@{zUD)iR^0yqZIYE4Yjmi5?Ki`OB3Uxe8I(090{A4 zzko$u6H25@@B6d&6;jc&ox0t5ZlWC}e@TCKK(USSeyidgc6%@kH{~`d;&T?|)Et=H z;+}2D6Dd{IYvSg$Hp=J{*WJ3l#<(dRSJv`hqu9=nQNBKylRSw$ZpmvN86RtyQNUCt z#GTQordwy2v}+scb?ZiqM%r4z>tu?Y&Pc50?YM^%5aJe+e4GmZI)`X++2%F@3__t) zba`g>q%YmIbZE`w_`=DBCvxiqtxi18m}+vicCJk7n}|~-2IjdaaFCc&@$9t%Cj{>T?h&Oj;B2!S#=Pf;}nLk0blK|G_AKiqE%k_XZ4lS@zv z7WSauyxlt*^=k(WT8SOIiS-{8PqfqxFB;FDk*i$r^9&UH3>H)*LZWSQZ-sr*j`ha6 zB2ujX8UMG*5pvuAMyavU)`)QUjNeEQbqMy`%H{awve`0_E}xA}71T%xm4VwS=9@3UJB*zw~xze=kzcNlX@MhOckunHcr2&z!Kb( z_Q|k`vH*Tkb4^Sge#V5Yl<%h*iA6v)C1>va93hzGLndm*D(LjKA4C$X3ks8Fl z$A|U}BYp3{vCgjPhc~*pUo|+5odZ8?aL(0^TCLi7qjPn0EmrN^(WI9Z{Pne85#^ft zO|n}RhHKp{_^OV0c~bsNs#S&Ky3$slTVF5nD~q#g=8b-e(aaq!ibSmR!@+DBO8$Wh zAvUZ~tnm64Q2Hy387Wtbw^#116e&2vOPBD51ps$w*)qU9>h5-Wteo7@H``sA ztF%Gt(zGI-4K!nq@r(OrR@F3*)^-;6w_Ior&}wuh$fmWx8ZzOLbd8#z3^FNWR5{ob zOODp6tFdv`RH^9H=rnZ>{;(liD^yoP{{bN*W@ApFI_x5~;t)PB%{DpFKTuSdBT;jW zr5+Jlok&KE8Q^C(&~@rg(te&f7bk#nBqHo;0K2X(xyGSoWEsmy5~wombe3G0FVHgR ziGM4x(y+q#3a2wY#@$ryLQsC)m&U7g0BO>)^0~uiFTbw#MXG*^x0an61PAl&`2*m< zsrYCqF!#}25mga|LDbJ3iG9xXNO55k}E?2rWN&9mkJeY8R?FS4n$-#O|1Ci8{H^LEPHarw1cm|IsQ zDZ{<{-qtCV61NQvRt)$NkYN*ialM@JSLo~v!%<}eRmnO(^B z`@$7_+Gt0!;FvrywaI6K7lv0Ln#S6*tBu(R;r#!gbv=0r#&3@l*V?OgBBh%*SU2>5 zJ#Iy{&74R0bW`Td&LQL&+{L++f4+YaM3xsYEvZyVx^}?S-dUnHYf?rY@~j3TF;#+R z=1V{hG4`j)(;0FGi)qTw6lLdyw~^gKfWr|iYL(XXO? z^94MrUwk`GJ#`YPi&phodMF2|1T~|v-}2CmO#2WUb!#<3Mx_~P+6--;PwcWB88PS+ z5*HVOj`!$=dT2|JEdpnQ>u0S7-xb$N{rXb^89vEzamn!%En^`t#-*~Ey)F0{Nj9d^ zs$O+sP9Yc!=Ff3Tj&_F3!xHhV#~6Q24K6wxs+UX+7Z1j4kRqD&zNww)`*!Zv@qs{Z z#H@@F(pI{^s^(lB}`5lre+Rm(N@r-%Pb;w6; zuq3ZhhEqkz8q9cSNf3-sKFuf9v_Am%8YO`YB{n&3iR7s1P8o5%XPTbESVv>c9} z*2Ogt1eR4)NK0k1f^M*eNLO!jdaaw?CV;7(vT#CQ0k_viCM0Sju3Z+9-u)l`@{q8l z`(fC~ic3Li>52e(WUOJhCo0+(kxe%-+q0$Pea#G$Q9FQ(j`MmoTW+BeOXYNS|#V#9h|i%V=d|C&*cl(sr+AX50? zvFx7EJ;X_Y(uxXhnW$pl#gn=;(owRwec8F3C<;q{O)ML7!wvZ%LqL`$?|4|Jds#sZ z_@j$oDkMlqO$hxXT-npu75+P+2A@v)w!2l5Fo}88EEx;#P68bubkNL|k@0aM*)=&) zb^wspXtQgLTqi;iLur)7jE>B=Mp@*LzE7LiZIu81w=t1S`=D}Z^=D#34FVPuw5y=N z3wvkF%R)Vnn()t1Wq2%oRs|9ZkU2DiC7q!$65?J)F@{(~uORQfZAmHq*EcSRPB}s2 zaY1#wCDQG#Ef{-&)P&>Bc{T;FL)y`1Mor)6C;5&`{+GpmhNL6nzQT+=S_{h9Y~+pJx4 zAZH&VcSB398StIhubkYXBSG0qk1sy%h;N3bE2lT-2U)>e=A|XNrCXpeJ1CQLEON_V zr5z_aPZVwWa4fcb!2@qpe355jc2!j&%3lgUX1_r14RS8Iyy&t$`JDo#7yz(CfvQGn z$`A#`1M_BGxoEwZ4Q2xry263aQXjO%H`t|wi}_$9)QRSRVjx{bX|zjwQPO6*NX`Ls z07b3MLP=2tH(^%9#@wpKpD*WR*MwEYBTu_Hh%y zM5H9j}JL0=4W%Z*uu%{Qp%Zw58h)c@9iMbHAlCYYkpckA8#|{Q}<1>{N zbnl5tyTW@|dC^aNxX%eI|2G%rgnjz#Qg_2>Sy zZC@v6?B9?R5w*IdxW+2BUpnWa;3KyVgCtZQ6P9lkF``7G!K| zmDnrRE7#Lr9<*-TJCVJ!wA{LN+FD3ro;0V+e3sjn72xDwhj&(0*Q@MneCnRau1a@g z_ukZ6AA98Tg%QPHrEd`wii?LU`}Q1_88m=w_MEN|`qVJM*YCWzq{LEYPl$vjpT=Y^ ztSM5E@H%EvUi$7n)_Tf@si{FKQ7ItLs&z(<$K`4)m>kTmruVsM2KR~eF{dSwKq{Hj zh@DI+vSjYqI-{bzetvcLSl9x|0(0;Dvs|*gT%jqoN=#~#M5j!ViA<^2pcs1H;1=)I za*<=gk)}Y6kF2R8pLo2irz>GB?Bx^HQ^bI|3&yPdVdLBs9>#>>Ia0FiOK0ZQRjL0p zALR#3DprY21u#Y##*Muy@+zxBra9Z{HcnXeE{-?XTR=A$+1xB^7T3f!)OEuB|ME8S zM*cOf>ijfCZ#HSznOU~1OfB2wU^izKz0|VLHU7)%=e7Q;{O6mT`pD)Cc44RQ`@!b&Ir%;KsmB24=Gn8Y>+i&8P$?bvR z?ylw1!V435t2N!vpEXf1#(fH;!A~(cv0bs(Y=(F5n1FYh6D0oxj1;I1`EO#vzX9Fu zmB~YdZRZcsA(RAb4$=rNXI<8sLIdrFQfYYOe!D-7z#ut{1I0C~`vnlj+y)u)cvE*xC z(i4s6z9u?6+{$2_i!S+3Brw9 z0)7;b(JU%~`u}zO+Yc3=Z?Hfl5rjP%3s1zCLKew8G8k-|B)pfgS8%v;ZClk=b8UYcwpH2U=lE>IM+rNaxG7tsN;asW* zYROhg-d?Hzf)>_3NXu6)m?Mj->E6SVhh`QLRej9@iXyY{NPy#Dksml5(*6kgAHBZjFGWOlFh8nCw*G8G9`$2XRw ziFyaOf7c+`&}h@O4Q=~&JSgBVtJU3UJn(E`+8Mzns%QKiFe1YM`vJa`aJu5 zDlebY&|d3npS;i{PpUUqVfCC1R5(jCoIRi-{_R82TQX$ij2vl0eP?Z^uRV&o6OGAm zxcJ^OdmV62eUmDdo2~MDc%g_Vm{~C0BsNQu6}nAk8LZU_Wl}xYkuA^Z8!Rq>l}>e} zd~MVI6e87Go#idFaWd$^3U?5{5L#vzwU(;5#y#?_a4Dg(pz2pV<)|(K$yq6p&Tcth z5c&}{BYqxE!ibl(h7bBpk0$voYRmFR&)Fr6vxWW6lCvP;i6N4uBGe(okuE zsYm)~Dt!w}R3Ow8WXpWd8dN+s-&94Gi6>|qzg7J5d`&ELbkSSrmKAlCQ@qf39YIn{ z5hL9y`@xMUN0?^;#5Z37myIbDoQL0Jdud~HK}g*r+YbFiVX;gpGbkX1C=G`ZTV--; zq`WzzWGMZdFkezIy|z(-Qk;Cc3SRZWk(wceAt?la9Dz*czAZDzsY4RR=d|Y7!s(3LXJxDD7d5lOk#e$4tv#p}P`@EE;@?oN*2l;RWJ?0(-%rc+gd@epi?)r9?!kwD3$b^kTOWgy+9FDyyz6{=+d}FRghf z*V-U;Nm`*|=!K0-saBdft)&96v}^H_rj#*Lfjah+Bq0q8NYZmL_q#AAgnX5a$wp7g zEtT6FGIg}CfqYrHi2ZYvM9kOqYYR{K=7w2I8x>OGU)xuF|72Np)Ov+-a zaJKMbj#+}ne~YL=!UElC$8(0sUxm_%9eADb6s_vlYh

^#>IXLWsI|EZ!SFj*H;jok!m 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 literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/FiraSans-Italic-81dc35de.woff2 b/compiler-docs/static.files/FiraSans-Italic-81dc35de.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3f63664fee6ddf221f71a57461a7f4d1de281177 GIT binary patch literal 136300 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 _HdD`n5<@_AzZ{+=$) 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�e%nZC1!^pP?`Fe-tm;C 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 G0{{TFWc059 literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt b/compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt new file mode 100644 index 0000000000..d7e9c149b7 --- /dev/null +++ b/compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/FiraSans-Medium-e1aa3f0a.woff2 b/compiler-docs/static.files/FiraSans-Medium-e1aa3f0a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7a1e5fc548ef28137a32150b6aa50a568cd53d02 GIT binary patch literal 132780 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�|o|A<_G9#bJ&K$mXTSM@kZfZ^-ZYS)6EG~kHJ{! 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

TIWHPC<_9>em(Cvlhuf-BD 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 literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/FiraSans-MediumItalic-ccf7e434.woff2 b/compiler-docs/static.files/FiraSans-MediumItalic-ccf7e434.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d08f9f7d45fda39315519c4d6ffce5b84454d70 GIT binary patch literal 140588 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�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

%kIaTch%S18n7|ogN{Ilm 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⪻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

(_VuT5-N!zd8q@AJ44ro;*^XcsH^-RBAu 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 literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/FiraSans-Regular-0fe48ade.woff2 b/compiler-docs/static.files/FiraSans-Regular-0fe48ade.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e766e06ccb0d457fcdc8d4428efb796c7772a497 GIT binary patch literal 129188 zcmV)FK)=6tPew8T0RR910r;c<5dZ)H1}VG%0r)%s1REj%00000000000000000000 z0000Qg9sah<{TV>l?Dc20D+=N2!T=wmlqKT3XY3#jH+}2HUcCA(i{uYAOHj)1&l=p zf!8YxfjL|CjcTd zMT&z@rx%hTQV#E)CB+h%C#}}#9Gl67CpH3PX8-^H|NsC0|NsC0|Nq}#GLg-az^*OD zC(P_sg`l`5<5@olDT)&@4IRWHT+7Fv;O8}uK?Pm(ODyxqmbtDNpI42h0@o^q4r(k= zDXW+=)$3`4noLuxEp)oQK=D2eXsKe97Rrtqa>fUThSSant5e_r;22c^Dm2y)tu(Gg z1*a3OtU{ViPE3)mvLTK!20>3N$`~|LgOQpsYPP@%G)FpeFi#7MOKe&56%M{CR2;6+ zIu%{ArHPf5<}wX#per<`7InxFI$&+h6-|(m1__%&$HA6Zv+aa=Oe-ETyFD%`B?2Pg znoqG!Yivi0yL%!a0wUnJQcP)*)i>E9_8G)wFb!HDD9~y~1DXsSlv&467;!6Z7~U>W zk32FI(xK4?h94c%5+6CxqfKE?H-s&#X`L12gOi<%m1xK)Dgz)-E2cpw+8VulyR-LMmO~h&~*jKm_Cgc{yYWn=qQ}U2{bZ@kCsIkftBQ zj4~vN7qo3#(3c`0&dYtdAg9t)t58`GIzA5ko!RouT6XxE!SZ-9L%*(x7 z=|vyiieB!Wi|7XuaxlyJmHhoSy@K9GX~C&-9=q0fm!5RsNz1vny%W(wxAidFvSh8T zp0Q;C`y$+n<<-VSY7o$6lv0{f#gosVL_oxW2qkWD%isIdsV>q-V$vXAS|;B?B&VWs zp2(+SI+lDUc?!vM?#plvM=Mf+tmWHsEJFlbykTpstlSuYgN)xQ26tym3B_Ey7rFK| zmaTF$b>T=~&^PUizCR+xO5Ab)=PP3Ktd&&C$L!p_!2OYfMl0;HCFifs;ds3I@uRqp zvuLyULhVamT5XBSh+2sTj(;J>5P_U)K~xY|kaJ~-8X}N$e-IT!Am^t3U#Z7in~!wO zJq`|8k)axel5%34obgOHZr!>*>9esGrA6Zm033oKjuIRhFw18+_zVa2zy=7i;tT)( zq`9V$8rpedNXlqBFAS2QfGbjB?Zj>MVk>%-ZFya5m*SLc?wyLkMLR6Exy?<*XS^Nl zQABg@SsBh(#W*grHS)>J;fh=pfqKp;0UTP;(80D_2ADz#0Kb61x* zwZagiv@=$v^ldG>mb2`*Fs`_<+<63f5Kn4N<@MGk>WBEU9Y4AM)j^(*-|t`7p1Gly z6aZ0`RaI40R22X!08~|ks;vI;zsg$upL6cL?jDgPC@4WBWFce=2|0r1z4s-V?PiEC zFf1y9W}+fTtj5Yi1b)Sd|%fN(=#xBKCjH{N`Hdn?2nDPxU{$fz{XKpADtx8BTtGGqJF@_f z`yuHlzdKPUt`JoLh#=cW&SY}Lkjz02*Bc4;Jn7cFzkie64`e9|k^pNY5SCy7Bd|n5 zJF0*bE5;H%SFd|s$6l{Cxmud`I~!-c>lP9KU=U4B8awG;5$FjCOd%|Z%_jGhCVgu{ zqFQkpBdRbUu>wW>N1fkyWI{=nWr_ilJfZ=*AEEsVR4=#N^xM=kJoh~7|3717-Wa{H zXHV_c%#7Zcmvp3^m+UK9XA@AN)x!Ic^ZBjHoz~ItU#P^D<(G&2k-}5^x3vi!5J8H5RqQU0$ zn;KS$1tdoZ7x?Oj^YQ5$ zROV9JsWgp7qfu!xgK#pXSD}`N^!x|KGb$K;(=@3JhEtosE#|D8ou75j;RWt25jgPy zeILt|6d^POElZZ!-(z52fpWQAejE-*P9k4cIybZO;Z_2-5-4CCHM>VWIH7%L&Tw_8 zjtm`a3YCdy&L0X~0RIrk*g8zB*U0FMsOx$oge>B(AoDi43u0Nb{|=L90tAeJh+rG1 zv|rmE&kIT7^rBG!Ut=dlc5S`>%%=}F%Pg5t<~_i<%$gJ^nkGR&;WjYZcCatKT7nLo zgA|B$s+TYbh5yx=R?GJKB^^t6qri_iLT zVIojTATf^W0 zmJ%+w4c)QqKTkIkV*vjDf4}E9&wYEZwa&&G?Kjjj9xYOWRT_gtBAG@JNv5My0#S*P z%02?h>-3fnm0S9d3fJh-*U!dtEP>4v;B=DqlHE1F|860hGxQ_-U(;TY!IA{5U;Ai66t}d?{jgw>ZU2rW zH^?I1bUmB?`u886y_~AcNNkrDHGL2_9}#2N6h?Y>epHxaBjy&LrfF4B5T|>5F0oul zVMP7M?a$F$@i3>18<=O#6Y+spNX@8hcnIs&>pz{azkrwsPtls3<3oJo7fZRA2G0qWqfP(_nJ0RcVi z^4g+0cGba+$^UCw%?7rae!1m+zfu5ZjBkl#m8tOm-+r(5o_QhK2@4(djf%9% zn?Pr7%WD2xRe&n!zU%T`)o4^T5Gg=gsj75qRN;Br?^{)SfAws0DS2afZw2xBzYH`n zjhzthpclWG&rjePLTyVWv5lJX|C|2*^sGZmsG)8nDZ=3tLS_$bCqsKVlrvm&ak;Ujo7zyAc|G#f) zmHuA0aY(5^SuV zsC$FR*l>b)gCN>)!+ej{>RRTNEsdf`DH&X zKt{N9MTCqqaq+**mFe^{uLLW$>L}zKC+C9<*<4AeAfx~9X|AXHFJhUwJC>a@p7R!n zWIpDwXW6jS(k67Lbxu_QilgB4kvtZKZ45y?!&@)3YIls$V6K z9A;mqizz^O@6h3cXyL*=c7UG$|2A7~v!?UV36=`6qNSuXsnTspmrr*1s}pQ~R`Mp; zTeBQ0y@<_HiG6$yr{`=(Zxv+^JpXT5F17!)4M@>I1fj{sL?kg`P^$M!hJQ;eded`2 z#kPx8)kMvrYO%=69z-~th#;nkaOf~2f``u=$hJpaI3R7^ZAlk?O1l}voaDcnmi6a9 z=war9EW-n%&pLg z%FAVU{W$?wjO3Jf0P+d`u>cSL?{&v_<|=q9#^N1eOx3_vzZge_P>f0Z>txalcL*U~ zr&t!(S#}!-(xz7CeL}nwL_a<;3zW6!%hb@h~b4Y0~6eBZO!Q zyJhB>6_Qtg1MfgM;Q8!Aq=QMGTrvRC&6g2uQV?lVDi;^1IT0<-+b`bvPR^?T6oW(< zPlw(Z$kveWmVe|AeqaqlJ@_!BQoT4FevB|%uufNEt|2eb*l$>0uatSt^^f3$-tdti zK{Dcsdo_)O5JD3gaYM)+z32D;=?uMhAIHw@>+I_oHKM8_A|j%q`oAEchYiP*l$x1i z=7#;Z`md{f|2m3Wij*QEA|=QWLdfn7&)@$4`9EV$_SZdMTejrLk|arzr2BYn6S8HL zR4e$zhTA}qf@WxjVOh*^n8(ov#$r=)f@S}q2>&j{|Nglu%B@tX7=#f<1QSdUW-yP1 zr-}Jw-b{NZy-X0)3_+_-g(_4bj4>uPSz~_B%iQegFIv>8EM$=&BC?2xc<=WahM?%y z9bryz3T+vcR8NpNb>JX+p64)2BZLs55W@z>XwC6fRfc17Sm>4mrHEh9FDgdiHq;u& zBNs;GHfGorjp2(yFo`_q=gN7L!l`^F&H_b|Wm$g-YvMD1=*@k}6<0vKT0PrIhiwMA zv<7KsZ+D@ruaH+B34(6-ehxMT4Mo5^Z5#Zl^{s52WZbq)_c#ef0*Pkm5=fwGXWv)9 zJNmi$wwbs(jxWT!35YZTf@Gn|ovZZz&OXuE-`Y;Nk$EUxu2jjT5m80bjWKt>7XR_* z{=c`7+w@$0Wm-`WHn31jB1uSg;BRJIj%Y$xowd%@q4nTt;Y45evq84~|DRbWj2Crp zi!wq*0f`a40UHZ_Kg_d8+Q&1GKF&Jp)LN?|>YRu%^7$O~>^Jfkw+4$C;&Cv%Uo63r zfOEB<&%2uULu5YP)9adCd9Kxauf77$lrU487<5Yoff@$QGVa*{OMdV2?Wvy}rM7Zi zS455yVgJ~#?ODI|(0#YBlvN>Ra%tJwCj_L*wkUNJH>;;bBcqa-EP33*iMHF6J3^?-x#*Tvic={xP{bh01H=%@@Fsq< z&|c%j2Cvz2)7aj5pyj}z!T0|eFb1u)??hk5hO@b3em{ify@?`Xg2 z#sO#?TyAWODA0Rn2p%Lw{}qatVYoWtfRD}?o$o#tjH&Nu*NpSuzm%W#ef~4Tnm0F9 zz2Ti|827xlsr#ossBe65*^}C5o(|e@M9;aQ<2nNu25vBNX~HoRS7w|rb8W#X3pX}6 zW98NsH`%yzfsQ@*?qSJ+2a*2T$1RRL0&x4wd>>NQQc}~oV|LHZ#p}_NNRGGvxi*iKxWtt7tX$c% zd<6^)2+*Hd9Rw5%{QK{}h64h!`(NAy1r37}R(>5WM0qN-nQD%?uC&A&TioO>1Ry2` z&@7D>&M)#0^FOyyp7riE05l`Lh2hF%ri8i9;hH*F_kMC&H|%-rGj#ou@NjA#9Kb#A zy)>Nhg>cJ%z!3m^^|uTw0DS$QQyKu@{>s+y_OHQr{-yW7Y_uh02B+I_=g5G4RPz5X z#r~=s4qIm{Wce4|Qjn|^*R7AgiZab@c*J?~Omb?iWY*MBcGsA%iR+u& z6sEp{y&J+b8x|rj9~gM4K>Ea7VFG2=xgN0v{S}~u{o>OoC|T``64nq#zq$hhfANz> z05Adf3EoSMyM;pa%X-QAVXh(KR6xX7!xY6TJLrT#tlG?l#3VlW&1u#d`j9dLa_yyD zG+1)4_o|sQt4%S>kFekd(Fn1nwZWRQr5q|su z;4b*{`a`GT2x911FTIXmzzQ_(j=7)FM0QzV!fLMS zX`R6WxGoE<3=ya)?suMXhC#!Dm$lgh9g@r3bvk9M&r^L{Q4cl{9t-p$@!#6(*Y+lo z|J=%5$?Xots%0(+9ruC;y_q|Ml5Ow%2sCH>fSjaTqacL=FMh()O|d?X{Zj*|ix^;C zB1k8mC|ic&Fs%swcqexXH@~%<+JM}x;N@%2EpQLJJttZdiZel?Pfc~!Z6M&GxtE=(iqFN5{&w51|UxOGhi#jhMVeoUb^tl9RQ7!YwF(&n!+ZnoJe1e z<81%DT+oknMXxN~tNgrfeN(8^`Xy|YZY#oIF5iGYJ;6kwDazCuvZa$AL%C1jO>;k4 zV+)NYSq(e<26-RM_d3#!VE3IGJ_2eSF)*l;UnJBcUZO-o?xSWuq2ULt_5vu5dKJb~ zqt6S7sKmHLv1C(6_F{99-Od=oVt1|uRc0A*y0c1Go(^(3?_JkYT-~nfQH+06KAr_T zw*5F69>AD1FGK3wzy;h`4MSNgKO`8sP!}Lk>|%T&MkvfTmPduj7`|=VB({ zF7h{0_9?{|{k9G1cGay+ML+<5|vWWfazijXe?o%Ko}7 z_`Qe$2T7SHZ$UbM_X?`zV?0gcDfv#iqL0^K=EyX!Se~UgsB>lMU8|SN+O*JRQ;A7; zwH*L3qlKXw0MB4Y3wrQdMMe{_)8&uhuyD1 zPH__V^#GcF(43=l2!8~8ObT{ZkqASCNa9_K1tUE{*UM3gDIZbp%R?m}T`H#vs*7?& zQm2&+iW{@hm7MGK4YOA2y)C)wTe-e*g&HX|kd0ZVzT9FByi3r5|F zU?XV-uZ;LRY{aZTg&%{<40;>7W_Wb;#>6JNgDxmtF+S|g5oO$OkF%D}$LlRF0qP9_ z(D%2%AOq~?)?6WX>a{`%;6#2t@?lxxt>L}wmQc6>(3n|-LNz6EGY2bN%LLM-T!jF_ z^gx(SEoA$~NvGzB$>l!gvNAD8$3S@*W`^B3&|D=$t(&RO1+xNpxBH-w2FdT z{(E*Q0yMG4sA{RQ(!KjyFdB$a%TJ&nfI%vwfDK-Gq}i-PWdU_~QW9QRV2qm6B+ENk zHVlrMC_1>Q#T4q7k0g{Xr#LY9o8FectK1Zawc`E=Vf2(b=RwJq z82tx_;D*LP%Z1UfREzAVos`+ce3A_Yn&3dGGO;}CbYw$?BS5ygm;l%B1 z@%^MOLY~V|%(4}Xm`ioI*PUUpRj^vHL`=$NHp4>O(=1S-8dkd@nBGbygNEOXxg%oV z|8liN9Bx!MDL4;?+4C1wX7)H)Sk2}}drVmV^wS^cP9KpspNp(D<7K5(rpQbD#44&)Do*hJ6!J%U8K}#+p?fY;pI|)Iy-$#F@W_ z8~)k=yY;HB>yN($&}9S+vwykFeROzueb}O6cM=D$9;@qf5C5NwbldLTUi866Ke73$ingOiA(cOkE^<608 zes5)zs;)C(Sstvw50w1S7=g$DUXOPQ^7;u=ODwGrZ{&Qy8cgN?kNNXcr~Pn>3S`D? z2Fz^IDzM|JX48LK_P(a1YPgb)5t-Sc3X9>mwF_(1nG0@e6Mo+amqh`2P2@}HOV;l<$n49{w^k8Zd}w1 z(3ow(Z|<>AxL`&fGsT^w@$$%%jle7+&RQwRQn1gMrirTX5+w5tW?RGbO5As_YsX+8 zK2H4vhbUnC>FSNI<-frxD)Im!s;vD53M3S$BSiPUTo|ap1mL7}^*nI^h~BB)aZ21A zMhN8@ZBvg33bG-d3zv|g!GsI{;n#=~QU5C4M-q@r1sbC-!-xf&96g2UcOrD-BS2_j z2!*>BTO>flGw6D3UmyxZ_r!vDY2ipmytQJq4+Pz^VN40O&I7BR2h=ZxUB^4siSEhfD4BU*)v=R{UV7wHK2o3JOi`AF@@Kw0&{5SpO@3n! z`#Z-KZ!q=aYgcp+?^*0MHX$GUmohT!6x)+caaL*5$Q1lQs8<`g(ZxVU8xu5APK!Ryu-xYaMxRcD6} z1ovT4FqVNQt9bAsY7dQYzu`<-u`|_2cO72rKcZytG*L-A+N8Y=#~8r{0dWY$wfyUW zHFn3hok3^NQC1XP%{ito!tL2k=Jbxg_p!E+v z-g=(n*nJ=Rcx>#RVlOTnk7&e_YN^!>#&WO|6RgNL9KOuT)oSaUJ2Ly8>~^_cKmG$g z$3`9q`{eixoJ!PW1zYelRQ1b&n|`C7-)Za*{`8mn6JFsN1kL>|knoOyV|;=``vWV4 zL$U>Tj=LlvHxe8T$0Xw7_;WAwuLt3-seTJig(hcOj|C%<4M)FCxCQ4U0ELKBf;8nQ zx@BtKk(q`-EL=;eL!XCCh-NJ29^zI~+Q@U6_~(2b!4zH!7a&J02oa(1zzxxh7le+m zyp@Lt*9}V+L|mzSq@uUdf@pyUDsVz5R>Nsv8V)&w5Yr;WT4x_VPkDw(M*I!#t?nE! zNO)1O)o`409B$0(Q@ak=niM6286pmn*QS;>AeGh&eU+fSvP(#JDX=^h4-Q~1GSX7B zQy)J+7wc!2_d#$FvQ~F{obmgY@F0N4F2bMUN%)J`EEUhdbD;KJvFL6*$xdn1cNLn= z*MsMywmKFyZNb~mrJ?so#6Ml+J{0irEezBn7(?}tR@Rg1GJoo3Al&zGQgME>v$YU zlH;f%P5SAC8D)zlN48%;)_e~F?gElagrTmCVlWX;rz@5tET`zhMhJFXN4eh+|1X0p zJcGcbnMVy5ZLo(w1?X(#WM{O6Fr%LkoZKM6(N2hjn`>lF=o7mM|HV6lPFPYcd}j2HFZ7$s87+I$5sW1s8 z*Ha)~8P&f9j69h@`lln|GQ%f7fq+*tr@KimvM0?ogZ zgdkzpxCqdd=Qb`GBLj@vJ<&YHdT09fj=Oz5w~X9M4TVfhWUwuh#bP z4h&2j8?6PknLryX+*3MEVANlK)cB8F-? zyp|hNzZ31wL{Vyh67+GnEE12zJJRCF;$psojE&1U1*8yHvdoN#gxHSEJz|lolE~O2 zJ-qUGCs5pkJqa5RnA|G2QbZ9-2w*ZkcOjhiw0IMS81fywgL5RfkixsSTx&T#g`Af6 zQRWI)Lv}V(24%<~?*g=9uOpLVPSGAi{`1Z|S|`=gvlPLxw8ybh;|dqrUxE zcEes<0)|aN8HJ#fAgeU^ao%59{L&YEuTxnZ_ks7EKS?WN~p#Y$@ z#N@Ib^c45>C&>E*uR>xWag8$dWrhX9gftd{ui>>bFoW}W+=a*?aBzbglv9o?u6}92 z7nfmK3F=-?3n%sDIl|8`pzz7H64Hey<_H)KMOYM$=9wHIp+DUfX#mW5*r1nr0L1S! zm!%xa1>oQnEjv)b5oxQ~a)?8OBknY#R62S&B?5+4KQs@H(6)!PkwwA71+##x09t>V z3jhYF86uSULn3n&E_0ci<>nvx3Fxnjh<|<%MyJe!l_LO3?WJYt-$WiTGC@^Los==9 zqY!2LEwVR>yHY*>4Fv!yE)m5W6aWF@X)yOHFI`##!+DIuu@DIA zAIYi)*9A1_a&+bE-q(Zl6_(v3{zBP(@#KmsoM4+<-VzZ3gepP^A;c1EHKke|rG4gW z0Ge=SM=kfGq|Ei3RfdZ$V!p&*;4(Y`9+)uk$6pRdX#9n^6G~>u{1Y!0jqIH+D$f@` z@&vu3np?Ot0_^8baLM(gw9`QGv1beD(Kr<2w1JXYI=JzVM#6)=C^;Dsl`xN2{s1)n zNTc>W_B4Imyv4MAMbvi5gavn6V%rw!t|!x|Hlmgm`SgSMheyU29o4{yK-u+VD|fkz z{8+DjH80P~@TMO={{LDX>+%<=bx&=xs3K|8>cOH*rx2Z4-Pm4MV+9ub5wL$RXFe3Yrf%@J1qzMLPJl6XI@dUa5rIs+Y81M zi~~%-5pngQl;P+&9*#v?7-_`AifCQ$Ez^crV~R%};`}5#;5_jss2B{xmc#~hH@Pnn zmq~tNf-9xsgZfzNXYA{Y1=mhjX^>GcogK!j=UG0rp4ffo^b_2+;teCa)AqIh&<|uJ z6a(4%Q{)1nA|wJ#nt@!ElNMFhn@q~;s?KoN`Y+ix71)Q4cTzO6`M{7tl&T* za)*C?GYoLvAOk#&T7bU=1Y1D31;kMENi=GN>WqLqm!JyQ>6P2mdtv7SQM{u zw_S4rTnHEfFC;`D24dNUAYI=h$P-i+3CR$23F^Pi8WSuD_ChWM4?08e&0ncN!Gv&* zO-+U}Qgf*&wVY~Fo2>1rJzXjvKhQbUvc{&4#Mq@4oFdF=xnHC51mT6!Bw>2EBX#N3 zKkqBns+I?KVnYOtU@1aG5V1;pL_Cp+;(<(6Au@=nkS0;zYD%l$%0(L>W0eH=lrzsD!kfqOw|Q#A#~*n^D$KTV%9}d>?%0C?0|NrZ(?`uU`e{RCr^bsUB)cgbK&7kzw1H1a!Z4JC8sGb6apF!fSi_jv^;}fpHu;I zcr%Kf098QrQSSqhax0?pYSK;h)J_A9{C%R%Hj-a#qYxi?x~yZVaZ30@YPi-vp++fy z^16X4K*2&%J>w~4Q5Ak*7gc~FQ!An{DA(M|N73|qQS>PnM=@nbR$(tb-tkvo^}axt zS^E`=wX*iv{Xm5&;+*t!B1*hJ5}G@x@qNlg-}q(%l)GC-X`TS3F0TIBQ2H7f%3w#Z zo)l#a!r`uK@NVv~P|$J8jH#~`WA)jA!Wv-}{;$1tV%-pL2;{)JlZ9A=&Z*)%D$n*} z1laA`xxmkK+d;VnEyE9oA+FJOgY&-bF!%-)mFar#&w#?MCtyaAh6abN#LG&O=9xdF ziDd3JfW4Vy^U77!6mr34AuT(pRTk!qg}H=D&I|yQ*Ox{U#)jQw_@47-_E;DlxbgLG zw4ngI8*aKt(HZldRvk)8=8%$XU$C!D>09%c%3A)?li1s(OpG$l_*I7iB^7iF`@+JM z^Z1FC1|-i9`7}`X+Z0sPm{WIwQuUBJT+o^*_A^fXT@vx7Z>t3`-}B>y(us%>CU|~5 zZpv{K?la0@or;50`-n92$EokilF4325K(vw=WUY$rr(xWs|aK|Bvx3rIMXZQBY0@3 z>!in?#gv|m5zR>57hsM#=IEkZbW?U;!UPt1CG}7E0{~V0rn-?d9tYI;$P|ns`n@q~ zQlB`1{A`ATcsr}89CD|Y%w*|M!1xwA=5Y|g6R8$8F9C-SkBrv}C zyIhgYH@PmuWe#y@VKg~6vfQz_m z`YZ~yY0@(Z)CZa%vzkTm*bybl{4Dgq=5@KB;Vu@AW|6Rj)50*DE}(vUq)|e;NTzqE zZey-K4(-|nt{AndJ64!0xtq|-WNFOzSYdvVwBvwcvJQj~JYan{H=76dZEr!f(BwcrwR2~QI90DNFu>!b23XVSZXeqX||TE z%Ql)cQ}$;5nP5~+pW8~RxnZ!-2^Y@cQU5qszkqMo-^?`k+i1QN^Q^JK`4`T|)AfqM z#VzNOl%;nC7=XUzNr}N`q+vKU&JKCzCs8%$1wJk=kJok;dg3>0(}tuY_Zn*?Bo@Xy zPYhle)?4MAZ!T=th-(C_+I!I4PLZGSLN=c!U?dF9#tCa}vZU zNd=Noyi@QvC2kMnRMe9{w;AFLqy>(y-iWwCh7z@O$iVfcUuFI14$Qg-yK$A_<&mec z2+2He&vHgwDP+S!hg{@g_iv0wW|FxA;DDd^H2An?NlqRuP(cHIWhC#o-9|oAFjp3J zTjdjhT&Rae(L|%DInu~!5iYm2X+vm51?cSP*F_5+wi7yYEO>R%2KbKI>o_JB9A-cS zCKBa9bYiu_98VBOV(I>h+i!nafiplRXRVs3Mi1l}Ii+8NaF}A0**9s^oY&H^ISa0! zPOsFxvn>aTK8r?figljfzLe{QWw0HpUEK%7>X3rn$|>bS06bC@lxh`&!pU9L8<8!D z(Hnyd%7nU6@N{!`A~WB&_SBU&-rzkReKJHiPAOzlg-Fj@gNcHO)XDslR+aG)z=kW8~+NT2) z(rDBKNF!GjbvakdAmAD-woE&qk6~(3(9Y%-T)5I3vs0SA5MU_mp9EAwB%)GC(IFP| zNH{K~&Y@1AE^=Bd#<2cN-OsJm1Jo@UJ!bolVvk;eE}L-i%YpHv$(WeQKUxBC093e6 zufBaRP6l1kKu0k#T?lS&i%TNo^?utW;jTis-yt1_5L@O{Wq5HF&iX<6LH)rXj$X-# zA_=(JA-hoktfedEk0o2t{n#KNG)tuSUfF+~$a(Aa5j>fQltzsZ-PoA4ckA0QmF9?(#2S1JTau+xWfTFu%dS0ReDB zcpa;GBDvuyQRxe1sp9=6R54K|s>(?tEB3!ttu`9cYHFk=V8WKEsgcuJc(@5FiTkXbd1qI%SYYsjB$8zDC!Ex{1L}578($70t24`kZap?Qs90k1{15 zc8J{#1U+?`$PP)H$SI_5V{=dHkf9zqp1X<=nVSw}iykI>kJnj1Wlz`9H_(^Rw`opq z?IycWO(0|p7{PH$ah3}FOjZ9?hcP~6$X4K&i3Z=phyof1w?V%n z1#>0Bd3E_aS!n`OxhTKUTJt_$3lhj>((LoTL}(<7jQ%3}Xha5&L@yl7+;P|M7lH`T zkR!?oN+ZWbUsi#ST$3RewXL|*_9cdy5C~zCo07cIWM6~83gF>oP%9qI!rH=P2oq%I>mohuuvz=VtJ8r#tJYAn+bCQothV^AC zZj|C|Tfom$#S1s-P0|ID^c^>bKJ+u{mj>S}H0oHX(e{Qk6ZtHCAV5P#Na8%&OFXGB z@#L0KCSJ5Oo;lpjNrmP<{aS$LGpE$5u9HXBSRd(`oBR$d$g{ld*=b~B^IHY&;M{hh zuLMe{8FP_Fg#^;MTsl`&Q@T*DAC?*#+@cQpsbRsr6QJ+yi~Lntloc{96!-C-0|S@= z5tvAn0lm4I5}DLpA~C=uKT$NV=8{`8h;SrKCHdy9TO}5bz3u~Cg1;jZuHjGMeoMjz=62y29bV^&+D>I>-xX9;DFf`U=CSW z);{Z$yMRba1q{#mU7AItDBUCW$*)^tu3}+CgPWa3wxG00hSboRyW`aEPGi=4WvIR- zV;5jtjpR$c&OElK7HM%IHHi-bm}~|GJZqKFOKTqN&7wW8-rHC|&`Vm~xE7$8mQ3)ts^*q5KWXXJh~foZr~VDk_A`VyP;3)qswmT!wa zD`GyS;Sg0}G>@|NhrR6twgua~W7D(@*>3jLr(=g=vy;3niwfpj8#S4<>agpCK+!=l zSI*38nyO&S|G_)BGuiiQ@b7fC%U76r)#=SqUSW?WGv0>HR*b6=kCAvV?PfUy3k-V zoLD^tliY7N}MjbNUWST=} z=I)*BGP#|X+MYt@J^E;PLIiP6`Rx3MtdM`E*(z1u+diw-*Ke4;pviBGy$rwWxVc3? ztbxAF_vLaF`se5}Kd=vYnL{B*!g=m8GI@U*Gr_f__!+&1Bs2N9sO_Z@kgK@PXk=j< zIa=R;vwI1UIShFeCn(K1DvsBd#!^;IZp}KSHR_vT5wP5ZCuhrIS@~cyTzAagiUJb_ zzyJp$+)n(1QZP?~(ye0s!BZg+s}!$j6g6M9-hKkKY9M3!=;3OWY5qE<02am>3eVK< z2%2!g2`(m0LK&am_sgQx!Awys*hVXst0R-PxoD$Zn+;ml5~E|$otmSvn6CJvvFQFC zV0X#&;=j*WuG>u1Je0ew??-WSxDDkHuQ%^h037&-3y?sKGGJ_l!@CktiX`ZbRWjZ@ zRiip&0Hok8d%%qQguT(TQn7&2rF*^G<2G*gQCd|-n)~=2=*!eG&3d9x75(DRDxbIN z_M)?z;5)b8_7>Y%S-y)f#s@y}6{ThHsNyPA2YKj*%&PwjXk$I&QUI#+Ut>$-$QY(z zxE(u?dD)-*Kgaz!MZh;ln1uychBerf+fl&#-jAacr}zQ|a6NIi%DyA}Jt6;Sr|YYn zyP_<<_NM5o2Dw%g3Sl#yqUxU~`SagCH1Z> zCe(1|^~5K&tSOUTSbQVXEL(t12UkmW1HjJUk4rGiPcB_ z8N`s(jIK|yk$AHTNIE*M~Brc(NrEjP~l>T;pW^qEo6HP}jNpxycXPu)X@ zJz*WE$%|{6W?qob0Fg$2dUX#%9lpfDwkN6^hMlUCIDxLPh;ATbC8-m-g&mZWbjQp* z6ld-l_1i=D_OY42F!oL4iZKZ<9X;+s)>qM!II@2{k;>S=Pa2Cx+P*0Q6_(0c;yJFM zYNntU*+`WrMyy@W2JiL{(~~rYK4hc=eMx+uzKxdf#ZL!*B*0Dg*IC4#S2X^mlr0nl zjT|AU@%P3H1J?sH_!BEwHKq<)suYtFVb-_ZL>oiqO(-Jez~vyttOPv+np zMn;BC>!UrU|l@c32#8i3Kk7J*=yOIvC6AyBxN-6wHpi=V}dn9rM;+GSzxJ8I+gdCE zPn$eFw65JeUC~@g@-A#KqGKB*sn)61zvBbrVUc5uvF_D7cN%p|--^jGq3a1TjywCf zlt*h)(c{|TjyEUD*&F8C=NJ#s^A@}3nMHc)f#mTZ=oyfc!?v7AnC>2T5F+Q6l_gi4 zzJX{A_zZMSlIW?#5C#W>pR|eCC>uO%^6-o0ctLQAH!sH`h;&8O<+X30Tm0JVJ6cs$}pB$n69>_{(s%rGE?&3x)#@g`@~=Uf#u^XFXaZo1|EbY^hlNVILsO zQH<1OVSBZDe&HMj|Y*wgMPc5o-Uf%Ay5O0ycA z^X}d6eqyMuC*?28;*tc{!#z00s?nPe&|(ggc1q^BG)Q zKixuFpODa5`4dAF3~Yc~z`*Z*m;?F&(Ha6u#RrYvZshGcRibJW`iVyO!?h{``3%jr z@&-UleQQNQcXS-@77j&vWT$u(;&|nue2vA*j^ijtI#l-h1=hBb8sAKJL{jzS45%<5 zQ(;iVPQ{7`K&mcTI)&;eP=l%mSxM_WY_k4rABMUkhY28_RDMTr#xpOim4mNv?2x7i z-ol|MjwkU4a9l!(TX02d?Orqd#PJsqMS}FDBBIDj&e7mXLSNGMl?rnlAmt81SJl{A zVONT@i0~PHRd^TTO&?-$qrv2X8eh>`^Mh~^F=K99nVq`@3|QZ8BPgigz(0fq5Q~6b z4`+Mwz6i<6r-}h)NG+5Oif=>_zeLhMNcR0<)*~pnyRS?@g1c9DVe0!x{n8XcaNxfN zkV6a0T{UZBC04f{>#F}nv&da2JG}{%nLgultT?5W&FDi$u-#Kl!IETYS$1}M0ANJl zFC9Fc&L1Ezb%CM(A(-a@41UK$z-XHQj6ie0D0Ncw%GjDZ7Te9oQRLDiy^K~v%WYLD zUF>`E-f+z8+K3+iM%|(wnLPmoGV0-ZQw&Vpu5^1_j;iw!3m}n;6|nVYLAjk$>IQIW zcj@Vf1(2v(nDX8F%cogax!$Oh~sIb^aQt6wGB!^)X z##r~bh-cCo#YSW#H%rNbpQJl9_8ud~jm1|qcsCIY*TEsK9lJI?e=9P;R$ekK{PU!$U%yWq5r>(&|DLeeu!g<|&N$K&d(Fwg|tJSsOk zi0@v=QpPsU8x341Q|ir!8QXNYq@h8x}Yy9dp$RECK>6fg?v zoD68Z1LN%o7w7;#asbm2lpAanbDB6|GlFl=M{P@70Fn!nj#9eQ8NMx!++x$5i~@nh zq@xT9qCBBtL0Kb_(ET_+g#ut-4)Jsg)L$JM4tcBNeyj2eDpTXvaR+=C287?EqMEhy zTmeP*qLQkj%uMN7PZ2Q8=n1{yS1h z4dyP!+zqvCJ4$Zm&J@Sa7BL%2%)Z=aC370>vhLp*heF0c@(M^Vod<6XO?(!;1=E$T z%aH_?v+7zf$W(5=+XrtLy{5SJB)gArkufZ2*k6s-8cw%qFc71fBKrneHFT5rfm=Lg zJl4o#3*#8aRN6RhIk{^nm0RoZa%@uXnAF#Q)@oZ6{q;a~sAue;s-3MEYgZ8qDGqN^ z?^4-32MWe?tSjW1&M0EOFH2t>IY+PFE!PHqHlxxPwth%|2i;M#LW<~S?EGs5WcQ2i z`>0}qxENjhBD$q?ojJ1XR?{;X@|$}yc=NDKN>NxBmx@E9IHkciL-k2zMM2f8rcZc? zj3VE4D9ZD${!(*|4nn0@r^1Xo3MuBQ;{8)`mQAWERb=56l({^Fm-~3R!__4Zp#>Es zZB1+1l2o=zD3tZGX?mgb~$fMnBW6bL>Q34(5v-{{nwL z9$Mtz>1wXEa(HMc#%Ro&TuwK_TE@Y$;cZV?!%@Imc;mzmwT~Fen?S=kI5fJCjYi^h z&;X%$aro|@w+GNkyd1n1 zybio&`u4Yiw}H2VOTjz9JHh+GN5QAT7r~dnH^BG&kN*Vx3j7-U2K=dP=O5so;Qy)J zbG829^oaumAQ@zUY>*2~Pz=hzC{Pz3-wZmySkMcmdq2(w=Yx6RO0Wp50PDb(8lN&! z%`{E>^vuAF%-CF=U*@-YIM3$Ie43pAbFf5~8a}e;`DzkRCdRaWR*i@#srkT=@@p|DVqrO9Ea2lT>{DiE!0?o!^y|Qj^DJO%@y5VT_fg?S!*->Mp z;KL#(=s}jTgN7>)@II)%+JNjMM%S!obda8dRW(+P`S6jd^7i^YzsWwQ2C?}swCtI8 z{5R^`2w?ynf$k&%JiH6Pym;&?pKp8#8?Rh)>mBv|zw>zDRN(B%99O>(xE#0^xY@#d z^*e$4fk%O-b3B1h9iC~!d>!WB8peJ5*&sfJh||Y^ok&skzI^X2w0Q4rOm4jTn&A52 zrr_54U%nl|-NAjqgTW)gAB?5P|y5m->wu~c(L!ETt>MSJ)17iX7s#4zh#`?$J114b9xv>gKjj}g?jnR?TInS7Gv*AA0Q6BWQ-jH>O)<-O zb8f&iR|QPBE|>b;F_I}*yc0b}{wBN52Ow8< zC48=%NlrmUQ8F?!J5${&C!b%&C1Bx?u(A;iRYt@j<*}00G98l@y$6S+_ z8@Vme^$)cWdl*WX0v2gX6zcS77&GAF%}jt<0mj*gDF@Os%)`XCVlL{+d6ln1rRvqI zrLIYXmNo0ty$(H$d&vx=y=*RMEhu^;tO#4;30slr+b~%}IQ(G}*(g6@U;B@J3EzwMmu{(ac+9}+h5&rj^ff5Eul|JBF) zr^M`QH6iA3YiPO!hM=pUgxvlb@RdX7vd~L?OY5SYc>H z(o4!Phz#nu5RYcRClayU0tJrGSIM$5sZ}>uSy`y!cvVwrZyf^ofHp0B_U&KVv00W)R|}*vam|B%RcKq zEe8Ask_GsK+B zcyYDn_#nmirSJq4N=|rjl9Eue^q8e`mo0*-qZ^3*pGJ|yo>i7ZruBR z=&~P=RONpLeN?pL0owVDv0Z2t1og=U)8rcr|%NDs_*LuT+=VW4gE^srhcQ}aZ7(7 za94jxKki+Bhx^pOabG%)D_0jJyfR29>%r zH5*G?^Ms|N1+Ju9K>+bM#jJa&QQevh3DiHQLB( zvW3-bkkw)*t93WA+J^EEyxNC3tknUb`*)8#_S7@8=B#CB@`Da0*x-T>A;geE4h2Fj zl_D0Yq*Ys8wXQ1L1R}kVg)VY&N?qD=R#8<{UDa1x^;LW^E3GoBtGe5)Uqgr(Miq5z zamF1_ic^v*2(1PSEVTMH?70EN$;Hh>yhMCL(k7zN0hK6Krc$*I-KLms1^|MPXbh1| z71AbM-QCX`@0O1=)m)!;(IuB%an*o9LxznQHD=s3*WGZ_Ew|lq*F8wyv(LJ1Qa7CE z^iLR0`2}b^1f)=4iUF9?1mLRGeK`C<6buMg%p#3Eni$iap2Q|TiAhcR4%z2nrVS@X z0OV0Q5H%_$*(9Okd9Yf=zh}{GNL!hyE z^0C1P-^k?)gkp(Q7Js@?IR4kU`McZ)@SJdQ2@Kcs^Lb0Z9MGXtmnr)7^bL$mOwG(K zt*mX1N|uAdk3&|3Ban_b28SAZjUtsTMGBQhXE0d@6#GO3LXlV^m96%{ zXH1=m&ZxwUK9iJ!dB7(hC#eXLqxWYHD<@I?OjJiz$`DphWuTEqlgT(Yx=|8$({LVQ zh!>UjohI=%i#$)YRLe}x!?hf;QJk~YULasR|vUcBYfWHdfGR*DWu%y zfym?`h=4ydgp$X+7P-91Mlk-udyYTwop{8jy~$L~7mV=u^7XRh(c3 zNz5B*EXYfx2vS+|j6b})T$9;yJ(TDKlDI9YD$W{B-a$UwBss6_K;;ner!HMoU815lvglaDy&&WpXqRDSbh_uSjhXiIz}O-+87VmeS1u>ECtn)kHWXsTsGSE0aulGYeBKvb3zqHdtqq4WI@l6=~RhUw=~9<|9cc8=^i6Pq?)X$tJ&H%*&nMqtZ$w7+lxB)(uU_aVk1>< z)NPF4=*_Hb>7|<^2j02cmU?GczmxKyDvxd3RmY}?{C8UX@75; zEmPFW?|%P+O_;v5Q8mE|JQWy#9|heMJQob-ty+v&UyhU7Bz^^>P$W@AA!Ltv zUh$I4DnesWPZ}#LoLR=h6h9s zp&sMN>k%5_F)H!|jq%jW@%8BP0;=h7Lmb9ZW^~wxVnHf4=YfMS0Td@>6M#sJmIMlprw5afV96n|q7hk1n_QPoC3?nG z3y0;bSC;02;^xT%-9hc)jfzX;vqZJ=v#P(oE~_-$HDXk%OuRMtq;1ZkTa zsav%rZx2#-EKx(>K6y7vQ=p2eNZyOceMJ2bV;a$PsA@(d^-SXoLm|hr%#zQ+tzn+E z7TQEz1k&+RNb2R-j#t2AuEH(;_kh$51Z&eam2D-^-_c zKwR|^dGb++aT=X>26dc8-Er}A8^V2|ft4;H`T@~pU{qfL9sMJR;iqos25?T_WYf=x zegRtg76|oSI*X)D4c>EQ%g4$rsc?lfrzzp;pXbOYD*83x=oOx2oiw+D=|Jlq-UsKP zJeuo_>qTEiB9Nd=7!O>W2+EvQv2aN&u1peMRSg7H4boM^mcvPzqL9`VTtNql)JUlb zFx1Sb1jy~MKn+{;FzfB1OMi&HwLX>lKz%EBm4$aM zigA0q&RPS@+0LQExnY!tC?A;Q0-{12x(zi9!EqJ>s5FvIXdDKNu_6Fr6G62}3m0bU zJrPrYi%h*K7no)S9cG$6i-Tw4;z~RlEb}cKBtlDqsxr$jzZ(w0m3-#{6{udf@f% z(Bwa0nD4_`egO4;2yQ6&|0$50VuDQWPPw6#%J<1Pw{in4HIpIJp;1gOQfYH<$1$M%Gx50B7h;A*l?ZG#md2 zE#s&rWk<$OXUe;E8+3Jt(L=Oe8GWXTEJmb0H^jNZueKB#caDS3a}5?|e)G>2ONJ-n zV&N6kqs1~h0t0J~8K6>8+2tD5ExsUGTZ+;qSzVyj4hWmfCT|vDnjCcN!#h($xl$w7EK$~`wpB0gWog&$B2?Dil2o_oDwTBV@$_;fS^L?(J{a~5 zuJQ?0hiGNLDvtuW!l3Ew+syU@+sAV{0ZXVdGB^+qr98uELJk3LzGGwAPM|3k#w>ajb6`SX2 zZF`{TvE3$~SPS)37qq-Fq*JE5&IFvN{jDR@#bn+^^vRr1&oo9?LH4z?Ct`B})#nN< zO-jY&pbeA=$Ve?dCo^bAoLWOKUjJAr^OOmPHix!h3)%EK%}z`~c;L3ZvZ&)o#vv!T z282Zf(q{O@z%x8go&WX_)KS(fAIfe)1g8ykH;scuPBrhqh)qwm+{<9y=i!@Cov00y~|}Nwo>ofVE?ACPt>UFsUt2 zrw7;sH=dtOXy)QC23WV@B8DPWBK9HR&{+o1ImRYH3IbR|N&&QUAVolvy3PL9>i0zc zoK273vwq4q!&{_xFCDKcwv$?z&&K0}_YC~8=-Te37TSAqz1RKpm`iS(qkg=aySsU) zMRaa)dj4wl$_VF&d1yPyk0)>WmU`@P`)~Iw`f=~Do#Zv+oLjO*dExCX|8!0l$TM!i zMjL!>z_pF6fmLX2YS1(|8W3$QCofL$ez%aso{OhTFft}0?;5AaGch`+@O|~6heYd?&(vVQWOsz_$ zy6T!S@BO07Y*rMd>{c1AvRGxVRM%Cjf>ITt6h-l^bFIECm+UeBy%unS6DFWI`pY4I z+;&aH!!eFoESOjTv7lk$K#XyG$OBIxRc`Q1pEHD!Br+#*l9=47Gsp=^98P3q2u}nq zXY{x{zj+ft01Wo_jNn=HOb`(r(0hA$+aubG%AhPNJ2(iwK@92!L;%D~bjziy3*M{EH(bwFHE3hwEJ9O?V3_VRJJ{@L`Pr*!R`qE3; z?4WBJ*3#a(jsAk#K7z3^V}v;s8#@ys( zYph>qhUDm*xVJufIb$MgEM8*l8Nm(<+zrqLgcu&js9eD|5I6W1+#+s8WrrYJ00G39 zrN~++m^OeGB4q_zAvhM=BGxk&1S`fwIkx312+^((D;3omPV{QPDzuX-Kp9gdo-5?4 zQmYz-ic(g?i?$-$pi(JBePt7sRcM!|Q2VM;O~;O&Y9B>|igBt?rZh`wlQa~y z4Jg|nNL0%}sR1mV7{-J!omH8TQpS7YqzvJCB0M3^gdu!vTa+Xa5qt+m`hyS+DWa(u z0V!h8BOn4nbU=h+2qPUutk6OQTH)%v)c<%?P*uB{64%SeoD$KcLJKLaz(PWGk@|`` zRG@V!=wgcgnps==a5wkr$3IsatK-vWA3S{Ti)8i&!hXe4MWsr#P>B+S@bh-9sqw9BP!70fZmMxc|IhG9O zlh=BOk zy6J&3J&WaoDY1J(h#BdQj6*%a+|7I}DJxhGzpwL@lJ6ykq1>6YmpGE?yEStMtQtu2 zxya3c6c>=J1uPAPlJ7-_G>`IKZbPKqXK@+tBXStvAw)_Ma8t^Wl| zZpdUTDh-3=e~vI?ODYOPO)k!{q*3mEz)Qmc;d;+cPZ9pkkd6m&42_^6gzb%s0u&I4fDQRZvW^AVSgk__a5w^ur;BMVVyprP?rXTOJ}-;S zg+qDHCH%#k3TkQ#QYwb*9hIlJlI~yzIRGDAxTdU{_M7E=l-yK@l!nVXWk1b=nrf1! zVBFVFV?|V0ab;n$&+EK|33L9Dl~TXiq$laO5s=z|l?x!_`n|ZUnug#f0UuCugIzT> zTwEmhBn-$ZpI$?>;NKWA@Z{LRAID^=P+w9{A;3a?%ZnlpH!nFpO0Rll| z1Q5dI25p#KeJ?!-VxTpfQcB?FtM3i4pQNO4N$-AYz1~A_Fsi*`g^CdcY3;0aB4VCNpglxsEnHjE9VHq5MfB- zN8UAXiT6b{o?e7dQo6X03hTT3=wOJ=Eb=dGAo>++oz<^hD2eF0N z|5Qq`l=K2hRu3N@{*9w17>Kui@ z%S!S?1(OioZq=Qj2rVs95SOnx)6#4Bnk9Sxb&q;YwKPUI&j4N zM**9-O846C++4VDRg;HF4jhB>J0$%ol#rF!fRvfQlv#{sBRU6g<)RZD^Ha%uhpcMe z9+7uSZ)-fdy{hpbN{`={S`8nnyL(J}N#oJ`_>h;28_-c7JM-2=#$!OJ<=55uACZmtuezlyD_f?zOxyqq5aYW=zwrUTPQJKoYDI^ZCiHK08 zZ;=eTf~$+f!8{&(;vo%Gu3sf?p=@FEt~ON%04$w)U5`X(iCHk!>_%!qVx3S}jMiA) zuti>p1Qy!vLuyGaGMlQUva}4bAhDI?EOi5ZI;*yy+kCD*Tf^`tNZBp?J z=by~$Gpx*K(yssW_HQm*i+x`^N(28Cm4xe;Qd3kTMz~J#^xLm;0_cgT$0xpz=Qsxj z-Oqq;+Xf?e0o7gEFFQdlGSaEIW zw0Pwep09fE{oP1;H>tVv4d0he+P741ow}{8S+ihC>4i=#5lhsyU28Vph;dB=tPoS@ z1pU#t5Qw=>5N}+#4=6MdY`z758Rd+8t@+rU1#vg9tjpqX-ZHK&XKekqHU|5ISH9SSBw_nV85B_pAhf)v=Pr z^{Nzxv02K`o+9v(LH4t4{DTc9B7iy?Vqh3#Y>4TA5JXMq?A!w*G8O;=h$t}Y%-LlU zG)-kKg{7*|XhiLAK4xy@MpIM7P}OSoZVukfsk=FHH`|OxJCnAms%k5C)cQ?L%BYU^ z)IMCe(;I`JNlBHEP(~jiv4}<}L?9vxSr3q(<^Mck{=3hJ>5Mo|>}HbJgh{cO8(khb zF-Qd_vrwfvg+>{01oZ_w=yi6T_bX}Zw9+cdzkudP@K;m&5vlL#d_>-oPGwcAGuMO* zkyAOding6{cKe-3qH?V?&;rOx`sfu;tM7$T^B35X)?R*17bnK0QYc%t zEve+Gv`M8(4=1_0Zl_o#2NRlL#T1k>rKt`a}mQw(d zP||@ZL6cCc_PmJ9ZL+sN?VF5n9lz>Ue=Vo}?O${*Ef=y_2e<+8F^pEE+yhCj8U?cq zDFu2oA>~d~`_dc&kN~;CmeFYez}CcWERh;DEvu~PMug%h9S1LqU?Y+Dz2Us5teE4j zSoO;QK^Io#G60RGyNX&FP>@v@%4Qh~SoNZ66yly)bs(}yuu&*O5hRFclM$D>Nsm!_ z*s^oq8ofv9vCzJ3UExfpd(OTUlzfCjfQ-v0dHJ60-7pFep^%A!OcZ`S(!9^Qds%e- z^^R!v9{*<4+!5s)$HCRj)y?yLo{dNMad-c?`v~`qXxeN!MqBzm6dl($;ya%gqyAoo zyz%nq;tetWh5!KZcZRC@lb0>0d=ewl_<)>MMMIY5*4qK%g}`jnd;n zpb~*cZ1fldeQnSS&;{JC(^|~R!pp1FhqIi!>pKlu&1z=mtnr3M2uFC|J=Q`JQg?@p~C7eqj0sesK2kl<*)RlwnBnZ5( zG#ekr*G+v#M`pP(tV37#1iI17K?s z>0j}2dH&F{zfGCJYtdAf#0gw!Yq-()P z&H9CE&xvbqX8nqt6S>cwIYGgv&5f&1A2_QRj@1kMGIJaF@x$!X*yNkID-64mW{a|X zr{OfCPCzYr8Z!R@vh>Kip_T8*FLPsw(V*yO6Lg$n#muTGRYNcGCsZUOPf?BhA@SeD z{j8SFuU{noAK?!pKYth{Z0ZddHt^LzQ-h-hK}MR7zx7I}yJcP52bXY`hG{kvNQ=xo z>k}y{nbe%oWiAJY18!F!Gilqe_I_+P$xqU^YR_42E8h0wO?0CEzt^UAAVBu}{nc|Z zqc!-B6{m|VrvT^`sWk&c;Avn8B0s`n_N_E#jp6B;-IGehz@yGgFp+NyjwA^pE$75$ zgJ*1Z4vmx~`5KgwTAo==(=kD5cJcKy~Emcmk0Kjon-Z8*)!_8(!Wt4*FqPC5Yj$4f`(}8%d+Pj7XUJmnF z(d!BPV})l>mdoQd+if#C2F7NV@m;(f`yjvta;E=9-}#rvaYf{YjFOtp9kY9OuDe%w zt&b3qQc%^@GxizZ#YcmjH{{jb`b=DW*CgarH1v!tY#iAwjbrco1cXE-q~#Qq)iktp za^G$H>JLrKEUaQvf*pG>U;qIzQ}mXy4(PZ%eP0zcr z51+o`yM!p{e6VSI*ARj@cZrOKiHq-=gq$jCmc3p=JtGSn2REO9P>y#0z2-0>EvKlg zrlF;yZ)jq6S>WReSBOoCcI?4`0R%)8bS%7^aR2lWi9t%?mX?8u)dMFFzhDlNrP-pG zl$?^PhPIxesZXoezQyQmULRr%zyJaw3OW`ZAu%aMzP-!kiM0$&tR6Ud_yvW^p>Y>H-NB1IHDS8?u&igcvoQJ7)LnT)ZAV ziHJ+JvLk^hcvkhI=}phOu@9fV;(P7ysL$@|PSFlP5a%wD(J*oGU6VBO=AfdXXJldH z;N}w$5|zm5XnNN)r>Lx^p{1j5Xkunzl{W{v_N+xGo%Ph;0K<5YQ5t0eW6iWB=TmB; zbcsb+ihri#AuAjEk7$J3P+O7KHTr%HM@X_R8sQvjr-TIx8nj4oWCR3L+at9@((33f z3diJ^XoNGU-6geKq;`+g?vvUBQrjoB15&$5N_S}5&KEGz^b;Sv+C!f5lDB;1D?i!o zpyN16a0nJ65Msn57nNwnFv}cs?@az(Exh=$E3ct;1mKEL18~ic%-tVxl(2^_oZyZV zpNDe*tLMt-wFQ|slK)*z7j)r8+Ng^U@~xb=zGOiFu=Xvj@x6;MZ!w7 zBf~a@ZIVr|q?_A!z3b-_|2kWhPaHdkyP`o~{?}F?c}L*^-&RyKbPP-^Y#dxXHER82 zC~@@sFC^qEPzVYJ4gm?JLZ#o)m>248-U!m9%K(unOST-j%9OhZ1SP`nw=x^-0={(S z9{>&L_o%m?Kd8?=e^Q^efAhBU)!B*h+K%1H(u~fR3H=@&v%g*alrvGcN?oAUGAIm= zKv8LQje?>IR83t|OIt@*AA#iY1wye@=6P7zDptF?(fN28!fAX$Vp4KSYFe#NdR^3_ zTeXKiBlaZ*i^CI$Br+u)pYE@*iK!VDhbIt8WD1o=XE0f84mWlVR~=W^w&2>=F}nYD z=?_`iIk|cH1%*Y$C8cHT1qDUHP;e9n%7s;@E<2elHis(`OQbTnLa9>o_yXbXMMKdr zG#t%=Mxc>s6#UCxyIj6(#j=&lRxMk-Yzr2LCjdkenL?$}8BCDH=5Tp@=(4qN1kxFW zw&HVfE8^j`8o3XZoag`Y_g;At)C;NYN}x2A{8N69b1f;bBoX-MkR8Y0PjxT)*{^=L z+)97?sh|6$U;C}!`=dYmtH1lFfBUchYmjI2Z-M3R;j%rw z7dwe0GKETGSX!CI=5Tp@flwrtNM&+`Ql-{tb$UZ3hn3O-1cB$}EabeMgT`QScmk0` zrci0~nXxOSOctBN<*K8eZ+*chv&T2?ez!4 z(RkWlkr&Hk1%Mj}MoVPP4oyH|8v}MqWWtNm&&z z91sM7!r*G^8k$<#I=XuL28M__Yu(UCn31uGsTmfBClE&76x~o@MKF3}jl~vD& z@Xd!BX1EbXVmOaqMII{kv=O6<7FVBM$Kn&9sTI&{r5hOyAlk|?NI|K_tLf+&{QUp% z#jG5}B&1y2ig!l*V9jczmH)y18~R za0~*2LNC*qY_32gk!{1kFdP^pMn<3zLJB1`{2nr%AM)ET$}$Fn`ee569lEk~6`(@- zfz_q1Sxq~u{GkV+Li~!vG;V8FbB;MLvX<+7tj0g zHYKf=l0sO}OgCc|SZ15EXyoXk`SRp#EseD{+GMjWK60Bu+wHKES#I@e*M#o)TQLk$ zSx$FG@O0mV+%o=Z*SI!)pcQBbI)E#JLFAMT+A~ zNlO2V$l9GL=}AmR-_3($TqbU2;Pvh^zuleP-M!tfE-xiESz+F*=I3dnSzGONt3`L( z>!724ND4ah%`(a!!$IQl9=2wW0qjB69lq}O(T}jg&O8Mk1PX})&@R*`XrJHXe$T!1 z6?g=DjyLY!%xwD)kcb4IkPu7&hcADZ`C3Hrb zpUXySn04fxdoG1=`ylC;VA_P9Y1fCZCxo8)3P&&XWO_gJZ`@?C`!_?o{|Twg?|GCL zd6$jsb(ETxQk!-S%>^f~zFqvDFm2AF73;R_I&jS64~ApOOukg916XUou(J8H4^H`) zVc@(Hq{&tYg@A?wAg5*Kh`}zDPF8EzN&m0(8kz%O7!rdgQP~Bl=^%{pRJQQBwu-}D z-_+W{vrqK6mdI5az0qQGxP5_8G?C5~%e6+U(;rS|3kUn2pa>L#8zG<+Wh!4J38a-v z)#}us3RI&G^=n9gFts!gBUZ9Z?HD+P#3K2evd@*S zb*E=I!?`YUnXBC3R(HAILk5hw<$)QqmTh{=`y-~{)ajBy8rc+rf&dLpK=Rb-GY96% zTWOWm)>wNzC6-n}WmVNwdp!*_Qlnl})5P>P+8b1CJ2b^i^F@f0B1^%fQ_nbXMJqiF zS2y+=UQZVTFwDMa^5`S*Br3ZgH64WU2iUWjVWw_-?+g$M^G(uZO!njtY*4S2jx@Ak z4R3&vj&ihP9P2oyXna#X)l)ys(>cA9JZY0X1yeRv(=e^mHT^R*z+lsw-Vnpgbi~nT zWA>8$LKBn(SAu>;FZD`ZxvO;5ukJOzme>BeT#tL^`ra!y_=aOVyC0b3Lf{xm#*eYR zt~`eOCI*u>c+4f6JOR%+Eb#nf!45dwg<~_8`)f~=!A|OX!ee5C&*4}28X z?_1cQf5nD<53BbdShpWzt$wlHdi_RYeqLF5JExp>hL5w(Iqw2L{w}&AK%gL3T@x&% zudE{lV8EiDnyZDB}$cHD_5b?aayl` z>J4DfkYOW6jlG_@`?IMfHG??|7A;w^+U7dj!nPf|_Ut=w=*Wq47cO17W(wTgps`KC zhL(eO?OTLvX}1mvsPd%tA>Lxp7-;gP^)Ug=2q~f~klv?63MpYIl+ouT3MpfPg7hVs zLMm8bGW#=yLPxN{W%XAoU95@&A-k`&4?;(AA?5UUI?~MNKZXY-w|_EbY^K-}pgxyK zW=okXV_uF0b9^z+R}1)N;o(J#MlQtC^=ip75D6FdL+hu0>9>}(qCe~Z&cKCQPT8;~ zn(r4*s!^d#$pjCzDwQi83D=IPP+d;Ygf6!+pczXGj#fNv1PVkHiYby%ETu$7nVfnB z4N4kS4Em3DB6moauY>HVh^MPwJf%-PKNYtY8Xi=yo0*(3(2KD10C+hmT#s@<*a95&oO3Q`%jaF{d@(4r) z!W7}D5CJ7h4S_l$O(a^#v{C4w(nX_B3<4dJIG!Q+h7uS?XgIMEq(-)8$0PT$W~s*7 z{q?--_V*1h+JF0S6ZrPe)rS2`Y}|ir+W-Fl&HI1cjt0BrPe)idvZ-bU3kQ#Yh=hzn z#k9-{fB4HkR#{_R8z5HnaoZ^!)p;gfY{eT0PO)>E0}EcP6l2eKVGc@c@zKtu@hSG0 z6|eEv>#TZ%b#JoiEw;SPj(6_2=iS)%UKTX}7AQIk1UmbAD0EJCK+%VUtbwti@J8RV~W6yWzf*dqeMT_MNyE_gVE~IB~`G!M^(JY$07CfwQH>{){~q zoc=R%9VzBsp5y3Z8I{z?B``nfmmo&hlTS?I>*WT_H&OgRAL$hl%gIh2S>|{KpS^SR zhi02^RgbF&DBLsVK`w%ES7xBM527t37z;654s;d^~VQC&n?{miBoG22?g>}r`X`&xa==1?2M zj@LHkRC}0n?PV@?kh#`zcA~BsW2+l=GhjWaCvnvCdKGV97$N6-cz-w-dUS|?kDV3~ zUBq}~eGzy<7f=zzQct{VyoD4hukfPyiz!Z^gc1cyj;W-yGK9(^C@;4H6&2+qRh86Q zzg+6lQ(ptdHOT2j>uHlqqx-Iy+H*!{H`%XdHQPJq^{+Jx+Kg&(yBQ*Y51>rKDjc~8 zYap45wKYBc20Xwfd@p4)fdp+K62Ub{QC&|gNjH;@(H&%xb0_)CZDpCW*PV#qV_+wJ z!kL24Wa;Ov=X_cEZL7cUO22On^uv?gTk3Qhc-J{>h`yRg+avafd&3v%3azFozmo5hc23@@t+|t_K6Q7X05Z5UY(~EV} zHD_}*cPq-PL3=|4y$s?}|Lbb6uIj(JH~$vI0dYXhtwUP&2*-RG3S#`j8m~w7xK2ZC zI8P+h?1-rX6#x>@wA4Z{NEJbruQID9(CJK=+(#5yBP35Y6`jHczDX+9&Qte z#C2`WTtmmkBjqq2?xXamJ9>_1xj->f_cNJ|Isq&P)*d>_&Aq+%6;Aj7xcSfpxci9ja&mR@mUux>e}<6|FtpoMQr;j; zg^HA`q?@UqLYRNFPy5i}2n^=4I>6gM@x=)v!&%0H=JlqNvNqh|*$K$@Ys0K46|aM+ zde%m_^jzm-=4GzHZY`E+6fngCD{OJV5m!!dnE*DIw?cU=uzhQfm(A7GoSXKVE6;`URbX-Y zO z32d=baTeHl0zhU!Tk$cK>vB|Ju~)`o7<@ z)6ILP>(iZO#Qt@DSw;^*T{iPUpjNlN_elr+6bD2sB8Q>pgmW!dhnU3SyKRQCI4 zS(ogmS(ok?S(oiMo4WiqdyX&DehZbk%YrV~q@apa@vAbqvlu(PNhW|15P6tuNGjnP zU7k}Fhjt|A_eCgvqFP4yM}obv#AwGl#>HOkxDv%_HHXiV=Y0=wL+Axw%Bhi!9BGq! zNuR2Rj08t!;_JCfwuWe)a|lJQX5!Ln52@)}9dbG0LXn9Y=ue-a<<1I=ueH9cXdB9_ zJ>S@3rUigwu|@5k!`fbe^j>5Ty@a^E0^hxg?Y#!Nr#F5YWZ3&=$#*~e^4GtcwJ$Z~ z9&+-8+Ji5fJn|`M0Y=bDfq+`-aO5~nIOD^sX* zKMS@BK!!Ds{uJ;gycO4KwV?L@Pq1b{Q=w;kwrmG&3#>x|rhHo#vL9dqJ5G<+`m4}T ztwhUH9c}?A{)j2yN(b9D075{$zpJKi&)F-^R%Ox*P-gkFJ_Vd}; z)ut_gBjpNGK~pocySTnK{%5{_`%e0KhV9L@(C@Yh1(8r%1sQ5J?(i>+ zTC40;s!@eH^S<=4PqF^jL@SCp7P~B4)k;=&?Mu;?oyKd?fD)&(q$MeNU90hS4>~`b z-Dv-omFrqN*>1N#D^Qlr*V|3e=XI8?kE-dKvfXOmTIm^T*D?0XSho4O$>pa$GPIV~ z+@_!8lX946tk@Y5-!P~W*!|M`nBPj*gl*^~o^7~TI+>Lk-+~smw3R%^%YZLd2!snF zD9-5B&FGDKR4;efKUpv8Ch+Zd2Ji+aFlYCY7)O{Ty0dp3>)&85=5ns(W`57}ycz4P zzmz0tQd+Wt3@)TF!;3Ir+-XUBx-!Mu^SZ25q&|&lPHV>Z!G5%cr#0U6^8cArbnzvY zT3Y#S8~RrjtSrS^$w_7MbL5w#Ds7p{vD_+Bp-Gz_>uhtH8!3DEZA%~;B%MN{NKq6h zM=3fKBMK%KHg--WYSd}aq(z$!U8c))6I-no9Y)}qhG-KSTbF5{ilXvRg{Y!bGF6N! zNo7#gsXA0csyX!vHH;cXP07s2Y|3oO?905Dg`x4&glJ+kNt!&(k>)}3q!ng;qkX6S z5QB;##CXK`#014e#mHi^Vy0qVVm@M{bZNRQ{h35d-h@;I94U8J?xI{!ZF+4(ZF6mR zqt4bLfeB119i$r+hMo&9n*xKl{_)2*#v+&R!fl*q#Ow?5hUs|CTiV|bf^F2 zGn&=PHngcNZRxY_iK*%Dx|FI_uTisB?K<^H#!{eMomO4O z)O3&-QzmyyG7~aWsdy@pN~IHm+9ey;zMe4;)H`xG1I=TOWJ-YudH3CY#DTC!bw3)7 z^i7^^J$s+^CkQ>x#br)rYs(Autl=iG0P|sww&4Q-a4fkl4CNfqoKcp|f>*$k(6c(M z=i>!u9{Sj(wscL`h6*Pi+5eMYHQ#wHl6Y_(yw-wo??Q2}0tZ??h~Mde+GcJ}cIVX} zCvfC0K!hZDj>ckKv5@Z0yWmx{H54BR-U47th}mSk*+hx>5=c!#w34_T7?_3h=7 z=BlrZ;-%JCe@z2|;BEP}K6qIX)OKuV^<6Kb0|;c4d(&>#z4jDI{$Y!n@!C%Sn-7E2 z13bUe*{B9~1WuN9;WI{_8#jp~o&ZTf<1RVcfCtn(y+@U(61A#JeZTYcPS*HF6~X<( z!u~~z{^s4VdBMjkuJMWnT7QO(95-7Jd)nAQ9W?Jw*tuIJPN8UsJ&6X~%1Po-YH`Bk&tD`MuxUb}D_>XH=$&Fa-NL;@s9mQ6CF=?Vo6zPA_=WLH;yk&Q z(T@;$%*#h<2&Ji&6lQRrwq<*qtkTk(kl1IobU)wcfo@zKy07KcJ~P7oAV*hv`oe?4 zqIjdjjZ6}`sSbQE!T6VnZS=4*6XQqmw9#CA_jlke6yXk;gwxR*9*82lb?Q^A)mq(F zS#PgKr3C=|dh!&7TOHOHHQN3aoy!;Kip@2CHNk1GqVCYY=QG|?ZqzRQ8Qx#ci0blIRLIjFaRaVw@w)8`9i_<-P|z zB@-BKfyPacxD_Yvz~^2B52CssIg&?7_=?yI6nsutDq7HQitJZxAFre8{VCKRf}L>9 zY4J{pbyCdG`>SXuH4i7dZNzFDQcXjxWn}6brG^JT+Ln=e9(P{HnU{4cG`xs7pqai` zR-&*vXLYk|QU77GS+AA4(40P7XT56!(0NceDED}WyyU}S`(gmQ#+rH%P?jn6Ojb~6 zT1bd+)kKSARO?}anKIps20QgY1BYhxY)(9si8_%dno5lox!&#ZfLoqST4G!+>Wdd+ z1Pd*Wzi!1_>~K{cUsXK)_rLs4$;?N7SIuqGxsAJe{`+?1z8i&D18uN0RA6>vu1ek` ziSu?zUO|2wwY0osbzXP1CU)DBzF9rLz1dM;j>v)WIW(1VLrWvqZGW*agDf$%ns7<) zJvEu0%`t;{E2Gm!SMKeh`ek(98Jc&8o?|sWp-@^SwO;CY8K%5sH}c)$_sHDlqU*?t zfk-jc(KfrwJSPKcr0219mRW9Vl=jP)t8-Claag+!cWnFApA~r_9)I_qzxlzxnrCtl zP;Mv}R3!KaM>0}c2BlSGv7|QDsYq4IQ<|~|b@@G#E)UwVSNC$4y~4GwbKM)*Q`Pw; z*Ztmo&%NeVr@JoT2va5g6$r#44sUqV<#H4+XQ_)blIZYz!?rBm!7FqwKiMbuzz)J? zfa>ny3dmSX4F-gRl~k17Q(kk$BKc+Hy{&i9@av(vrmmsBcBAK(sMuaygCvQly0*Nq z9E|tu4grlK*7%ywC8H5S2!LnXOE4Xvm%e8))C##oTPC%0HoZRT*>=4r_>6D2zEAol z2f|j&?YqwX+4Ei|)0&GfrG%1WmQ-q>;!1*abqDG#P*%})8`@sO``^g+8{I)~2Jd^W zwYOhu>+WAos7_D0=9AyYJfYK+uH2pE@g#*;5T5kuc$fn#)@<3ZWA8X8j@)?hHreg> z21AM_r-E20O8@$E{A67C+>>2*|0Xr z)_=x-zv#VERr}HQ7dzf=uowML_74vFz!uWhR9KiJ+?m4_;TGv0<*{YGHy3m7`QY{F z6Y-7u`8jTsFix60o2Jat=9$MWvX;3s%#Mh%^40~L08j*$KxJ?RQiaxFb$A2OM24sq zx{c{zySN^{PZ$vU7lAY)k0}%Cls2Q!84Ko;wPLS18}633;u&ul0{X9y;ddsJ>CES!K7`!~O>1ngY|0`ifp#N3_ z44_!SK#C&_qS(M-N)d)owirrf0>c){aTpFGC>LSmhGGDtC_9X%n8O%K7>uRZ!MKIu z4C7%2EoPXxp_sueiWAJHyk!pMDRU_=m`AaP`9d!Sg)X2DSZF9LVhk+0KNS|+Ep8)N z!ltmK9bhSY!qSdm8OO7%lUdGrEbk&#a5F1<7c2P)EBgei_ztU1e_=H;5yk2#0c$KM z4Qs+$r~qqkPz%XFBXunXEtR)i^Yq*$FfJ-QixRg?e%P50f zPGtmFP+7p0R0~{1Wd>JMC&D$9SX@h);yTI=xSq-!ZlL2Y65qct{iAVQm19 z7zmH*43Fstj~fI}m;g^&6`ry91dZ@A0iIQ51x?5zRZNTuqNI^6;J~72*BuLwryP|2WFC5g3R1 z$I26N7-2wz|)!=11|C-GVv3U zfuD&M{6gg5SE2~N5j*&u9D_e7WBfT|BmUz|mF6>-6yP7E1pksU{6~iPpSVMVj0pZR zh&~8`A3}*{APf!&C;B1>{1HKnMPx_il$eRjq#%wMViIy9fmkzsDHX(!+ss;41!?3Z z<{+*!Zd+1_HIN_86fjFH;es*>5i6sx>$S&8#F{9A7K#!}A^~g?iLH=?3CYA3NWmki z#5PF76UB(Fk?zM$sFK+^_X|EKN$iMH{jLrOakPi9stj?svL9Ev=KRDyco-IxH%HWp zfMT%Ho+P}*POP6)72(O zb>J*@38#8+uKI)z4d4iNG!I}}H$ZU#t)@hLA=(tb)IC2V|cHJ5AK^ORpt|Mn+xPkBKMgq|te&I!$wLLn*jCp zCQT-ak+~)i##TxV+YSxek0joKDt1sF+6hDK3YoI|vi@#M|Gb2UGwNFe)Ovh1TQ5-`NA1HQkCT*JoHDNpkSJ`vH%?_plyZIq zA5K#$_zC@-xpY}a;!`?drKP*v7x>`(GDLllxw;<{u|0mpq~C}waS`J#5hwT^|NRko zg+DizI%%cAtNgvOQa#eLftn*8P+UBwiw*_VPuUB&Y*7GZw!)lb&;oMln1L49^!fjqyJ7r9I*d^i%!S&e+Cd605-~MOw z2+1A6DeW4TNHP(|ZNU@2ib#i@MI`3`T305quUN8bm96wdm6O0ugks-UKMC9z+BLKD zSR!r-y&aEtu?E$z;B6!WU5S)E9U)?t$``TaBc_;#&f+SqHVN^z93F@6Wyw5TAxo=A zilL>?o`9`A1^2a_X*MpP&1xK4I`oRw?pZjSh789?lay}H^CuAxgt+Pcn5FkYO3`Qp6h>L{4VPI2w1Dp3$Z z+$!JOU9eqFR*ts^O|`#rThY~Cf=}Zee4A526LNZe*ppE7dHcA|tnsvdx7f@f+Sqkb}s@!<|dRb@Ay;y`3Gllx2_!-5u&*L5$u-E6;2O~;#IYcu z;~Fh;u8`~J61ibNT@mG6BoX7goF{7kJK8w&U`=8t{Y=NHO4ad#J4v|q##p*`uSYq# zl61RMP@HCmEEn%I>WX-F&CcD0M&bBIB=L$YgUhrk|gD-M3 zm?Q-?26dqt!Mn&`Y?ERs(WS_(lmQZUnQ}jPkP7wb+v`-Sv7oC2bELXV4Sj8Dom8nq zoYa#eX*f922!7JE-jG@8FNTq3X*pcF6)m844t;GLv9)u=*HK66_zI59dN^|Hot|8E zGVo}3@o@b-QoE0*8^pxMFu#X*vq#g5+>G)p>H_0?g6Dg7_+EbwBYSa}qrZgFy(w3h zSio;nlW!ITUhh4=>;r!8BYtcezxD~=HUt07B6M>ciOqAQx9~Z#o9q77rG0~dEh1=3 z2;6sE*)lE!P!$B%gCai|27;p{1R_GBEEGyZqb3Zx;zWH|#K(mP@t`;yqT)kg{J5DA zDicOncr+%0jzrNA0d*149SMVxQ4s}qqM|JtYNLalI7*U0XObvL3b{$6y+asE1~JK^ zC^^J+78Vyaz}aIIHxHZ zSJ)N;UQI(FwvC|Qv2YdFxWQmbYzHBfh3gCdd)z<-Wh0U}>4;*Ji028Cz!N5stsrUP zq#+qh_6KRSuvKIrldXY8N8|sOg$g!>O4PF@G@y}fpb5>J*M}BC@n~Hr1#K87KTHrM z;4vlR2{G}MlJJaD@%)bgpBH#Z#dw7`1i@QOQYog0itvu@;yvZz1KYz#%EvVOk56r{yi?lo)@2e$O=_f=sVJA^>|ulA@Ku`N3gibwAP z1_(7!;S`u7;7;H;&J_ZRJ2VVuoWv8BJ}x@AS>pLW2fX+x5+LX(AtE%0(z71II%ND4 z1E#-0f)&a0Xv_DDd9>lq3y0XT{uEiqFN#JuI((cPc?!HRDC?s#mN7_mbYq0NbfV2= z2A(ivWRfx7GgY`4c<65%&id>xJG(n)#re<+_`^5x`r$AC zczO~4T#CP!k62iBg`WUx0{IKF?y8Hf*%0iK5Sv0>7G?{Ru2kdFrXK0D^khuEGH2;y zQI+MsY**yimMcJ>9r*&?w5vdnLVJo_RqVeK*Ob~LBuic1rlHp#4t%Tk&)seFpr$xNGcCdK7xOxvLxiYpSBHks_n+)7cp z$>v9I=w4~eNoXAusB!%PyR+EYXg`iLJP@0hhvAPVDR_wl5ecwwfbzH2W z*QJ&FE7sWA(keX_(iB%8A$Gf)rBy30*1VKH+DEaL4wgRFJF(WTl~(JQRF+0qt9M7N zy)UITdLeeF3#B#dFV<1{(poi_O4?AgcAdq#DqLEpwo<7Zy4J0y*!4=5hSpFlzIvs( z>L$jhSZU*0iOE-~v|)Y34p*j(K}{b2xc90FqorzNWuCq(UH=~Z9J^UONAG=ppY8~5 z-%(WGF|^)?2)~bT>yG2b3+3|%UKrot7tZG&yc~Q(UJTF9#CjknVTpweKrWIcH*AuJ zf#CbsvAA07kty3 zUiTDy_cXnsF9GOBQ}ibgFH)wL2+Yeg-7E0V0GePZ5jTw9F`CF3L;H;-hm51W#uHf+ z=v}jkzB%-bW$?ptSPHBlXS@X~fR*H&RWJ>#CT`ZiEU=cGv<~Kg^~A#lmJ}3?sl6;%F<30o#a^?Jy3!L!9k^31BC2u?t3l-Q>7Eu-jhJVBg~W+(nw~hrQlg zIWGfXv-im@2VtuZNR>md&0$jQ2yAzh)HnuPd`K#N1ZN#5znp;6J|;hW0uOvjHGKw; zd``7}0k?fgm3#$veN9z-1NVGOk2neUouaC~gFC*b%6@<+ex$li!!tioeP`ggpQ(Yf z@WMH2=sY}if$I5%2>6v&`i%&=NUL2Uc)!zHe-KfB(t3Xpg1>2l%Y^6(ZS)Tj@h`3O zA35SG9dnJSxK2miAV=M#kK7`fZvUoFC}H3rtA)Z7CtiXL!XrgBK1%h7G=;XWWjNYr z$LOR%mr*NBS!KeObK6|4j>iqzIZ5_BFU*0Lb3;4taxSh2s70Wl#$0vnA5#1W!9rRT zDy((a-55l;h~Y#_s#~(m@K|m(sQ^1=OON1FJgdE-RJQJc}Wj=x*>XFm|h#9x5ns|hp(IQ$auH+e!`O&p5h6f@g&c` zc#0QZ_rv6%@1{0e_Rjl^eDE;?p9W7f!;^j9e5zRsgZtuZo4ySOv$#2wCEs)M!_OT3 z8c(wE+w$_DS;33@#{{i10c%Xi2IIH6If^aYS=q6dm;Zy8Fe-{co}xic$N*A+1(X2U zK#7nKlvKzAa&>J2$N@@)P$&&TARU6CbO?Yl3Kmf2*%Ocgl-+Xzl7NgtB9ONa3$%xF z!5H#`B~)721`7940r5b!;0`qcCa4Wup?QnzoG%B>2WVvh_z$!YK0=EM&!NSA3E(oc zwA>|wmi6@j3PBrS7ic4VfHoDLL7V#)fRoT;Py+NM6a&2s4M49z8PMxc4~*dY2$P03 zFd1kIlZ%!xes};=T(pK6cODPm3T8r|4!{Ky1I}QsLFHhs9S_TOP$8J>M@8owfVmOy zNNzH!$jz4bom-3yxz(s7`;F>u2iyG0_!H5jw;90#Cr} zNz{ecC#Vy=`%xqK%0=zq>*&r2P}6z9`c2`t!1~SbO0a%&a&K6_9qbL(??m1V>vzTt zVEr!SgYf)O)J5R=qp8cm^T)v70M8#wt^>~>2iJ$^uU?#%>sWH!V;R?r_gly}&%6WZ z4+Sr;B02y0_x#kEg`>g$G!6D^7l~!u!`dU!f9-#OP^Yk|p1mcF&W!;6DPyjT(VqHV z;la@hcwifK*0Z#91KWTaz>ZCO?`=)OK~KER{m10N;ln~!HZ_h)sw)=!`SjNB@CDwb zMV8+D1Jd&b$L&+1Y=wC*ry3_DnAZP_^DrFQq4OSm0-MbzTt!o2fPgnW4de3%9gDZR z;lZcL^uhh&XtDD-dGl`U72R9OQN~}XSK({dW?C_PEw*YaVVvd-cqH(qz!H% z&Z%5zUc4q=A{A1_j*@-b9Ar5gc$rRe4oJ{KaIMEe=2k+Mh(n_8lQWbCILxGC9XC0T z!qS!@pNyO?j*t?M+ewX$e`=z&(&lQ@THC2?xw?~+<%U$)iCVfBx@LFG5Y#iDVBa7na4 zGT!W^#>;uWN>XJ%0x5X2o!;zL3^||Xr`1nI1KP0Pr>*s&ETUNk8%$$M%t*4()YOIa zR%(v3aE)W%25m-(HE3`R8FivC~rr#h9 zYYo?$_7a*zEl7}v5acwfK-ur)$vPs`ah%aoTc=!c$6d(*9S!82Ksp)~mJyf@36f<7 zZtftPCpauCI4wIUmJ`&Q6hb}p4g{e6sv`Se)dtpx%{&d2B(D_*BvTy*sJVdZ1Jpb~ z%?DIJpcVkC3B-oe2Rw{3DLB56oN8vr`m8T+WCi`HKmLRaMYJ^t;>hdAzuBk6!B-UW37ETRW%Ye&){)O$|I-jTZ zpoM&XJ5UAhEPR}DyRY+d05HMtxZ)%}?4Lk>WR4G#iURf8xJ@v$Y) z5)70caTjRMyg3abO#jxxCUh3h*iP2jk*I>I)#3L}LW8W3Fv&Yofm zGz1s-ER3vzX;42wsHhL_#;z%ib{vOa7OTJm-Qn62A8h#$hdSxAd0LYrc-JG%NpFyK zL9thEF{p{@Oqhcol`}nMNuU+CcXZcq^%bW)8EosYc2fIf&y#dm zy+EW-Xunfp+ABIyj2Nc9#MyV?z%XmKDiPaDtF$!5v9f*iOXhNsSM1ijQoU|fy^LJF z5qZs0^IA2l>t*KpjmR68nm4NLXhQ4@@rQnMx&seB99%q{T;lJX_&V9TW&(lY2mj@y zjTbElc<__{bsvXMfAQlxUIt=zJpUhR`zIZO6OsFbk@>}EtyeNpcH{= zCL{n%bzD{Qw+ZKy)0}vPwww{{j2#hdpV-d4RqM-jtRT@usHv)^Z{?4KcVrr2Cg64A zku)j&l74M7 zi2)|lZY0u)qeHM}T%NO9$&p!VRV#{#xH?cjXypzodi$D;6Z8~mUsxd(bw!QZMm!xIoXFIW@~rs5j(VL9sQNjEoaeHV zzbIEWj+II_E*z8fP@y$cvip(YWKQPZK|Nq`u2ucSx=I|p`zK<3l^pW*i(;))Cxc%H4V&}$32yoyLkAS>#qEoZZca8w_q~q%8HQw&l9Q6Xg4BoK`(0IOrbKOOzr7ThO z%7CH~k(vhP%s+}WR3L_mrN^;V0|@e8JjcdN1oh01PpoWIR#v50&b*h;syyMpBT4NJ z!KtecNda@fs1Ux{afcdku~`(WxQX%yoqSUBgBw?jRgToGz^;hY3P2(?4a}Lx!NDr^ z?)Y=>Z}>K=2eNQwB4N(#xqR5oHLuj!)gGBgyF0zx54M77!6tjyeF`OfB49#9>cI=% z!gkHyJ>^wplegv#=94P(3}1g6&lh_f!J@}wwf~t=?@Ks4`ydC$U|Ljhf<_9uF3R0>rQ{+Nom`0l0W5hJ#mT=Zpl^MY&hK zAc^tVRI?f}T?XAX`xyV>JzAEBajq1RL9X!UM&G{uPL!5!`nl-!aHHeVsmm#SPV+4c z)Ki=GEj4xM;Wb2aJMQ@)n)#p1k}u;mbM!oFmsG2=s(W~gYspGQ?%F=we%s30q#}=< zQ`NVVFPl+dhA^%pQtr>)yi7|t&%xuyNt&Zmub!mQ+KVb|D3hgLPa8FF#_oSlJpyfk zTck%>k^+c0DkZoiB~G&nr%??7`gSOY0K7)lF35Se>~e!MK}=RPN{G|V__xoBXlgy8 zXBIZfDg$azftG3LwNpz_7e2&;cU%fjLi3rswfyY*zLg`t_#L;B#xR`m3(he~>eJiJ zThvqWMs4~s?n^0Sr;_R)m!Mi(t?0I2Ibphsi&i{4^0{qg6WhP0r#kh>?4X}zC|gv(nq8IY#~ z971F#An1rzO5(SF*oiy6ie`whmVx^|?DlrfjHETENq=)RwD#0->_?W|ho4PfgdTm$ z*Q9yXb6;jV`N0CSMn)~P9>{gnDg_6nS_6m3kX;{eW#aPmnM{GW+JFX;8OyU>M}yV6 zWaRkkUhR@%HVv(FZZ1)Bk9I9Uwqry>l;0AVF<;w~H1?LGIa&i-U}oUi6>*qgjHe2q zfWYg@lN0Y@y9Lp`9%EWqCVqc!?RA|7HSNm*lgJRc?K%z#wzW8GjT3Xl=AkqW2H0>G zXM<9#Y>gkLNZD4LM7wjb_)NB~4M6l3;D_E=JCRYu(&vtnaHdgNSvFk32>$6;qCpTv z6XEqNkumIU?A2_(b{v_V1MUDus7lczpwj@<@GB4@SnSd9cmN_pj=A=J(CQv)*95@m z7@#4*-04UXX@EEes_xkVmXJf}5n`-%cYtGJ*+sm%tpU%i)gc+k@>ax|6RmOp?Tw>m zAMP9#cin?8_KXH!SEAX!o;jbsJ(m9mAqAp-NJM&5hCY7?)p_z3f902T`|ox6QjeUr zq4G@R1=ERGI3u!S_3t#V!MgZM#A8k(@)--X2yH$nKP?N+nbZpjAPztG0m=yeH^jD> zc-+*E>I0O0F$L>@YEP2c6B(b=)UV;?Egj%{cGdS&Kr;N&#-_-RT<;GtPr7i`7||)# zew>TUlU5s@D~^Zts6ED4sRr}-t*qrMJrW7WKq#|E+U05zG06hr>M4_H^XSXERCajg>k&OH4fIP^`-ueQtZZ@{4q}_9!SSB0ns6 zKX|)5#OG5(8<6Er@a0S{Y4!~P8mh??ME<5S)KfG>+XD44vypy2q=5d>G#R^v?}IP) z7fe|g2&teKr%;jGtODBi9rfpbY3Z3*>o$0z@B?kwjpF9#(ihcuSuyJCb;bUe!XCSk}$`eJxzPQ z(h8LuNLZ@(vJ>}@14br5Q8e`~D z)e)%|N^t0w2Tf~KOH&B7_<(^F7T;B9$vK%~(ibH(m58z9+h|dNE;&>K0BdYj%o@k- zT^=ntqiaF1weYhFkat*DDn+on;h+uhrdP#T^~V1ia>)>Vjpyu zSLGLMguXBGT{d&ddCQhe!raP?A5#v|1%#6oUzNgqg(8RNPGE+TfiBV+@``6~Nl9=+ zKl2f4MU+h@si4}y_ttEd1Alnbfsp&bKG^KzYiLIP zscbYGFiZp$02h7OI(J>p`V_#5)L>ydNr|+fQiuvEMTIeDNjEA@?X;AJKKJA#2^MCM zR@s`C{%gTLVey-gY!d4*T6bzNcOG{FHG4u~ldGpgTcUwH$?>nms!&Kd{;WK-Lq4yR zQsw~SvOxyaM{}BINuV@*-Xc$>&PJZ&2P(`N;{3gALGzS;KzyYyLz?-i-)Y)6HH?T_ zIK;PwzRMD9C-}4&&J9fLh5itm&O{I8THv`3d>qgF;GD-=cG%xp#~<&wX8!;=1Q=sa z|5$v5?@-~nBi;G;Ksl74_TMTrBM3NVlG^;GNs(qD8OzI?g4Ckrnwoy|_+GaD&KM6} z-U?Yfi-fmn4)gCS(0SI+!STWqg&a!an++3%600Ab3OnRTl8QE2+QIeVzW_~4xMh`Qnbcvt9 z37A|bcr>%G-!uC;qHJUIO8k)G$3u6zJXQyc2wgZpFu%&{ARo4vQJxSMSJ)%Ev9Jky zG!~o`Z|9lLZS=M*wb^Zq;|gg)rXjP@CWOs1VV zJ6Ad%1OcbZsUu%1Ax7$>l~#5V6~X6K3H7U#!a2u&ot^d=jswgee0nh599$8JYcE<-r;yW*OHPdE^L>lM67+b2pW#Uf0Qv zxY=^xtV9fZFvo2QGE&LyX?+&hmqNq_{6}oA3oyV+PHS2+B*cuS^eQb%sgmE#qu(kJ zk5~Y5<`A6|R3w0FonjiCZ#e))6glb5yN@ccs<)3%gq+&*`&ZWh`dO}4;d||^W!i!U z!s9soZ3*8B7G|Bv8&Q{wI(rZr1RqOB>59P^A-rgtxpWMn!3gpa=N&GdzSwxb~ivBZYT7a2IC8sie39&lCJ(Q)OUbg9oGp z1WZYw0ToI{@OvdIIz;v?4LrEN2vLy|AV5g}1ezo2+VzxmV6D{fvVcqw;$6lsjy8S- zA$j$e<&WXcWmSCLA8yNo`WlLT!nKR(I@oy@@>MnR5?K26oCH5CrzGL*FuupUsI7-e2T3&EQMPu!;Yc8B-*^(mY^NjLG@& zp^Gx?!$(nPzGzn#U+FGqCS4Rm)L_IpsPL68V4+lWJ zfK{fn8e8&A)rk#)!qVs>sj@jzn=Ooot5GJ6{VQLQ&_AGHyWL9qYjffaWwWJ$${G92 z-@7Auy}*E3Mu$}F`X0Ca&Mtj8-T01t4ZP*8rcFDuPod98^lPIM4FxUxmK|6%vo5x`h2;IjmqYT4?-#L0d)8f4 zOCh23+(@yQDIYlA=EPJ1288g`>s5U6XkngbNk2R3_4#8nYch>*HQHht0Z9etW6i}P zhoWnZFqHk|9lISp4-i;a>LbVGz}*7H|q zOe-iAq2ebJ`ad0!di=Yap+$ik-6AXIF{MNMA=TrZ7J0q08=0O<-=B1shc-$Z5}U+E z|6OSvUj-PY-(nwGWamd?WGL7S4y|$g2B<-n*(+wMA_BO;ypzH-I2+%8*k(x0MH&T0 z(p$6COZ9&cnglv258$hh@_=3}*F_C@Clz0rW4}4%109qT;W2-@a$68Hz??F-m|hsu zQy4-Z3Ek)vhU`9vB^a8X!(ujD{pPki5~S1be+JQHW*QJT5}KGiBBnY2F;9JPOstvo z^@g!YZv_XOuuf zw5NSHMmh*piIb>1oi9)@SXo1EQ!1chNP0+|lv&hs45gT%3Q&%^ZN2sT$x$$LDER9d_jny5zfRS$wNnlIAeY7t&OD$F{Q7y?8;Ug`PusE_rWp&%Wj1 zJoAj)LaSk9$GFM8nXOC-bv>}wL)2(xq#L$!SwLoHvz%3sLt8uR4q3wx8<(Dy;xseJ zWkeVw6IIt$PBw6(x$DjQ2Mn9K^WwB5GWchn`F5bk^F^!$az?iVp=Ju?j_E}r4oU0r za&qWvHogpr>@tD1eoZ{YkX1ai#9qQ#J(YJq-3rx+ZVku0Uce*My9ie;%qfyE9*_dN zz`1e|0Q__zwP&G@m$dQ)G%AAqYJ7EY{Uo6AI3PO!!?}=>r9qszm0b~f?)C^H4KLm? z08ZDvz*<_MMVJrJD2xfoC!_E^^f7`KJfR;Vk|*ms{j$LhXYM?owpY$88ZD2vWQ2He z_?SJ>c^@Zhn~MjKXdtw#YacT;TkRc}+#QGsFxZNw>bicVF*xaAV z@UOT)s_47qP)Huq{V6#&Yw6z;PH5wQww;X4K5RSOaLtgm&i(3x@G_BN)_wo1mGA+d`YkT>}`2(!ji7zC|uKa@!;yi^q~R-Shz|(eQ`w z2eAARQ!zJtM!ey`#2|1Mo1YyZWFBJo0`3k8rVn?RNdA#CobF=>f6y z>fsPip2oF-ch1uQ>bV8S#7CL#=W@vLxyO4K98wh~_2tp@|nTPrPKj{-z=8d_8r z5Z(}4GPmut^m(Y?L2dMBM}%e9s3j{j%azL+DaAR|lLO%bI3@qg`+!aaBrp?Y)t_gn z`-3tBqzGVCT-B^y@;7+4Ye#sv9sXT=;?wM?q{WrmD{1o$A%)V!yFYp{^o-rDZx)t}QHe*M6R{|e!1aDBz zevDJW1gUeO$#hlg}9!9Q#ODlF(0(Fk}+%gqF>Im<9^+j zl1~OL6=2At{8euW3=#W)7fqb#Sv;0*?rzHFuFSLCW?nDPVk(nC9~8->1=;z%)sc;T z$Bm*h9+nGdKeSKakRaN8ON21kmzBDQ_YHgBnX8010VZ+N!wZg|Si5e4A2!Z~uJ^nR zvyJk`fG1gAP;&BK0c`JW5)ID)Y=bj!Zg92%J12}kV9>3FHlYHG8n~n!r2J0iQ3{cE zPa<;QPf&X-`j5mz28k9E*7W&Tl8zv{=pG2l*MV*KK)y27xxzALpmnu!rLX==H}Vb% zA?SUh7#UDmr3QPJYK*{lDJob1Y&Xxgv{Ek~FSll;0MSp0V{CsTw4Q&xH*-~Cx3G=| z_-eo?x}1v}8P?#3qlB9F3xpYw&*4k$H$DvkRrU6Yzgd88wc{cmulsR*PGW-}rpfzo z@izdh-KccOv(_b<=wc)(T($yui8HHZ64^7EZXSZb!F%3Fv*D<$0%YTA`23SUvKaFF z#<4N%Ja~prBXLrfa=Qzrb$Co&-Jf9$$)$#yy}3u&W^tJSKUY!1p+`R9l_4^#8R1s6 z@7d#rL$25fXnjUSsjkfhpFC}dXfOZ4I4NAD5M%6JE%WFgQfdRQA`=eDRrUr;kYh(% zBnX5iVFrU3|BU(Ov6Tt6_o%IxnP#=;wWU*~@BMav zoy%Fm#XCP(f$W4q*D?=wgz(_UjpyQ_Th*^(hMbBj(UhuV^vycpD?ZM?$tYn7FG`18 z>%_NvOIhJVsTmJ5W!X`TEwOFNYdDDZPvI;;Ghc+ZzR7_CU)Xg@9=iJnz5CRyiopzd z`g8p18D9(nYB@-}PI*~;HV{g@Q$wj?{{B>`^z%^!RP-?Om*R>Z7B%o5*KjCGUoa!e5w5B}m;qlRRA|xVo zxs&pyZURSM(n%Q;zWTBDCQ+09&6^KAUFw}UW_!jC`;5_^DueT3YMQ=_?_1)EK2jrF z@`x7hQJNz&FOGX!0m{8opMYbY1aglO*MutVV<@0tLi157M`HKLUf{QfS3@FIh6)B4S-@w4w&U;D|xV9k@zJRqv66nuEp=nN3sOwV5N z7Cj>%K$y+dLbI;A)e713VG^0Ic}-|BNFscg7}uh54rG=ysM48Hsm*C4X%#e_?XGj`dFbef561Uv4_B~$##Hk^`5$oD8rG7?9kc01m8k zCkDLL6V^%0sW8*o5P#Mys>kmOGi;ZV!;}CMc&KAj-^w0TRFgY-_##^8cG@GESTw4T zQMSp7x{rlz3t6#p*mk?Eo42goV)RYGw5Dm$-h=|Xa&`)~##-9jIQ zsQqCrzxC+A5N2$n?G>;rt7WlZ|)!c^1y1H3a+o*yLLuno2Lmf?=GPF zS>?X(aU3~&=wK8z9@%2lt^TTT5 z(F)aO(EBe25t9_MbnoQYe(8-@Vv5NuSDw7z%R82@S4veHw?S++s+^$w+L(h5J@}l{ouBzkdJ5!1Ic7I3%0Org1GlhuxHS&F3(Lw z<1s-;oitBU56Xr{`7Cd;Q5oI`xf^4&t}X>2x@cxsE)ik0WC$K29|9GE417QrdfeJj zFQ$z$iK$$ujhPgLzm`q=3FML^Rk9{2A!KM?t1fO^MX+~nSrGsmL$ER&xgc}8mUl+@ zKo8w2r-KrF_zEUODEc!e(nTjawH_y@YA<66dhe5qE;mGzwLYZM z08oGi*57~0LF@XRsX{VCZGMPt=Za1z(oW?LCBWoURgxj)MS)0rs8y_Ovg=I?Odr?6 zS0bg9=?E@KYZ}!)KfRImC1sELOIH988#Kh`px5owxt=?6=HFjHGL=UTkO2>n0jc>I z|F>^^5i)t@@*!4>KariK3#419TOb$K1Nf{x0V>a3Cs8j&<_VM?sUdX8z?jSYMpKP( zXG)L+Aq!MMUI5ayee&yG8=_S+QLA>^obQKUdEexzpWgfO!cHzrTTxBNHXo|I^5`oL z=!ENs_NRLr06+^@!Z0HNG|0uCoAcFv@63ksNVd~}o9KN=t1Mk^c}!qzXA4muS)Ju!YtKA~{tAY-U?L4@`-hppma3>2oU=^b zl_5Bd-d_JaxXT+DgLn3AkzDNvYa};5gtr5hNYF9C$G=&2MuA#&o2<-&$Muv~(Pmo% z6%j>X(+kK;YVf<9t1v(y^kSjp8{k+Es4%ZIB-^ayUWiYZ2UKH(xR;TWGCT3cl{TRi z%hh#YxW|MTtqU84E(aBC;Br8BeB=v*d005uVfHW%xpHM0TwL%qM%yt)4pHCvWPlzxO4VlFa%s_7m83>x|st^PJM<6X`dZLMltxN zn`I;@`yP=t3t_jZ8Cm4)aey~7NPH2Ldcd(VWTYR);PKZX30?EPV z{92%-qE8}8ET>BAbAf}R>9mc@|7`DTy?u4HF`w^$*0~h38bygVivAF8)x>1e)-CET z0=M26JWZ}u(pf&?^sQ2mwFgtPNMC#O=sczPOoG8; zHAr(3lEb=$f1-@5IJlVefejmmexSBElmF9uuf@&mP|bhKVHTcZG^~P*xm5I_oUZjQ z5&GBYaRv)S8&5I>3&;7)N}ehTc6>T7CY_F~n8Ml-x-$L6UO60B*L^ED+s?%A={#`Z zNA^^&b5~r`*jC=S%NTKt5&JP4X}6Mc+g5+Y4PY!0`I*S30m%b0oRms~z!V zGwHx$$KkT@c@m*ml{(3l_2p07 zXp{BYbq*WG_5ZpG_>9DX)j%FZh|2Ht8x0zh8Z9CrSar=&) zG5og0J*MD-b3) z*Z{R!Z=ZASADl}9Fy!+KzorkI1Wi0&ZOTTGX^+*ZK~>bSCvN3~Dx;ex`w#O&PkR^j zpCY?I{ZWp8cr=nrBJdUc%zMu6%?0 zLnx9@4@BRj6q@;K5cUZ47m>096{Uc1S)oyWYhnn@T;W_YgLou9j7pDF^vrenitDLr zHLP!3|1*2exQ)~Iu+0aSh2fDn*LzYaLN=R%%yBBVbLGx(!n`Bh-^E zP!noAl{8A-DWGDN><`9UyQAF=8$u{8uBCrr-@|5W&sDyKG^Q*L(olLB6WmQ*pcQc!dk0=OYkL1M>iW_0@97)7ZUXUXc@ z2xKO^)WcQe0y1Lzu}8TRvS(;Kb(jESYa^<+gs@|CU* z#|Z&OY=%<2P|S}ZrN8}h$uGUM6byG=t^umlj4PMf4fr|Zug)!v{M4rzJ}<)JSy>VC zn+xRd?61&5cxZMXj_Woo+mX^Vo{pdIMQJGGYnYc@K?fkqoLB3Avhr%E8^_xX@Z|8% zi_#k@ix);q=iB~F$U}*CN*T4XILG#u>gJAehn1ndGgNl1SG3ako^?!2&~D{*!0}}* z#kaF1SS-;jQa-r&Kq79Mem9{+puVOrIZs( z=i@c53egOlesv0ZS3aty;Weh`@a-S<#KCAOI+b6d3S^l)3ad$YYH5d>(e3fIEQo~} z-?;>-V;Q-@|6JWxG=dqN`jrpCvIw$0F7ZpnMrBp9`mmd@H?cQfE($PT|4X?(73THl zunx34%=MsdQL#|ux`uCmr$s-Oi1J0E4kaWUWeu?8?ThO7CXHWyjGflTY0 zCwQnGWTP0GqaIPo%&;eFT>Y0~;%)W5O^vRVHS62Zv={|g#nY`?`1jOKI6m?x~zJtobhF!5w>HHpJL zE`=)(I#d)RRubi}_i7uzgQH|l8 zxE;U}OZjVUW2UJf;7~3wy`4?d^~^?VSnFeP;Zu!IxS$ey+zF{+Vg=QiZa6DFRY2)b z-C!+@66nzBk4=DL;O^SN{V}{oG0cg>r-G1*Mhv6Jq zU$tqgsVf9kT|q1}rVh==x?%}h0q{~CLxC@3SES-O^g>g0R#u?RSZxp`nz5!{7K8S$ zP#XS^3ii!Bz%#Qzd@<5Y6)zlm^P( zg-qq@0@Ff)XhNmrhxKE{Nv=-n@RM0wz`G*hl~#5#=}Xn0=coUvK;Ae2K7Ef}2JKsK z^x(UNqpOH{_W9hEXRYiyV`vtYvIH7bc2C>-iS!l!S-&hjd6vOlGyh_x8s{1RdtuKD zp=%VS;Z2#(VaQ7Dsm%EuC()PtlvA-nK*b{Wxt6X&)5BU`VK5(U{p#YA&*6oIcQ;XM zFnn7u%U1cdJ8Q1g9=__FsE?Go2ZesFkrYRrM*k_x)oAN>Rxe<>481on^9ti9NlOSi zWK6I{BBn)PC15T1cKXgK(C4w}rZVKgbAwU)2Xt>=Gw=zxf%Ef)FF>LT z$#*O1|LuStC1*BvniW{9j;;#_9oC(_OdU-pJMy`Z|V@glj_#miOKluNWBI-O5EW3-!0b)i;#WbY

zFqfxF#AWI;fH3Gzg+nlNe>fOE#tPWC8f`}1A=2sfXYKzx)? z{{q%DYHWs3^+58VB*Nx_*w<_*myb>&JYeSZ-B7=2(fTMithXQaV<+`4DY{W>8#peNh>Y*P)J@X1O7L7r~`hl2BTa-w(ISHjwb>2+|mMvrepB0s9 zAWxX6EGF6-a{gXvHO_+dAlxrB1`KlOQC$N-56cn^)9xXrmGoC^#Rmso)d04r3@MTu z*(HYyFB?3NyBlyDw?q9dPK*&}ff*UF_$_qKZHequ8tFNx@%u5;!3bE{b=+(qk;oGx zI7iTz1*|Pm94`kchXh<37RG=tT0tGbf<|q%xtnN5OP;Xpzds2x6t8}zgTy@vA*Gml zsHD1Fm<~aFlSK45Vh(wEz#=shf1pijkc&z;Hm%Ch45pcAj#9p85J(ZWKn4kdu3v&D zaRUpIgVNmpOCpJRhy$;P3egZ!u}K{&jwgFBSi6TVP!&&%7t(_*FLWmN9H36i-DpOW z2=H=0a8&0|h4Q(Uh+vNUD!MRlO};<`8M+!y!^2zFlf=2!k{PE^f)ab>oG_upqhjlf zOItuOkQaDEsEAjXurl=J0W0AVk9Fbh3H@!>;?3rv7JM0#mX&irQlx(({=>)5SoJ(L zG;3i_dU<_7*ptxM4cP%weAHw@RFul(sQVH&qHJdXey8iV;nrV=z0$AcB^4#`=#Qn^ zrg=^0ChGXc%L!aw_QTzmjRrn*Dv9i*D2d4_o!-^dG|#sgp6*38{Jq<8IuYLk%Ue;5 z5$e6~;`!?0@bO&pT@ul7r0GIOK}}Bl?}#k;=isQTzjQ!5vSVK(UP!`Ba}qW~h|#H? z%uy97exlBF?2NxUr&lotsw%tHQ)>vKSt0vG-3XV|g0j2R-!e8uCEd7bgQ;ObVk=l2 zf#0vaNbrF0mqqM$bT{^ zTR{Lkqv9xLTn(%So$>{vddNP;L%>+tw_r}mfD!SZ?ce)eI9K1R6|b$UldYYqQ4=QQ z>YxJD#~-sXLOdz$-xqyhu?MDxaCM9LiVw(ceenV)_hds?-Rv1sK`)K&<0233xQJu@UG zR^U&@nmar?@9c@uRns?(%)`i16t0%0l~v3}XFeCPvKp|w(ib_eqxg;oJn%u^j|#@a zdPN@B*g<${m!cs4ak6=^xVn6(ro(n1R$1@xCV?sqU#?VB73eG8um{iN&t7H7yGELz zT#C2)4=Y+b(iAGA!3<^ZJ2$;+_Qzho*QJJrD4zs5E1X}ho%niPYmz48r_FJVjCpTD zeJp9TEv}(|TI-xV<3%(dM^EUziTJ;nWThG{zCISow zFI+*8$vI4>LMU>wc}=TpQCv|Cf#qPyEhc{8Ymt(T!>AlcK6~%*NS8e0m4LZ@kR(Sx z_$$U}>~F(J_`hSPsG%|*{k~0J!+QBBoos*nmxm-RRmm%nb5?VSlSy+{6J+92cvbNS zX$D>_2iO7`U1R3|bSq!EL~-+%iL9@Rs&cpjsKnE3bbEVk-NZlhu2`bX|LGRrym~rK zD&SLO8I#E8z5XvB$R41bBh@*ly#QA#SE)qYc*dx02TbX^>QEVV{iq}NNt=S7j3SyT zHf{VO{s8O%$(@GU7lVnP@SihJhin+?Fhn;lED)Md-gmWwp-QY-B^YL6BXMOks}Ksy(nusF=O$!Q8Qu^$8o1>4(a z<+YSj7&vVqMoC^P+d&}tF@mJFS4>SFu-nd5#K#6l-#B$Qg&`nVzhVkuOdskmCKa(? z9|&cM9^BFYuEP2X>~7}>)sr006{%G6EN6j~nfQVZfpQ%@C(j{u*kS=XFCbFnoo zNpS5>Dn{XqL80we-}SrfR66nE+aWn|Qb$W{YKp1};8dpLo02Xhw!WXN3&mzW;H2GN z9+ymP_&_`oI!MHcW7))do1JQRW`9>?JJgGTbxo)6BK0(uA0i5p9q%LW#hVWO!DQ4vklttF51$ z9~kl+IQ$YWB<|PQk{x3bO-U372m%{*49iGoiUb-mmDFm<0ES<5*aFy@5Y!uz_>p@3<9rrVQ#MqBHgtp{ z&N=tuzh~SwJld-je^*~C{;pSNGWBZ2-__NK*Y)X*7KLZ}yt&?Kmg5PD#}QH00y~Gs z@wPK{x^_CpOJ@r0e_e#D33Hu;z5PO#gfi%wi$kj}Vfi{h%+(2u2EC9A7({wpKAx)P z*^!+^ZqylSn+r*XC2b!S9&#Kb!Jhb$I_FtQ=tSZTj!>R1j27O74XI(Cyk;x2M0jR+ z;Z=F!+9apq)ASn??E~eKq1#(o;9?jDbt0}0kyz~(MP_2VYvI_|I4I%k2jR@DXAk_I z&*YQ@sY4}UaH1!-^?N?tQs&DqmjAdk-J)Xs)`;C^6-Q&Kpf%c$#f_V_d4$xd!1m<0 zR-=6Ge5I469-FNw=+(yDbB7RH4kW?5JCk6K1*h|m+)}mz?`~wX=Q*UI8U(tX>gH{AK8raLrPlySVp*Oy8GB6`2c^xraR?LaL5Ua~aXCK;8 zFJ9ZL)z@p~FUmP-aAV29oCWqig+p3kJ{mJ6s^qgxIXkuZ(fX;`D!>?QH+~Mh3 zMgs4X9Y`%ucWFcsHwVD2NjvP>x8reFjk*hI4beNYfio^kpt56?GT}B(KsA`;FeX*G0 z9C0=q)wKq$L1E-+3Gt#XEuh9lWUXM1TdnXE1#lVjMFnPvltm`yx4-egnc}l z|90Wi!iT$ULmT9tt{^fBx5ZnQq|wFV$+FOT?WjBdHnm!s1}6!zn2c6V)^$#-0ZCA^ z7&KcoUOv}qmi8L5i5wk^k-chsqzvM=CHKgEm(OMk%UGqdJ)`O@b^E|`=kwy4>XL=; zoF`mP*ICW0RIL5iE})C;WOo1^zrLB35H;FO|CWUj_$bn(PD0ABNi*=5w0zWZrO=Dnz{$T1rhI=>u2l*7)dEi-8;qmZIQ`db5}98!Rtx zoKxO;FkAq=nkg}?0B;UTG%T%L%~69HPIB{TqeH1IvXo}(li3_RRmEf!Y55eJd7h{o zN3~GQWuQC#^v8}Y>}wKAo?1=$v!sBB!nP7?dBM)I@8I;`gp|@sn!KU2yZol}idv+S zNJUD`6<6w$-|zJvL7ai&Fv% zy;b~aXDgIr$`7=}>P}Cm)#B~yEN4#N|8^s+*ddrv@0Kj;(-_cccq(er!K6YZm-_Av z`*uon4ev_*fAkqA+R2{PBv%SNRHB#jyYr5SD`%>8ZOtKRf$<5C6FC#%mc{MeoGF}^ zp<#Qqz29Cu-Cl1uW%>9(`#hA#XHX#i^~7_K^j*d3rK2VU!N3p+ef0tj#F%x7$$3WL zvF#vhDtQ@Ew{%U2ysb7qZP$!o=Ejt5NKA*%1^AkkQ1!hoZVL;Z(g?ACPiWZ zEDCNFU8`UxIrZ%X6_GUWO!H_)h5);ipbd7>`0lg0In~C>i>0R-!&QTVewx3Nw54pjKZTiL;dq&J`JzV_*m{>ew@7C$xKB~9 zB*(0Tj!u3PjV6ldBsNA;8&hRzhh_`>YvSUPmpD&vm_CiR^n*Zup%k;OX5SGzq3xT1cXqH_lIS ziBrYSDbBBrf*w`82vyLdz~oQOH}{2>bX+q;?f=3b2<7V_hKw7<6*)B>3#Vwwon-=P zN*rJg0scKgS2>o6mInKH)X5~P(8FiSyxwA|mo;;2r~f7C7#KCTqE@3SuPs>cYw5)( zHhC5n{VN*>pPNe+k+rqDin&qXn5z4dXWnh(+sk-ME&B)#8*}bFcs&qPqXndTGYl3Tzg4Ec~Vo zFymkB_}73--xp(6rU}Mwt=X)GA)S?rIyJa17r@2v^VZo^{reOL4^EoDK99*OF7`1z zw4ULVaP_=%Sl&Gp7CerH8S`NiS>0m+u{h=7rGkOX!i&BW6s|Jr(7tSggBb^mC01We zFJ}66`>T~4EkjdnF80ft=}rFB1PK41?O1DG+k0C^Sw=mn0D+3@Y!Yc~k~QrN{(D!X z#pq_C?c~ZaUDJyKw=O~9!Gj4}-)|8qgGj_YN+u)pIi2$sr*tgWNK&8mm# zC_107dS<&dMak5#>OwaCx&0px{>NK}AGS--L)%iy=Jjf^opu3RM-k4{jN3x9C<-w3 zo}j3-g6*IK1kJykbJ@MYQ0vVkFlv>#vm(-XXV5T0!BC8;{g9rUw3uyOVP*gG-RZQq zqsw*1wKdhobu089&x&7LzRI+AxzSTEnK5V9?3uIb8>bJ=oi#AKDdn!B!xA%OZ`!NP zp#oHFTc~squxNg|+OOQwgcxDMn^&JBjww=fsmMICkC({-ioIT;gA2iZT4_SHRJ6~X zq9=Fxgd#$ZzdQiR->0#dBRoU(2)fWXwv5i~=Nu}I~`i895plNm*Y8;6#UAcVHZN9CqeQmHix7NW|^=i11;;}lndNcdJFCI1jB)KC6jC~>ej6RpxRPkj6mK|ZQ& zqmgf;(Kn}PImiy97Sm}F(9{@h2mqu?N`ipV417epR*mj91GEBu{>HeTd8v7jmycrJ z8#wqk&XP-D`n<(7FTR=W^^H{(Nc!IInkwuH7H$Akj$(H}{~BP8)E3I#=gWU5*>~iR z!ziX*q{u!50k&p|gMXf_#S_ZB#dvKX@qg&$#!xo&LvCb90mO8fxRu z1j}c+A3ZDArVy#>yg9kBJ(4A|l}c(|DP1To6_6W+Ua;N^%gtcKr=3O1?Odx#N^)y1 z@Cj)ml34(9$+*cswt9=WbWa6IEG$NJYO=%`Xh19#10tGU#lQSHd$>tDz!rLQ2>AJL zzlwRc75=ck6X~=jVYc=hZEu>Bw|nE-zAK;}@02BS7&?m|BUj2vd`@SM6bSr@y9Q_O z0;GMLyt-LURx3i~XG>6n4j{23A>ZY`m^NW?FzVV0VBsPX}dA&3ps z(rgbcncWcEs9+I~!z=F%)hjXW@UCZx3h188+nB*D&vQwdGGcj}Tq(dv*o$4r%b4Nr z!hC7&uFY!pPT&&#(&zVmDAqzffi<&RldVjRj1)~$!NK9`986(;P8)_9Dx$E&=)$$6 zLViNvHia8Pa@6W%O?{KA<3XNRp%)H^wOHj8KAjs{oe$$xC^fQj0l8B=>&w+6Zu!#Ypf?ge#iy*N^!dmA~U4k5fWS93%8bc(#i>cC032&}HR zAV8FeAn z5sAVtfE6r2Lmz!U7-37Np|$DT4G0qea1vk8w{)jeE$-{?m|Nx5ahnTyaY#B}?Qc>i zCbrkjEbV^tr=Nu^V=>uU1&2MTZ7h_lRRA}hN`HO@4d&(Ks&8hLlank$ktBMhTu!2ChGrS!& zHGV(;4a|~fjeX{;v=V`YEe7~lNjjHoKgt!raVoMQL>&SYAhSmbm-0{UOO#IsemG3l zIRKudLJfw-BY07|f9q$dPuz6f4)h#X?>XfNEs$5Ye>*}gVf9lI&3p|EeG z!QjPX&;W*~-G&BP9nqq3-*iD=?uY^iAk?O+@Yr*oAG#X}7wU8kW&SBr)g3@&h9DthCe^lMV|`^miTqvF*-v zq)^qoW;wRaE}TRttEg{|a14Ht!^w2fmbljWDvCH{ua7FAI|_e@WeYQ)JdR2vVo1IL zQ7e>yvcncKtrDoLtVj3RPMu-{fQX~wL4_IY*dLsQ3}G>a=;eCaiCPhV0|hevdr7XB zM&WBewzRvb8_IZ(r-(=KmQaLrJM?HQo0kFQ3RNP21DrYq3R=#JVidE9cp8TQ+m=$W z*qF;;*>N}%QDd`-CQn-m=KX;*6{qg!gYyM|VA^vp!^sU;!8Aw+9*U*glzD~0FOlID zSOYyrWb=Msd3(Ah$3VQ?&aG@vfRnv}XnWiE{9|kS zW2b5dt0=pm&~L{=z=yVwe5T%k+!#dYkOOj-EkwK&Sh_3 zsVIxadR|06vW3R})D)xjLgL=LFpN)8Y}1Vu6Nc3I$(3P0I0i<6vC$18k4Jp~Q`#N6 zFnoPcCgNW(N@=>K;Ur$0c~RI-@)mGY!gx&V<0%shq1|&dmS@|XrLI50Kb?T{I(Xex zbQmJZF$qY&rtsVgl;qD~%mA9v8Sg0Z;JNhyU{Y7>$6^LNP6zb1>qv5N0x!9D;5!!t zDg@m0JUI_LBZY^V>q!k#3#Z~@jx?^^(88_W$_uyhs;@#$y(!5It_Q-h54TdQug0JH zt0et*)}(2!cj1=}a7m}0S#Lc{B1T1mt-#E@;XWO<(Ei;al^0wp$8RKfstj3PQVDi# zO84NXIez04%ufJ^^;WGN7e@fb=8Xw>0csii~;inQvYYrINJ34{qhk(+%nsw$LIGTokpM z=O*BU{CB0b*vp~2=ZtCdJkZi?6p)GpBobg62PJx|HrmjA@-5*@vrY* zIn9MN=0nk3O&-pwq?d^{X61c`kT;HKlEhMqc7dUv@Rm(7*;y3KKrAMfY9)nr$o|e* zmBob|AF~8HvO~n%NYvi+X7_McE2hM6x4EpqSnxN=@7nKyT=WU^Z znAXskk_1WG_%o8x;k|9G^;S4M+;zNZeG|8?nO%e8X(`K{MhhfI9nD_d8+2|?6*<;F z5C@4eRkl!abgX(|O1tV>O`^n3HbXLYX~v9db!VJODa&j!p z0cJGNgmuWcC0_{qZTX`2QVdaRLT)5#uRa}u$wB86T3oR1o1Kfv7001#+OHT7y7di= zN-Sk?J!oeP-n#23U?%Fx4CX@D@cFtz`N-Q(`Gv=Am^z)(pBz=s?7Cqnl%KELGL}+N zQ5z=9@XbSnCoZP-&WTl;c|5<8=!B=rQj{8{+7>E?iE}bukR*+9(up)9oVwp&ORmfEWwk|o_>r68XtHGp=`R&qpXt$c$ zWgrE;qqd#?b@{=@rvBT}I4Nde!5BY5*VNwdFcwHYgVwd`ZLYMEoLlkARz>x=_8y&| z%5_Vad35-fo0Ie!2l#~%a_wwB=We8R3%;n1?pxfYH@wR9SfCzmaoW+qLP zO;^!HuVhxX6R$xxt(00?vziYxzwSZgfCDM^xqY1#OFib)zipw9RDr++jXuGnUoVZd z6#UmPku{uKDxBXkqd4G-E%Z)VV8e`tmRIKx|6gn&56T1Ur#I|3v7C?EIDrg@S+jGG zp6$BX3L~clA#{#2=YqTtK{~w4v(y=TjyArSUW`mZvN06`l`m7Y8r1EESARf!6~EXb z58FZ^`xW^F1-$oDtO7M!4fJfF+`gGyQnvE5dHSs*AF2;}i9UnYY= z8HbPhI2f8uV3l~1O=NkBi^= zWWBx?ZLca|F zS)7w%NUtg*apH54gv?C8ccyrwjHhhXm|B&BARbOb7|Tmlo0+PT{7qanGoKUx z_bMw^aoHLtP6BmPvkBxV{7jRAEd*M|GRJFm9-LDMg?w$0#3n`;Se|F`F$9cK14Gj{ z?^#s{%fTX_Ufq4BFzdjDO$*cWfWpe5R4~qash>E#% zRQ-1f`8c~TrEXsDZ5uG}mG)q9N)z!szEmz@fg-TQ7TVht0yNN|XS1^al>gX^G$M^B zEZ$Qss-72)VFqt_{uRqO_pZ{h=$JSOCRJeB2cMwAFSBwvUK0?O_s<<|Au{M`bwOb% zy8|H9Z}C`q<4*`2!%FA{OM2UY5cF}+dwxDcxHVJQYQdrCV2I32b$JHYk#p;|Q-=d0 zG1`XX*K9{G%n1Ro+)K5XYu`_x$8kbD^2V%+yR&jldZmVt5cz>ZuF2h9{D}4+Fz8am zs!TS3s!t4Gu2czGSo*sgpXQe@%l%zjW98|qUDP%RN(zH12_&2jM6#%w99}{Qp%8PB zfXjfUiC1#t>6~_NnayBnwwm`f3ZQQx9PM_1lXi+m?gNCkRAhEak%~o^2=xg_D>pU2 z9jOAaPn3dIyd|3=!t)Jcb37;NSx&}Bgd{i4Xx7n72&IXdW%OS0rHsG?x>zBuTq-Lz zXSJxBo~TdsM?xrx7$weF-lf+pG4>=}pA<>s+c1IfD=t`$j+~OYrULI9T)AW!H>kyTa z7(4r&6sT56y6|~`2x;!3Y`=z;aVT}-0gFZ!`1#*p=y5Q01OwF#xlPBl26plv5x6bXd9djIOZ;u2WKbB~~q92_inUBdDEZX6<-X7mlfzyb?!{ZVPd)fJ<*_G4Ded)P zc|L8I%aDLX{K_9Kc7FK-g6p#C(on=+qL(@V3_fzV{v#4#;!Q^fw&jKMhM>JBMqw7( z8z4eZ_)w&(%($|b)Wf}S9=C#@(vtDx@OenoP!VkCG<3+h>dFemf7ssW1U}UYl7OHP zBk^_V$IQYIExZ`hkq|0x5Jq<>WFn!rCh8$sXWnGfI>ydNG!>c`nawc_q6g??3}4F4 zMCCIDBbK5NQS)L86XuLs{t|f>xW?}^K!4@p|NUp9VYMEZUcHpbyP1fevf-E@=M%ce zS#up+8stE4ddBgWRWuUwwIDj{8--46Dg^SQz>8yAg*nxW^g_U*1HJSBE);L2!k>{d zv7SOL1r%meEHrBj*=1iR+Cn>}UV^oL&OCGb>yx?9j*yt-jOSbK=$h6Tk_?bTFMJK`20i(}U9F#)V&6^XKCBS^UDHH)t?;As>opXYh<{t3Z$6XCSQU7c`bC)gpL6n2Jg0C!YU z)sSb3P=)Y&yT<9R1_>ws-}zZGsopl?o#jb0EHgnO=#q?YpwPuXul}cG9a_LafI@P)Svvw(0Q?ZD|xdi+Z$l9w&eZx-j12mq1>o=`H# zFp7q)-pgZf_+&!|8BO16(wF|6K1Ls3DKBBlQtf|P7-CatZLP6Fl3N;hd(@mumDcmw z{SF(iw~h}GE~d${{T51TEbj2er9Ch@NJQeYrHT>#yYtF&UF&Qngt0 zfE3seEF`=>hR1=3W_Zaum|S;d`RJ^XzZU(dU%NchOPQMgsCqso6yI6Etif++{%-Y# zo|eUg{sLeNN8`4)w|n#kgm0D!3?buff9dPpE@@k9gf&MwjBTNc>Q`+D?y|-f4si#b zu(hJyWHYqcDii}Rq|aa7mhpHv8l8`3lQzD3y#0dc!hugBH9-c=dn7)opCAhX&Sef| z*}yv^BWRfvmimazTXB$cxN zf1I+kl%H{k`y>=6DVew{sx3$ z)R|2m;M!wprxhX&>lJ!o#G~uD(uf(HM*!#SRA3fo6K(Tr+-ACfE(N9UKjUbN`R~o| zNrTao5*r+Srt*Gs-i9D38Vd>z)yOsx4H7b-0j@wW&?$930w1}uj;qaT2bo`*TV4OQ z;64}w`Rd&EPPW-4b(v84PDsWcReXDSNX;YUZviFgXOJr{_eAFvb|hKjqG~_aEDPib z@X<2I3B@PDB8mVee=lGF|188$z$XOa4kANBdfxi<bI+zwRd8$cdou>#*1W7?S$pAwe$@!2ll`1|vo&--xOpDELBjJaSTm}xs)VM>8)3mWSm08bc z^@1R)zg{4h*Q3+-*{$rpdZAn@)|S`S>&m37@7-OE$T>qpa3A-LSgUd)bhKp-_D>}R zPjhCEnn+8Z3Y%2@fC@e!6 zDCe;?KkI59-NaAb0E@C zs4*wvd_pIs)cP9h<4YE{whF}8(JR%{QqNUvlHd+s$T2 zx1~(_14!7w%LXu<$|2yM5Hswnh=)|$4)Y3X^Dk9Yg9Okn@?SfGU#1L4mogoBN?9F` z)oX9uAMO!0aWi8F!ic-%k+^P>x`b^PU{we2Nf_|T0K5=sTDgmPBVW`9uigvgi7-7g z5}uo06gd0ZJ8S`R**$uIQ@G$IIueX!VqS;^;y_H-?j#J;oTbUX!%56XEzV6;l&K6! z7MVoe0D8Hl`MN?5%}NxY;i+6H3QW<<*hs9vlt;myG#A;7f$NKjF_#4kIZ2dfv+{9V z%<{A{^1OMLV3%5?s39g+t7q zIkOh`Evs&9TQoBz{$ow#xUU#yp+f z%4tmnQyV#rv)_~-EJO1i1s7yLi}>}lK9g>HDjS6x4YUQ-?vFW*a#m?|h#*)t0FhI# zK3n%3d@f09njG0w$ANrd;WDb*3?ajD! zl$)*K)ReWF&CX6s#pYF)eoNt~#}uq=K9)`6;drv&6=W6Dqvo-65-<&jXBWWV;FMx= zyiV4}0HJtU_068rm;#a1B%;PBu>AB-mOyuj7P^F}lm>QL!17Zf zV_XHGzEOP9{JXR6+EXvFnko0>wE9w(fM!IX)c85zAl``PNbKg{;;u$VJ_7&9x17YY zOG0Uj?|j+$#zwr&{IvS1yZX7~xgpCMR)opY?0Fm$okg-AnSQP%AdI`YQ7! z$(um}nAf8V$drg^i03dq^*%RAbGx+nP5&FuUc~yqlDZ2G7d-1HWoF&FZNGH_EFO%R z72{4n`^#tQnbGD-45;}t{d2~K38 z6{!uE6cSg#3twRh{)EE!*|I6*NBhO?zsYT-wtE6bPA;z~i+3lR=g8$1tfQ}#FF|j4 zk-0i6MBXFLT^l5;gnl17eISWv!HOxg42_%Q(y8sc@|qr@y7wBSgN+-)WR+w}cv8U> zIQElWkt$w2eS6~P07TCA9STl*AzRENbBg%3q+|YSOu0B60{Puf(WAdiQ5^JI;2*snEQ?`9 zW3>cCs^+CgIyI@OsjPOc33aNaZQ}*2b1&d7C{Y&+E=sw~xh9&I;x)L2jGab|0cp@_ z+XH`@lOx1Fown3;JJlMjqx{1CMM-K_Jd#B&UOC%B_K3=t6pV_ag%zF-XCpgJoDs}R zyukDPvqVp}mSjhmt%okh#+l-@-;uuVv@61jv9i9Epn=x z!lxzx?ITY0tnjL2NlQj_!$d91aQV9(xw*fsxopt0SgyUQaas0agFhP{Np01&s_K0_ z2lO4rxeemYLU~AO?&U`gB-*lIJ6-86=g6_s153V?uvsg1QY_5L>+1FNf=haY4}!=6X`rjt7f!^%_w zSXJW;aZZ}nXFH-m_m_d=3nNZXtjFnrQhy$?dmeZ!D9#R{%u{-({qQx)gCw4+QLKZs zqMYSeEk;J1FfAg?J@+zPTQxy1uOrRbHw1R_WKe$p?}+C}n0Nn48je<#VW8hDziJvf4~-0lBbV$YXocSYeUejHFPf88Mw;K(uic9C360P zHBI~46B73u?K2n7a`x$~-}Z=iQM39ZD;GmJNjx{Ncv|&Tk1@hwQSt$5@qo_?MXJ`s_RTmLQjEuw5uA2uID+ z(rD?%bc!j>^b!|rY%SpQVQ5vEt>V6zVA1! zd&UpvZ+d1vw0xX^t1PV}vG85lHL@wBHDpd=MDU_#{73v{&t!=4na`2JvG?Pi=~fO@ zsahLK9JZ=*s}&Tj1ldg0uLzcKIRY_VTEze9B_L?UZoP;Ux3GE8D!dIrtv!Klo_d23 z;cfNn>GAI=ZZ$9ikYiH!{|XUO$yqoro+Q7Vzn$b01&=vSuL4$?oTeh6C~i)K2Km#G zfzU`{eH_SE0C9GE;LSZMA`D+O`XSg9?YY3U8p8dxw!Q`om0|$AfI+7$D-ODokai^n zA~hLo$b1$i5F6UBMnMPE+~d5B5E8#~JwI+YX*X10AF*dax0ANVFUj?z@Vg6Yc^px8Lnur0i_aZy4G-x)rOfu&* z#<$Myfh|8N>k;Nsf!crfeN~jp1q ztw7O*ZfqVQ6rPugA$(#s<)Kv_o_`y#zznoUbXDp~9}k8v>Vx12P^tLj(Ud5FL#p zMF*Bi=d}Rx-l4r)?MV~6t<7qUqdBmfecE`wNMeNPn#cPGi5gWGJg`1sPFU4Vx!Gc@ za6Bz<>??rDAE#dK*(1edLrJ%?olR6POkl|HC*I}?<-!b`gVA_`S%KwuF zzl3jV`Yd1u`p)nO8nuC6F%oqG20NcdH(GN{R$*(dnXovL6H9mUYld2==m@-vi>d%C zQT{^v8wQs|+Yhc=E#&Zt%p)|$^x8fU0J#MM_trXz4=QS>UTGhO6oGs5Okys9YN9HaVQ_mv7mrk%wYnnK8U#Y7_*FzIc>fXNU$q#B=g@|p`l8VG z-`!)XE3TO$9Y-tD3nT`Jj*Xcom$wesoSP`w29}7v+d#@67oJA3%BqFdNdIG{V`2>Keo5m5T`vm~S=$GhmTwiGwn7CUerc;P}idq|#1z<;8j*`*UWqa3mEl!IxIkPe;ISe=YHOl z!wJQK?uawebGD9^LDhj^v?t*4zj&+#d-TL5iN&37fVbwi!mc;o=L}un7gyCS;I{d; zsQQ)@6O&@hR3WYFtqQ-|-Y|kHGJo4#6?Hm@7*q?nv!N#aRqqVq)i{dq4;>o1c6F{v zlCn3YYW@fQM=%P!DeS*doOM4k%Khwy$UVX3DP=R}Cx}xIL@0t>aqpm~t%-k;Aa-I) ztEr~BhZOVGf{JYMwbr(_6)t}I>oaEYy8-5audDycPRFkvJ7cFt~w=sPNQYKT&u7T%qv*0;$i1`(oTB=~Goy0fJg6E*$ zJEE-Tww*JhI4cBmRqCOp{~C1;`C{49gSDJil+&!HJ5&^?p)11da2@5+BH-Q2i%6AV z8$FLPJx8NnoImnT`Yj=SP621XEA~j$c19!+9We(pqS&NuF_^Xm-460~#Od3obHZUv z@pob70L&923XkP^vIC%6sypXS)l<4k`GAv8IsAm1!IWzK6nBBU!8`i6#FWOleZ5Wd zYl{Tbqvt&NG(hWbz6IP0&@vT_oV_=fBDASQE-j^)PwLPq37tN%$ki|qROzTkE6+i0}dIxP+JZs-Ahl`XV&TBxwSnk-Bcpjc!Mj?1~lD$mLwuC%=; zu)*;h9O7CyLo3=lTo>B7mHJEAG5HvpcL_WhS$QJTX`ReGEEzie5~2zRV_&igFIA0k zTm5gq>EG)8k#=J=^+0JM$`ps^k@&Isv8d>gb0$L5HjLeXZ67x8DqV9Eche?%h#fbN zW2PKbJ}e#QO#bjx`7m}Ww%1y?3|uoxS5qZEe|k|pQ2!i!t_8IBmzwI3t3a(m{f=*j zeMe#!K)*hj9=0T5q6Y_0sh}9a&4#L9UdKUuR=N5L_o&{XRfNjX;)&^QkwGPw`O6ud zhz73P5ojXLq>;-ITzvPj?*(asFZe_J4RlAYTZ6d`=!S%n8}5z|Bo5}$AV~=*eYTL= z#lYf!0thKe2jMFrFbW}3uRG;FV;0hL7}i(hEK4ZnIoQ?WV0bhC-);dQZw;^XyHk61 zO}Mc#Zi0e!Fb6p*2Vm93wHR=5LdaSUPi>Y0YBldR6D=t!0MOZgr&BWuxF?Xu1;J9Z zXeP9;WtNv3qMU=Z@K*^`?lbM`1Vc+#vqPn@?8rNo&_~C=tr*%ixXqbJ7U_V}%a+hv zrGReRc^3if>m_POs|v>qJVz&GUTHUlg6Aj!1>jh0{aSu5<+=T1%e@hC>#%v~6lY{Y2rXdg~%x6*Rbb zO*Ebq5#m?h3-)2dz%T^3*)N46q$Q+uihpT1)wQn56{}^ZOWB=Ml-HEfCtwu#K-ho3 zc>Y7GKr(FU)DA|~=+5EZM~Z`TpfxItZa5`J9fMrRJU)nr>sICQ%P)YV(ub7u)cUD= zIJ2E4TiPh^0j+mP!q!EFSG0F72-!Z_3Ej-2r`zffJnaZ%428Y}`?AC3b`%!mZzKnG zW!EEE7kzHWd&f)Hf2rbC4E}y$n#U!VfSl{u7G&MvBMhuvsu4K8#Llyl2UniU4l66QH0jt7V++3Uhg%$ ze(}TL%Cf08tIl6)Z`6}HcZ+v@d&})*SxP!sfVuxA(I!YQm9TO?C(gF3LXo$vE40Gi zc(0`Q-8fEw7L;p@Pg0>JwF^3|DJqtgNnsoP%zs7J0{+E64Wj-keD>cY?KBl7QRB!e zEKXgl>9kSFAaxGzbeE~LU>OWl&l@LXYd3U%gsNtBlTNGeGS<(V{gy0YfQ&~H46-0t z2q(LGIcHd`*u#kSz3smn+3VYru- z=i~sBKv5OJSgley{{<%*LFVGo=nq_4xCBMmQIPi%Rme${0(LrH1n5r>v{)WrZzO6w^sVD0uo&Y}I9y1nFky1Ik zm&-e1EL;)nNeY7ogU?<)0|^^biL2VkJbCt^aL$o!?5rcpU5h=lJ@(9zjSD;b{5V$5 zjDR^^P3;Rh`~B!v`UeMa&~A44HMsn3W_#Vf3}>@j9FrQhTvRhF_a(dpgvRO6{0v?t zYe|Z~qtHzbtTMr^H_yQr&_6l|))$9g7+)NDVTIt{js4Z?zDB)3hHfUT&9ow*RqSts z0E+xYn9c5GyjmcB^YS`Uby*u&&69yQ{SpBrJb$(SBtA~S`CUk_DdNS_2}KhHjB$Bk z$*2N6pR`e&qt-@)&e~@3ZHj*x4-&vTFYjcnWSy~P#a*%=6_f|0%jR5)E;+0uzEb~b zW^zsX0P`Q>Km43VhahkI7qSYoeQ3#?&Sf_bp4(JP~2ONJWe&A;ps@VBOfxp;w z=|t|!CeUd*0iLL;g6?Sl48B?}UJ@i)zN67fu4VQu9UAIiQC~52D6m^P0aO8B$RirM zruY_r`#x9#C@Sh}m8HT}hlgRF?$*`ZDeZaQNLG^djn+C%+*P@ROCaLL36yuCt5++w zaw_6^w>9FmVWJf>+AL4YB%*dq{b(z_Nw@ zP!@VyzA!g!f3m0Np6{s2`QI~sW-R<(wPEU^5L~j`{TZ`i{etuS>@NGTQUI3P^qPa3FYPOt6k(sk=1$1hILhl|kCkU#e+62Gxj?Cry!#V%ma zNT|(iQYajHW%$z)WJF}}wL=sQRf?duIS^#ok;V)xIT&=B<>%Gg0cOAtC1ki$(Gofp zm4nqjka2wrE`5W6%;=M)L*k)eFxVtEJyM0sky|R9uknTfB44(GmmtGRwXe}Czznww z{c>3h?ODx(_qm&GC7>nTlfOQ z7FhajNb&;qwoYpNRUqsMTgK5&{jt#sXjXB{u6*~gIbLqc@0h!MwoS$*WSy;C8=+pD z4CM2)8i7C~XWv1{UGtFuADH*{`Kqlq0CRJFp?7>ZIGrfKGj-5@+Kk1wt$T2PA;+q>J7< zSAHNJn=>fwn=Dyh;FQ%lf(9d`RG*@uZbH)Ic*0y`mexW!32+tY(EI?NC*ug>7Xg&3 z&-$_T>PHgvIaxCi{cStCcV1ZsrX+V?fpWsY=u7f}Fb`X*qjd{tVG zmYAaK^9n4gk0I4^bHd|^>u5~TxU#Eg6$Fms8;A@`(dp5d`-H*g#eh!mKY{TAs1enV zucy&PkE?c49-n(3+E7H1O)hqpw_vk20Tg6u9QMHkN^V;zXY(G)of8$yp}@zrdKrP; zY&g1Lv4x|4((oE@<7h?94-f3WiaG_HviftmMHlv*w9!*#)q8i_cP9*|B~5N1@$ppA zJrR2+AX4|UoYh7{BHOLuR$V$NJ8k2tErbtFvexIRpJOGycT(t5+$h^qes#dzpnjkH zXKNP_je)#%5D#E*8Q-jiTT}0Q2}W^%Yy;rpAWSx0ZK!QGn{U+dM2#YtA5#z!e)`h1G75y^S2Q$6)1wSFt=18Y6*Jr`=c#g2Mk+8&4thW)E%G)@UU={yw_ zcQeQ_L2ak71Z=czGzaPwstKsQqrGZiRaGUmQ&L#1zNH2dIepDDi~4L6Ii@J^wu@9?9zGr02eI8?0ubYc0~LS*(MPbe5_7_7xjKk=9AFLSQR96g-x z88%Sc2l*_Ld2i5(^{3q{;NGXl$@)<AhJA_c{*ls1L&DC&|R|JjS`c~ii`0s0$gN@Z;Gj98Sur3u6-PayO==Na&hl$ z;U9~ts$EnYf}o`US`9ZO-Jp~RlxDS_5F*49xoj@&4xwS@o@Lww1h3t(@mR}cK3}r(aZ4f-;dDp$yMrE z&Bqj4T=L>!Eky0H3B;@V7Z?dbO(1%HsHBYXEsPP3N*O+4ql<|Vii5ha_<>_u3;{pq zb_O@KC;Ym4NezPM@%C`< zVr5CwhxuZ8RpoF09J*zartL9i>MKgR+h$efq0e>&58z8gsqv<>cmC9h=>dIL$3%s` z=K(TZL5@*+X$B(c47mc}R7r)doD_}imKA)O3e7uWCFlj>U6E72>+2nu9(2MKI@TN5 zI;BMh8Az3YDT2&tQkUGM4N7ubOH@aqF8&~eLkwa?w9%Vccu*N98#@n%O=HexSVIp_ zrS~cO;?0?J_#M!y+9XHlcly8`0Rg+wed6dfYLHx_?l-nc6h++cD#Ismxv^D> zr*LRO@YjHwiyc4^0PH(P@0nu1yjp=ARieUSu>#u6mnYVKy=<#%9Flwu zVMV1jjUcb(FxvDwMt7}HPEaNow9a3cbH)_P9)H2W9)+Q}&HvJbB8X6_0K@TetC&QX z`u8q@&3+#S@h%u81FF8GEs-@k2ShsuWii9>A%-KS%*qeGLwa7OV?3Ew;p}MgR);&zucoDwkFk#F7a7lys*p*{9XHzgc zM;0~q`cbXafq;2UzS6}FQ$MU^)BNW*dEg3%#_q>=_}f+Tn$>oVQtD9KC-I45{7rMS zyDDUredT!E?q96enLMV%Uu)8e0{9H(b$Bncp2zGm8gM0VUD6Zcjf65+sis&a)A~xi zB<~{e38`&}P;St(yBh>D%!!GUI(L8S(=W1|clagEn)(;ui~2R1V-t}GExUioYzMc$ ziLazvvgce(;3UEo*7DlBD`ET?{o%`CDwWX0RHfW|mbWfnVJoStwU#O1i`(v0+p-zT zCLX8XVdM8T^QD=u?jPD;9$kobF&ILx5}-uSkH|E^}4GjhTq@XRPwv$)eV($Mvr zO|KaG&$74QX2s;6n+Rr^YRY;SubS5puBf*ADvC*6M-F+1*^{cI#1l`pdAf3m?IXDM zkPJWc*TyZ6=Xp|$bi-TEy0;T97OQSbZp!O1`6a8CnSXi>5o({}^F7D~+P>#PAnA=_ z(trK7_d6>uToA5}(N_X1rJz&^C^s%8;hGXJ$-XBPK9gZxyX5F63=teh`Zwu{8zQPB z+^@^IeRG2&QtZFPn!$wfN8d0h_rb2flvf#5F(1QDJJ=o>z%H`8 zc|{`X`t&J~o}7%Rb16N^2Q$m2ZLS^Oy0vzsrsi}NsK{J(xP~KUO_?{3)x+hmd*;pM z-8gbSNMGqF;QTm6gN1DV#h(k9q?)>^4GqYj5W4cT!I~bllYCQDO~z(35~V;f0p%`U zfKDf-k?kb}0kaqZ7EKgDpllJq;PHuETquxT_0v(%2k`}*RLB>-vb^;3M(0hIO&Pq4 zC*+X*%Z>-_Q|~t+Hs}M+K`F+PS`UxvE2RjTPT0(*tNaW&N34=axLiug(IK&>yvlb- zhsHXEB1)x;MsKRvxx9+8vCgWL-)6j`h;=jl8kiqs>em33o3}(iPbb0ht5`r0Xl%Uw=-J=ygr+a*WVKQX&kTrp!Br}T`dobVSMmOa~ID#u0MWtreZhJbcvol9}%A$^rn6d4_`tb6|TGc?n!p z8q-4>603h!-!exYe0mUHoE zDD1u#bU=Afk6rx|a}A+6^cOIKQ+~*R#to-dx@nBo%15kbY-qHqRTmj)B)M_sq$ZZd zm(k8%b=M%J*rN&CCrsXaDqdDz@^P}c*{c%fwAQJTjmv#ga)q9p`O^a3ZY2zZ(RhrT z!>1PYml8D-D{BGav5e`XHT(Arr>3@c&G2&jYNv%H)Ll z6R){YPwTVAh>7V(@N}lv-6pXFOKd zGq*K>YQ@C~B1nyMC$+Q8McMt`s}|Msm%*->*uX9q3LjNOv}n`)bPU<@jBn%~D&1U$ z6$nbvR1>wmpK8S^Ni?e3UPvU`^QlT2o-ExpH}E2v@Cb;ndp3w9j**x&36EH~kCVUF zRDhOJXkr$N&^lT(yL+y5*9uR6^0G7Y=Jos4)+-P=qJfC@@WnJ=5s@KmBk3nLGrT+m z)e0$HOe7XDYX!_V^<$WQwL+OJj@frmdTRwTf!I`5S7)ve2$-%LnaYH)za-KH(rq&a zM1KM0FkMKz3Qx#WcUAN#(YVt}$!vFDWuXv(;ZTT3(JUEVLg1q~Oq=_YRIz%Npj0pa z#BzeTS86GW5oW*zQW2|jHYpUyr;6w#)FTRvd(+S}pUz7za2KNUeoDHr=U+x8*yi$v zG+zY;;J6#y7i6G#viSsDTH4WLVof8b8Rp~NA{w);3TBN)eLF!>nBtKd7y;7Gfyp|w z6mzU0#|PA0ee<>HJ3d#oCfjd2D)9dInj6xO@Uoa_CQ9H8z6zPTNKr0Wr`ZPJW!FmT5io28I1fB zCOVAE4{q5u-#fb!oW zrX%yOwe4#_k@aG+iGImU$lH{aJEtIfdSYg6MhY_{c|NaWp`7n^5?ylFQPPxXZc^=s z^1xC-84tFMOUs>Q_AV`P z=E;c=I8MZ#!w7zq3DdCAX%l&=1%SM4T^*3POm~zSnp1pOLNEzLA_Je0x1ood#ldRm z?WRUe#?eLD?)iw+lyKVq@6?IO5s)0tg0ytZ88p0mI80hr`z0@jh44{*@TRc z=%UMWu0cdlPE$-1;eCxuGgCCP8Ih~3k*jC3Qnj!(dSy&xLzf~ta8buka1R8zc8<-# zV7{5L8xdl~Hta=#PZK)kEBNEmMAlnv7ksB4*o+!pqZQr1<`7n=)SI~ zlNqw8TPi-0w~SY?>C)>M21(v`kELkDCTQN`HwBV$X&-;s7jjY~*?v6r7rsytw_a&v zMQ)8Fl&1c|1*EY{l|)v6418e4iqv0L>}VrcREd(IqgokGV$v33{Nd@4A8m~bH`je0 z$|!)^P_QHQ0VeT^kWL@=LwTSpCoiVm=L_ZW>y<`UL>m zJgcF>x5yH{NVSL)3=Roav+q$qql7Z4Pa#wBIb6BIr%(|1+&sC;r%+Ag^HmCkPbTLB zOQ*9$TrNvQr?dZ|uCIR7KGY#`3I^%us?pisA0Ayk{U-?`?ML_ogNF%sySaRV6SM>@ zDr43-^EeY$bAVCuz8h2Pj1QA<;y>o9l(GU&JWj0<#Ue_2I%1p6uK=szwKTD2db`u3 zC9{kl3vcAC`S#znj{kPO|24BijjaO}n7hXl&dy@P2e#CmnT9T7*~-gp1L{1fd8<12 zo9*UC+0x@?*#`O2?@e2?wIeMF!k1myv4^>*##SR^%A_(t=3d%8y|koysI-mgN}=kE zERDp-(UgC3tZI+cu@sX4iAfZHB)V?HgifbHkF)OnY2w};}i)UgJwgUrEcj%h>8A?pyU{-V*hi?);IroOLslxQc+t2cPz zhL<>*D#E=}J(-|hDs89gYOOE^=IiQ+Ns{-s+p)&fm7MmOg4V1xf4zQd{q46O`hBn3JYawT*@GR~fpSnl z`TszBDd=|P1BI@(7Mwb??h<3EPigrQ63B_y0)D(tKtf0R+Be-~}zF(1D0c@Y5CUg`Dcr+KD z;srRkA_IYl62p1}%KGQD<;3y!O<{Q^cx6E|h9we6IVv)Gk`z+8Zhi4i9!R$a9+}bB(UKiId?du*esz5OCZm7YNMQcT){a0dR}zEgQ3e*4 zk4LMcl3we~lnxiZ81H(p){_&eu$NOuKgbc@Kx3qO!4t!&m{AFGGiap04SlB+$ z<+PN_U+_&r`IJ>01b?Mqkr~7cwMbg{4C3cRnkC$MYgKD!MDW?b2q66}^r!xKNY?7# z(T$0>Hd zk);!ENX)HY4lR|VRKi9@2yqH2)`}3SJy29OK4;*kU!ArUoi+z7D;~&Fu|u3gX#7h0 zM>@l8`)$C9z7rLFu1B3J#tbYWRy-?~sE4!<#k$$L=nqF7DvLCKe@5o_osppxD63~wn~xO2=~6v6f6t}@b*#ydl-)p7*OYRJ zF8l5Z6u|Q$DS8S^2nyg3lnf(q81;qxZ~3|A0Td$-mH|^4&;kTm&SaxyIXM@O3pB$W z+Hh7qwp-rU22@v?-F;>C`7d71(dp(I4NU7+gK_R59Vyc)83BBQklP{_ahriiR4+s% z=C;HZO|2{)iI;Mbtr(m{5*3MZ~7&7IFfn&duVLE7WcY5$gZ3P!^w&grsNcQbk;9 z_E7$KowtrVh$)Rt%DDIw;=gRy*w0e8aGOXWn!?c>8juBF56nzMO|+!)i;^d1=7j{k z5=RY`Stn~JR|fCtl;$DDSZrj{JUBe^li+jVifA-CCND2P46<{fcUpg2gqO?a;ks#L z?pnZCcL*%qR8ms0<*=)&;;^%NN9FuA>b1tHgqpMeoeBQ?uhw2$wpzlC{5-W%!(jm!_<#nl;q#Ee4BYpnEybR)cB{3lwU~?cn920a(f^n%*=sUMrckCU z9?w%M3f?jJt0}qOkC8?F&-$LZM=9E5SjaZTw(rf~=a_|NA#C(oDgMs<9e`i_7n&DZ z@$xfYci+7;W$M(>7OiGK*#B!A%Hl*;sp15ap1L?sg_F*&0$7>Nb2+(&zxH)K%qLN{ z>1z1jWST-x@0Ias0bT1S=~7K!Q2&d7q6|(#s&U`efgfNs38*rzRPa zL@u$YIFg%~YMP{5&lylo>OVP2m866wsuPnWlk}(h2Ll2lHcT?7YI%wOx9#CPkxdfE zp{mRdL8!F|UdHChCp|&hYj~U}i4x{}(*C%ihQFu$NufukDR>k=)ngI^f8j46Q7Kzd zldeL93C9we0)J`Ws@WPbWq|^9PhjWl2X%PaPWt@iTON;>^;^ahEMFlg&$?{+^56nz zM=6V<5UV)|Pp72EoM2gX#p)>Ss9=TMuosfBUBaq%rK~;{EDc6aft{z@4m_U*NSsa5 z2Aj&3rA#EHv}^ zSI?H>ljf5EIeQ+mkOLJBj^a~N2&twKD%GV&c3}fAG84m!`{>=IoB>x_BD5V&o2q0g zv_frCn5<9GHy|JA74%M*=l^l@-xMacu;oq6e?^F)#S5^^^;Dn~`80cA?z~Swo-@A4X)<+qB#nQ)8d5|^uUtRf*X2>yb-$8BB`+s( zPTBVedh=TL+Lo*}{hs;&Vf4-Y$w6^x>YN-`8k}DKP{%yXIINutkpjd+h=H*GnK;m&qdGezE?gs>Ml*B_ZkKlb>Q@ zCT`%}fwA|W>3d4$O&oXWq%A6DkgQZRU_?C~6V4awueTJ#lH293NM3Yox3EiTgn#Uy z?)hlQ#0|OH#>)!~Gf*wOE)lk&eHv05`oTqW8MMja!=3}x^ zv@j!J{4}u*bkB)dL#UuCWM5>RE9IC(XwRHs+5X%zEZh7+M@UwU)dAn!&i#W)0iYRA z_n-YU;}8j8?p5whOuWJ5|78cM-?3m>*(ych_?BhPrKm`72=BMN`hLJaCwxRw`}t2| z;-balZWf#A2zvhE2QwNKO^N~6Xa%#88JNB@Mp1j>u2i zne;1>vz7x5Sv@x#>T3uIa+#d;rZsbVTJPTmN4oug8&Xv3*Nv8fAOHRvdqcvhjcV49Nctz#em}7*L{MpZ zB^!mH=LbrO`0~l9!Hwe!C8){AbWp(w6Eh)vb$}I|@={g13+hh@;!bqn`>hz13IT&f zw>-Z6dPl*Y6MVxi&fo`|HVBnVA`@ex#aA8NfE^?gQmD7`K1ff8cqq#+WNHcvk713Bl`M#mG|lCV(NL){dZ}wac;H;z7NLD3rog}pyjTDs_MUDR(EFWlBulj?ZHP)E zdSWh18yoin_}?#~ZsBnCS!#K7!*J%cN4N}5a5YHczKHJ*Y9ZJ?@yrbp+5Bq$v#kDy z3qQ{B&mr54-vwehu6W;16ai&-Sm&*zF~l^`UQ555JNYp)N9X|P*=)-UxpmygX@?Ko za}?yBqt`}lOz-})p*f=ZH!0*lSqDVP++}3|Q9!Q0RwF2xmh>M3Uw8Y7xFpOPhbBPy z^urpT6y=6{qy-RI4xBd!(zhc>%Z0PoshG@b{7<4RiRZDuo|5=4cK1f&5e=Ns`H|9oz>0mkTKqZ8^m?G>Co2Cyk058lQcWx zSr`<~EkvckyvL|*|LgQ=4r7HQpRmY|<1#S;bFIc|`7vwGR=x{7yx|BGKa3x-fJ0sg zF-k?0N$@7?($*OraRwH2Q9@rVj$6=CR7e#&C6h2ojupuFW>G~Ra$t!xBZ05BVmh#M zdfa3cXXVHozG$P3$AM~mNRkzgJ&fQq6B*70Wozs8AlNMI%2Wij0)}Dct-y38;N@c8 z-{OcPw)SWEI->a*cDx3G1TCvbXJr+#9``wzj+pINp#Y7D<#;GUJwwZnv&2FZWTvpH zLZXg>+&KQeR8b4Mfj|dl-GP`qS>ggB)u`nH61RY`VkJc(!g+Zv@U<$#j#)Ndl4=Qv zSsd>`hJQMuV9YU1r|-96%o|3#IvNIt!p_A_{eqf<9v?x4IeDZZT;2`g-|?i zp`F+mZDIb3Nht^tFPl@S1%(EWG%5QKrKyG^{@F`0SD?AW$!460!&pI9{vl(k1CJZt zN!iq8Bu(I(w^+GdMDQNxU#RwH%I|e_lLsT!!Xcr72{rG?K z@!x{N5m_UVi25?pv=efX{+5gS78VRg!o`#;nv74gk-BJpcmPlR{QTMV#6kd`rVNF* zGvIuBvY2QX9?F5BO9)SfIg<3}=ljVIL#Eo5)*~WEvKIa?$wa1Dekrngd~im)|0HGDEP|sH*|T37|C`qz3-;Fm zxp1JX1Z}~r6TPA?ScNc5!o_VUzx$`vPlBfdH)y^|Cm4i{< zgjq&mww5x-obk;Q<}YQ|qNBeJ&BXcI+(0Hu&x3*Bxb$y@OFV>0qrjAr%QQVj#hq&9 zx*dJ)=RBU9GXCk&G&1yd#&nVW_v(+tLob2J`D3v(`8dms~=*DL$l;TWZOawU*}iA-P;=T!=) zFk~ZU`?P~=p4M@J>`uURgn0&PIT)oFW>G719FH5@FlXbI?lo3Rro4Dvr|KUbEeU)@ zFU&K$VhZ+rTITDrE52g8{wAaA#eMqBrX%srZLft*Ok0K0-%gfB@#t0H5>H{$Bw*eM z?Rv2NdH~4QxlZ@pw;C#Y@<(2}%o#mC(~kaS96bh19Cw$rLl4U@csDW)Kk4@?vApV%${GRY1M{9i^t zq@L&KlQ`N7M|<<1n$-s~-~197L^Yp%0+{FkCXGi@)(sNIQ+(j~JawF|j$NY_Nk1kq zk}(iwow><4nnXLJ$X3A-TZKn#RTweP8CTsoYx=#ws7!!a{=#e@slbJq&H)&d-Yv9( zfhqHH^hqRrN7%^dQdbL1F&R_4B80s@7?`dYW+;bQddnPdqgJiq7CWh>8>2f(-T+K< zv16~N{Y?6w-7__I@p=nn))5}HBWCK;>3O_yspi`;>F$b;RxMI`cw;jyb0u_IvVCE1R zxJbIhACj1QzLXt+?lL8~|H|=NUc!E$x8is>9l>p|0nI+#nP)ND@h^21|5yhwSkkKA z1&r{rqd!v3wuFIlB@Ph`5X!L=lEV%5M1Sfgqh)lS#4%g-|zeZ678v}Abk zUfZ;r#G!E+?>O48Sz$-@5##7b)bn8>&$7&^o2CHnCs`^^tWqq7K24&To0s)F@VYrL zLLQ7~XY$V-t71ezB5nLfDP>hWj{5ywv1`IAhhYs-9o0aai$^Ids^PwQ3uRLdu$T3F z-T*M3t<8_ym{W0YjAq))Wn5Um6)*&PICxex&a!$%W!NHpuq)(Lv7eSn{@=-(jTgJJ z3Wdnk5tv^O-$>aTa1+r5(i8IhW!F%#=YN=&1g zi!J>hWz$<67-@8h>l3CdlN7zt{dDmkT`jPn15$kI!0=XK$|yI)fO5kSJE_I9qY}T9 zu+;Nm0V65xVMasIH~usLjN# zbveCRAojGW|1(|w8f=l$^8u!;8Zth}(X)v8E0}<#x**##SS3H!>exvw9v|I_#||m`glEoWI|4{PK8xwAI^zE`^#cs~0U)(<;eGjc2{T}R@9KNjO0PaZ z;?dZgfpZdAEN!_n`rVS&lq+C#y&5nK0bqXU^*KM#f)Uxu#G^=~S7QmeasZ?TCz74Od02#$Ug!L2@g z9ew-C+ks8jykfVLcTNOi5l8v3tJQ=(L~7~O4Rhn~>W$SU7n^3ly1j3HSfrwuAIqI( zknA>QoPp9-4fKWC0d=a>=k!n?khyZ!zv)pXAl)kfLrt&IqWhN{0=mv+M_^MA`ZnUx zY_W8$tpAeaQG4ANo5ysu#fPNaV@4eOYFAlo;sE|sejuF-V0iANR@S8P_uadb3+haGe``l872*n@f5Z60^;$+N$ru+L8j-=4V`BNmN}jjlG`|2NHm z(CbcWb^ny)?cc0$i_dV61;}=DvR~m$=l8xQ@gpiCBCC zn>rX*HkH6l>Sbs3F>&7|sAX4Y&5g~8%bh9MskV2Y*bjXbarAh%huSb-g;MMUG+Q~1 z#_uzht7DJpYL6VgU$SYwPs!qe=6V0eLcq`UAKFg^PU5;}VvZ%Qu=wihyr%_?DBM=0 z-W6gqYT^5ixKLI{s_u+{ApuWQ;&^fR%L^ulhV84rNRMnlx zpTpj6Kje&&OKhG-qjb^NaruFTzjB=$y7kd#|CnPoYB&2$bz^R3Pm>NYIi~kNzjpSd z+?bFxHlp>SJvaIc2&2FPx%N?$zlJ1iw`E*{rQEoS3MQx%TIbC1kYWm%J;8OypeGb+*R-g zDi(@Jjx9u5^gqvAD3oZk+&@AY_r5op{;OVG?OQ(cW`C$OF%JGf`REq}oKS!|6!(wz z4?i>x!Y!dqq=Ayf*GuG`5bSRJVE;j!XukO9e=!zS82*7DP9XA+FXMYv>|IeOI+F%sxeHKQm$YOEcVBW8Y`hef53yeQ=+>tx)~y zGqe*?+2Ozl92vNzV7h_BOj}3>4z=9ddSJ-7o6(k<2<&Z}??-?7q2bGEmg>>!(fZN) z(fZL=EKYyiUJK$&k9w#5)_uHst3GT7sV=t5)wPS|s=ipRx~V;+DkmcZwd-lJ!zsP^ zPY^_;_hPoq_^#BZ(W{1hSWG!9($6f&v}f}H?-^zs={)9}^eL^%jVj`1GS-M0v2|uC zu6w_{Sbk5j3oa-9d?=gj@Oc&gHD^;RNakr7YxKP3kR6JwOTL$7_c~w>(i%ozHuOA} z-Yz^?XB|8oy**d^J+k<#35+~>CeIbug0}zuYmT~esaWG;4_e8sMl znbds}96}NtM)DPhk}TGRT(FIx1)pc)iCKG)xI>W@`(7ivxskJAY0Sa#XSWbXFI!8J zc}B?!J!n{GAP@o;oTuJ(Jn#Ygj&^2x}@wzZ;{jic*uh8R5R+^Cb4P)8-xUPUu} zrMyu`CA}+7)@hfO%ujAs@tljXW?4(-EPJ*?a!%dY%nc;?8$++W&O5ceV?@Lh&peK5d_!L#apUwdO@!Ixp#Ra18H ze_IIFQEs%p?Z~>m6`&s#=t~9qQ)$xPu>$B<1^QNj{#9TMDwB{eY#>EAgEVR#Y){hw zb^)wLH2+pE;J+r?Jiy;6wrj>l+4ARKS>&p2{(Y@ z_Ndg#8S~9{CIMuw3db^zm8lf9@{?mFl6##&wQc2z-ACe+!Qu8%cDe0O)|x(Ct>XmN z@2bG%@EKQ%S2|# zVtS>;^lU4Tiygn)cK|yS0l0%T#=z};Bmv?r0$3FgK>`^RP(gzj=n$t`;iyt9Ab|`D zsGva%^qM#a$t`vr(DU_Iky{x8y73c$F%tgQ=lB6YSiZ{!FqGqf?#7=qpDyMFMy$D* z@ddE*Atb)+bx;9yK&Fx!Qvcu-VwAgmKM9(zi#4MWTv!lDD|~*$qT-UW z`i4du2@ht3o94m6ttW7TfHexk)CzqXXR4Ap^BU>J%C4j&l(;1n^&TDbq|IgC;~Cpm zCJgmxaY&ftk>r*akj?b>faNcs(+}RNx3BIjxHoNFSdO`ih0r#EUt{L*Dhg;xY$FeA zFVtIoT6+y3?agzZw~e@MDoXp?D5mQtwQ0+C-DzN#b7^i0V?PeQERZ^M5=Yw4e(n7_ z{q24W3k!?(0(to6^!hfs`F1$9sPCVqeR|yK+fbYQPx=Wr^81AZ-0z#cb+|R;8{5qd z{$y?cyRmNFAEkrFc0&tTvHx@czT9^fNZ8iS_GkH0ySgmz zyFjhNMBJ%jpYG}NgRhFvRlY}vR9d-Ca|m|x0Xao3{;Q>7OiO5%^?I}3rDhAOW*2I6 z0Fz2NgJy&k+u|iplIGi_Bn(2Ta;P*6qS;QDYQP}Y3wnBRb{|_t%*-EL(YBM>Lm$_I zjcvQ!>JH*1{@h1(LyK40b2cxVIby!F;WP5zdGdVQ61sS3URUM(w%p>BH`ue!+wCVr z`L=T9JBlELdyhzcyX9AH+vuNY1(eF)+cS8h-~K+7HU91tRaE8TU-NI1x(0O4)!uhT z-2#35FKRe4{fZox_ok|Zx{{=W;S&){2cyA1=3(pp0M>8(fEn}mxg3KZ6j?r?;7C$5 zz{merUUGzkK8uHz%i(ik@V3|b<~_@!SIrIvXhp?;HW&l2-LgAe&B~09Q+ua5=CICo zqJ9sg`~Q&d+bEv+>-n;mDM=~ZL;pKRt2+lEmv=jLed(YN($~mS+`kXL;Qh0i@j^EPLn22a*_oE+-@t-$ldFb&)F}K z%749AARIQocOd1BWM$xQnX1Eg+C~Zp!7{156%00AqEUosX4PXns`1;am72C-mqNE1 ztfc0M%9fp@8SeD1I0|W-$G|bo%J9?1K(U|(_*pY=DYI1Gh@}lJXhoS>1Hq)E5sn$% zWRml;nS~VV<3}nHqnC&^C=pA52#F9Mu_gt9?7VqzV5Yj*l9X_m|6zpryb2T8RmR^lhRh#xQ z98=5~cgK0`ndB8w^iegNiAba)yF8zYFgvF*UG$VgC^iq4upWuek%53Bcwi{R?@_O@ z4L9hp1Z4LjV_%Q~L3R{bjbkg@QkWJG&W*dRlR+6`05>afw0`1ob1D9JLKW`ynEe1=I z3i{rM#R)#P4GU`ao9Z%6YBLgDszYE`IkvOEB`G1lOBcT@C^kkS5EAGLAYfBlNhlFp z=Wa=37Oi*JQ$e^5`|H@T;o=ZLHntyk`cP^Vg1`X}F^^r!;`r_pjZ}yKN0EgV6{9{;hS1zFVn=>6_yJE#28Y z0Vylu;C<#kEB4^xRwxxG4LnMaX?0or=DicJqa;s)>jR=V3p-AXQ!Z?e-n-x)p2Sx` zVcIQG#GMv90?-6agsYBd&FfMu924w_N`#!FGZQMoOOwg7lsd#{vveJ1jc9;l63B`! z0IZX_w&WaZuURV{nvQbCb0Gr6W)WzSg5kUSN~0BWLvi%FMAhcA)Vrc<_zyS|k50>=v z7UjuVvgZGqx>z|j50*$g%SG(WkCM4tL1uyBtq7n4UoH*cdmwg3#I5E5J_cLKlM-ve z?70Zw2DurdKm%t+n%*q&JRrMW9*UasLKCQ~Qp?B6aqpkgiInScuq~;=F)QMOkO?xW z*`*{1PdWl@D5=egeVn>kd;+|!Ize-`J+w~+ze6T?xi!svb)XCdsGci>4eGHy_NZ4D zZ}0iU9F84<{t4w=0(q`FK-sESZH>gY3w(r3kVz#iPn1AVOd7bq1ijlme56 z5!ck#%3Q8luaId=y~^$=u#4TLT|VN7wwjShQpu3iLxzhQKY!%`5ip&7ffQExNG%GX zp}K>X1oPSBwPhvK1N@QQJ%fqd8dgEDpc1;**R3rJs-U(!?*HCK;r?!8>CqMrfSK~h zy%W!2lV@}nsm;vMNOe!$(V8VqLZi*3lQqD_IlD|ERyLRsWFxCx9xRb~@`~q(M~F!|bYF4md~w{sw|ZuQYL6^uWFWr+)rdTZV-3$p z#X-6I+7QQZ4`Bk7q2OhngHTzxO5L}+cTT?%evf^q6n3pY*n67gzpUlNvEph2OD0$6 zHdYaqefHM|IGT=Szz|_pTI*h~_NU9t2jqB2J&N>);gs*-`s&2r%!ViSaenvi2*aMD zt90y7X=%379kyBseJnkL+mjOR0WAg^5vDF z#(=dB#@6r0ioyZ+VOBQGV9>1h5K`OWC!7`k9}cO|R?nbOg4k|QOeT*4AZKleLK_`R z5Z5BFMb_7$m-=5ZKKsji;oiaN{=e3ax3YcHOW_|D3th7VOk-OO!X=zoGKQ(#b1)H4uj2I_IEC4F|Nuk1Vf3t@1u5KZ>>!drETVU~60`fN?j> z>hdja_9EW9Y)ceV>P{CY9NynJn9$wk-VWeE+m6}__x{vTe{4(H9!O@K6)TU5zBAy` zlW+|U7TZ2`Xc)${G_MKy2KkZp&&y(@7I`QqA)9jY8AV&^V1<&g zb-cArBbTWV&n3Nq2Oh&(GUi)E?~@~o7>}bzCV(_QR-N?(0LkCegWS7D%ah^zn0VvU zjJkG_4Lh2f)V<%0>5gJYHJ)GZEJ~>n^X`-75+A2nfDg{T84ZY7kk2R_kC?!oDc(&n z_~5J{M(}ZFb61ub-Nz{gd~o*7XfXnxDMLu@sKKo`yyb zuGxUsbglvdADn$N8W6EyKC@fpUP z2Ke+UxGtFw@`R=f&kpDaNJlwd!^Eg(YGGRsqPI3sN53s%*6>Oq&wgT~o^i^pvuZ+H zb6bV>ysOvWUhmE_U#vg6x&n)=3X?KsrlgE=z>6RR$#pv=-hu|SvloYgoSI%ELP9*J zN8rX;Hxz)Jo4xpuIc2B%BZbe8tead=Sqygq13pAQ8UdcR;ZU)H0B3FJ^5a2NoLa5< zeyC4BzFJ@fxv0t%cLD=GL<>fMr)@|*RuJH96iTTzKdf_~ygn%vwCbEWC_P!_J4bPRCH_iRY$PZ1v#{J{q=^oC53>rHLp0tHrRQWxoPl? zZ|IFLOS$TFYNK=?50Q?}JMK=hgmbmAW&EI^hLs&`OR6gv6jZphgZk!q`F<{i81U!JltL_6 z-MSc?tgXh3=k#q9zA-{Mlmn*C21ooj1j+-<`{t2UAOS4~flOVaEBGBcTIE&Atsj{+yR?lG0GH`C(0H&54f zyR6wMxPiD(`N6YO>Y}k|s?A`9WiwBtufZB4ML`{UUS)G%Xw}!Rw5GRJ+H3=rE+3>vXbLV z#(VfgJ2^CP#Qr67Fbvlk9SJ$5mA`T~JI&|PZ19FhmgA1>q9$9S4Bpgq%}-$OO;0YH zo!|N5evfCkKXu)4c9`R`(0Fsz7`Di~(PS1G>Y7MPOice5#{OIC0D49kpB z3w(o!^@_VMbFn)_%!Q0VVW*%rhj^kmS(WJ`kxCv#`!*D z{yh8AAna47mbB%Vn<#w9NKr{q#w#L;>EEzN88mkV9>p)|)T=AvB9+IPplRC`obB2} zQ&(AvVtAjpH2nK!T@hW*}Hc;NY4IeW6e$ORa z!_$?m!b$*&m?FhOR%A*F(#=6nOXP>wOqle#MW#e_$PXR`zSYZleMLu-RY0(GF>hOc z>}0GgCYYqq3BF#pXVl~^{r^RMd?cl)cxzh7O@vzwu#uupWmxmg1ror1ikBZc?IY#{+k;h1Zpn=2>j%p z14ij;8>9g7TCU;vxK-2w=?L^MUDiW*eW;)fq|J(4zmVDLU7&4MEz}I$MxXzyS_g6z4jvl`GZs;P90jyroSr^H&O~M4Gw+=E4cP z^@3n79}B$)thhT)koUEc)Hr%5P1db7G%>AS1;Il;XWF52M<9YXJQllyvt4#*s@+L@ z;%1SP&PwNaAmh@BZ$%=K#axm|4Vnfg;KHxvX{jna<8&G;sNC?w!b-_)kHqU{#Yplr z7b;{UPF)1zQHDcJBO@n`lw^bfaJ^QRvKXuou-T09i2>Mw-M)!KidF&I5SdMi`HWur z0xpHk0T8SRrxKsyGE$>P8#ci7Jwd@3HpG2Qb@v+FGB&eSr!nL(&0ZVt;I~dw=0WmPAehE>MR+yr4}|W z(+}xnC5f;&3b@AUrfIU5lQkeUBHxfQ|JypG8bOjoFRy6L|OKqF=fDMwQK z>uP#V(<>&Io-G%(ysUkW=oI{VNuS79g=S<^WVp9#>S(#K)7H}4UP*g`7BrX5n^#)V z_B<_W*#Fo?D-cJ}Bk=zA(1guoKEMxoWC#ZP@Ucgxi|hGHK_37shn9X@E(F#0?4mw3 zR{>eX$^qmJpdjM$y#Wz-Uk*KOnPk-hBXh}+MNFsiAYC>BblEam1cTk|!)&90f}p9? z4+YWNcMjls5P3j0a@TJqvX_t-E!9!lxT_BiH9hJpXY|fF*|B0(gcOWa>Cw&QTa&v* zP30#r+D4Rx8%kEpS?B~9QQ(S88Yj_v);Nz~I>Nj~`C_SuZcY<06IVp6kNgZR_Fm9@-0~Smv z93r$TF$8894>>1CXb3v7`&8lUcELeT{PjTVK!Wx$X1J8)x|IvPU*nN**Xm&C81^jNwg8S zB_^YYAU!Llm)r5kadQ!`c$w<+Jx|khLOz8*!N!2y8r%^)38r<5EJj!bfh<%bLps?=BRv zXDZq;Nx;e}G!ApKHoYa*#Tsj_1%r#zEN1g+-mKhV&=2*pi*bnq!WElCi&wfxi`kII!bZj2mWJ4tFNa~GlQX;J)oE?to(*>0UHux)a- zIP=K%$2RsnpSi@2rN&jHr8>CLGhvwRnTcq z+zrQjt~K4*BX9X3PYFfJ!9-I2c{!8nsbJVL(xgQsfw@m>8Yy$`hlOZKt|^(&cU(1` z6ytZ&wRVo}K+{wUO(&(V=aCT_<85?sL62pSeoF~S*DnYU|AclYu8~@ORr#BLnvS{r z*%hlFo+jhlgGHyl`SRu-Q+`S!Dj^sB3M^G9+vt-7fv=fw^TQ><^#1AV>$8WZQr1OQ z?LPhk@azXGeMe$NPf@{EeP-y?-Slb2%bRnp-yaB$-oE_x>;eRvuDtTl4Mp`s%Y?GRrN-GjpThxP{|HhZa7y) zrz9&}k=GMu1*>89Z5Y#pjK=GS-Fv;KG9KVb8>`3pX&M;+@83h-5uaM-FcASx#sFx#2nZ(srDyEooaWm;& zp&0q-%ouMgEs9`P4>`lOcl;e6I_>S7-3@u(4PBqN`QhXjT<-gn-?gImP0dK@n*jxS z9k)zYDst$Zc6Hhw_~Ei`VGP~${k6Tem%&FDqYD>5Cb?9Phleogi*!=U_dDWE#J*YM!Nq)7;`^#HfZ z9N0ril4YD`UB!+zynbx)9&f)<@^ExYloh>QZzTgq>x3&~CiS8M@9l;@;NB>XhJ9<% z9Lc+mEcu=x*7DyX%8_#<*^r4LB+0E$B|*H(+e1wX^0h#kdY#09!NYw1Jw!Grl_Qd} zWGy6eP4TOk6gG(rCR{BW?P=wUy)adYMHU(I(t&8rzrIY;()orZ5}B5mUL~M2v#qJD zXrUojO7)dgDF2XU8D_Nt)B^FyfQs#%-dBEbvPTOhMj_y=^=wVal{IVQ?dYW5opdKV zEBKPOH3fynU8mu+8Eb2_#$p|Qv{x?+LvE4;3ge%wgAj>MVN2AO8tu75dGcIrT zgrw}#ybjU31=xPC%x082D9nd35$Do@Z|`%+7Yma|C6{i+JU!4Cmm-gxCQUB)E_l_~ zNx`gHlFHPf%ACoIq+PO4+mN4D3bT$;@c0RZ#!+HPOMdH|!Q!-?(Pew27U|9>L1Oo_ z`;6+-q(RFtL{&miJT2hVr9V5ovW&~(<${R^y>>bmw@!n*2 zd&je9eq%k6_O6GuS$a5)*%qK)kMxdJrOVVsVR|F!KT5e%bFopGJ?imH){3q2aER-F#)$pr^)U zWRkgmQR-JJTP0syfOIINQ7}zOn zlv>Lkg(r|JVassN&4>AzoO;U_!S(~^>jqWV_w}0KuMt3fqtcN_m8Io%2AB52_WQhU8K)9ioxxgws+UQBs1)j*?DvREXsTxE)lyQY1Hfd(qJlu&Q1wLKK={D(6sR0&?|IHd8c ziv`>3@-~*mpj+-2qRX&bL&Qy+tHMtW0!eXjG|v0xC5zz*xdbaVNx}2;j$n0qpA^?T z^(Y+e32yqNi^>{y0GgH;qVP%)X=za0K2kbeWbmpxy9?8EUIz#6KY2Q{p8*qxpb)WLY6s9HAPV{b*! z5$KRswRwNWsD?K3)xW(U4MU^sx=!#FyBo&ki_q%ypcPB!yRMsdyT@wWxa;Ql;Qip_ zd!!$-1Hh@m%S&$<<4@z7gHo3oq5H>JK#sCZMJ&i2oY>=fC>=Lm>d@KPy6M~73D9}W za1r4(jBUjVKpv`h%F@`i(|m(H01n{qrMjn%$H;%^Sx+}$c1ygWg>kbi+;W7u&(d6R zchpQS4^Y)TIZs;G6tV!D3~-K70n*w=^~E*v_kXVMFSki`6uLv1JM%^IAFuLN!?ZMf zlYgd{Kau=jH@2DwRGaD(tGtDtS|GN#;~Gty8jtbq)HOgJF0j*B+m6tA>X>TA87Sri zDu_4PXny&Z)&&30dU+>bt@QNq`|Is`8eJJ9yUy)T@jn^Of6&XT@5a`CO%}O+vXo>g z?5p_72JIrZb!e=4iOpM@qfWEa#9|>lK}mdL64dkHO*nzzcz0*Ce08sB2p<3c>c{WC z`Rvv6A79@k;~sm-$iB&VQ;vHgzYFcFz!Ljp3b(VN4Q}Y<`_C{CNio}NhlB8L6|K5$ zUI%m=5egTKu*)cYF?}1KMwC0HD{RQcS8o38zO!j$3kqFJ%Zv`3Z@S|rN&b;ae?72S zR=COahB+s%{SMHwAzyU@O`Iu|CQ5pZ21TblFnMPw#^#stos zjvm}uBfC$H*=X`3Dt+IvS+3*8>)b2st9%Nb0U4#IM|2FTLfcq52lRxF!47$D`u+0O zb+wb5EZBT8_gE*Ro!1`_zfR>3y4r0VJKe?BmO$nP zQh^zz$w@l9Fz_db(1mRu0x5F{o~Jbx(d5Ca2X6dqWRAPYzYDCVuN}W0AQW{LQ`~Ub zWY*q`eL47cem&J{Y&?*In=IbYTXH4lE|!keziX0!*LoIyW+9T!fqkdVAy@0hl|Gs7kt=S5;nV$QHDC1;S> z>puN5oOKB<&nV$reH;p&J9>~N5$1J;TMU_NCCvJR$26C_ZV3dYy|yJg7?>c|R=ttD zrpz6PX{!z zSj5?7q_3R(^Y-KG+tby%YK=1B#C9mHEy`>ww?epTW+*%5?>F!mcVaZ?qnZSOetion zn(o+^!sjwbzoAmxH!_-_T>KYC3QrUIM~>SYH+ITFnG@7W`qi$E6o`pH z5t@EyN0OIBIQ>KCYt+B7t%rasd@js5WcLa%&ld>FbuBOnEs}VgsjUY77&L>Mi=j2M zkqc2&cPXuJ@b??Yz)_10$@*wjmPteFm}dn_X$|Q13pt=+MN??r9)r+=oj>4YnxIG( z=!K4FtL9GA=A;4X6Enf?XgBV=l`Q3YC6l_-W79uY{iB*tPqK9`YmMg{Hq^mBa@fhW z&UXC?rRFo<_n__D{g&?}xT?Q0An#h&p=roIRm`RS4wvozhyg2Z_hVp=#&2zq*iQ+wTpf^3g(@#qh6% zFCRppEAt6x3TMQHUcyQfIHKJa2QoFGAYEH=qNUC>HIYn+;+P}uu ze%j9#q;zUegYSL5-UM;~hR~FoSyHfGHB39LZNL#5T2kc7r@qNaA$Y83Wd0fPSi zgQNERVlBb={_^$ZX3usSJQ?T<$bMrP5eeNH7qr{$d9IRGkD68X4HgT4(YIR5#^mHl z9L6{0-Fhz^J2>5{vbGJekuUBzl+=2R{LklR z<48kd=u$EEj9L=jMK%mi-{e7!Y9pn(V9+!cF`eo@L?>BMc%8XbAMA+H?&>!3)Y(7b zvBLYSdvfc09DiFzOq7~`rF_4o$&AoALDHGcKO;DO>Ml>=PJ8{MF>Z9GZ&33S!+vZT z%aWzG5k1wnJR?DI67n&Ky{mBQ-O)qN)bAyM>jC%2a3tPj{K}kaM#AVmwo9vv45wSd|wptuZm%c^EDnG zX>43QIt`Gvz?bhW8griB)pHl-l>sPYBH%`U-UFE|EaJPInD9u6$r*!8M#lJ|PlY@~ zvWHq{&Tv2_PSQM)_w$G~Y{TJ#5nh9l2)8F!56R`?(%I!{OaUNcIm1lD-g3g7bz9#VvJr#DITUp;h4-KwZ#@B1Y0go18RX(zO=v<;+}B$(_Iv=hr>ao@#j zICf!U)kda>dk6XE3v}4xj=aux@eZBBv>M6FbT-^rSsX~XAJ7Hp8kerj8G&a?exe-~ zIXQ`F?*tkPT?8d$Hjl^Q07PB@y%sw*UcI_Hu}Xh=%vEA&#DF?CuKWv)kOQ8GH-4kTfJ!%g&Uy{xGkWZm~HbhcoCGR$ryL2SXptg+uDT~p~6 zuwzB%y)5D39<9|25PLK3iREr_EOreMMxs$R`|}*j7%4sJZ>`%NT_)pn8P`U(lqWLI z5Ff2!^b#5@SgLoVha`b%1)jT%l8xJ3ZU>|zob9a$)LGF_)j>d@m$pEK`UL;JeXa{u zdV=Ho7zR67WFx$uOUCVbAZ{|xMFzL2nac3;{+M?I!Kgcqo$tU|(nomLXvjS~%h6h+ zsgjqpK4@>}H(^{OSw!+`xF*cy&&r88B(}0Z$g~ILgdDJM=ZXz#*S9y0Bv9yytZz#S z?GvW@Fvc2B{5JH7V34>g(d(x?yvlw~;+U3HrhTmo2DEulvz+K7z~oT(OW%*c&P<3j zABj?$RzOH@i)bnfHj!ue4vLM=@`T>}V9a%asPe-_dv(6~9Bk*NF$3#_aqk_}NwO&S ztA1-&Is?HFXC(AIweG2%#lVNPc0o_7dxjhe-HB}txcNqh&zvl*f3m*S*L{NC!ehW{GMX!#B6(b~pbF=%iHm z9Wz3qqc0gVk$HcO**mjlZVAiSiaoRx6A`2t^Oqj`VDNm8T$ycmMB+AD_xYf7tnJ(l zxAKE1E#Vy{X?i*mtpE}@f6E$$_Qz=(qtmaeg#b_UW`eA)JKGKJR&C-~5lg66$BMz`yNwer+=YU9e&Aia~%c-zC0UHys^FWAufQe_q(!Q+>TA zL1yr{&#`$wmwmQVAcUh|XxhDI9;|Z>Z|v{4te&U6I@wwe*6jt&A-p_1NYSQ{gtuKr z^$X+w9mL)0^QR~?(&<@9P;NfE0bKfkPxAtAC zv+MUhX$w*nHs#cm5O5z#w5+Y>=SAPsOeFvyX8?!y8vO4ci@Ltnr+x*np-$SwNCDBuo z53ZO!P4k3JjAEODl{^+dsVoD@H!d7~v9`v*bYfa>hY--^`8r2wq6|Q>Hi>Na`il#y ziCtP929-5t1`$5!Ytu}t)vgpYl$eawVd#h+u$mBqE5Hw)j*;FU{%70nWa=)i1%QTx zoK@oA<(%awN3|Qu=k*j z_@!{p>kTf#DGN;+X(%tZN2T4A1h}7(z?n|;#NL|WNA&UiK{6s)7R?S`AZ?m1N1l!o zE4#njujfJh_5u?nzCo9ybVO)5ZfjtBoYvn*+Nd1ePN{9W!9!i?j0g!?4YJST;{VYZQz?rG+RX>9uQsN!ZieGiwdbbDg9D~?=3<% zbUMCTK>HN;=sFIpc}wgmY$HKqC@#xP+86~ET|42m=J$vRg0i#S z+<5hc>M>(~>1yGznLU|d3s_O6h93Je*n6VP2{8Sdh!N#z)d;4y*!HftMftlsdA@Sy z0Lmm(Co$R}500?)nvkG6azX(T!j0!d)}5Lu9|OBh5qFp7`}|p%kQVaG3g<|A_~cQblj7TkH~TNWh8IzLEn{GWV=!A;Gs-J z;oPrI+f|86Nep<*1^Ls}8Hz%{drvA#E@@JY(F`3IiL?)-cw}fO)-9?*3`gXoX$a*T+Lw>7(j}qXuRzpb zEP9GsM+hGA-r5$Wp|#m+MbMJT(cubyW-M7<123Nq9AvK#?bRbnqO22Z%wa^iD6|rMyW+p zXEUJOs7V`@whHznqEd%-vAT)1ns%!q%1nnHHmZ>md%WV!Nq^+jLLp!Hbo>lpt;jDO zci`m(hVha&V3buwvUU5SZK~vSaq7PR5;@D&NFU%)+ROk!!zVTeox!j$1iY9t(gww$ z>9BidLLqRC*Y~Gjq>sm{I^K>?m#G@7Vcd5`(&W@W-{9;^z_01B1Mb%>A#c3?`;0m* ziEq8TeR+FXd>l}3Xd>*3cZwu{2BFJrP|%wWyJsTgW8`@K?ld})!{mIy2N$Q?^;{q8 z5$q3zb7k0}Yb3^Lo&~fVzmi(8gRJ9MMcJu4>{DU~(b*;PhS!-Ps70nxTgNk*@n{;w zE{@rD$-rMb?ojz8ese`dT8z$VN45R@J-4DK0gSABPQAp~KT|ARy%cSglv3v? zp3JDm6RZN?)C?*ZuE&Q82I6;o|4wlD{QmR%*Xan^10dMtO)UfJv}Zn@7GFWR?Fk(D3ta-vN9w6$QAcU%Uh!wpyZI9{k7n?J@j+)pf$`ZQg2 z^I^dZ_&r~xn6`(VltT1YUjsyGy#lghYgB$4?pMu33*yia*F(DnM)}S_?MonOFe#bO zas_oIn{ijc$k)qLSCOuvutw0-OIL*ASq5SHn*&WFyBJuOf2Sl27Qj!$RD zwduJryAZG<>XRiKyvOSgbWbLqU)nbEcfT$`Y!_+I?bIWHPlqFy1SvQ^OgP^^Y1nDi z^@`==GlbAAgl+?J@E;+9ih@05N}z+h^dwWw+mgVGAAFGc3BbpA`b-Afx(karSd|_v z#G9b_+1ulhHA-Nl>=CDL##XYP_KTEvY}3DSs=}u;mPJ8l2tn8lVaB^aco&%mp>$|7 zUZmx2nQ%?<1%m~Ni6Hx0kLgbmK#t^N(BNaR@U1gmXvxqyzRl_yqY*EpEk>{5^803` z#HSEAPRS#r`-f~+o~c1i^Ka3JbtSF7W+Tm#ALg^|Bbf?*>^yJhp6_9HC?bKJ6#Y0v``C3}@68Kvi;LO%-5+SfGg zm{mPE+EmqTCdqn-o_aQiR`p>yKIMp9CYq`JB85>?+x6y+UhQrCUfY^cr@JL=*pc~> zoDc*m+`ICW@Lcmw1C9YE3a6T!^4f47A#WTBpu%yhXkrRIDXBc$QSb;p${UBEKk6X{ z$D_(El;TykW=#0%|K91Y!&qxn8V#VK4oS?|0MdK1oOpOwOYa?eZ5N3w$1F0wRaB&P zH9qcRK0V%rQG0QvQHTav_S3D-ns4lgvacd=@0`v- zH|KEB1b3`DM%Xv!CS5B91RP{$eR`p?8p7h79N6b^^hiTRkO9&kdX3!|Q@h zXDx`$&$L{aF9FUsxp!YIf%SenEfTuFKjEr7hAsIktV2r03kHMH>r$@YIp>9y0J2*18ZOw@o9R6<6p)1S!@p>>c8Y5((Ov zux4B-FcXP3sgk;rQ$93`#s`fdw5_6jpe4aw7^xAhf!4-&o|zBxiJMRTwuWUyJs^P7aT1+A+SO$m+l*ihbV`Fhr5~1wx)KwH&TS0qfz`n*t*Y_ztQmrLoH*A!M3 zau)xT(fJqpI??V)&}J3Z1;?IG{rUKMjUl77>p;?2qm$}@2@%Sa$jr_ua*|2f&o4*4 zoEC?bVQnLPx9ahx3vj0gdZwYarBidE&bN2S5%dwHkr8qV0;Fl`$*^R=?^W7qZ>ZW+ z+Eb=}`F5D4%|vnmJJ~IC^prXr?#AFcYHO|$8nmft=b9h0))(&oDsf*Hix5wZE1yiE zg9V~3-*3}PfqzuK#y7!m(|2tlL-jUPjCf zcRA4O!s+lW12LN=iutUEQpp;Pw<73&wpMHXDB)y=RSKWpQ?efZ{1t9G0;vx@Se|)8 zWbbPa{UKjE(TSv-?b{zX5Ma7wJ@Ua`u+d80u0D^cT9oudR{+9 zjry5WlndQFNsN4?(-AU=`NH*4R^D758v-?L9 zg4(V_KQvQB_SA$Y@jK>PQ)=&lgn$d;EAgg1QL08CA1NtxKIJeNa2}z!2F)tv=3!U* zraeGz%Q}Gcr7!xfi5^xY0s#~s<+x@tQQAFA=#V=BMzOQq!&=N8O!shiV%_#3Wi7Ag zo(kq|Yv&LO9w7{C*gDk9S+N%w(

)Thpg9J)x+@B(n?maf9&#`PQNHtKX<@|CQ`> z0~ME!G#q{LWV-3hr+>Exljx+IeN@slf|a@R@cCk0iKIc4zn?(vO0383WncW8->SPT6E16E!KO z?-NXec9g@DW0aien&-;CoTX%!^LP-n&l8N-K5;A>Ri!G7QI)4M+t*;qz`L zH4LdWNvQOMQL!b)jDbKo)s^`qet^0sjr=X$qC<+8!^kYoZzRn|3mB?i?*@66hpyd4 zHa|`lulkw7o>^+#Sx3MXOKn}}y?mgQF-bO!<#w31^f(p!Mzzr4)8x^r$@XZGYSgJ> z_w)>+Bo2^M-fjBTg#M(>GtCE8Pr7&5#j7MkmER4Y;5(XFsG}$A*dMc>dX+6s)iBu6qx!m_5LIQANh1Q5P()xl2zr`%^wMEIL*g=pkfhKwF7G-9AfY8v+Fty9>$S z?u^+(TZg#AJpK!E1B5wk{-}ZGRav_@_}f=8mEwmA^tvNLbPLW+v$LmkQSC=veA%Bw z9o6#1l9Q{PEJR&z%a?4TuE%8&RRNS=E}9)a;aJK^^8>vsYP;N!xlW`T<}BIl=D#O7 zTE<6doK($;_oFUh$x=o2wW!g=WM<(gACi@6bw9{N4u=PZm$>XAmfhPO%jo~({JM;I z|9Iu9AIg1=ZlYt*6P@%aUni9}`jDtgUQTm6p4DIX2@M6l%d)*L4EC0la&s$I#Y(-t z8)(~)=(OShOEK$r8J9N_9viZwU=)go=(3c*;-I(t({0++rInp zWe>gHa;j{FSAn2oLU7mROOCR`G$Fb!k2~XPYgh-b;}Bh!dG?S96VLMOmzAnGvd!r_ zziWGK9i8n8wp5Qhyi84xG1>LJggm>@m*9?AzF%|e!bR`IzQZ{SntI$NEMKC*9p$o< zZoc)`Nf_+a`;gC*UB&!ky=5ir_LM@CW@bNHk1x#TYy-vA&nw|+cGj3M#*G&J1PA#% z?h=@J{VpsG>-^OMJ&$Vf5wLA}UZkNxh3k(g%fb!ZMRI?`Ni;koDaCE*bzPeS7ey)N-8 zIA_B(7RZ)&ycj%8f(3$1T@S>}YRJzzylyvwVAm|LUYWSkt(@hwD0tgjM;*oTfSlx` zZ9(pd*H!1{Nm3{OA7%(4zeqW8Y@bBX0R9$q7MJuho#ogVteG2ovBRJdSan;<@P{C~jW?7Yj|)(K1^%Q85~?;?vm{CFG|cT3p0xdaj1xkrx!+O2Nnv#A>l@ST>p=b+=u-J<<2r z6;flcnAsb(i(f!Hq6=jG#s~KYKPV{L)S|`UqRk^$v`nmsj^Oljyuux3e4bqjvTus0 zmL|tl*NY>5*F)4L99J*%LsQX3oz8Lfu{l<86e*zu0k4n{J*Yg(Q=)PTrZw70jq}W& zcxSs%id%{mWW0m17VTgM3pe(s=@so(7|ND*6rYbNSNM1sF-i{$p+|ajir~AuQTiQT z)a7Q)Iu|1^kw=|9uItN^EuN+J8LYJ?2xld9wtK!A{QJ$a$YiO?s19E}@=>7y*jYC- zGpF$CSW)jeXGS>g%#I6!dN#p8|cUsM`|C)~0(|lS3QG_B1ILE=zthrVr=j>tI9!PVrrs*QTeoE zpT^U6LD`*_c&^Gx0i2YpLm9#o ztBqAg`^9-rY3D#rkY(L^ceJ{`!B}na*DEm(wtY2MX;fv1qTse!c>}RL!&N)XCB}uj z?vg$EvPz&z3Y{5sfoytMb0DOtPAQhRaYru0@C!e@&n__0a4zLH{9X#LO+Yy$L&+BK zpjTN@Xw75wzve|QFI&?PbejG+gJ8e!!44ovhC)t8w3g>(!sawbu1G? ztx?e{pc7yVg3|6vgJ_Xl6BORMnJtctv=93V90<#k8);$&U~|8{qtvCW9})nFnd;R0 zGGH7G=u2?Ypbz`YFaY5eZZJp?Il9a}s`%p?_V-6`S6^dpL$pgl{{{O%a;p`)5)j7u zU<$prlXxA583l7?e-wJfryI}1B<#J#*onefrY(Bt>xu}fgf*Ow8c{IO37W!xS!KBz zv@$%>0MrKupvtp?B9~f5RTWA<<<-i1!doE@2B?rW(A}mPN>@z!OyqR$KBBURS@2uS z8~M7%AhO7o^dUl*KFfI~x7nNLDCIrJ>Xo?Ed!fV{tv@vdeKsutpQQm@Pow^k2h{uj zbkV9DVeQHR znaUfW&oSBm<+Ydlp;OM!p3$LF!bJ=MQhpreB=1SJ(uik981d^6=kWzeW|Kl-{W?BY zf{AC(4?(LDIXa6$0=GMaLCTPc1fnz`ksSbOhgbS@DIg$sqJ~<0&()a?Ke=!B>_jQ^ zUXe$h2GDNhcT*SzpN)NX4C1fCydP#^!6f^KH>y~?s_gS#ieek(D9CvLT8vTrA3BXT zl1lAt!^8)~5Fi@Uc-F;mJK<`~VDFGT^L&5hUqJ{a)+!l^#Hlqpal}mQRei&ua>P0| zuG|+Xqul{Aso%31gkp2M_r>!Y&g3szbVJo+#8Kdp287V>S(=`i>C6To=^EbO<*Wy5 z?@TRhMn*rS$xznEE0SuBF?+81A@Mu*cpjt~FanGk>sHIh$>?L#vzAmB&+ICGOM&&b zXx6Y9;;oFv>Da}_7hRk~P`g<$rb;0g`Z@_Q%DmJhG0ThYGep}VW`9r>ETg|qtS~3b zbMKTyFku#^-sOCKHrAHQgciR$B8i6wd`_kEuC7u(dtaoifJh2*h67Qc_4usIZe`_V z&$v7!PZ6*sGK$%F9S^rAuDiD|av*e+O}vRXM3zUH0tS9bfahGX<02kd=JO0R+dU%+ z{>$1~JWdNK8#2xseYFd6c(k@FUM;ad~ay88xdphQOh7M&Qkq%^v*K!6ZCd^Q4T2G_B+ksK30v zg0#q11h95{7m1e}OX@g7u0rgQ$cPN~i{S!EN97@gk`TUNj^&CXbq&gk1R^~$D|6Ud z(XT+Bx}nJ*iNVz-Cpx6}lu_G}irdJJZaUDR{_DXIto7AsCfj6vCTy+hT zQ1>o8(TLa7%_L+9Hx*S`RUcdzSrR+N=^=9z_^8o^7qW>eRyY=&=0p5kS=qQ;(H_^? zlIR-KnH6*)Yb1yQOy_)E|jSes}ol%V)Xfl5Lsw%m#n$N|=bkX=Sm< zee#z)d%l%q=TUJ|)a}iFb@=uQpToU9qumFtnv#iu?UFHU5-H-t9CUu_D6Av@mjbO-Q6*!6T}N_7t6I~kuMs&Qq-G{ zvqEdz#)vD6U0W(6wIZh$S#dB0aPhIXNSJkyFB(~(5f0pA4p2Dw= ze4hIqV~$I>D2kk;u-tTlo01Yt3(yT-MYk$6-RLB<6d?HMZQwUgIla><)^~fRC=$#& zC__e=ZapEp^4w7Ju}AEWb4;ZI*18ajuDNc9^$UrgioFs% z2|uGmC`hlIRo3`3=5q?Ki9JJTPaVvM&(OAeM8PRz!Gr~faOGwE(!hZbodnkIwP8*r zi%@;Yx^c`=XlU3QY3COyn;$z>=HcYL&9o)>0<7}6dpgHR*mAoA7zFC7wF>83MP^9B zexa8$^5=O?Z*0d;Ruk+HH^#n2N}e>p(TerB-I8*~jxt27Ohl(>Uh^&c03b94ySeOD zj=G?wWMJ1yoR$OI6^fQ;J^UFnh0Pqq@W*~E4+2vq{qonAi*+|SEAr$@ zS6SI7s6%~}7g}##N-G6}IF{D#g?TQmo|>fvnCYNDn&YhQG|dvgN^jJ~_3$2=qiD}R zin(=4f|M8_%}O9OlH0nbDQ#OORy=>cVoz06;(YPy}J9mS8RXJ)99x>avHBH9BHd%AdM_}-&s-6uQ2A6}yc2#|O ziCxf)5+0ta49x#xj!4CnNqBbK&f&CeIM3*I)hiO~ijifmG*ONu$j%4OnS!7w_}6BMQ*&kW)4 zffa6*&GQdjjQPz-yw)^mz}#@EbKxhp_0N?^=)CG;PPM<)Hu0H@GQlZR%Cp;X z#n8kButP%oA$aoM)}B1YdB!h{=^u<=qsKlbo=)AEcD}i5+Po?&qcm3il6{c7)SN4Ok>j&t17dPs}*h^?YdI>@T!*`0)`4%iQQW_SQqAafINlKD%62+3TIh# z_7Y@V@)mGHKW~GdxM7WRVFfHdt#H%&`hBoE-kIK=EQN4@b zvu9wcrCX`f)j9cJG}I@_d%hg zBm4SQs3VBa@HD3E_cP(apM^6yr@Sk3W_|xzO_?s9Lo=HOOivw^({8PCv0g6vK{|I{ z_XR7}y%>HRQE_o8=^m3?F6m1a=x7q{i1o;0UUwjRUiZ50*Shz0-`9O!_iKIEkO0y6 zHSu=_jL?Mj11CvPoXW(fTyg0@QG4G{tq4|3^wi zV<$L?4UK5L%AQ?n2xwhQRhG%@P29z68B5|sg;H`@wj{cq#7YTkwZH3^(3)o5txc|K zg-fj2L`svP%6;-NOr@$&jzf%_OiHTtKFdxC3f`u!-%M4y-q!!f^HY}mHI>#lPLZET zhxV-ZGz7C4uaM@C6HO8SIA{zO2fZ#F}ay7J1G#6W`kQMdi)`k+Xu; zwP>kK;Ki)$&zf=#^BAet`)pn8!#vIObzWB(*T@dvzlrRyzC*FcsC-4WiM<@WCms6> z&M4b(`_Z(L8@_zy)`@0){n?QQzZM$@IONAkvG)0m5#Vosa~kzzk#sXa7hK8V6l0?P z_uyaBtrJyjN38K?B8t`zMR{GN%n@H0OS0omY&XqdYNyn*-d5SxtCP`)v%rjGQcF-5 zsfpZup=fi=Tc&j+8sO0p`ce_=+=gA+hu;F(K(J zF&LJtT-XUOml-DkYxHs$`I&wCICdhB`GQ!djC-Sqw`*}A`?z)lF$2)96LoAyth1HZ zR$L*IVdA=>d-WDb1Jf^gFo4Vc~YA0F&wYlWLi<7oU9Yre60R(8t3U)jGZ=_w*X5 zrc69I5>$ST_6WpdOke--kia#!?3}~ob(8Nj>n|NDwbU2d^~HtW##VSuR!hT{TyTY5 zrFeprA~6u5hO3r+8=S4=I?q0Yp&VczhLY6IO=xC6T!`H>xIZ^FgzZ}^ABLcug{GFH z3#>?b?emfutyITV@*g4*&Xpz~#RwKm69y@-Bzq+&P~P*4)Vy8e>LgYU(=&8jcsQ|& zUnUfKw{guY^H~a5=j=D)3IciQZQo_b;x-F*Xjkj=x2-p`uU%M|>sTKj{K8sYuVZay zk1p1MVnu&H*kMPHdt*9_Hz8v(yF%fGKiZ2gOlxDUQYVk@FW89ldcmT?_@~t`y`_xO z4J(BPZZg`bsCb#5Db~wE+O+HSFQEtcMKsLl-?#Ow>tr8^Q({ds4h@9d0f-W`ue0qW z99~k_8zC+@TT7UZ;%|!%8NreQJ@>SBNXUAar!o+Wp4$zcjBGx4?gKYi( z#V6!bA-KyrR`ZaZnqfi%2S3QjPwSq_pD-UfJ&nr*2xLdgC{dca0sOV+xW1_?fGe^q zx#1j56%3qWgmUo;OFyz?rKwDSV~~NSwM-o!3s5-WRII-30@;NkCfhGvJ$=FzY01r9 zC>(C0Te3Q>GRE$SN>$OgE?GG&Zv89{5nhzAran@QL&0K^GAqA?pbv}0odU#?RCBwT!og+{>l$<*qq@$7`U z+*CjhglJ$u03=O(Y0#Zxf32J79~WCEg+4%=J0t$3cq z&v1ml<2lXSEqGbBmN6d-1uMFCS+Qd#nEBWVrT`4e7?(o#@>*Y`$YQ=;{Vh8_HVm)1 zH(s@9`)d0rzmBZrsq2Vo-TR!u4)@5>y(rV~J&2_Hnb=T_hG-AKit&)b$hktCQX&;b zld(k3y7gjlLqlbCP?zkdptmx+o(4KyfPcj{qE_UE1+_A}o*l?~k|gZj{$@_OW=@$z zp=e^eUQN!i2V-NvEl+^UfcgWmT_@AklRK{SNo(Sm}; zS7*We7Gs11qbUIF_KfsFDFFq}_tTtZ(LDJgm%kMgy)Q(snnJ9K;1`ckl1Ag0>a;m# zwVTo?`E$U7dYLD$MnD~hF^_|>y zH%iu^&?2w<3z}@rU1EvSZ)VKXabuKXz&X4zd(>&)b&DTel+=R(@Q(Plf|q#SFln_^ zatGd#s3`7aC>9SBkH#EE#kJGS9$GaJav5$DpTs#v>SI{KTJyLFEFKb*Rz@hY|BH*1 z{9hQmJc+_m>1?ojIoya*I`QKmX-M9SCFQ3U9@a^dD_Go5buWpQs_lsRW^9b!v`Lpu zyZ_VDS$$avKeoE2)=hI0&Y%9pg)A}vu*sHuvo4`78bA=sozv$3z5gqk9dM>e;{Qz- z;feWY^4Vlbfd7qG%jS|~mH+pqSMK1c0zy0QGvPI-D*eS>L5qOcAHOY~26kE0L21rr z{iJGqxU4snU^Ff1R5~^#fCTl%Sh>n)CgRZgUxIl0NE|eRBe4>%&c6-~oL21nk`aOC zP!v+Xf@g~+5HWtZuY6gA;?W#wiC-rGxS9o}qY3b{`>y3V=E2v@v5vq ztm^yJL97({!qTM|I6qm-z4Vq6BEQW5T5O>Qb&tOhwWJh9Kd4jgKX(+HhPTm2SMJY) z%7oYkk$74=KmzBSk?0^SHoD%r$DnM(7PMiQMjaDj%oW1N4%5AIdJr78BFz=ZwPmi? z5=3^9^@;`G^xg-v9n0QD2IZ_L39@KaYPG7$T)F!l7-#Pu?>p+@)@O*U1}s_8pE8 zVnNrfd}4)3m$Bi-;Q|bx_t1pWKB}vkV)Hm;PZYH2xS)hU$rv988WwoWcL~H)K!grM zPf}T{NP>N^S2F;T->aFth_Y%-zGK8Y$7VXl9M)vW27_eBZEUop z7L|V+fNLa{ZCPhehoD!`&-+lgb_@lzSr`9?Wmb6D@u6bP$DpDdg79&c^IK)~(wV&# zM8bNvcZz*FJd6_aXtgPm)zV!js1bxU z%(zpW*AE?m01~EDkmXm}B)^QcMj8GlBDS$D_jx{emgrNxTg+{;{(FAc0YliBC};@8@5G0nR$1f z^xY+Rs8t^m`z?W47V|`Rzf14N8y-N`d?=`*d!E@(Ex5vy-rT2E&mHcT8MB^JuA22} z+faOxgUNS8niAByt}YRT+JjZv{K^WmAuxxgCONe!F#@2fO~Osb)*k`sUmZo)_`L1X zAETtrzkXzi6I2r}kU*N-(VtzmXAwllgm5uUd@up zNbOxu3?LHxNZCL1t_`mLO)Ba!Y&z7)nSi#AAYqK+?C!gsxp&BV$^bw^j$u9rE~v(< z)`=fRML2VfWY6V|6z7p2oyVcolbrUu)7B6^amFF4e>||Uu3mR?G|1dz7@F2XPJYX_ zQknLJ!J}^CWSA5pYt;2GyUfMY@G?AKrdMFD0Y2p;mL;6r=mAphb-8Jvv$r&AwKvyT zQ>5zaJ(f1Ae@XoKl|8%%z%74ioviBU%5)vN^0uly@7=m-_6I{vW4-&d0^0VxsVZ%F z^`p*9PxK~y-eipyPcJd(~17d(ZW zOztFBM}gfC8H6_nEVWZSTvSB zqh(9)9TBUS=yU>H!fWWd{i>5?rxBYt80b!d+F#MC%F=URLJbDMZsT6za(dv9^lPv& zZo7apoC~hxZI?ktC@6OX%Nq394m|IEN-bO4gqhGbAUYv+sfkgoWT--&f_9j&lI&Xv zmR7=Br;(FinKKsO(eVlBGW;$mbdtTZmaYSXV;0l_){r%r00wC=@K%3eURjFl%ixp& z0GSSMoux-eUibxzBhsTi(qoBPyD8QBdfAusB@NcH$9_&{q_j(ivjZ@CkrQdhj#0WS z?N5HF^>bDKtaP4>FxCh3Ho?GKBZZk{m@}JNY$?iL8!Mfe)p8+`iqBy_XgJ`H=MZg% zTJ)h>|AuQRlMN_NWM*`7q&RH%Xwf_nFH*jqw@~%j*p5`&55`>4y1tQ&cEJ8wd9vbM z!yfi0iZTdayeO>X2!rnwin+=6ia**zRxN80?oD~Z<>v@J50?QJ-!B4U~ip%NxGuY=ifQcsRWgo~Lg{YB=<1lgv zbPldkM3r68I*G%^Ub|e|It=Z=sG26UWDtEu!8DD?O^k)|W48Zp$I5TLcCXMz$G%@k zY^3l^9pmA^thg!&5-oC|MJ0v$9%RD4+Vpt*o+-5zo%NA^^tHVg^<6L9eILq=#Z-Zf zT`)On*VE8vf`M&=t!S&VPo#N&beZu*Mg;e$_5wTybO*Jvr3@& zF$`!QEY`HxqRSSY>?&}to=%brPJ3mymscD77j%5iIWD8Qr;k(fr(-WSrbHkr9w_JbX<{KbVcGLG3gUt z_hmV}4X>=%i|O9SQW(8_94B8A57W=zSnBgEladcyk@aAh0pL?Y|JMM5H2Ffh_reR- zSLPDhW;Wmj@b&V)@HW1_eBo|82=15@rHyRP<`R_myxC#UOHAiHRx7>P0e1^Y>s$2GmUrw~@ok5?TYwGsA z2py&Q+z0o102Bg+;s!n zZSK^(V+kO%d_`$Ko2X=#AgB-a;o-AT@}(I;Q0jCC5NBmcLr>q3 z8Bh{cU4vRQKjF*1u;A%uzKgkK@XMbpGNC@j8i2`ZaL>S=NYx2;5Nt5y4I99|Q` z1S#mJ-T5s@AVlRZvtaq8-1pL1U3Zu-wy=<4k2%~!DS(Lgd$Zu{3%Ph;!sX_?qHlT{ zFiu<8$PJ&yLgd1@F3Cawd~ z3{l>-EE$Ik?KR)mQx8+GNA-Dad9a;t+QW|GC0k#dJ|~~{-Ce^U|AIY9S{}i9`W`aS zjX=Q3{vKRZ=Kb$xEyW47aMA*BV)`D(8*Gci8J}IsN2gGpW^*ISUY)fo-ns_PM_aP+ zkOMZJAQ{EC-m+&~t(^jJr3CwTQu=AxBW1A_p*gw>;a8F!JR6Mw{Vh6GHl2RZJY-2B z71WwJ2HuR@JDPWJ)(IR8{4yBb9E$DmqpGF+zA<`Gcx@jlu4+`S>RILU3HZV)wO!`YmDd)85`pwh<~{BFZ+8asj|m~G zKVP%9VP0pK2c~8g{YWeRE){ONObQo~WiZW$rfS91$sBqul9$$tO2U|Azgoz-PA){0 zzT($g5z(7EOg)8V2yvFbyaP(XEE&_)yCTeY@JG!2?5KV8bsPzfzpBrNXXBUg{pmvX ztT&kA#)sboQPQ3|DhHuN!b^oEM-S0(g6oN$Ehs3PM~jpK--x;h1Byb31;YzaStH4h zjv;6%y52teh3V*?^4qkKuF#?+480DN&7g6#Bmg#U##IjR?p2sFexr&?^w5o*5H!*( zOK~Lg344eO+}l_U^m6g@kB8ZZx(W@r4f)Wth4a$6Ser(FB(1t%Jo*Ton`ds;#tMheiMI(=lM@TouRwNylySoCOy~ad`#J(ty({mAu;>KxD+3>%Z+*hbSNe<)} zpkShcn#|A*3|iOrW9#m;LPO;Q4i|wuAar+_yg~O`rJ}82t&n?+mMUm2qsGP`wnY6Q zAKt4aC%Z%1@AfRCNTWI50Sr{WhtY?p7bB| ze`(6tHlq_Vt5Qg|EM*niiYj#%*I`5PUe2U)^(ge(;ZV_@{^x$IOEK4vr)`P##Mjiv zZNSREXxR>QwHR%KgGOPzI^=7Ivr_CQZ$|X@W|aKb9%Fes)HOlxYJ5@WKp}C`%5zI0 z;BRVV0Cr7LI3#6NJ~KMB#5KR8Wz7Ibn8HYOF6mAZheLcVQ}-NKf7va!WpQSx`JS=O znc7T)lH~}W0)ymlvUa?s4Qq4qhqY>A^{w&?pS(fG-~WSr#qXK}e_)>m@%s=kBlwkM z5(Pw=4~aNQQWLiscDCME!Wtrho>&8JovgbQDZF6=Fod~_1#^l#H)b3v`Hx3{{QZ^( zHo(_}kBkjK_z7EJ?7&GrK_GQTl&Y2hoziL9aCxh3b6{~)99FYLGq0V~v^pYCiVxYV z8fetm2R`P!uoI1LUjFs^>a_TO{{N4Vbgs{DU%Zm1iq4Ew)lx!Exv8x3Pgi92k<#D) zl#n>#GtQ!8&KL>F9GInS!oy_k18T!BNbVGOkud5Ci~*qA%+-3T~|D}Twv*Uw%wxXGbdQYoM_k;Z#dd9>{ zkbQ2XtRs|VgZD8j8aPSHVGa11G$u3kABGxLavQJ$Rng5!csy~ANzE0>o=X4u`_^U4 zjHClDE1#J1gJS_`y(bQ{Frdbw7t3eR$bTTK(@|Xfk;j-uq4+A$hB;~c**gx5pk959by=2;;rbXKlAqDt9kjz>Z!`!)j&^&B*ELLVjjW zEeKC(K9mU$4LU`nUT|S%m#D+%Slwi64VlNZ+^^W2u>puScgdFVzn}j5?|=OLZ-4#s z@BWt$8~o*mZ@#L06V(plmt*%LC`6oI^T?ei?}n6bX2`uh(fNceSCxbRxS{y|FR8!V z>^`?R&nb4ywhZ?0FAh6kyB~e*ZO?nk{kFQ%HC9{Z3iHf1!vx)$s2~3G%M~jFIUM^k ziM0>*)duT?0Y=M`R7${)3?e5?%z$SbZk@Pvt*TDlq~lQrcix#gA1%p0H3~;6{kK1E zTppJKMULD;Je`rzm!)k`0)){Iq2G0};}<^qVl|Z`<0W=KKYUC^Rrwb7`td&^Gz3)Q zgSOSh9!_2KL8M5~$tGkp;j}ePXJ?eod_5DO4=r#Si-LjOY{#$?d6f{x<#OU+h{!U+ z=MG+H3>sH>2gsA&@1hKBHs#u}ds6X7y3veefw~#5%9-GyMR>6sDN{tS+tm64a78R_ zJq>rG_t8S`q>J$1-vuz0sNdOY-xAmWBl1 zLl=-Ky#W>MXgPKxCQzT|4;tHk9_d2X0lNT$XM_N3f~k|TiZ7cT6{>1!q9r>p-89d- zlX}VEMDnI#-nZn7vmjYw*J@c}@EK~pT2fywH*=VM1XNES^kyTM{3FSR-opYSQR+kv zXs{#IO6}<-#D>{pU}0prnemXvkhUZzg61L)$l^q-Osp+8O+ zGDQEhqwAT4s0w_*H_3SPGgW3vFmc?!C09!Zy@@X!qh7rcdg;4PRzZ)kC2yPEfFp+c zIY+Ue6dC|Y7?#jumdDg-7nD&k`RJnDp2k8ypNsnpWrv`bIx_zZZj$`X>obYZyZ}J> zqN&?WDH$LWmB%yaGuh+DA)ZejC2QM{9<;_Haa(y*R)1g3+<57IVn5rYp+dqQ22BC~ z<@@HYrJB7WkgCa)f!{t+G)+ml(0giPess3IpU>u~=N=_tLZ*)=#Sfj`W4|xr2&9rq z`h^kDw&zQO(BaR9-j)TjAxpe?NgGbs+h@o@$NHQma7JdfiAXY*iRgk^_R&+kl$+g| z8&Uh-J;xyAqk(mr_;Mge#)p3fgG2agGx3R3(Ev;h5P&i$xDAr_{_n>dd&2lS8p|2i zaZxc#jy(I(B>?xfbpb;lW$hV4$7m*laV6ECiXloJ#-$9%{}D?a%Jbgsg9qey9i2a} z84xvzVyqC#Z!FDuJk;;0~LxNKchMhKDDi#W%E6oJ;ISO-7y?2L{vI!Tq0*SU) z*c?^yN-r*5_9689k_N(N3C66dp?=?TZeV4zP`EwHIK+L5pNz&vhND7WD;C=+j6k!p z^4(U@g1a+d8Xve-PIM{(beSmy+-YLkae`P@ zx8vjhqT??YWhROA_hnOd)N$HNcR8N1x;x94dv9%?KyHQy#bmwK-_lawzD1+mb!$Ji z@rQg1v4L)HlkV}+bN7pC)GEeUtR24WLEEcc-yEBDF8W-zJ3v@Q0Kh-Pkc~ut<$(g? zxDTcy`B3;7H+P#mBA~!^JIRa+&ID6W68B{z7Pp#bgEP9Hf?BY`=`#de=to~1=ELod=-s!xNiIXTS?lz{eRrL46H&*_CV(=xeT zWtT51XZv9tCe<5&<@3wwem{TgHEe`(CNwv3nXR?1I*o~`1V!N?<1?Rayc2w@?K(>5 ztjLNE?6`}hbFX~|EHs>1jR%U;D2VfRT_B4-z3Kh@_k?~z^z^n;PGZoAP^4W@Qkw|^ zOQpqR5*Sr`&j`SF$c$$N=dVaROlgmRDKvQJU6tv`cGvGW4}H7ZrxT(%aSMP-j&7i$ z+`S;RH-G3)6+N+#lc!Lp|9TyxVnKq|89s!I@|j6JxCasP!wb^VHM2xF=*aLJbbESR zs${RX-J{SbJHi39vE}%~eNrA>Mz#MuG)|fVI0Wte5hJmBk4+689HdK?(>~?Ew6v#l zDnFI5)(-ZYRpQM2&bEAB#E|=JM5{Jw)9P4@SL1?G^IPKDf=u(UN7$uy;jD zn$?A%4!nBCwW_t#1+uKfYdEWx;!={25$P~gvvBLCjAJ|9j_du-DOanSjW=xXt5;=! zz)u)cin>}ffTH3|wLB<|!^(JX)jLQMd@&Aw&6&T(Rc=H0EKLg4STSGHn91SGac1?7 zRrFK2zvoNGMAhjzjymn zA*uI6f5*n_q1hELprk1xnuKSZw+Q_HL(L3Ilgq4Jn8JyNwG}f6o&(>g5P;BC?mo<> zq`R%&IoT?o;aN`NhMKdJ5$8P8?eNS@dyH8IJRz35|NGGiCWhH)g>Dt{q_dTVI8ER} z+>Mxsguub?_|<&xDuYqqx2~>kQqMZ7bXZPSk|u>mfd`F%qf1oI|8N_S5l?y89jzMG zsZyatk(;t)NR=o?gv~bmhUB(y2@o*ZYhVQp6C>i!iY{6zvhdFTkHh-kS2f3UTFAd9N$du7BqqfD%xbe_Q4_a z+k^dNKWux2um)r})PrO-u2%$GPH7!mD_`L9v3Ch(Gr20=I6JAhT!>|9+elVqS#C7z z?=eC1yDeHxoA@w#I20Kps-aLV zsxdB4A8#XCIY;fU%J+{ATSB3OB~8CvI&R&$PdM3?<(!g1M_X$HM(in5Km@f-GW$i4s6hR!&nDf?MIbB4sF2%uLv=~H~w>-N^l!11>c~0m~ zm9J-I2g^Pr$HCUZez5u|Zk0~q$X*PQ%>0Df<~;pJjE~1pU%=2tQUog#!w|l$Z6}r$ zcO7CJZiNkD7$y8+*aYwjK7H$YQ_jLH)M9gJPMlwhz1S^tWDL*hHG>=X>#1ji2`};9 z6>ZybQbRqyv%z!{*)u$Ee@g@5^)Ol=XL30zReXO)3Uj?w9sah@Ntvd zKU3Qu(%S#(0l%!k|Ie#R?b#WfYBb564KcM!=f96BaM$%~_5yvCLSWRpZYb{Ku9s|K z#uRw=nTxRv0n^Utt{F^J2Y{3wUxyY>Mw&%T1M*NUWM+Em~>0KB`WVBQ86YD#jm`j+l~?JhI7qT zj7Zem_sVXj%=>XP&Q3$Nx$yc-O@*f?Bi$3#9S6dRhWCbc=4bBeoG;b%{3tvkk*&?51D>>bPUw!SuV;mcu*L0K z+9cX8F|YnPeKMyhwi4?r*%K_`<5Jj7qkrJK@_BB;Big=Q${RQhL-{`#-@7*`(QJ@xkcJYMVo!wpG2*PG#|duXath%Cbj&2$no+X83-! z!IB4AuuT&|2NDQd%*%LGw*G?k!P{x% zB&V12?5)$|ssS=7!^fU7mPAm`iF!s1=`AKwYodM8*?s3G>BJh+AC0_1$?PM-dcW|1 z!ssK@=Gin+892>1&k5b}tJHr;KRDQ!u=>y3B2WLp;br%UOb5fi%-``oK?A4%J%cT4 z>h;R?Trk*8AUnMG2&3&jRbNqAR{EnYC4J>dNNz>R?ytv%p^~}2b(M0lhxU)^z-Xum z>e|z|(`k{xKje;(nF_&@;ZBB4=Wy{TGBk9vlF?KK{T$H#cCP%CF}WjcGe5^yIz3d& zRw!$$u^c&)y*MuEDOS^up!=vhDK>A9S0uB~X_~P)X3>w1CN+x)fyrbu;gG^?+hpky zcH0bHd@H5BI5f_;awHsrO=r*6mN~`7Bkkz2z%%hpq29)PU5kKl4uTajbD52ln4+F- z1r*jqzp~@lJ`+eOm_v_vZDS5$Ofo6{hPlTc2JWYFdx)C0nR^1Sa6VH?_Vw;+xM#=h z9}^VjYPh6VZ>1qD^|U$#cD1dHi~TcYI&^I;HU#VOJ&KoZXEUSk4;bl417Rv+-Bz`c zusjz)%RHxZ#L8YVX+a*TD<4~g9g3RPe0AQ8aKjjJ7gDL3zLJ^A;vhDnN|J5NWca8W z*m>5MKY1K8=8=+OzOy32-+(RmaAKtR9G@p+P>+|}1GYgR*!$bbp<4om$@`}pO#yw# z6z75Y$X;$@Vm{lFGi8C9JaE$lQ|z_P$@Jtt(MAd5kXa}uqa>qN$8#ddiY!3JrRpuu zM!qMi7ce(4B*LeRyHJ_GL~KY6Q>^wN7~BK90V({{CjACm>pv}VLc6xBwQcW8ljXg-NB{NQf zI7G2$ncY1-%b|5qL$l)Q-w_#Vs`QK+R}S-L_~#R%5@ZDbyU5gEh|*;|EX1;BFiFmB zF6o?iG=`(>!Qhfcvooo%%W5$ocD$+8WRTf~G-)^+i7p^&9wLLEB#g_B*HKZjArHy^ zl3#0Epm9EK*86tRXOGjCT&;^(Db<|>tD`St?}~4>WrOF$6Av7o}9mRG;RGu=dq$!^Tq?HdCj$0Lk(y*i?44w)tq z*^hydEm+H{RuB(H>BSn^9e{sw2kT-M)p;qv7mGXt);`G)!5BA;(u2f%ziG%9n0J}_ ztgS_`Om4&pyN7h<95`2MPG)R8!c zKxS8Mk+EX?*{A_Ke^*LADMqBT9LpZ`B27-zVqhyA${UqM2J|_ck`{@)9^hvh{%&5QQ>QC6^)7#)+!>bTDH$O0u@ypY= zmWgLhl8@|e4jjS4_pvy$(!q$`LMoAX{2#ON>Lb2}RRzfOevBHU$EhY_i}}7CO--R{ z&deEEG03xO)+?emy1~gpv(yZ0sS$603j9Ybc6#@0DQqvmYvLn1|1phGr&r)1h$Q9iP`T6uJ{Pvd4@@rgA?$Tg{(=ybl5z&Jqu{ zbf!rCj-8Y#!H@^H12xZ1Pca5-qsw%QKDQi{>uZNNo{S+A?&bK!4uXP}B6Wp8$dw}k zx9=MUw?|O6>99ui{v3T}xO^r*r{DM(&SL<>zcNC97H@2+9BuT^E?gbH7KWVR=YDPx zrOVxM%8@=W4l!Jl1%8p?3M=tsn_-yXe~7{Nc+pi~%ndBX zgyuhfpRwwKPnATgad(`?nF_S2zA30o2x(|*7 z%dvI(Q9OH^XIIb6h^~yO6Qf}SHE$r_aDt=TrnzkT6ZjQ`5wm>(NW0pS(vzNd?3Ylc z6zrD{eYG?r7xK8z-K2VI=VZ5k&7hBAyww_{)%y*5g$ic&OifR3qi)6=OwK`Pi>r&P zFC&HsFL!6a|9_|!wX*$L^%OqAP3j+cZVsnHt>LTg45w24240lAy9M{PszG-%CC(CA z<6;hJ{=Z#E?$qEt)&754UTDj<7*>|f|Np7{>z{E6PeYy0x`M6=o#c80tm*oGQ( zS5yM(wmyOXboVg0A=J@tq~fBu@tp{Ue-YyR&lrt~y!Jyt;Uq)E6LaQzVOsa8&(9^J zq{SDZhbSiZT0A7a|NBuS~W=t0}c)%G3>V*0ShnpwjLSqimFuW~u>g{<#7ArZyIVo*hJ6Z;BTRL{o zZ_K{Lx4#R`ZifQouLJ6kE`e$7ikA-|*3NVN9kLFrfQTz^!B7p~-7H+mHFg25V)W~+ z?owB1xkqcR|3}6(I>`kv68HzmU(YK61hhP?QE8@gf)ZEeD&XvU^BFyt-p}0hc7PSR z8wzb0{&fi?S2YAP)S=zbgiE|;ysp)PihhNR?^PtlwIYP~7DVMsfMglBl3jy= z9a$8dUCpxD8vQR$xeb?~lHvZR*>dsApHHYK^UqwUh7Car&I5oyn}v+ndRJjA`QAc7XT}_m+TWOB-r2(TJRmWmSrWCQi_3ejP8&5 zyjM6A#1)tc>M-I81uNuB$U`#lEb1rQIIu2@w2{?BPT0X-%2LkAGozI4W%()yk1mE; zKrT0o`R~y%vT^^Sy<-m=?l@%CYWm)6!;n$Av2Mh zsd3C2No>o^h*%82z!hR(6tXL!NWkS+W-^_)hWrHvi-Su>mDHA;_mi2Wg!6rM=rNP8T7*gqh z(V3x5hK^9+xn(ejZn%4f(h#ds1y$6Ewu8WaON3EH823oLRe%i*g!+MF7!zCz%muEn zsmyJxRhud@3CGaB?f;#@aun6Y*} zJ$}N(Nj#IM*lqceY4WDe2$?x+wtWAk`}WS__PqHE6f6u4^ZY&$kx@FEq_A=E2?`Y_ zCMCQ0d`~7VJtNcD41@Zd3GZZSU+FsZs}Eq@7MY1$UMYzIT3c>BApg-vojoPhT2|#(ezKL^74mWOMmK zu~e>9YgTo3qiJ(->+W{P?+!iUmV5gHOI2^;$#mw{#}-T9i4Lqc^D~f;9Pw;WB?p3` zux?R+*KeY_Bi-EC+|u55=U;aB_78Lp6UkIMb98)idX~-Q3y%7t(S z-Tm*i>o;!Rx_##^t^fY-+w{Tr)qrv2*ojkT&Rw{4<@zBw{)lwj9fFimRfwk*N|m}w zsdidj zNtYoLOIEc7a^%XxsiV%i>aM5W`np?x_ZsMagPqcMV{g8p&UChO78>h97rWG0KUm~RSNgG^EbyXh zUGGLW`?+7b)$Q(dw_p3Md;Q)Y-Pdoe@G5|jpO_ppqa^=Zapb!)c z90C#w8U_{)ev~OF8AX+ILC`TUv9NJ)@$d-<0YtoInLWK-Z{&k(x8n!pcU@ zi8zTly({A3Rm`VEsWRm%RH{;~M(ui2ylv2^NwXHM+O+G?sY|yhdbG61oN~hM=^Gdt z8Jn1znOj&|S$Ai5*#LkbFa!#NBakRG28+WJh$J$FN~1HFEH;PB;|qi$u|z79E0ij= zMjoznL6nqLQ~^K`7y^aC)zmdKwX|V7K@WTY(I|!1>`WY+n5uRnyl^L8B2%ce@tfFS zve+Chk1r64#1g5@&o*cT9T>*`oo=r`7!o8!Go$fjI%7Fr5G7erH9AnH z6PuvDil3@1p6mg&sQ@q#E>ba>4s_9j_chgxF}B2EHBEc zZrZND4C6E}>$V@~^>%+eTkTG_*B=Z=Y3Uo2Pa4FEzgf?}?ru1JbzSdJGUL*0`V zRnraAvK^Pr69j1fKlyQzW_eLobtA8!sHCi-3IKw@5GV|;rmmr>rLCi@r*B}0K%&qX zBV!X&Gb|2IAd<)w>I46iZkU$sxSk(`QJkb1P}mH+IMivn+#avx^Xqs))Jq20sHi5h z#cDIjW+*#93iNW`zbs)p5~)0QOvwW&u`h*3nW9dECN0`@=n_o~vBVKi0*NG%Op3R& zQg?HuQs+u_&QtRfBn%LFwk1iLEP0BQ0_Lbjnpiu?=**dL!-FhjZ{)?bK10S#nX_cg z7Dy5r#KW5dK^rZrT<;vMs@n9NzMmJjz1CHKb**N9+bE>g+G?*uwLC~hJIIcgo9G$q zDz&uI%P2EeS!EN4j-6M2H&M+&DP^MO&T)ZSylZXsH6TGl(c0Dn2lqmt&T#nk-U!D? z{8*_d<^uXL+W}Hz)S%A8T!C77EKZQDtat{)9Y2blA3Z2t!(G@_K4};YO+nvwJuKf1Y^6tO(^>l#T zoF8wE%P`zHWUffx_Tw>ds4tX1%Idbt~}eU1z2x+rR7G>~?p1adBU~9#=>Irsqv4 zY0-Eq9ghq0{*Sx^=i^fFNyTY;?@=_va`L?}a4DjL0B)GY|;iw}6fUZe;z^t}P z01Yw}hbmYh0Fkab@6?86(ZEF8PWZ3Vw7O*-A6C7LPt&9q@egNyUM4;~8PV(mKDVsM z0(+Vc8K+wozQFi@qdvz7;fiH?%f>(X(=DJ zjeIuyAn-@<&iF^dscmaAON1Ae*DKMYEt zk4Jv~C|sgmZI;~su;tV7mahd<*w4pO^0WLU3&y@K901K+sOf|s0jAPP7NP$YRSBF`#Bhh>-}_6;;Y?(B`$>mo?q zdiRJ%UD-dt>qb8<6JMW>ia%*;A7PcgZ7gBZGL*OxoDP`RUt`akp!jxB?+MZ}XO0>w zoEYo)@>x08WtZVKQPU%XO9Lu|(2dIvBv1y{kQYADOm|&bLGy|(^I|+-`RA>#Od$+- zBHw{*aXwu;=L61l*mA57hdFU>W}sn*6KrR3qZHdZNu8W$_=rTV8|xum2%Dm!cBbG` z{VIVMvd=eGQFT!bL|1_3)m?Z4UlQ8w#u{$Ap@uVopKp$^kT_|=g>y2o0Dv#e#nTq_$U(r6qLHFSjuJHxV{JqL z2*#{dEOg`gPyAub)0dv6X|q*u6QnU<KX@pqZ*qBDP^q zzGECEe`#GZrr`vF@EU>2nG;z_F$?p@Sf1H(2uxh@Q~JAl|{4m|HY!nZmxcHnZmr+dG&m=0fmrB)#p z#g}m&7Q+FjcVEVvNq3HR^fSxLBy+E>7juM9v3xQ~ooyaEm0=(=RGc^=LLXt$JV(w2 z*~(m&;G6b;_?DmaW>$SV2*)ObuZb5sO(_^Re81cu!A_%znE7~{FnjkK#T}z2FX=^A zVM!T?N)CpU7?FqyQLr@56oK}|-lh}~we^TrJ?xFV5_tEy5!mpSgMyo-y;`0r6|}iq zX8lMZgHz;Cj=r$#;%(87u~$d}rg>lf#}wO5F8`RoN02~v3vZ4=vCa;J@Pu@14d;Ac z!NzVIQcMa=>v<0Jb(@fC0*z)xtFoPCX@80-=RgcP+mqYRkv4xvL}UlCtX~DUUCdHU zRas_^6i#Y)9K)gqJ4!98vY$J!RMk&_d1+tC$}`(Ws8~2kE(4|TV*WX$tSCWHqupB{ zrfq&pgJ~zN^Eow=cEv>Q98FBmt-Siwb+BLGH+s_{ahx6F4=L^=qd?$dV_ zM&)9AS>=H*N(U-XrBQwWqb#M6 zmz`msp=@2PoQOsa}KrwG(|M^9vw=sT9Ntp)rIy!u0?Zqo6Y-qNdCg z^q>{6RUpum)^}K&D#;)d)FRa7J#7LHJ%DmGw013)Qk?8tq+aYDdibkisXC_~8&u6M zt9qoWvlK54us)0m7YL$QK#=&r(qFvG_q%Y9#chjpqcI^zc<-n1Nr`Ry^?X zPuGERZT!PxV}&W|Y%!VXAJRoGpacx0u0%`}voWAK?G90hO4m%ke7iA_PdN5gDDL=B z^+k6NB3V&5Onfepwm_r18|iHw#Tm1L)~N9FU?cG#53XG+fp@?@T*g?hL7P zy#=lB!G-@iAaprK1UI>q8c^!z?5(E`b)@1#Jeluf^!kddM}0+AgT8iZs4pk3oF3>uX*8XwR&NX-9V9$Ugu6jM8e z3TbX4yEhTV(a?7Q|M6i10Vw+0hc^WkMw}X!np8`KqtSj-m(B8r|DacMpTW^zsYeii zs2JSaLq=tQ&Sm3tjoDP4brNy~I`SQ2-EOU%V7v z3P%A#2qAgEP(lbHgc3q1rIb)g zDIu3aOt~$TftYeT*!H!BngM?09wo5hA%qY@)bHqBC7n{yn_|5dNa+cQRX<9fzWG~(zU7nk^Ovd$4WoPe z5Oe_rTMldXw^n}F`a}49h$rKZP)gv(xa?2$)?pYUT_AMsYSlea#OAgi)MLP%{rAjN)v9nt2GLgR=^? zsTJs4H~RP6>g??EIWwmNw?2d6cF8}b>Y6(5mRsSrS?R@k91L9+^Zf6W-2(flHQkM5?M2YQo>bG*FN+P=c+$S<$?lY5g*?DAaCm-($(+4C?L zkvaRR>_d!R^cIwc5!C~F8e()2%bP~RH6#OjTA@ttu7&N0_9$I5C=fyjHw%e(NDx8@Ej2Y# z%H2zCN3=)jnqkElV~p{Xs;xp(YQ$a=B`Zlv&xn~$jq1^eymU@ik?lf~Gsb0(kV@Cg zc#YXp1f@#dUED^io7&XdJOGt#QGa4fP=>p3R>r=<2nA^|0~J2>8zL`ky7)ksDB`9| zuXX8-NuNU?3S&2gE)?1KkxkSwMMyGj3?OsY-$YeA(at_`qL)Q?dC|H}VQY$ssCHpa zd@;CNfRNK5mH~4itMUPUwVQfuSk6 z3lv7r;`UHBuF-=45hf|IP9(Jiz;F?vtVa;I++>Qzvm1cXv$=(`)SA@801*z$3hS0x ztU3hfwPuVl#@0-`w(Pe=n8}?fHB({_ z1O&y}BaNPuM;d(;o%d3V)q&mp8`n^4%X^$W<{E;z4pNu<-3drMpG`N-B2Ht>{jL)P zaSP2g)@_^a*FKOE<4I#n&N+s?E4!AI5u10Kt~sMyhmqs7dJqqK7OAoc*60O?d>z>o zbIs@9agvzg8uMVF*JOVV z1P~~!Nl0U#liMr*T&T0@TzaWr5N#-a6tO80XQKa~q2nBCWYwFmhyZ8e8UL_}L16Gv zz2hR@Sv(e(0k01O96^4}@MIkJyqAq@mykLX|)WCJdNRiU|Ecc-Id)39;BOM_|KPi9n=PdeiR3En-3$ zx9nH^J%|YE^Mrm$3h&%4!C>`OAGdn$ap9y3Jpcv-As?s$L@)?S34O7brzH970Wcs4 z`9KvQfddRv02!pIE4<;_7$MY8Yl` zjni*r>tu|q96nB%60~dO((XoSBflJy87%qR!f)@8N=~}y-?@^k$!Mq{?Rsa>{nSX&>?S=O zsRzPLHAm7Tb2Nh#2n3*f;`=UqDIB3UKk{s`7XxkxSv)YXo5fQ)C14cft2u|t9J^me z8W~d9Wadb1AZIT!2&JuKctdL<}zSe<>8>PLy??A?=OZs2eKWj zQ#eHfmu$#!y>2Fy2%eJhw9W~;VwI=8aiyceP$((=P#((WN{@0xS>Y$r)N&&S2ewX`_)d%^`Cf}$w_M8YJTAfgaRi9|4?;v#&O-6&+XKgIDmfbsj*BRs+HUb3`L zMDUA~oqMtdzm(l6hOW^ru&~!!>mT9uG{68~tAC}x%iFunZm(3fDzr%4PX3^wEb;Phs966;F& zn0XANPYG)i$c?f*TB}*@a8obu8EfyH*D?*yZ|y zzBA-ouHxlVn$=7MW|BM!R3`P(LI#e`AaJGp@6C^Y=zn~#p9{W)F&pWSg~O5QamnGc zX>yT@C-RCqsV676v*IrHK4m9v1r z8z(4gJj{!&CsA3Uno%;#*1JGh9W+Rr-9G0S@s#_NRCd|y>4W|pZUyY<*(gyBa$wf@V?=YZls@RSndesl6_l7Fi zKfnL}jdunW?xucnyU!QytsbL3WpOffi#IY1-+ltc9m>zJe8ZD> z$wYss*d;Svq?v84CMh#5^;*AW)mkPev5(h>`^0AT)Ny*O9C3qix_`y1-6Dt5UF82=z5YZa;8_(Ejr8#f?`p+(GIPsAmL(xwp^e3 N#!G)s;2JO>~QPMdMZ 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

xz5_8aF@(pQs@zgto+ItjS_s2^}<|M=lFQ2 z(q-ZShLtD|7Xn+iOvq$OBMbdg#~aF)Q;!vf8bMkNe|D&Drx))jd_321w59&m6JAb{ zLt@ATHgyI=>^cV7U6h~qLOU(^SPbQp;#8x$?q{7?x|qqE;YJ*aoEXXGO)ZHSRF<+< z^iwfU8qxRVuS8lK#rr($)+r8>FYv;Y3$@cSPnmJ@m8-)DVHylU2t|1SM?kp0@Wz5W ztUn0O3Jd$|1$Q8OozY^lus}3T|G3&I)+S_))IDOa%VBbF*uc|;tutcgzDATMuC(f}qzArQ%NO zd;V*>wPN(8LySz8F^i(9kdNg~jnF933W#J(vVX{#f6D505hJFb$?kdyCWPrmG6l!d z_DFmYFPl(RIfa}sDTArJkCoi3Y#ndzkTm}nXe-M1DRsw#{EmOscqRL zdrJqb$t7%GxTC7lGXaI06vd1B-&{R+gAXOM*D^4!xIsVWmQ;lW zf$?TO3r8df_-n@`!I(*z)xXM-z9VGw>DN4bEC?UJ$NTuf-MJ~33e?Q^l`eQ?=G5Mt z@GxaA=npIvS{6teEwfs_GN&b<3rYKjB1u!j%BSeYuSS6~$T#vXf?ssedTY^Ws9RCH zHv+xCgSC7;46~>gMxx^Am=Pi_=U1g<)3`AOiR)ia&N3?>a0C$w4#ZzaAvQp;GWDGQ z{FFwjgz|Y(>Py=_I=0fB+QD6n$C|WCEtV`R6|9=iI-g~(^y*y2{(M$h;xk%@;;}NV z=XO5`KRS8qgw|~jehiJZm^UW0AX7V}iEVR^0^GlD|`Epkse@I#k z;=S<=o)VvTf@FExDb06Zcl;qSDr*?=b)JRD|DdzdUj@9pntUEQN5E;uCf&4?CK)vE z2Q$fxeg>_dp8GOm-Fn%Xii^YgX`(Yz`D9(054n6eeLO<)C^LK`wjwlJ2>R-Rm-FY1E3rNpY2~gwf6J3^-pvl(5_M#Hy;P z%Cy8QbCprpWYa?{4G89vW{2~WR;)QMXonk0m^w#?ptEA#sXRxzcy)LZ9M zbfz}|kw;u8k%|V;(ij`j^~I17HN%2+RTg2tu8MVnbMYk>PP`OZVxM=5ZS9fy8q50; zo%ez{pa*RG6vM*6-FrT;cHco7F0WFw zCs76L#0?w}V>*`$Ueg*JGlW3cmzaxur=Z8!;o_WJPO{Iyp?i50yb<=)8tmm`K)#GC zUc8|G@{ngQWCUNDdLXd1eY*BSi})|eaH+vw?Gzb}2}1yI=pqkS-zl))E3qK`(2F~d z@AzSUszrNIkuSIN38=3a{0f)?z5xNBLA}t|a0j(`k*&pBSWqx8f9~A*`33nsMQx>8 zJ2Y&v2x`nTLnntxpuPjDt@g!>pST_;Qn1vLK2!>qWTj7MW8F?o+zvF_lbJhNHhp(h zSw~wn%i)&290rlvRxbD)h%0ewhDC77JAJU&Zj5MDBpZe%lk1bsU$z$m!m zoxfMDRCE)e8+UzS;e3_@*-9k;?(5)5!ad56S>jBc)QG<73Y%h`*E+5_JbpY8_|wD= zRD^dIZoL2eDlg(!(IfB&FTAghqplWU@HB~J8bJ*fOP=oS;AC&3A+rQ(l~j)^PpTTO z5fZVYdhpHxUgiJhxIGaIJ%rXJZx=oN}1Tzv}rjqWd?zqhfd zx#Cs-ji>0F_OYc*x%}jC(vr4tP@O9vM>&?E#=(jzs_cegV^$*8m3CflqG&vxrC~) zQ9g6IU1WDzH`%2H@2Zocp4>sm-$v-52YSAeil-A)V5#`(7ad%2tnVkz)Jl^`i>ixn z35zVr2MVPq7Z`!FR#<=M%N?|@D8DG87IF&^wD1VEx-xdZQZq=Q+n(GWpiTd)^ z9;T-saYO)tO4?$RoXka%i?wHv6_h@zeEeY1Im z!yJJlFlj92=S$eW|6*jq0p+wZ(Np_UTncN{LS~6llzcJ}E(Vw;`I@*q@w0^Hz}Qik zcVz(49|V3vjTlqRw9x=vyYflC0E zMG^9=DAy947)1D2`EmM#Ko01(f!aeK_@~@`645kLxwTk)byq7P3Qg5{cuKiMi_*mN zRJMy}44ys)^R05`^!tNQaB@7SCqBsT1AENu&zxYfF0;Ni#&p%Z+&lDV0 zSmlWgWdvY?$I4BD)w<`-qv5X2CJR!XvntkU5Ob55D@!7s!OaT6 zII|qttSM+?5@THvRsgPia5q=c()(#~X)F8(I^stR1HheJg-q8u;ZjumT6_9W*213Q z{tTLgJGtjvGoEH?pm-u5*R5r*hB-S`F44DLii#g;%iB`1acTZ>*n&36=y(r<#V1H( zemh^s(A_>edj{)c%72AsQTYJb9{_qmj2r#2R{xY| zc;!!h?Qc6-%VZJXBUpUgN~`>IKFqZk_GPwVWNN(!D&C~TvA`OH?#VGhsklNgA3HlM&7e*i3KfZfd+ z)E#2998Qp$;e56xhfiy^Tv2H9pvWx5Zsm6nnsR~ zI%}~Hdn8V@Z`PNo%H`$CvZK^m>TdF55kn{Fb^e$1x(J#GJhMBtwBu+Do05rqrT`!fZuQIN)U5uyoiWF%LWIpm#TcEQc|NWYEmsZmn> zeE~%Sc+xTjn#@(5Q8c3SSx(L%jQui8;1&&!glr-jIVsZzUPtA!+W^tc?ftKufQI4k ztgfs><+7>-jG>UYe0DW@;e=+r*9r^@6C%D$viT)EQe;z{5g!+}-S1SREMGRCaxA9~haWCb3L5Fo!y6}Wj&)ESh7giBH%QisujKsU+( z1q)#6eGhShx(PMs$5dpDqbOMh;B-m;gl@G-9X%MLE*c{j^UHFgD>J#>-c68YU^y#A@Z0Hx=*^qB4w5JlOCGeTMS}T~A2`$qR7LG&+ z6Lw$H3(NxM>wz>#f@fX@BH_p6c-U*lzp7vjk`uqQ)y{N~#a~7t9Md1qgqvnyKvIe= z?NN>UFrI9lNDCxao-BPr6#85cJ-1o=T@S^iEr3ncalSr`71xgdG!|=)5YAT|?a}a4% zER!SRR1a`kTn(atB}0n>vQeJZ@|eGe|HmQDn3@>LFU+J^M^FV=@p+bW<6w{vf>7R$^w^!e>7eN}I%XK3XyRvQlJ_)S4yOLGk$xiB>QGs= zWKm)g(+KN9#0gl!PBaI~ivG5o8n#qYT_DW$YT2uH-3e~oC&r^eZj$T9>Y6*b=c?M{ zM!^bO`T}KzL+yQ_&PG*ksv(F8b6BRdV{D-o^{A>NlI0nX8hqB0aJVS$P?pF$0o8l- zA=^@|tkiZV!1|8t)eQRB-_wj28C3rUZDf-sWyj3H;mV4i6!v&}D9- z?x%|yNzAW)<8|Z?43vXc+6ghPl3^QS4A9kf`e{%P;Y7Z&FDzN_dU0C%k11NsYs#!TuNF zj6obAE>D2^=&zigeY%!Gf+&u;$lPB8FeBH6qpIhmVDXF{xV zrm>OO84Izp)LRB;$1MsBqOjteV{{LVH%ofrsQr}XUJ})>!A@L_4hI=j+@^3J)Dzrr zja-NR9{yT-we233=Egz(z7*D-#92ju3sJ?y*pp@2YSkyB45;xj++YV@AYo{zV-Y+F z3`RJfM23AYGSE}EgN-EleUDyC4|=(NBf)Kr9qKv4&q3sUSkork9dhmp6 zNW=$Z6fn+sQ^VpN-4%$ub4ju6a71;GI))wFYe=eaL!E3PPZ02^CAOPLvEz~XzXLxq@eBikt;`1VWQ^bvQO^u>)-aRAI0?+>uSdueh*u~Jt_HHa(R+W z6H|?~!Yc$J0a61JfP6hkz4$`fBK@OP9y~gn5%IdaGApX^h_^hh@V_)7?34OU6nowM%kHFNslB&7fy-exD*3Z9B^R1#NZRX2yOxd@j-tX|vRvsx zi1X}L_@`?Qb!^8D5Tr{;kC%7NNge--mY#Ds%}$l<-te{LFK62&J!{V3{^qVApLHE9 z#|s0hvnnKgWmT0j_{>|L@$6eJ2XVh0w{|StZGLJ-@|CKnOqpSvFmwCBr@0tsF-i7y zbF=EZpR-Z{iKtz!)UI~&n3+*ljTeS+^f#zS#*Mk*=E-wA;?+F=al8a5=`0DnKhK_@ zqYZPmwwJOYX-pk_9(fw4?qcUh#9*1wrA0LoyP8#Jk(^Z}QN>=4j-TS++c3}%O;qR- zf9&!~hWXynI?fsuFj3d?tF`VhQD}TF++Bq;`pL|FjX;NHpwSWkQ4qR-cN6^dkLIq! zlR07HGuKktpIyk70Qjxn&G#b5189RyNb#q2_%3KG0Q}T(sQi$VU3x`;?1qX06+c4& z08Z1!vWYX%%;IuaG&I&3pC?7b1%Sd(7>y!^CBxTB(o_L_i1)_e2aGHJGk(4oUx*1Y z92h53u*8z_CT@7fbPhfbHA&=W*)`)_&sR+tP~1P^fpW&^1r+bO)8(TTik{_LL(!?O zyB^dpJuVZ^AgIA|*|Tpm6J=p`b$EkNEthHrY!nsp&8IwWwl+F67z-UmfC%tdOD!g! zt^6VzUOn!h&A=epFAau5${!xcA$GnooOP)qU8t{G=9QXW7jcB&``4ZUf#3|djGrNc zm#94+bkm(=3M>|0z1Jg-LO`CGrmErUpy7s5_;{gliWRo? zclq(d`HU?}d5Pevw3FzoOT$%5r7CJ1%SSa=1D!G!^BV~Y1)*Z15BfZZ-XXBCZbz}f zMsWGK!4Uhuvv%$^vp*Y7gKI{vB#dyXP_334B-Z>|ltzumG4EK4U&6Q()p#bvHQl0~ zlcREe<;ZejZ^5IYMzbc2K^E#h^YGe^a^}uD>cITcDQnD!fA(f9S+Hg0UK_x3YSv=S zn8Q$7K3LtbRGkr-YKE_tahH}k-bTUcG?nwc)N92(*8vUQ>+aY6{vs7CSFY<>Zvc38 znoUuV5CWn{esh2Hb2^n#8nf0$fmf;>{eWmXUE}=foZZXL9Skr8LcNWJoKVU6yE!ZT zNp{r=HF<082NaG^hiPd_=X;kP)a?YGd z>ymxN-=dFLBTw6nm)gO$o_Amf?t0q-W1}GrVJRO26#JW;tXG!5 z%$~HsufacOVeDQ%BtA7ar_z`W-^Ls2oMRL`@r-Gm7eUq}J6$@2TL`ps->LwP(_R~Z zksN!&OvbK024&nnm;RUiaJ}R!?z>*?XF}Dbof!n`EH)H;D*!MiWq*#t=qQX|D6Q=_ z|t*Go)Wh2L$qq;za(%_VcOLFl7=cR*(5Aw{X zTsNre)Ct!?NQgQhO&A~N!@6^w>UZ^1pV1T7Lu9mV{^HU!1i>$iYmQI$Da^_RZyFwU zURh1IJ~#GLok4e5t|G}Pk#Xmk`LydM)lHpsojgE==kO*LBqvhNo68dN1Q$cGvr}^E zbrYKAI_pelPq|+1L$P}vW^%;a)R1e4`aX*-r|(QCj8YJV&VBoS_&qDQH@yhmBW~!j z72s)fx1q@PrA?Z7T|q5r2C46;-}RJs`)f9^jL14PcP6`qG6$O;K55-f`mtk0JmdUx z&F6UV&#W%8yV?}u6#)U9s@l)+?laZ%$eqpAvjjqD3~bj2kig@wDmnAJwlq~#MjQo< z0wAE@dF1CM-z5fn!8;F&Z2msE+4VH-&$plluDtGUj|TXanvFyY?l6>A4AwO)S7$|* z>Lb=k>IUSFPX*LEhQ|4x)bZcH|Dg=!=+N!DtrNizVEOLX?heHZZwR=LcQ? zqJfh0k4tv0+H0rCXjWQEK2Tk^R0TSz4ABO=U$>mI<~d5=YJP+Qn~d zv0ZZ`$r`)U?UPt4QRLkBS0L-@T&L>EsWdA5n>f`IF1yHpe{J;PMl9S@UW%*5W+SC` zb)0Bv!>SDsZ8!B?oocgXqY3Ez>d6$2(})&3h6fpaJzfo`^n>}kmQb`sIhbX)7|_B- zcW1pRw_ecY=A*|NqdGt~ljD?tNwRS~=T6+-Jo@rk)izgO0_UU>;_v>~QL4KnyniO{L*dmL@H&=XZSjBD11_$Z^YuU7B`6|eoK z_V?TNiv@*+37={WI?8exJhgP>)Umye_M;GCGQ7aKZ{OjmOGE&RDZ8_6lVIa)!mgKl z9(_u;EdicWSxhQ6#C8}{z$B-nk{?Wbo&7Dvl;Qc#eftiEM-ke*Ec>MJaVBENWAq)} z-I{>Rtt=rDjqWhm73Rd!9~Ao&9e;1f6+|~=yCQkPzO`zYKy`9#ijD78{FD?c-z)#! zkzofke{EVx4xM+N5l5586W-E@p~QltUnq}Fg9a&+J7CTo?;D4*BEn*gcH zv1^%E;~sb!$|(1Yf1J0MwgX#H4ANj;HBuAEt=S`JH@&W{jwd>fnp+5;KzcP)#aoT~*v{8CEkgnrcCmQS>dNR$^!O2?c-m{I+o|N6s zEJXx!J2Fi3h{_E2V5wKI{5{x;DzJcxYP{xv+oA~)c?S!P9Apksf24+`(u`N9l7TJP z)46$Efz*fY@4smC3aq@;6WWV~H=@&AL+3!#UTP#~^F&xL{ zu{cFSH#f&DRhRbRKA}S`KMPk(Nzrh=gGTjaBGiA&A!D+SBtW?`z-pSVRL*GpK}?8w z#~WZTWLc@^85htoe9uVM5CWBE^^patQfN0}Wy0TFQ|=K*`^33hz>6PWc$jiLuw%<% zOW6w$iG-Rbw1i9zd702=rUsI8!!C2(%b%eUy?xRyA3-8_AJL2e|4F7_PPYw8zFKm1lcM7@P>BGu^nm=q#aDI}Kb#C;wOmCV$4Dn)*+{xmEMX)P7pr+JIkX1G2>VMn2vuytfzip7Jk9*SSkY;&W}w!6 z_e~Z$*1k$NT0&X^u-A3N3?P8>sVywF--nS;jlG0Z>7(((5uv?8aa0sCS5mr)iey5v7>V-y5wbK{tFU%6 zq%8=tDhRr-VPn^y$vd&UKf^Uew{Y0fLjHhznYWCMdwB3Jsl-}ae$aGihS4xN<;H*w z+J{aj5MK)x`thYYl^!+6W&K}pz^7_-0^8zlSn>H#-1wVa$}1}sE|_Wbki@ycHV(#8 zm@qFFvtAQNPFFbl`HZY||_+b(4Lv`;K zaT&X?`T}`ZZJxF+!NAC?4{XNk&*82^QyX+5_jDw;YX57&!_w+GFu~D{fW+mKR?e*t=oij_I`ubxA42Xd zgm%GMz6+F%&!BQHy}re8s8fP@U`(C@xnfU0QjDovPz z1;L>JY4TxXR(9pqP8U5rMAu^5*@^fJH@^=KhI}BYS+bc0^(p%}sx?`;q$z6x| zuKkE;GZmq84tSBvVS**R#VG;hnR!Ulb>|i;$zN{_KcQ6@0jggbfD7Q`P7#Cw*U`i4 z)DI=)W*60TI#~9rXt=vPN{oaw_KCHO#j5XeA3bB=4cFsoPiRx0qxV!m-GAR3+YU>? z_|N5@NfL4{C7ZTaro~Eruua)vC=DoA1{kR_kdb3a&(J&K7gH5@b?dD|m+$h*t!pbq zE;V~cq$;B=s*Y9C1WBXeWh{zZKOgd`n5K$JgYbT z&g>0NWPG_5DL}DV?9g6lt+5AId&WAXOWs%#Oy_Ye{5<$6sGiBMh!G9_LCR+Bphj4z5{ve)*2~XML__x-YNle+As{BYaaCZxEs>j(hi8l9Nx18$;EvhOim+4Hp{~``}xoYmR3vNiJW< zvcg!zX%&aXR3C7?O{x@(cS%rDu`8vECi%GjR2Doc6H57Ij#MlcTKzhSA2TG5<9ruC zB{GWo>l#Qpy6J#^zb@%Lu($|I*1thux!lgmWV~v+dkVQOu!&G^_qN@fU(q{KQSBKr z#tCzA<>GlV;A;P-@LbGL3@!_}gK^wpNZo~uZgsa7(0w~c@Gz2`M+iC0Bi9ZmyK}zf zkoGBQTQNE1^E{>`LD$MggBN-2P;u!U?K~Z*?4U9Fj*vhW$%KWbPPJMH@SG!T*RwxtDg9m57Jf3vQ4^;Q-)o#b4z6>=&c z62^kR#R@UT__}q}O=B3>?1cwGr9*j3HI+e@tGS?=J;zD}%PEbP@+ikmQ#)Ib zx7ANOg2ai3JLJw4&Ahn%)#mw45p}71&v-}~_zH6Vern6VW1t6h zZ#O+t+1g`eknB5jVom2i%9VF2hms}Kv8r>(aaeK$p-zhpuW|NVKIE=br90eS4woh+ zY!7ud>NG9#YXd=#(Ns5Qgtz1|-ATh*IUp#8;#3!qqh0e|Cz?cH0qM{H+gFJ=N#s?>2A#xBngtV>dMmx(yBweBPv<5C)e6@r>E37i88?^ z(D~aUyGy%xbZcKnPCByh%Hy=rRKeg>LrCv=&YpRHkARUoh}p#WkRKX9WA}EOiRaCr z(;Ag@wG?T@K7_6I@(D&9jL02S{{)Xu&59AU=q;R-Wm{vGCq7I;Y{;fZih z_pNE{Bb#E=L73_LvN|#=-5#<(evsf?eM-a!=bTd$!Vv%Jmy-n6t+MkN(`%2nFmxs= zR8WD_$@lx&^jw7Ja0kw}_@kZtVPf0!Lp7@Q5O}wW50FQeVB4KNE${$3eEb6rlv3|6 zfiYjdkazAva5>j{9%qK`;R+K|Kww)rE}8=kIHx;)d^)~0o?v;d`M;63COm>W`(uWj z)WS7{$>*M)+%IYmSGbvYfU_bxhyovUDLsyYQNA0(FWaVG1zK_Z2+@)C6JpQZ`W#{I z+rt$m6USPiP51x zaiV0WjX^BuZH~zXMpUV{&6}5S`TxQ`K?Hz>EdH}Ug4cCRWIA2M1Bp%&D(b>iI6_k9U z{ffp>S9Gta`7((er884KiDRq1q&xYj{Xy#H6O`lL(r-e$CRyWs_(UOfT3>O@b zLPH9k6-N}AIiqA&okL&9vtZR?cacPH;HxwXWW-2qP7b~~T)$w9YW zG>{-7w0o)l4Jv=7+BwkimSZmp5StVf7nM;UsI9TOuhBRXm@+ihk1=dMt|qdXT{H%2 zKva?Lx0dl$l#@^pj5&rb|3#qu;ohe7`4i0df~&|P4g;ON2HAj9bHI$d+j)GAyv}** zK#%Qi&QhU$sZm?#<8bU#oZ9}d7$HSla24x`z`OPJ9kgC4$}}iRm<4vU@9EOi0<1k7bYI}?*pm>PyEM0 z=!L!Dq<1yFQ!8?UQLuHpP|6Yo$C939tNv|)vo#!E7qT;BQqgQP*co>GHASy zju_YJ4UP(4xJJ29WA0_yg^jnH%FDe0&2ND#b||FNk#)O%DPrnwk=ysPhxwRomM~i- zMxW93R&8|kOl%X>6rTu17{`{9A<{!K#x>03f|liaQJ^;qKJ)dFeUmiv_rrL6CGs278iSnEUd@u#9fvXM3 zMY`rasai>EFuA!zO;TnOn)sSKi~H=!{dY;1iF@PRIPPUWSA*;q?1%SNP+tw~{p6^g zO?wT!EGkbDF|fSq`{yEQd;A0FLC#+s>DK4griHnyAa1Bp>BN&vV#g+H<%qW*XF(V*>jliLReK zh&hJ?N)eP0CfXX|u21y^)?Rmo$C4W$KA%VCxdxG2d=L6z<{jfdUORRJzf96s zUUF%lrFTU>WE~L&Yl5|$BGzUdqNq|~h&~VIjE60-4`IbidT*iEgy#?w3$^4NiX3$X zYwAqYeDVw?4ELkp2F9tzLkE}RRq!!T1#SYx1|t9}g> z;K-qHus~}17+T`h)z zXh209zkPCaW_LO){sXCo7kF<5=sj>=2Au>So6PDoerVLep+*S>h$IEgj$ z{`vU0-Q-ZZfvU!3Pg@Dop2TS(XMVYlI@>qQ@u6y$b(R~wqVoUy-t|yj^*74Odvb&; zMTtd|9VY}8+=|ttZK7#gJfNwT8^ zIf*4YsjfuU6Cm;l5z2A`Dr;gFN=A|1hQ~w>SimJL!q6UebPR8g+vp zu%D!QFRHOGLlr)Wo-eWb`Ky3qsKFAV>X|(5Z^1zU-ffuV2ycbI=o3<%$`ANSpHh`L zmX}rtVWf;+TAo=c9y9=%tlCpEH_-HxLqd)nZ#hk_rC{T}t#E5#ANs5b8t)mNltm}O z*d)8!UE@#X*H=T`E&rZOE`bv|hpLBm``BYuynZ4$$K*SKR$23^U)Gie52r%!`6c=O z#o5!onYuX~glGJ19YOc7sGW;Gcf#Z#2r6Ff)uXUFpl(=f|0vj%+@k+ zUiIlmk+ePe0rVj6FP>Y3veEXk#N=JP4sHvzh1UZug)t$PaP9d#8o!)H3&h@3k%ifzIS*NS)H9S$v|7Ke`8 zDT0#x`{i4h>=z?#nA-o2+rGX~GD|-wqw9;rXUnK>?~`LZy2tjuq?lhCy^H8@Y$3NW zj(B>g-Y3wl=v!3>Ygp`XL7+h>!VqH0?x9RG(NS1m{kw<`W(%c-*#j+g6dk$n zEjscp_k5`YaC{W>prZxziS(k#k#@T0Wj^rf6FrsG8QwtQb9oM>*ROyp7LL7Z@T7P6 zyy9;QHT;@I%y@@Z>RF1@9^t6Ecc2>_acP(N7K68M$*WPnBp?);_JV-QhZ0>3 zd0Q@O0UPD~OsN3#Uf_sG0A$n8}P6BKGPNKts>MmK4+DaDSqJL0mLJ+AQ}a;%3okGq_?*H2y=&A6rfV*ZX;=*w=^E2 zX}3n^6Gt*fC+vCX--9^gfh}RHegbP~6Mbu3KDPOH_+X9JT`LHXYoy;3^YAX~^rOFj z)h}QMPeiz{PYx!9?b<98NJ|uG%cEY>L<*Otl=8FCBaC5^9Lz)q32X@tWF?r}R~b9h z_*cIC5WfeOf@|gsyAZTL#lp@)>Li;E!2F+Y@!7CK{l>g-ib&w1xy6rMJaV=&~|Ts=wFfN*q!HtCjBol1`o4- zjg{}J-#`ElM8CRp{ZeV`@{R)gsffl>=7%iyxh#mw{_v7D#Eopb_^B@n3179G;hDI& z&D5t$41?5{entF)mo5D+9Fq+26%oO4xi7cM{A}zE@&tdAcA}TAXUG-}t=Z0c_?*l` za%$K$;t8C`4+sqK*#=ts*efRY$S8F!;@&Lhjh7S6krBnqWIr!HiK#|`U9+g7mI7o$ zpom4$0)&|3Xf5i#-1zl6%)m^_)UCB8P>?A^aW{?gKl~fp4AqD4{ixrCG1zz*x0%b~ z23WX$gnty1Y(gc4=zQKtqxx&d@CQ@W;O2;MH}(Y3~qjG)jHr+_H8?T#xJJf=vQE938GUxEL^>#60isjO~e>fIY6 zI>zdaeZRDe$}Ul(G#Ap?x-3jF`WIbW{f7lIx>c!@w}6S=x;ODXCA#Jo;DAXNh14LA z4_LKsnbcFx#T>-yG?LbuUpK^b3}s}GAu+!j4WIIUvkOXO=kwXRzA71K2iC7K&-fz| zml7jrLPkk2WRXF##x39Ntq$e3ZnzZxl_>yJ;}CqnIz0Zd#efAYXf_WZaT8C0FPJIo zjSqdA^Y{f)<4Aq-dghMQ2&v(h*h4y#jB&Fzv8~04a8be}JxSpT@Vly@>DskM(W2x;RBUMrRKB1N=PW{!OLr~DG8NTu6Z-x^ zhX5nN5zG{UxY4%dw?o=zlM`t9GMDc}ayoEy+vE zq8DIV#ldV9TU!?IQmthY6cj%vcpIy0StG*o67n$7hdtYwi~nT8-ZaK*8Ff`tw{I`$ zpghNv7;FLC$(AwaNX*@3HWI|cIE0ChhG+~mmn#bG@$VNOdy~(&)kiA%|6TJVgWT}z3+)2W&LS{Wvdj6{+K2@jFf;f>_;XS95zv5B1$ZHq zd!=4&;892bX(}~@kb%Kc2{v&26TzmZz`6o%Ag6fTRFaI0R;a|JrCJSUg#2VJ5_#_3?U{&^mGeH%$zf=UoD7i2-nSnL zXqk4+s`LLVGdq8?J!>B?0!x-h3Z>VGk`>KTs}0g+h4?BL$`&uKhsUt6YgJVlkELnZ z%5FAD*S5%AnKnleYsF&y72Hv9ns9qny_X(B@?>L`v9IN3$z$_)X_x*I&T|ZR80vKJ z((`zMtVk*9kn_q#1w_~t!db(Y`$muY{r^nQ;rX(;%G@rwMe^KyB4A0cSrY_jb)JN2 zB4LzWtt@MkTP-g$jze;Gu5G#ubZ;=xQp94}Wy+K7a?2*2TpYtY_~aUepiVd;Rh|UE z5>IT3J=vd{G|si?->UHy^aa`@H}o$=^8JF$Ur2u!I%WSk#KJ3zu_B#$KXosm2b3Ck z5Uy%BT9$C(w|%yV$OEr;&@~d~&w+#Q10>CeGe4n`Fnot5)fxl4MpC-jx|tKTu4r#gt?Pk4I6GD-etsU8rnwlAlMxZI4NRr$Pkj(xb@jt+xCaRA<9%bp!e~+i% zeSGfEroC7ima9uCl-+5NzSt$FnbuP1oqrfvSU4fML?g39dnhGZsrx-OO_Xje~c;}Zr;&bqPN_M~`oB>Y+DE<`u0*F2ZGy@98FJVfhYw z+!#6oP1sK4%RK?f)Au7T0{vtqdN#8{3dQ5%L$XT@(s_^Mu1tI9C3vJZ+K9!bkYl6| z+o2w|Lwy^>AV(wW{{AaHi5JLbC^I_by6=-wfE-Y8lPtT+(ml^c&J34LTuh;!4XU;+hxvB@QsJp%X+KgDES&2oeV{h?6NEis6gV5p!@0 z@bH&+=HWzp;{n@U>p8;!&A|f5h6RvqIv^GhSpz|uY-b|*;eRMzMcgArM}nq^d?WM; zTHP!8dBTO?|9PG1sSDKGc8CfIMenVn3{t9&8F|lDS(i##e7ILG+AW7$ke8+uzs4o2e7jwbw@U z>7-9=8m^emVG>D(lvS$tQA<+D!6ua%iY0Xhw;W1F9y2n5ko|^D(`L=oG6IB!THZlD zBm$8e`sqgjw-y8bq6rU{mg+2dDV!<~?yOov24s?5AgGE6aj#QLjTy;ptkF*_d1^!} zq(UoBEitV#!bsLlAc;BR(F@nTX1Bz`5763{LTGJDbgZ{Nsq5iJ+n^7gzy;{jbrvsL z7b%q8s=Ux5xAl4#3h@Ldesi5GV$b-Vtn031^hYF5HcA=wTCTdYs66EDxUtng$#3l7 z-Kdvhlzb&dihtS?XTTRcEJVlM7a*^-9TTgAe*v+koD*#fnngS1yWQGbD4H%fIC=(O zEIUtmv|VoA3`ZB^k7b>`;SL^1z-2&2-yn6VOKDk!95EexBdf|t27rliNYh;2Ku4qT za*E!Ro)T>Vt=OdTZ00#Ql8gEPTR^10puj$jx)tsdU^n4#?x7!$49U<8$@(C&Rz%HY z4kS>g$4E=y0@)MF6CHAW@)HHkS*~`}wNoLq2nA38y-?705W~fexwL~;CXBKJ%BnWG z0ZWw;4?-+fb|((b-3HzPPDTYj)cHBZ?jzmwb#njXGW>X(gI+vt)r8DQGTHI6sC35B z*e#PnRGm24!5vnhK0{&z@gcr~F?3Z3{(HIkKy_bl+k&a{PIUQhsa7^!g1DR}WZI+u z+cF%lytoB#nrD*2%kiwHj-CE0c}%@4UwxJY_O;X-b1eH zS-=AB8zA5%iQf-v?oo!3&tlqI+o(*3s}Vpd_X|miIv|= zvRr~!SYTnCL+kV;_=0M)ng`u;SC0i2SZMYK*5e#7hxCqX1CQ2}dn~o=K3D;gc&V>7 zwR4SGWbWBuPBK@m7e*O&T6t1w7H{V?gHTk+v$*kAuAn24qe=1&;rKE%oN*83zQJ5y zriOHM(IPx#TOA@rRy~>MW|i!Y;&(?TPNhoj=11)glm^901E0|&?~F-haoRC7rh(F; z%?&RAA%eV5H(c(+k|IfwuEKa&_cAO6YyH4>v&;5INAHQk*(!iNXs_QiI8Gb%JS6IF zkSs1v7SxZ}-V4$${-Pm+I0?B88)5x*X6-X8NS~|Y>9&=FQn0mCg@+e*a@gO6;^8Vt z{*KM*{AGjH==G`LjyD;yIMGB$Fn6#ey5W1`F+A1fx0tSXvTkG9=kEzeekIVOdWeT% zD@DPg1J`71WBib9g%}kA0dhPDB}@u}4SLvN$nilp1xXh0|~b zLcv=dZ+)_waMaIo*vB<Hx4Ut3{LGjLL73n&iMYJTn zlh)2E0A7cDR!B0a4|ZW~8d-MC95$ItcLW1kq~3CFqKE0}PTUn?mwPtJnfDL0zYb>>kVx_v5fKI&KdLc7OPLp(GRa?oioM<5Vd!9|6MI=PN; z3v%3spIysNBIQm;~{^ ztNNZ!|Gw%weiNV986a;<`b_*`@I6#$3n}2V5bSyXDB~n1Y2?eXKAipx^TLfo3o-V1 z2_o7v4ngH|gNEY5l5rh<63jo|abtYc$wOlV(f8FSoum2=b*S2@)PfjWy^UWWXg=7Z z>;Y!yWSl{;>-tvH<)D|>*eOTDhq5Br6+?eu{WKL1$daT>k9t4)=MzcRijV{OlZUsEkszSUvav0?}LG-bs3FT?5QPhrI=Lw>o{?i{9rE|`}{|@d&ugT}Z zwnO_9rQHinM7g5FUA*F%!zEI(QkC4Ytoghyf9OaIO3!FGG zs+H8Vf-{I`^VNIPA>D5ecoorPFhSc+rvM#La#mt4|8cSj39iKw8A(|&bA;p)J{l7E zV}VmH7~@KjkXv{;3CNN##^u6zUeOhbTn1>8qGYKKG%~=C6aeyOW>7)MB{C*j6W%t=drUN zjZT@FxrnJ>8arRqqD72?kxwddNp7s5RI#Y4Od$}IrBp2{O(AF9xQJ7Y#9(vA?Ufo0 zf6>|^PBYbiOEeP4I!?KMr!nbb^EU!ZCDUoDs zN}>77nZ!xpxi5>ZF>Bxc(W;WL!^nfNj<8g~MeL3$_P|8M$D4+YxKN z3G3bFwQOPn7`AgXDDmqB1`I5U{}^=1n{94PB?^eUCw~^}wmV(q^?-wG5$crjCH;6I-c2rj74)Wp7*!5&V^(6 zi&5U;WS}*_*@<>8TXtK}$C+3Q`!oM6ZWY2WPIQx1+Bu9e>=ZunGt8f8&*k>e{Q3Mh z?3&5=<;Xd@zSZ7x&==|Glp*04tOEAj3#m|+6x1%v<#DVRgo3$|+~C&!ef*4IUlW;+ z;Ey@jhxbrhv8i}sTjup%!xu<_U$HGB?&gCb)f8mB3!t=)a{6FKouN`$Sj>#n;d zKIMJ=6rlkS{v^jMux*}PC~f(ZfFr}<}uK!5|^fBu^ecX7{VV@A4p4#l@6SF z6+JV?=Wl_VM!_0lU6Y}C)`9%=cAni14TX}(iI!6yT11$qmDT53`l~(6oSgKu{BsIN z%aPd$rJqkyERIA&k=l?}-Tv1Yo%w))yw6Cx)y{>wn0ejgE@d{TxI6)$L1|;A0kM+D zMYqRdJa0^K=kc`s*T^qL2hE&$P{?~b&1qE{W;PZX3ZaJcwhDH%tdgP%u|LpZ2Qlks z*cjY2}kSJI!awb%ZKp^^t(rwsn?{&1D9Az^m$t| z;c?Z4eddLVUJ#7oT?)1Zv-7wcl~!&+(I*C*;nSjOE622v8$IwL9|A!l^x?Y%5kgzR zrDn*;w!uGyPOAl!HVMy)dIwS%IgKyGn3Z5JXzY|MfNChL4%h{MW#|LW+A0QX5D>fQ z7*<5rMGfX~gC?8hf!Qf=pf@OJs!InLn3D_#u65d=>KTdUy&cp>&Y2e)m^Dx@WZc25 zm*5fW2#P3^uH3_9J&i94fe`uAT&430d5}^c9Wtw6T_Gi#)t&!nab9JNxw#qgsDAgpG++HmgfS$nqH+eP<8|aO|ijA|NJz} z{}7-hr+qNxpS12V;5*;YHvk1d<5qUMRgyaY4SN(XAxUR_8|2cCPU&t-UQ9OrgY_)! zG5+Bt%l@kkKkX^_?H>$Z#sHCxJC}aBi7bR!rMjPV#?7K)ZH*t(AH2d#CY1}ttTAz< zi^en!;0`#IJ{`gUB^+=xNa=hO3}7ZbUK4ml1vKE0>{ztJTlS?3UZ`igwZ8-z*NNO2 zHGT}500~y`#Ij{e*Jgd8b|(Fxsz>Obogy|nV}hoT_NBs{WLS3uTn3ecN_voJU$-rD zo40-B0=5ukE(CuBjqQ?Ru!e$?H0%3de0V240YntQe{zP;mMrV82^!)i1MjL=(8$S) zn6ObLbH>eMQz9^`gZjv_yj~+0(S-=B4EPB!Hj9gOHGY_LTR>_jRfr_4F>zE-5Io5i zyj!wgaBbl7)BFNUe08|lB00&(=hx^Av6$-=&f-y(=$>8I#+a#NWgYYX{WEzZzH}QG zf}EHmymT8l8O_8j`mvzbLW(2_nTW=t-+yXIGGrp^9Kso>?#0!pv3Rf9^Ueen2gpE8 z%)t#dMw-&bSaOhv4!IjBjg8d?_J@q11!4aPrg7 znc`|Hlre(hA-maKB)j1CdKgS^iuG8R_Y0L(IlE7l)05| zpJKp$2$zMnfk<0uNShFDyZLY=;qW=Z_j0N8_m4B5=}mnf;V~a4UP&l{VxWDMP#ScS zx130diiJX2nj(?NQcK~oGCBCEG6I-T8GaE(hsQ?`E0h<#^qd{k$J7M) zfqik!c!jkhQ~)|MaYGg7DWdvzIAdo0ZbbF|? zDZQCN!~?2QwOCGXKmqXcyV*|c_o?I2JNJom^L$G#T15tKszE;+*=VN21a^jMh* zq`*v(%%1MdainL;!j5^#JH~`|EL0pj=g)O9y3pzPRAac^Pe1T0*HG=_1#}eJ0zs9~ zbFZ8rie9JpM`H5*Yh=UXMT1m^OxGcRKP(h02q-r<2eK*{7ZvFj8JvH9PjEEYt}2Sb zzr&#-i{0l7Sf1m4NhZ_GBooBw3XlH_f9kDmI3( z#HDx?7s;d;9!-rdv5iJ&w_o7N=ntP7QVdvD(1PZ9dZ{1L-nln|nOtejiJN%wBhw{0 zS|^3jOz8EzE=Tk~z@L1?#%%Ye1!5oo0dN5xz=Q2y=X#j=A^D>-%VxBD7qbc=B1)dz<3uT`br*C(A-)KPzVYi#u1k`D9*l!4T zTf7=$TH>On(s0o3U;Gv!rBd=2;m^}`2If*^(sX2gdukf8c3(#?XX=NcG1lzW8|Fq9 zE?4)Z5*Y*qfgYI*pmgGeu+vY>mmn?D!a2AH_XN+qpE8vw-wd~8wzY^F47X&pw6U@Q zNQi{a302kZ1TVL7s8olO>?5Pbe(4}!8Sd(rV#&b!@|@TA-#5w)HpB0mjx3)hS}^*d z)$^zsG97g;pifb2QfYb;$gSY-N@GXP)y=DTE6CT6L|iEONfbL8JF$WSzH%pfntM)j z8P{R0|B~+jpHWur74yGQ333 zDdlWgiE;8@3-a}^H0SbuDB&D!?YYaVqSOB{U*Y^v*5T!!TB$0*-nh*I6q2+EWgU5> zW?td2AYVVEKdAe$l=FPr!mcieQtcF-=XR8Ll9Z_iQcA>1n2@k5`xwUgK%pLL-ilpitth%dM|oF4+^JqsWHurmR*p*8R1Kdy&N@vP$pXUKryYRHtS z?lmM&Pr6fQ80lUdH?f}Tjuq(&0o=eUikm)wCHJe`)J(tsiH%fj;!-@Q$9|@h6oq1# ztN2;>)Y!cqGe z`_0e>xu9VnZc)=}%S`U#aI-bM z4>Flf#N+D(di|L2E8TuZcCqg-v96jy$@6jmuvR#pNi#4gdN zz20XzmuTwQ58stckSnhrgR*>`t!*UI(8Wt{(wpMFZ>#2HczG)gYQ8%CoTygpa!G+` z*Tp8Jf-*f!{l2v~F5DsB%g0m>dARKstu_X3@%oHC_S#zupgz?vl&us|YA?l>J?`>v z|E4c5X?>y80`e#UuUVZlRGqzM@AnqeJvTiwh5jn~^&ehglxB}vtyF7Y$R?}G%1Tr+ zSxI8@p4(+%w^8(k<@jd^cJtT7F?*SIDz7z6E7YbB${JGLZqdpVN^woGNkdvexHaVa z)?R9;LxPt+U?bV!2A#H(88y%TO)@8=1yh+a)Ge60DObz&2&+^=F1t8RENe3ra> zwfX9vrM3di2SGlJe~hC%?G6W9xsBf$&}C1}eY&n~wRSaWj`!rS)VOAX6OL=A~#G9op`tX#d|CYsk{}1lioc2QE1qe@JR)f(>fhUkJZ7z3AI{!mvhe zBgP4CSnBm%e(Qh8LjC+fXK#8eNta^AOlcTd!?}fR9wmuC!XwLzN@MV39Er%-aa*IbF-D_3ixs*~5ZcZ2-tgn0bE5Vqnv|w5 z`iUlw9e3Fzo}<|jXmn|Y1nT<|PqM>-Crc!_!r`zhGR5@zh4NZDy;d%-H>TsC;fP$b z!-@^s!beG-Z|#stuu$NgldcWxXlpaiNF?6Y5oVr-Q!1{m_J}zwPeOG~Ny50Zvw)u( zONcB65t`AA7PO!jB_Qm25C1Pq2Twb}}3HD+K2+=dtMV%zN@Op|Mx)Qmg$)ZXKL_Y-*F5;4Luq2@idwNGi^ zf^2lfpXeNgSD99;p1@ffqKVd|UlP|!7A%lv@$Lqjh(;)tpwS#(*YS3goJf$-)-gN; zP%>-b?0YH>Q>-aq>Osmj_PEmonYk})-`<6VMB$n5D-ZOw!nd0;E9bnDzwa6J5~+kq zs6h>?Q4MF{4%}hL2hI%DB9m$HI`7c5)p|l4Rt--@sEh=Y0QaH}`xVJo+2_lc;_}fS zKYIys8V`1kRMguSd%$g(+xF}GqSefr;jplSrlnKk;g3SM-~(oR3{{~C@Vf9`ORzX4 z)jQn3Ba2upqcz{9m4_TlE~cu>)6%%Ry$Xv!!Gz-)P$uMV0j!_|L;ZPqOwxGjURMp1+-~6SfCNCxVX%_iq5yw zZ>xc#OgI{q^C3eM1Kc{~2~_x4fw9oy%-3u2i#g8Vta%-4s~+Ig!8fgIMCW<;x=h2A zM#q@!{HQ*P0>=b4qc>y7@f;ybDX-p=%{zU zbWjk=XMcDlmOQyy-r0|hQ3jjA;r%0WMb%0^&jEZ8ji#+|xH-HB^9-y-(63NlnAt-I z`GaiU6G-TxnM`h4(mpAkNrRxsLpSPDv4CBHlc)aJf&~_+u)y6PJiVOv!vW8hDqP62 zh68?Bs;_U}$QA2c6LTs23!E2Y@`QlVPb2wHL9vH!GI{7=6cVMx6Ji8Xv4GvdQ>OlE zz=8@?SdjOVr#I$1IN)h*c)G@vJ%p|PxN*3W_I(uf_Tc$^g$t?kpJZA9*zLpaLk5*o|^A`TjH~cw(1VG+~;p>L^I(C8jz*56E(q(>Yvz9BRlI4rk zuYhG~gd_-i7@}mSAe3`aAya}+A%Qu`DCH25EQegs$``awB)q&Z^z3Kc!r%jXZS#;{{yBrqLnA6v`bFO6G-oUCQH6Rb+$S0HaPr8OJYg>udmX^#}x}-g%L^B_COfp~eWKt^F z<{gnK2+cHE^rPG_LH|186xYmm^JQItZOow!Hij}ymTSqOn9F@jKk?W8VQy-E89c6l z@>;wY!VpvnDdeeMX=xc`mq%O#JcNgF&B2GOg2Cp@=TXHviQ8@`E&Sa?O_>y%_M3?&a@;AR|7SmfkkMu-$B{vz zN5OZZ9|PD}$=2J1Bf$&j*uV65)ev1OD2X-!hRzY1Vo4~h1dqV>T4=qvMto&BQ!FkC zPC2(dhA7?wwq&)nh#CmCSX`(EhoJFj=4EE3$7QHqeV3oD zo&D)y^3Y~G`wut-hgm>ov0sy~paxRMex>#r>LhVEa=Nbj-4tL)=M4LZ_V5|$j_?|7 zZ0bfkrW1059ig^()A*!#o$&0Ie*VUe#K$F7NJG=1?nRIS>gW&m(Bek4GiRhbn6=vV zI)Dl^0?E-d63juzX9nz7G75Uy+ewaD33(L9JRRt+ZV(*K1x0oS^o+%zVyz>h1BJ3E zmnOmI33+WuPKUc!oC5B++tuszA98)^TuNN4-ps=FWH znfjYq9XUq^ukvlmFO$`wqI8#O#)j+HF1)5)|$dgdw46a?EqxG`4yQL5@gHk^`c5OQSUdE|_mG9+GG9z^p6} z>VjnI4@4`$zux&W|0N%oQxKy_t=d`kY-9BJ1Hn4 z&}w(jX?^j?be9$J{8EOD!uI&gUn*d%98qnB4dnvYXrrm=~Hrouoox{&0d%tR1NZ-v3D=$E*yI`O>tAn150S! zN1ex2W{0SO|CrQ(y}x&IKq zbte+xO_T*?F)cw`i^&)=c5^W=FcY%`uE==wTAj3}-3TzY_}OQSIsz}9fo(altXK>G z~p7Lzy~sPIruls;D*6&lWu^7Af^lu}_;E!)1; zUqV@x0^y-%qaivI>B!i4+Mp}%_Xv8r8n6^c$~+2j?1%hqC@Y>k-x;IkF zoE>b{3tOxRpr*SuXvwV?z$AVYA3q@%-YTFol9E|31=A~)M1#%g>!7W1EoG$VdA*yI zC$dos8$%Sm)tSR)6w`LZ+`8ywy*@9H11=>H5EYigK5dfPg6$yBz^y~RC@_vQ!n4OZ}@4vn0=4x69&&0XEX zp%~t|`EBzfFMV&(U1p*FeWaBW_1+}5E&J$oQrXla3FvIzlPB6IEb8OedILEfxQww8 zRaWRwHsEa!!A@$f;#W2Iut>SXf4!P6R@CEOt)7&DZQ%)B>SQE{qbwrewt~YDyRk zShJb}QPrhKD9fHa+cqf?o=y^4q3m9mVK=~TqC4Zi4sU)XK!Iv{?8^CQkE4&cE>ib1 zT7#!XTMAAYt+86-9AggP!F<7FW5sA~5|^f9qa*BQcwWL7$Xx#H!g)|5nyN^8e}Ye} z8mlT1@iRESq?9!&Fdm+1G9ZKlM(TQ7odK6;EIww+3#^j9&N@AnMP`l}x+3-Vq{}fX zw}n7;1a&>J$?SSqOS(c8VFGrK_AsdpD+ekN#vv3JjyqyKYf0 zGsZvl`1u;V!ts)uv_e(rd@20SK|4Ef0&Yf&8^lj-H51gUN{R|Pi`0t>isqHH2vm__ zA)LtTMTUg&BmKtw^uAP79u?%G%Gkyk?UO95 zTfo;dhxSF~aJr(Fc;qmU^lU@JpN0dMs%vwYn#@mvqu}*=01OEad09wan-8f$lY#?b zO#JSF%lf)%QAq59c~35(#*?FY z5~toJSo~&)&I0VCnM`3rv0Tf^AyN#~KVQ_QiOw^CsYbSDH)a-Sb!N9L^eA6>=uOAU zOl0XQmWlnRb%=IJ_zIOBX~aPN+bwN)cbo!1?XHn7nAMIbN2^}IC=Db+EG)``Mmw;W zi<1GE1g;WLt3|VN7W;E>=P0wpSJ)Tnm(;Yuk&5cf)tPR8(c&%O>i<+&l0OXN+w=S= zA#_!r-YaSr>Aw8)0=EIwep__4B!{hQ4Ze_xpZlX9-1&|rolNsXW`tyJ&7@|x9^z&= zx8~3dZh2>gb+^g0^H(Gy>%dcG!osa}q7&To&PcrP3E+QMX_`&sRc{fgZzlC@9C^P0 z@anSGe}+Ev>N{EdNjfUPgAg6`CbG|lo8TJle{Vp(1>0Ui8)|8LZ=%tEM{OmyC$5}=3n0j|J?Wq~q*v-L+m?I4 zmGLO;aHi|s7qNR&OW?t?wqE|88)tWJmlfxuaF@MbyTe6gKKPoV!FpeI08UUg7$*4x zxY8zmHARw9SCmca@my+GL`FYwW;IyjS4gf%NHP`_Ws?Rxm)eyQ+c!B}N4vJA1#d)6 zASJ(o#h^jFpG#1(=j=DXz)abNSx~3uWPkc0QV6is;7aryc-pV=K9pAE#pUQ(ABwKX z{Q>Fnby)j(NXWs0`+&d6_POSJ_>pe3%?yxlQjp#$<@LOF=cWu$??*1t_FVsT#+^|DlD?DLzesL-tY30R+Y7Wd2^hR7%63XVr%032*O}9 zVrF7;^kM6#=4oqsx?9WWn_|H!-&1Q-%$}x{X$h?v-p)0srSQq2kv=B%5AHO(SpTyJ zevOUf8@bPx1#H#067~g`cs58WGx)8^?KQFOHUGpi+?0QV?SUK59&O5?7r?sXtN<3n zStO;rn%kP3--1IvpnHmiJIyXzX|wd!<_I93`~Or-&ZiHXwD3%b zft`kpcXwhJEVoHluMqa72OH+t00gEF@b_TTOhJ)~jZ|5Tn;XK$j&a|1F!e5#I`%#p zo&&k=uHm;BpS^Rg?`9ETG@G5h$cC?Ojcq>8__2d?&SPD}0p65N0my2$&4EZ&l1Kk%sN(W1j)$GFEL&kKZQ#ZTs3kB~Q_J&|Jm zzeObnX$(59_`LbpEsPn(Pol^>wiRW+)eYGHfBboG8|!{sY<+42^Xzk7cG{3W>*>4+<;MK;#|d9E;i20Pmq|+ENC64%8f`M&Jeh#y+}mu zF;&W~AKM0(jjRAd;?$Z+N3lh6dfRRhGL$0o7HD8>fN&9Pq?%p0O!m2*lRv?KoYMB_ z6e?EBGPqxkWzRyLUW`4~GYxT_i6wehrNU9l=)(lUXBMjVNE4m-s6zdTSa*lEXz6(g zL&-Og(+}o~{={6FfVZ;R8S-{P*a!76A2?^$jAKK)3{G8(r>(lq&{fvdeOY`!I%^GQ zQA_eT-Ez({UWo0;`M{oc1{b%zy@uL4cE)xTc|2<6WYEVm> zhp0*4h)ESTU3<~jh_RyvgP;3eWd#1rc84Noex6rqYeS98mVY34cYReohJNi`6+KvCj?jnxHI1 z9;DvN=D28A{^wb5hX*|v_w5MEfb+PKO+0f(y|I0Q$FGnC-RQ z7C&wV2L0~fqWe?3vY$El-}60?lgJ(rR+nW0?;w9BXzNjv7TDb0b-)BT%UHT1h9DTI z(nTDzJ1Q=EL~ML=?PtK2*rd?EyQ9>W@o*5@UX%KXN<6Bs4WNOb|F0S860&GaR}#b& z%Y0X8YI{8CIH2prDS--8Bu5_qN#}HxGGS@bFtbgI%eHGlNEiU;uC53#IdQ@_pbTD7vtQBV4YPnw#h>F_svC5($|L@+Rl zUs(`<{Ob@|Vr#?o$0?+RsQKCINB*ZNtEfCtI>r=2;p7b+%+mbwRGQDVQ(T9N!vN^x z1}{7wqq#NT8e_alkI)0A0qQ9Qbk%M1aCuJ5d3)_d;ge>HZUj%7R%JFB8H*S!vYyRC z1Gch%!(s-TpwVi77BRU&U$?lbb)E_sUeIo1r5pOo|nd+5uE0vNT-5d$AleQ~}d z&@()T!&e!?zt^P)P+7m{&1C6)%JiFNM-zOh)laZFmu|$xdBVJHBV`E*g^Psobftv( zqcki#-2XZ!J>aGZ?VD`pa+WD;S=mql6Vlbx34BlS{x6rG&csv@99NN+u&R}-!8?Fc zjfE?g5yVugav{g&j*N*O5$m5e-l(-^HmP(I-xDJX$HTzMr{^g&stZa{e7=1&%QQf7 z3|~!tS=r}*&H1fUfGbT60TgkH|K4n^gd`ddsR(9>I;VUy%f?pjv<7JNMop9fowZoy z+*~YjMxIvNHb2(wwM&(9d#$s+*i~VSFlmjCIkfDui2Vow4zFE1yf;4Z3PS| zXhJC#8QZ|grF;_cV6c~#@QI{ez>6cRyk}9Ak518D;zn;kdi*?Ki~k{t4K7DC(;U8@ zu+_f-+Z#k}Lq)BF&!PBDRC|E#3SPN;uY7ze)uID2I^#Q22X)@@`g?;(esK~;Ar)vm zsfiNoQ3>{^m=+wtFHRSqz`KDhz#+?`hv$6KH4YZndoy7H!0>Rr4^lNFN%NCect~xF#6oaHsKyl;!Hf*dXn|@S1Q;r#n2r*Y=VX2e*MDqfSkD1?4@lf z{#on|ocX+L6AX<~LvwQtP!w7Z0{}fs#TgEe+`57f5gsY3>*^1ze#b+ZL2#YB@rc%U z^yX*In@%ngkN!uvTnyB;tVHeAls@pGz~-77Z!!bPP$sOHVQo(^*YA*O?|200TnnFh zX7!teDFaJ`wC{>QS&PAOi0Cw6*g#UBytvPibk@b0D{yQGZHu)ZQaQ#$h z&a-CMjp4B6Fq_CF`U8ZqWJY6Mna;_1Jbqrw*xp@VrG7&r2acnRSoT=9`FFzLZs&?B zDGqUgF_R-pnF7R2J*ySZSbH6CaCNjCrMiS&Oh1yScWaUDMdJr(hg;AM22cs#FTyFF z&EY3!@gLl<7tw@4yGP0E9?LfQHVq!b=g*w>%(f`O8C0Ar%GqK`vf;7;{E`5a93D_L zIez$nyB}Irz=9kxYgA|}%dMUI+XNak5`YwH6|YRv5}^n#tR29OW+CfjT!Nl+p*3>LJ|e zqdPX=)E!q<*z27`irti+JfC$ASBeQu1-y~>nEFNX?Y1cqt>4rL#2(9U{y~#oBp{P5 zt%dyYYYPRyx29DDBt?Ii8~Za#)GqxG(`?c5n0;MAe}>rNUytk6hxDz)-5pN}#QXgC z2CQ0`Tit1JSIw$fQ^ zA^->WUx_(i{r)8VOX4Y@5e;S~m#7~~qg&6Wfj*je8d!|1P7mQ1qUyjb64)>xE}tkhc8iRUsFs&E9y;4sC<{SO4F%Sh3ner@u?@brILXfZ zFmTDO3TMVvmEfM=GP#488$Oe6i$0&(yxR8iNx2I?jF zH3br1yGOo^j?}jRWD`#yt_PM3Wc(AXh=4nx!Qr+0ry1M*%p< zM?C*9HS|}BwSd8{$wXUr@c6X}Oc1mEFt@>VhbFEgfB`}#T`S4k0ZkZKmdW`FwH~Hq zvBeEd^s2^HBNgz&c$bemqW-W=mkbSfpmGW#kP=ow=`8fN7byXjI* z_{F@iiscVJ1H1Bb*&4eBzu>X6+2eo4d~q z8sNQqL&-50gJTk<&k+ESFAFO}0N^ee?>k0iAM*IslG;+v@~>UDTqYsyeL$I#1W4@r zXa?TYXS1$WsjPBTklsvvL$aiX#dpRFSFa`X0JPtB3;G`WlY={Y#%n>JBW!WWSN3oA zhY@}&ceB^0tlC3F3ZrM+q?i0oQ>l=!++1zQkLJX;TKFHaMxB~Q3TuEOoa1msaP`6n z7(8mXhL7}-GTWE*M6j95KcXC4|odA=Oh-%Rs>bgi7$fPNVs^+DH$9MOq@2 zsAp}r0ILtGVP=%89HH5}ZoxX<=^GY3hH&m9iXbB$d@t2Q*^}537C4_{AwymGWirry zsQ*t8sT;v?pTuzpd5ht}xBt*A9EZBWZtQm?$>ea)qCP}?&*WBwT>7RC9w3G8NyBL2 zGX@{mI?*LWdfyQklIwvx@--@fzUAOE$-pIrxqPrw38^tUUMVkznr-ErD5{^o3g*mE zKW-2Uiq-c=VBihgjY6Z6K4L6ooUfkJ#!8WUAd11I5htT}dZTlvIe%gu~r>KKkgqDS*jU8ow%v zd(TAW_~RAI@uJ3z<7Sl#o>cTwf+7Bl`e}eOQ09)5vZ@(I-}KlT z=6sGGj`CNAKWw-^N)rwo^?t!5@$#6S1;|Vh%X;d`Y`y#y;W<6+T(3IiI=5nnkB=b` zgm)Q(W(Y)zE#2nexrDWWyofD_1OUsz8 zk=H)z#X|x@UR08xXEzDbcRTKYTM<`JGkq@5`-Uo95}2A+^CKzb+DE;({V-CH%ByWG zdQGM{ZiLGbpPU%&nz5_i_<=@I;`$GwY5IUwO!C#PY-1D&!ZVv7anL;zb5 z#ah;htgxXAiMfBx!b0yy)En|4<4Rdj4;BZ0E5P;N3w4XL+ZbIHhsjPtJzx)(07=cx za2+wM?phZbKxFqlQU86fnkkiA7z39H^Y{k<*FNgOBoWG>eF^Y{JqJm-Ui1oyxqF%* zQo|?kJ?U4+dX-?}c*Y6)V~7D(sIXL$vU-EYb;isb7mh(qFjd;qc(d`2xt_-t#b2f5 zk8A7w=EAA|d(yPR34**b%{--}5vb$unVouM))4Y{hMiL58y@O-$1+S>AV&~;Tabvg zTW~7>qfOG&9K7eKs5L97MP-W(t=Rm%&o9oy}G=+-;A6PZc(bi5_Z z&rW`kHG&vZ#_Wno^=knD-OR$vuxSH-xQwq>*Hd1^Y@5d;mrG*zzNB0k3rH^au?(g_ zeJ07u8IEew$I{r8tZ4T)e8vqORfG{(X|eYO;;x0rxv7ljH#QICb9WF@!( zqoy>461FA0=vYXqUJ+piZ`l6n2XB3Hxq(c;>3PLn%5G+DtgmafP2|&;8+iCE;ln$Y zRFcjjG7!2=G9^gAEev|tnO{Ma{S z^8uV5q#zVXe}oOj@C6+E;|Zt9ZK;R*{|vGEC78t*;rAI|v9Fmtj&%#W#jAg0SsyCy zF}3^+NH4YiMB*e5->&XfC%c47pE#y|!2eDg<-Ws#$3(dTu-8SzI32%}A4kg>8g3NL z4+ToNAFmLtUK?Qp@7N~#pEPa1F3 z;u(!<%^%ui9t#DZk?@`Xc0h^0ye82Kv;@FrPQ~fTq`0KjcSkdr~Y*v z%Tn&V7O0Z~LtT1gR)^BIzer^DI%76(e5hMyETt!BuXffHyC{q>t|)9=XLc1cAqX&a zu(2lWRq~k4cBxP|;PQp0MJ7ZwXwbO?yoIZA@q|KdX(%YaNEHBU4sto`V?4g|NcF2q zvo8hTPj>owETuf94VwDH>=DO4x!@)cO!xdRJ_Zt)h3(`|Wx@sIFGi1ENIcdvmCS^c zrIqj_IKsz$DPh+~6{-nnuD`n~6V6AIAER1&vR3m2c`1B8lzL5s1-xw=?}ukTDV_p59Bu!%>-4_6H4Oze%&@IjPtu#`k3AH~m9R%T zZ_+=`W}y?vnR~@H{BN@FK=xa9`^9tgw(m5>Phd_5`&DBtduVaT=MJp%pnEr_cS z^ayMdD))#%{9y~;%#{BX)QM}L=kzl$a5NIBd96;i`jO*G$54a@c*{v$GgmfP*|_)I z;IC*3g$4I$Ywo5jyi90Sx}ubf5vu;}0I~|p=kc%0C9>uJQ?8T&QqX-Y18M}GCPmpg z#6SX7VU;O{&H$PthRmrIVZgwlNQ`E8-DImD!>;rL4*a7X^k3$`o|O@zHi5&Civgnj z^G*o`=mq)wce!;hoB%V`Nj}ilfy|N=`iCQ25MI&DnoV^r14ZNZj^PsO%f(;&l=(Id zD)9#zYMCvlP{_y94FY_Q_y%{<4AQxj7=-oCtQd-(D`Q2?Yj|ne2F!sn!EzRj=F#yM zt1rk-@nbqw2n?=thp0uk>dOH;f?1ypbei=PBG|mTSLpi@#SjbibB8`4eb>vjE|-AS zs^m}Hd*c|%teKl#UD5w0E=ZhsrumKDG=xGZcj~=x_2i>VxZpBQ6$x=cCu(e2N8bDu zS<07Tb^zfona43GqYB<&6aWWO3ewCI@iHSY zT?wr)H`8ph`<2#eKf=Ff1a0a!?KTyV8m5MZGWyu5U7JgA!so2nx%o+wK-f%cy+P%P z;z|<~rz`#KgolrkN%Wc99294boy~T1B;Rgt!od^+S~X~H6Y4?=#UjuI6iT7c=djeo zZC$l!YV8-K0uIrkBKOnn2+H`=r5W3V|8}W05A*F30XxYL1+dZ+?PO>@P7%XUpD4v0 z>!WTw4Tf_f;R~M7jVX5F5wZ_va0*4x;>RP{0#pOrl@&J>6w(E}02knrJG%vkSRlM? zNiG|5IBz~50ujbx=)msm(fqEzOQ8O^xg%0v`%GXUxD{fv$)bU{OQ5-Fsrk}bFBhP< zZR@(CJ6|={i*|{zB{_Lt$JzVw+;(!wf_|Y(px#ZZ@};xhEPzq*zmm`QU{LI{NM7W> z8<|a?bt~lg>-U})U4{#rdo9}fK@aw&0jI77)LtvX`sceh^8H3qMDh^3&tALtYyxuH z`1yZCn;+>iix$~S5WBx~|Gsl7i+-8}3z5gNF_{Y;E@daUc3+ko=hrik5!)5nA2no^ zX+5m7wCvKwdoK-U*OSroD0)@9$<_@q(5P?Qui5#L$gOAR9qJ%_-TG~}D9uk;ic(^Q z!9^4e<1!Y=)v&qo|9M7dZKT6-m{hZf4O8BmMk_o-x7$ zTH?F`f7-2n$&zc@XF~GxE?d$VhkxO)yEI-KMDPofARRxKw}$*Zc8^g`jr?ew2X^$H zxjHXbt?MB5r2fC}?rc8_YC0_?NzZfilYk6_L_ag2}LE+yj@w*My z`856rWI%zn9d!NZHSZg8n&k2rDv5ll>^e39O`5%5JjxRfjD52apFp=U4^{SS>{V@x&XCG0iS z*L(4;!2^csD{7)X(vHliVO#8B2VW^##zs=_Sc9|3%>K_#j|3pST)O2R!?BbbI2qFn z>fs3F4%ums>Jx(&9d|lI=t5cb1H%!i>AzmQ?`Cl-vg>zpwAyK;pf^<&2oWAj4{&Eo zxkL*iomqOuA}*3Qa|u*|RWMtb9at}ov8uOtjr7B14W`cBUOD5FJ7LQlo;lfB?J$zC zVl}A;lH|48*AF;t_ke4KrL-oQ0##CYY$kw`2}8A5EmOj*#u}l)FE~5P@jC_%E zETXl78~3icwL5zU9vt4O7wI@#gYFqDAt>h7o+_S#TShD;17|S>jo3Wl?%$n$P(KDY zy*5;gi|;Pq1a)ybNu90(#GSKnKQ7t;xZ5$RWg|uRB^K+$vtBk<2)2AI>Z#{xbMRzIwSgqm|)df0o%pJc8q& zuTJjBkTBfs{h2c20i1Jvs63IOWCm(n$Km&>i~~V0TxCF-;1tZn1Qo_5SSo2ul*^N~wLrB(_K=;MUr` z9n||z0~vo}JZ@zjBK_Z;E{_&)&08GgFCXx)gW6BGl3LHaApV}L4;O2MLv_caoSp2TiJe$e7Z_A_|PFvXpGCq;}!9T`@QI@Cga2y$|nbYk}Y;iCx%u+2#j&0R#p@|L2?(J`F0r#e@z79|02O#R;nbbPa zpE7U`uHL{o1;#z1WV+ca;@vFb`=;lP>Z0F*9 zH3$S!3WHBa9;MdQ({jdey>T+|RQ>-FOP3^G&gTvUz9T}!TSR_2Sdp{DwK&g;)?Jr4 zz(6vI5vDV=@h*zPYLc#&jin<^bEypke;Q^#XJOa#kgc&#$M4eF+Pg)@;)-Gr2o4^e z#zRC-O}(934*HUE-ZqKCGXyL+5jYx7OmM^dNn#WU#s&+m%-eXDHeI2QGpu=}e1Vz- z%!Vf|OTU_04Em4~{vaV8I5{X*&7Q{FnrLPe$0xYr{lpB_YMiWewnI`E(1H9-i4SUB zk>dpg&F2wSo$?^H67(Zgyb)Z(O~FaPlM?@y;CO#YtRmq!kapt}7=O*n0l7##9n5Fc z`4vV93LqetpB#bN{CyumDS#bdM7aY&wWAuW*`R&So2FkdlN?MfFlz51Ck8fy|8r}> zR8WPk@-}V#!W%)%|013+8p^?nj3u)#s~*gsnj;SM#(m$--X z{8_C$2Q=2hQ7vCkfpB>zZ)+F%e;^QGV^y^jS4mG^RmSBMBbA(;v_JrW816*5GLM)A zuiQ9xVDDJM!`d;F;`SITSgWO7sHVLMuoSQoD5Yk3YZ+ga;fhKTCRYV4MF4;pI`CqO zv+eAZ;Fn|A}X~Cj(}@Niel#WHqqndxI|nczyaEz-qTbKgclA%hdMF zoeA#SmqQIyTOb2T9jEhEi1mG9gZ&v|O5+WbwPchi*LAT@CsS4r z?l}5YJkhJf%KC$h-bSi>$WD&{oBzly^0tUXujS+A1k_tkgovdfHHEc%DnR3RQSBo_ zHH~8PmWf|m909=?`2EnAbQ<fwVnRLB!-AlIwl#exOtiqWf^~X|QyeZM($>NC7EA z)&j%i{l2~4L5ntZ>!d1>--q^Z=(eVn@Wbb$0{mtqb+3a=&;b@TZLeJ7(3SYLWmbJk zA|0?VFy8W3K5!C6_5epBvX8p9sS`ioRwU!i&zaU!(jlrF1)Xp^fwg)g*!&p+%HF|9 zSl;2~`L!KixA;Oit3$ah71s4+5)=x#Qm14>ST_RN0it=rq50F)ADd$Ec0b2^Ok>*g z6ch!CJkI1PsaxSD&>~@%xq<)WoX>aMvELZEqdVdW14r(}$i2O1;HRwGpfdu?k_2SX z#(SGe?W8z>hFY!ry&{hr!71qw((MEim@0_b_jOZ`!fP zTr=Zw4wZp5pB$)xuP&rubI{tJ{ABAPoNWsNI-R7F^U3Zfk>i=iZ6xxw21tN_Qjdm* zYe0rFhY_UQnthddqA;`}0WnM#kWYp3A@_Vlow;4=eMmoqbY^yraukX;8RxJ55JTyp zoW2}Ho+)ROC>U)>Knxwe6_oobkjBhL^H)`Jg-elYu9C3|0s#u|(wgaNkk-sr5w)GH>zTC&>tPa!( zxN_klAn7rvum_=ahNA(V&@&jL^q!bgz?bUwIKUNnJIo252cbcv!0Hd*+9#;#@KzVi zJg`3w2zVm~OEadBllL(;2w89t@LCL( zW=swzk1;j~DP|D*-!@k}Zjzi+jM>l02btE567?>;U@c^FLBOjqSOsIUIe8Bwz?OJJ z0nB5tG-FCQc|Q}woPRtwq2(+QH%>RB!AWohz=Gur5!?K$Z9H5lAVLdSG;Tj#EC045 z4HhzJ?6SiCS%8J+ut?k(U1f{(r@$NriLFOF)I(k!x}U}4#%Yfu3(<~DxSzpeoAGWM zAcqUk&}5{zNPjZSX5iR*cz}GQ3N2x=xC3-ONOokv5(bNHL~P#!1*U$vAdpwF zzq0j$G4-5uv;zP&UqK+Vu`5<#Oa;TgUQZew-SSPRzFU=Zb z|5aAUm^w~9!gOOId;lA800+YZH3C5(FJl+17mTUl{6`pT7%A<&-JcgLc(Zy!@XTlV zSHgF7K3-FIQ2z#q9tBZjSU)5*Hx|O?ON0CD=o|FH@fCFuS4c(()+-7Tir;app>JR2 zNZlS+#+6iU9d4#du#ggK($YG}&l^5!Nma3jRDq{K4P~u0ar1usbo9F$Elj3+B>AIG>GjwJp~ypo>7R0ObjFqN!`m z5rYL!h)0o9&GsCmaSSibn%ifQ-#2+Hl$a9@uPrKklBL@>URnO^Q9H&+qiop-f0o#6emlUniCAKEGiQ+#;w8j98lhSz=EQ-^hIj-=}ux|TJGh7 zjWm$#qx$o<;(JbobKAN7r%ojj=f)a5Xz$w0*)7ySB?lA8MmA{sTK(MaSDgm6wc!%T zMmCb8|B!sX2YddTD6LHe%gqPJpV%Z-Clg(OabZri!}naNBLfWN1$BYn!398x=#h*P zX~a+8w~MXSPH|Kl59OvL->dZ@>vNC*E45#NxOBGfI|4?za~9CrU2Z-&UB%?e?iqGV zSET~kVZOCj;0)YiyP)nugt62JG+Tf#gle6~h)1|aZahQJlO?jipqzPnW9pn%QyZi=26Tp8?=^G2Fw8Xw6vI&0R= zuhq3gKio2Z%d{smFLLWlLyoZE`u6=2ZP_nMqq)AJpZg2$$|5E%TC{4AJ>SFbIb^Vl zx=Mo-Tmh~*PltZ9o|2rhx+vhYroc2YQHa4(u!KbeJ}WCQO`Nt8E-4I_Ow=m^(^^@K z>yqR+rL>SVE?Fl51>we!K=J|xhKPZG)1>QC`2}R))Y>!94xeyAkX-t}QF{{BtXYF^ z+!eY7jZ3s@<9?rb!Hxw$>mst&^Vluj1x%X#?R)KczH|`w-fdy2=(63`bieC=TUZvm zdCNZ|86ch;T9dDcF4>Tpwy#N<`nDWS-~Z5&zqH&azYeRNA~)%#L0J%uSMPqt7e zr=0jD9C6=C3~FZ#Yo>|p35+)ouo*g?%9=IP6GMCvJKn4o@>1S{cWZ1ioU4y3y zNFz7`ozS@yPqauhR16z*J~z3V8_v~nYxqk93ot?cAj}{^d`60AsBZ0qliSFjW@gqp zfT*!tCl(h=M8A>^6kcZd{CB0;odOFg(bSVQultSdYwjYK{}}T6LrKbP@#<6JGJ&xx zCdC?O4AWvla~aYNntXkQjFyyHEA>f*>j9R4yvcdC@VX?-Ey@ZBY(*_!WjaXUl*+dF zN0%_Q>^7LM*l*TECO_v8S(QnZa2?#3^aI%|2)754sZ%v7B$)Pm_PQ#|Ho&a9q<;H7 z_;yl_ivj+7c1rm+8>;D>z_l&UbM~?if+nL4i;ysvO&g+7oh3R!!k>@b^dE&$mgOf3 zp{vooqAroa%RjFS)7whqJ{>5)Kfek7F3fCL&<)+F8&`PncYfpsrQ5)DT=4?@ouB&v zklNZNic*b{6{D7u`zo^YPY{Rz7}SHGKCM zd`tW~gFI;^oDbI~Jt6^Vui>%hnXR@2un0KWuw-sC^dwzELmx*1(jX4PAlx0PGl!Od zYf~?P0>Et8E-MD#4q3ZxCNexc9 zoYTcyaM4QuO;s)F5$T0A3$h_4Uf=@VgX~hduq51XMPr|F!3Ah?ZJ^|u^nkve1yRtG#L&kv>6X6Y)HBeS z2(ahF>4HAxf^cXAu#uOfhxeHlKu~@N6kM9_ghp>j06AfN5}$+8>$bL^w7pFO+QPKx zn-QoM=(T1y78K}pX15do_06z3X60aMi^pwnkTFmuaqLB zXf)shoit4tI}rwaThpd|MBjlUJ|+HgU@G zi06=x{t&tpNY|N&DWM9Cj0NIiuml~p{|JSiC7M zW7QF?3?M5=`)Y!?t?`s!;Zgg=`rB6n!j%Yt@8JI2N|=D6ZBTm8rP*JEZr`G^v+x&X zok3By9e%8AGsu-2@Sg#n?>NyS3ojc{4HnL=ySAm#_Bf>7*X-9kuI3+ zIiegblNB`AM}YjE0|AyZEDODSDPM+N0$T~FwO6xJf%Y8SIn4AfL>Sl99Zg#r5~R*} z)}kSF{Bl%ndRhRrp8B2b7lKxUQ4ivbBg#N^C-~n?E!zpcrV;xK{b-Qo3=5q^`)9m=n*;2b)9*A+ zo2Agxj#K3DM{qYNlW1c@6(eqqPTn3|LlCo_ zD$g{TB}

U?GtA<=#zc0@wb}ilSg7*Z0%GAE1AloO$-QIRXJ*+#0`WGXP4#Y-`yd&YOKvc8cTB zk#^*YKfW)}9da65M>)D?w06O8 zpx|MCI5rRu%c%AK!{cxJ=i#OfUKo5rP5J%bGBOR?UHV_-m&FqpOlL}otLsCTee#-K zqS1>$Yi6|m;$S(}ak)&(hm;23dgI%SxnXfoW^`vtL(0nYZwECdIp`KIj{f9oZF*v_ z(&YnCx$N6*oGH>hbbP;!)9aVh^S)0kdhef`B_pJ{FR zr+N)Dm}w5Wy4C&!wuNkQM2w18-R!XV9=0AT>|>{|N}trbp&ht$D}loDqL{}F2cfG= z%iaI5eJsT8bEW@TW?Gyh!INUfUTeM=@VsajRO05QO(UY(yA7sN6Y6FFdaUZCi1QEmC}y2CFAOT=G%@hZoxIwDDDq(e2=WI83s1)3Zc}N^iNp zHUQZ3v~}f7Y^VaizSbSnW)KnWLyOY;Z}TGhyq&jt42~)eZ>J3Xl+t;2$2@@op;|=H z%K6YYLnYeDz_HAK{DuTsZK>)Xo&yuBt>u3?8BP4+P(SG=jiUrK0n?vQ#>fEr!vaWB z6E;B;oB}ufkZEZ1qVU5eVfB83fMOq9Fjw|?-ICdbgwq5d?+@0`1#1D>=p6amjc58+ zqSew&D)GTU11wWLT*GhbUzgzhdfmu%{r%db0YFFs*?9jpF1c14uUY)=@wQ-zVnm45 zb4dx+y9B-!@U{ps#oG!fQpuy2w4@#IxoqISglKjac? zHS3xey_-(J{FCleIGOaHi7PFz1t7Fe+~7y{0j^oJ@PJP<><_#7@Q{V7hPxi;CAmXPbCp+Cru|J{^^Z#Y;wjy7ZxG`R_Ag&aU#X?sMPM+B-ozIjlz9VY|Ko0 z9P8OBwY}{+mQObDh_HXVE>p+2((M^bXAjw6kroN1vY8O4KA%(y|+++C4l_Bhe5>TyMHt;rlc_BM_K*UhO%N_oNX9WVo z2Pk`{Wu$2sq+a<&*dI*-e1muXc_G<-4Bl%cXeFlif$ zl$m4G5193D`RSeRTXyv30W)U;e+Zih#DWHb>T4OxPV9(C2-d7>P92JSTP zQ1Z9`l*n|NE%0Z5scDLOMp!hPqw4BD$y74JngOh> zj~n|~tJ#NoRTt~ARh@yJk}XYb_fVxrnB3J4yOE`b3N6MHsuQN4C1t_l(eTNzAK_R; zf5cQg)TzV?3iHos`MbapSC<+}=}jeyoDC_< zb{eyHs6vn*!tJR4P7N2A&>-~&48A+6fXJdaRYUROJT#*(w|-h|!>mo)Keg8-eV$bM zCAZ627u~IC7tdTK`EV_Ek!0pRKCb3trqlvxd=)eWEeH#K8C>-EEb@|)nHBhTwQi_3 zooJ(d(2tr;TbukCjSPAI03LL4SayXBw{kxCJ)C8Ia>}-q`atmCOwPOM$Xs~k4lByC zl=$+L>>S6NG@24Lqmlwq{o>*sAtd4y(zpPkRFCyg5694Tfk}wpIF$HH*2I^{j#*%J zx-Oq+PNlUnAxraNb-vLx^HC`p&a@+aQI_bNx^>2OJ08e9*}KveJE_;brpwOALb2CU z+yhcqqJ;ha)cA*8X$O`A(^CZu^fdzf!oOyHyYDi$=*9>9oyqvV2Ac7ef7O3;irwx+ zt?>f63Hpe>X?V1tVs%w9<;g|b{JI_aXKA*%FWGkkEMEvn!nm=BP75F9%X4nU`$XW^ zf=(#CRK%otcmJI4pzGO;>w5r9vuc&VPj7VjPZpyQ70HweYGP!rTxirQ{Y-!U0^+7Q#t+Wv)Nz(R4z@nM67)#`33 z8BA(}W!38bRZ$yN9LMr(VDN+wfGZAC8@ zNZ*JG76xDaC2W%G%s)1lz9IEuzgS8dLT$r0;e>U^mGa)c=nppJLv1nYxH6%L_tsut zs?37p$`fn@jQ7QPb`5WB=TTaz6IbRf;w_Z;gKaRlD!~h%`cWSN=c?E;g4sRW^+1tV zl9SExUKVbE?Rt3E8vUQPb9zNG0>6hO(6s&T`f~o6b?S0&pLiQP=rbQtng`!~1JI{? zg);Ny!gKKt=`7r^Cl+E*)wAZNHNW$U%5J6V?y5JcUC3jz<>$~es)lxp=J565H>JdB z<0>-PYQ4My7l|k5#yddf2(+gPX?cU5pU?)h_Rv3TwqZ2xd4np^8WI1p3(&U`^<}M= z_k$e0r`!U0!wZGzheF^pE7-ajn7oD@U{pj^%|m2)c?;W%NX%eRLA)3;1#`Au8wNY~Us$DI2IG z#j9b7otavRI~~%509dbP1!V+jnEL{x1_7?-LKJR^3iu8sg8(Q^z0AB}OS?M&Y6St% zlZp-Ux24VP4oN@&$WpMNbGk(Cv_U^KAO!~T_0_sVp}xd0%o#ypeR%=CkU|8wrB?@u zG7<=dzJVdF>1%M)AaMxhlZirXk;-AxmEaWm_m{}yGb(Ft>gHTLktqfKT*JRU<9*}A zL8mSqGP#_<2?2O#aUEz!W%&9g+GOG*Fk9RVBUit$RwS@0`s(SNuZSG8ytZ)uU+1N{_SDIrHBp`m43ZC|2X^9o1ZFogMkNq`Xd~|_|=o4&XS!J7yi5O&o&{DE&1sRi3|{* z)$N?8g=%CiLv*BH#H31_zN7eS#MD`Xq0coUKGo5Z2NTKOar~`PEh9UbZr6If%=R50 z2R%0z|1QUBu#=H7L-+aPUvHLtyq&tvYGs`M4XCdqbY!=Lg z?a<1$0ylR`P(Chw5l!pRDTPJ=8tR$Ud1m&PB_QHK;&vorYkJswwEc);fNiuQSboQ4 z(UL#w-rETtUF=LR)!tYzU*Fg)T^)TgY2MN?ecykr*z}_4oiz%fvyR;R3$ivY!yNwD zDTKd#9sQAJg}&-LbEE8x-6FKGx`^S;ZyY1oKon6J+k`sGMZ@gei` zrd4j>1zPJ87DFi;C?m6V61kw$!i(&{aCYLD%#t?0{LRt)!!!iX)J##dH7nQGv1Hsu9hJtcQx5R|F{M?>si zg97UDr@tu9+)m4zxeK`75_z2T zrJMN_-1Uk~z@4rvVqUpEQHDP@-%0VRNRgZIahuc?Ju5BwGIpp|M`Xa=>Pl!`4N zif=Dvl=-4TlR|37W@v`yrREzNL{Gz#%T4VfyVzfc1)-D?tq~~Sb{LSlqKlc|2Fo-1 zfonZRX&cGaZ>Rzf;s*ublCg2?o?ol8`o)2d6!$VVxhLaapQ~gWW`#`n?RtP^{AAQf zXUP$n)t$ettaEa*iAf=@nG?^4qIc0nyW4aIPa3N747UL-$R$3OJ#I6SbbYN(NZ zc#t90ekdD5DnB1wj=ddMS9qS0tI(lQnBEQP^vg%m~A_0x) zF=#pqcRetqV1Rw;B_w?euo%5*BmCIL*OVw?qtSisAO>L;31SsrcfZ>bmNm}OLIj796K5A zBAlwSB_HYk3&QHVaf=_}_sD=>LyBWTXxfU8Oy48m^=MH-Fp&P0{=@J5&*ot2#j8+I z^gx$TlX9=I82C&wQ;;0(%^pQm1l*DUvvZAz9Aoz!ew8-L4#iibj__hhQ24{oo`OQ%rSpuF?8gTID z@l9s4cEGqfcbCzs9x!i$Cg%wW#6146Q!bxKFbngnw|5IlZ@u8n>ww`MTFWD*7`8@k zM3Mef5g2e_TDTn1L?Z&|B1=F6?%}sFLi6fL?FZ1eI`jW2FJvpw$w`38Cei*s^~Jm5$<3I0{Fh zh3=b5Tf+$VO`$JmEMo<|eT?Be+{gP#n)Bvq&Qo!9h`xTXQSc?JZ@k4Lw+5N5s zxisCZ{s#lcXPxT@2;HLw>&N_^u4FJM`^wL5+{fJ`13ue4j<+pPhGz;e-uE!AlOb8s z=%^)q!zN7ywe6W-BTz>*ZhG#<;DZMsCz^3}@Nva?$T?XF$frktu`8T>3S)4+h zq>Gx(-9OXHVDtFw{rp%-pm7JH8X(}E>4nL;Emwwq01%8uKZ6m|?k zun3^$T=tDX;2yCr$DFgY2!QGg$`|^fh%|3-8C`VYPV9oDCokm#O!vHLMuByR`zsPv zlM?na7Uz(}r*6mOL&BKiI5(R0an`Hh0e4XocwX{IxKR;*I-}M&EBf%3rY5iEhZ7li z3?9iGQWEYk7aqy5MT1IOL{pA`x6_t0TBh#3HjT#FW|=~OuWDHhp(HRAToHw}C38RdkM zMgZNMcw@y+#(HkhRtioay3wi{u*epi88?DDmqN_r%X}hmi!lp@wJdf6%E%C#{r_UZ zEam{+&j1%x>oeW*-^(#)L*Wf7fz0owzOJ`q%@Mz1nr@I_k9L*LM0+CT@Mb&KyPylk zK6l>=1SDipdUy(j5el2-`i?ke0AZ)?`f$SCj~chy>zM_ibP`X(NqVwuQBGV~7Q2Qu zp9^S&a0m)bP-xDn9<>U=6Cs64_98EW|h`S`I$m%Bj$OtoT+ke_Cx@)Pu@XVh@6+H@*W5T4egH0oxJnh zLdvP(|Gs#x{xPEBPf`#8@YfydNVR5xyQN3zLDL}hyspFMOh!mHR;?v5-3P8^l3)?A z2%rM@oQrGZcMAOz7X$)AM>Os+wNnGCP_>P*c%`rSgC9b<|3jk=R`N%v%)QL;KihTP zXS!ya#dB5aSm%)Oujhv?Yg`S{hvHh|L>I@uWlX)Q3H=#yv(ZMzma?HCPB|HtZ<^AU zdZho)5U*d7B47S6Q1$-^H?5}Z5tc|$sekEj>5cROKk?gL($weK`hR-eFx&EnSP>D} z>ta%zP9O{7Pz*FsL)K6p;Odzqs(z>EPWm#*)r32|8wB5zoz#R0e9u0wsTv4c$CVX< z?(*BQZkI*ff9_d!&1bdCMuGl3q zf(yk>=&Y`i@rldtz;HS;?;{mkI&JrxV3Pa3LaotOlzHzJm5Q{nYf7V%_^or(?Mx zA|1t}a1@S`35HNuAnsGi{@KXtS(FvO!Rer8grQI>3x}Xkzltn2IyBTmCDRIB5S^JHBn|f=G5chE6Oow# zW&1lSdal{!mbJYvrmJd@zei_U@XSi?s4!*9Ay^uueYX#QqSayaEVB>?gX1`?-Y6K- z%z6^x*W`x1bmBZBd+K%biQ|JveP!}(Y?UX?4J@+293-$2o!GpEW81#!W_tFGXNfZZ zR@glRTeOJdKpgxDGw6g8O7rKDuKSF-1gO#me&zRWXj8xK>noFQ(oT8e7{UkP0br@%f|Kf^;!;RA?*81wMfx)mXS}8G(bT@3-*8aaR&LBjBneiTYL}z;gMVyeS)dJj?*SAqrw*eVaukHD%J*+t z(vL176;gx0sw`fA#wu&F1p?q0<_3(3bV8UJ3e9_B$Ps;C;Fkk%g`Xj|vSz~uj<#=` z;>nblK;Ia!cRHgwveJEtp#6O;(9Mkil$UGgGMCY1 zH={tKGE`-BU;`fy)s`jQ9u>dEwHUAsaGwdz|gzx&r}H@~?^u=MF-J%rA= zZN#OpoZs_(peG2DDddN*&<-8i^c+ep`6-BgU{KtS|cxiRaJq~AP~ z)&C&H9$j4k0V1sd`!I+dvqIs1YZ5_I5v8O^!zLSDz(5qxf?nwU>QSBi16@r8s0W_E zqyUR9C5D5wLv>h#5)Z*4I0Vhm2kGcT=#`X4$8yEjz4jk&dl> zfm{S=c^A9;C$)~DgHnv5c<&aie(#T_!R%1Z7(jWOQG=1wGZg^Xk7mGk(_1H!L8|LZ zm>usRf@dMjPaeW=cxY92ppWDBUIQG`|Llh`_1Y}1RVd3G8PbcYuS*uro^Qp;U$u)U z1jMdM@2iTtLNNeZDAy3*Fy`!F-|1TpGJC-ZE+YIR`(>HQ4lHkpt~81+`9}Ij$Pt4= zLhn^yfl#T6(+G^!7gzc7<1;8(lqm-wxb0ff_cz7)Q70;)Vr=^%Qa2O%FW;AWGdTD( z{=?grlt!oHsR+eLq2l#)8Jz|CZc&a0M`1*v%`5~cVNbSEGAGSP$vw#z_wA>^|A&Oq zw`^tR@ekow1`6fk0Ki1B^De9dw;7Vqkl;K5DXv^?t07y3-f#06yHxeeFjsE$uGj^! zynioSAaDmk$-G2JPDtm^0OxXyWUvdjOag)j`~C<`wZjyk$`gntTAF`J`_#*KI(md^1EKy=**;_c)_W{jzU@-n>!BWpx98vQ2+`5ybJ z6GKVe7lKaCA(25xOW9iAIdIB!wCJY;)Wl$_aPE{tlUe!-vBsfej8~ZG}wWo54wBvT+jG|8bAdt zdw5W6BAH6|2iqu_k$YbtL4BYvkCOj*NxC;NGXfD|6RFH1tf5H9Mg85Sy11fAs0xof zf+f7&kmUr&Kd6v@4Cz%8IE@N1Kg(4 zdM+VIO`WXqsR$zEA7(tu`qg`swofR?|Lh3bBlpBvVadbCX167 zrxOM1rtDfd^RGmHM1FYSK)`SBAu@!Fb6f)Fxq9vBbAjGBbPk6Erl!^W*c`HJ<==M_ z`C$?Z00PD7?T6$$&V>ySZD#G4e%!Ae>*xYOOY8#@`#xl(z>0sg*Qa5@T^&-K%@Su@ zpc4UXK@@9=6%DaL7ZP(vg^)FB}_7N&UjRb2TSV&wM- zdZ5d2LZE6JaL>}#RSDejh=hhjFWaOPQ?B3|f?0eX?*OoCt9~Xe&z1(;1U7zH8;MHG%xt zC>5rH3~xVVxI^?D{8$J1hkbQGS?4<^*pQEBPviTP(^a))t3!x>BVLAD^$124w!T(` zLSF}2_f|*RUnMX=-rN=_OdC>udoQ6>J=$?291~q;x(b#o*7j(PvPCizOVN%cV7t_7 zL|vIe&whMkJaLr@l@lh9XvQ(CZ_a{R-1{q_Qswn9@;EyExi)3k0YT^DP^F;Hp%uT%_SyAFp`)uZZv` zFf%WyFoNg-tgqkdxD<*whB(z{aSX651hJ44n2Jr9RHXyyz}YkA)95nHCen%6=YJpi zElLa%nFwAfK0>CtaV4Ay8PT~BWuzpUg8rFV;`fQomZKrYTAKh^K&QVpC!w!$uzgX= zocZ@>hiG#~T=L6Fe3}5|iaX=_A7Xt@%KE0#b3Icw9Xhn{Vs_AjOtRgO9M9NuG9BeA zQ}pukD=Gd=*v7glQVC`PUXB4LCBC0HI`+q-TU{!c-7btHw-BQ8D{C*;B+-mNhG-L% ziRyMK0gV5_XPERU(_}o1I!VPSgH)Ib^dwzBvOTh_sEFh4Wa)C_c}@z>K83Vreb2OE z%6sPQ`?Hw;S4>Yf!%TU>#J}Doi5tgEd59%;Wl9pJF)1-(5?33gxKmEt=}q>-HKNot zn!!$1H17zYmstr~N1GMp@1#Ul7w;Y*SwbgGbWixB*m&Cj<%{#s+-~LSJsM2!BDO`Y z6n#Z&yRulp0O!$7Xk`b0sP-N2BX*a$L5QqM>=(6Dx9~Q8exXJ@AkzCC)hwV)Vypk6 zStS4e%TVLpBexMu>_P#~c|SlO7&}ie3E|pETLbe0Gs;jic%n7$?euED3H`=aXO# z!aw{HDer$FgrO$EFf$AFaiJrGRz9>*u*d>!I22=W3u}$lYdcOeJwqbr42pvj9tCql zmPE*cC^9L+KUx8QW{Puz5^dlNzxPaF>UY3CQ6qw{81>}e4`BO?Zs2{m8^aic@0abD zihAu)v?!oVD2|DNVs&rIens`xMp$=Y$(icevhwTNe5L5xY1`MFhp9A$jD^>n9RtTa zx~j>&F^;froyeE(>6l%MzAvi4IDz>TLRNO=V9c>oCY|T~RY1vz`L}Z3K9oxNMOP4| zjyEVs5c*<}xD> zyGbywb;c#olsMHqRvvb=ixjunUM*M&M2d9VB}S~gotI8BU@yVOO;b|LWlJWTT9>5j zm{nyFUZN^_Qd@rZO(SYZH~)?lgOydbU^&@r(e9!o+r^lIzl@8qFz|DaC76WM?y`}k z{Tn+d8FGhTq*v%tr3;;ko`f6B{t0P7YLowM0%lg3#|-+{VlV>zYZDC*8VoM#Z=x-b#muB?Z*>4vof zTSIuMG7c|M72$9>RnMuf8>E~LsFVK0;L4*IOg{)4%c)14M>TbeQ(dGDm|J-<=F%m? zn{w(e&iA@d#_5JqU7W7!tXC?*Tb0-2EvhHHEvJS#SL;FvM+T(^I0MyQW%AkG=-)e; zo!qgN4g9C%81O(6(j`>gAG%!-8QsoE16_Q&0-(L5E0#`1A>ltXmERp;f4JVhjg`p? z0Q@C_=o|%= zMty#)R3ouZVF6+JpI?TjyH~Dyi^6i3v{6uEK#jH7uLEVb)$Ece)N?30OyQ~9lxUtb2bI0 zonf+YfUa}W6tEUxrs>If?B0@yX2hB|fPNHg@bUeFzT%R&$5|p7UZN_N1kd*mTEiuC z!-)_E7kxVrZoak<0hfu%gmy>G#8mkTl-MIyCZP0GSUm4on5 zQLuggLh|NBpfaY6B;Cqc&LOqpn#v1t&1joXnAAj-xb?Tn2y%iPEYcwMRsMs0qk%|j zqPV&>O)Vs0jAc#A2H?ig4xcn)%Z#Jwk`$GZ;-5BRu{E^J&VsZAw^nw>t&&Txc{N>| zboZA?AVp;q8L4B>kf_tfyOLzEj3`~pd5XTcQZw7QZP!K_ULGtL{kGdoq$@#2kbzg> z!Lxa)Kf(Ia;w3>A>g%na2)QS=*6zFW;*9`N7E*2C|W?X%KMmy)# zv@u7MrEBt7W?|#(?{0eIPN}vc03Tll) z-}<|+So-ECA=zU1oaqJXOq2u*)@9KFj9@5P&ssYtbkJj4OaoLvsn`e&t*c+dq#%X4 z=M#SO-WzhaKAi)TKqyWS{8$Xj_=_qF+;g3Tv5o!8XzJUwKSo>siF9DH#F2301`DXF zWNV@isGHQLe>YCtK=YRz$$ZBgVTxHDy8JA{LX3^HGk~VSXiDIJuU7ZbEd1UxiyI;F z8K{HJTZuMJlE&}&U3x2h#LxWwHEo(AP5n9Vi4w2;-t{&Rnl2a(jsOw5xW%+2?+}mK zottS`@G}M6Ue%vsnB#z0>VU9uonD=Wg1qI)74u7aOTtlh_9i9a$@($Iu*i6aXnwp% z#?Zo)PT9Dud(e^p@VfOIK}o?JH)ZtqWYOaA#?w6oFh09q^+zgjnMl`;mhjY)d0-9$ zvIp&53_g)1Na9d=7Bt9Zf#Z|`I0;}0() zy3PWxlrJ)3lpcv3>yKP5&W~i~_)M?IR}bQ1I*=sN1sipNg>EB(C!E4wt%m*-ob&Lz zQvTxA>&*?q6hrWcV-W?&#eRFcrmIHORrFC+EwH${f7OD(tlOeb(64kSp5A&p35+w z6OD+h%XZ6qV7{nLJTkKRiBKd-J?@aOBRFFibe-##rE0fkN`m^PP05Gp1= z4GmLccn9R2+`(Z+CmL}lH_0<-A6@m~V5;OZ9}E`S;ywXam(%x82P@ue6W590hq|O@ zwhmijflge)2J~PpYSEBy$qPLH`>KLuSu(@8-)K(Ah6WMW*W>qJ^ZGMk_bpxa;66h> z^=SZA+rYQ{)_rDr;FeG|%JfJGJyIGQXYQ>`LotvC*i*6w|A_0~QN z?hWNH|3+?vuEj~~<%^66vM#eM&KIxx5Nup}OfU&$i1rF^L%18QSgJir*-R$D5>81} zr}$S_<++x?lIM9JN>qEBaZ}Wn(01~nejgjCT0zOUr2`qFWif{CvOdkB3m0 zpp{g+ntBV7j%vyMNe$nmdE;2yCX7}T zK?nQH+Cz?l`N5p((o)^B3clEP(HuXwmo>t8I_T%%4_ zJpF$*$tOD5bth<(09D$+PyF^> zX_~Zc{f*;?v@L(wph)Qc!#T)fcIUtrH-L11!eZp+PDH|MVe7g}7wAP%-g>1MhGQ%d zS^Wya8>LXjHlGKr{bbv-mVJ`tBOSPQeFlhs({%ZeC9CZw{k~TjFep`lD>8W4ew~S0 zA_+g9Rz4)!0%bwpph<4tnPQi1X3V3YEgS2TmpM^sn!=9Hx+ zpeGy!7e+0_gM@(Swt{SP6H0sy`xOp$O(?ThPBkq_^yJq~f+PP|0eM9NJ;q5GOn6ZW z)RYTeP4FXJPOIxPM=K5u#3WaPfT|qj`G`ZKvApv!K%EpDRydT4z;`h~Q!gGKIMf$Q zy{-h7$b`cHW1r!Eu(nP79N)t2w6;+^WGps;n_s;D^6ZPrPyYQEE!L?}kgq3|Y-SJDQ5;wo{eHZ?D_e$1Z=U|pwo@$`EAjNQGn&=t62}qde zKpQGsp(n=(W884pAxHu56I(tE10Yd{%(9Z;!$w7rKKPs@(L0)1`39DjVV z|Brow>iP+#^%l!EXwrAy9S88%=LKQrq=hfmW(_nF4e4w<(LI?l9x_6;z9{u-5A%x=VYo8a*mA&v!B zoT(@so))m(JrvZq&ZMx3hx8c~fW@S@x@|y+UeGPSZU=@8*WKooJ8PtnsR zlV<9wuI0t};-R9eH6_j1;|oS>FNJDZgo00(PUQfsI9pLVJmF%+&P6n?Gc5d=hxGl~ z9Q)6@Y3PTmoJYp=3M@F^Ky2+mW{$t&`dzGo=~&sZqF9Q=8E3C8MVdmXOBAm)C~f{)EbsILIpp>WGdtxnm0YuJhIX^>3=kFd8;=) z!@V0|6&7c0fE_Xr+uK^LnSc z-b9!xqciOUY{clf+`%sJSt4NtbLZa5iOjkGZZ8{L_!bjGVUs@L>3aYs zQTnXot<=)ub?3r2ecb*RnNLPg%R-idO8m#R>P@B$i+(~*&i2;{ITy88V2X1*w&e}P z4i--FV}1qiMrsX^sYwk*=(hgXvQy39v*pN`7liqD;#~JzspY(v16FGmEJ>JI((&2F zX8|JlJAWxVB_uN?Z2tEdGXc8b)oBuQkyYuG_luq7Rmjv@fT?5lZv9)_Qs;F?b}MnF zia~PEXxmXAx~{z})4EQ9zH3$_ZdRXiEE)b+x5O5L0Nmb!Xy2D?>#|#!A{62vHX)O7iEvF;DvjCrj_8 z&pka{&9L}FCLU>Jf}1em-Z6Wtgfw~0F;5cbnAm8hn%w9h@zlw^NY(Pq08`C!4Ec`T zmE#7!A-`$oknXHaF-^irKe}TO_m1`n8auoi>(VqAO&&}eW-)EIV%sP?dr(QZb16_C z#^81ekEUvj7syGd+3dgYl4*3N$x;AVeWkO!OVM>A2YNOWHTO-WIMY2?~d3C?eg7nHZ zuU=~`L3|a0f>LFoFW$z>D_6t;4^1z^V4zMk=@)=ltai{W(bSkN-nRre&s3R=-h757 z_D<0$o!n=~gooN;1RRV#Xp)aJ&Mf^)|C6^~BYe6*H|RI>WEb;OUILWRJJ$A5D79og zkkcJY=Mk#5v5mp8cge46Y8q8QT~}W{fFnQkV2DI#&%r7v?BxJJc^$Y&>pmV->3IX! zN-F-tma~g1N;zR1pdzlV3S7e~4zY#otO^CkXCXG_i<)B?zlS}oqKb1e9O%>e+ACJF zZ%WcD3Av^D+A8L=uS?P@WSocLVY%h~Gv_q3Iqb$`D@TYkS7l+zDU@8=g9g zD+adX0`v18<>2wAehmK`REyS5j#!aypZCM2Sxn%z&-7LBHJZ6K>@E_1PgN(vIn<&v z(=M`3e=WH~DI8_ON{{v}dG@S(z)gNkHKzE^et{m9UBE6#U54-u%bTBBK6zM}Dr}&M zcii-*XGWg@2-+?V_!BgY0P6I*l8NyQoC4T^7Au~sw-Ay5Tef~@)y*e)1D--+XgBoL z#MIR`tVv-;NGZxTAUhSm(MDaFHTE}qseTf%(q}`wpPyNvD3K%rcj|`vcVqGGd*1uf z$e9^xYH%rnC=e|%s71cBH?8uarw#1*nHp2PC=8(L%gkoZbU;s0fo2*fUyd&aZkG1J2=mj@?&+ zxZn8@dK|l=d?weHb#git$Al0CaDLvc7b&34)???l6F94zUP3vemp*_3dN~zO%1X6p z7LDDEi36-m!wCybmALTtq&z&_@&)92HFX_ofOv?lNIqY+6wN>zDx|E@)2+_xN1-z6 z4IFXO;sE-lIboFn0KNV~Gv+5g?VAxNT0bAyGt=K9ncSb%QcBKQS%9fBRM4HEtnjL5 z467ZPIE<;EI|N1M9Y$4HVMZZ?8Ya(`6JwsVIjOI?WuAOdA*o1ELArJqrrxwKtN5d)VW~HL`=vYL zRR#}qG*ReE8{~U8o}p0T9X0xTQ~nE**Iw!pqgl-U$ip{<>b_|TNtvUJ^p?%6vx}xR zIpexje-Zk@XXGAWPnIhpq2sFPh$uP9mW9un>R2KWikvPa&WkKe(p~aBMXe-*e8XhG z(r;B~UwYezVNbm-9|5n9JC~@Niac{aHEl&wp+u)eQxI|?G9_A1lhLB80)0qlP}CNc z%*;>%`L-n(lETltF8GPp`KZ$#CA8_C(rELFmpvcgE87DuK_NF>#he=X*=8R8YdCn$ z5S3|&ZvCUQ9C(fF-c0u?xuoB6*#1&1K&pT5zlcOVpvQx!2 zWe=MPPbvkP%~88yyvUbgxq*ToK{TyFqx`kni8GGSKx7Bzs|Llz*!&Mo4Z#7NqZIB3w9}u;sMPTa9SQCJnUd7nVicA z3l}*v`u8UPS3q8VDO)x=w^(CXj$*Dd6nDSM9kTiuaW3Dvkj1a~cXwZr;JvR?cJy_+ zhhuL7k>y|~eJMR>P8DtZo2BC+7Z;WZ2&7e9dS)hcBlc*8*i1lpcDv_XM;U=Qqp8u|h?c?~&yK{91Ic^NI}>1hn( zVV<6UPSj-AG2eRiIYNNp-%$yRa!n5+G8F*A63V|?xA@=PV4>;uJ3j>w>iB~lfj=4) zcB>BMHnMLbRg|-nh?O44#|PZ9SsZQ~^^@i4(eI(!!8vlM+)+k)hS2p^adr78EPv%H zyzoOzHdPz!`7&LgFuKyrf0sQ?sUotg+vC0HoG^Cnof{=8t}TrK#9iBIAtv{#id&Rx zIuVko-k==3edUrY9DfZx*+E1Avri?QnQjEJ_}P4L=%x`UmYaeUf}W;S1$n0e$8T{? z5y|praU(Ebs?MvqM&+6&l$-650{>DPAIv%73cAEe1i$h!SMD||bOt-W9cQKvmoRb5 z%xLI?O_zsH{vFk(yCu{pRO5_tV{Y`8sHQTnzb=`WsT0tU80a(fr&ZUQC~$XO+R0dkmMAx3mlwON#Fx{+lYZ=#dsPmUs1dKe$Ra&)5K z0Jl0>rz+f2wz$w>EI~c5sbK@Ldk=It95W{ol^em?|edJoCQpD zdFTya$%vgr)XLinub%C}fUe44i=;Jva}m(Dq$r&qvDaK0K|XQbQLTa z&>FQyS)XbnU#CV#<}oxzWVD%ji4mN~iG-Fs+bwYWdQ{c7MuQuo4w498kIScy(20{W zl14hms91BB%*oy_6a(ZB17Z)w8RwZZq&c0b|1bghq90T5_K^=PRAi=c=Wb$e&9jM*8| zV`^ygIaak`*dLu?etw!zi90_}bU|lqkN^_{zC@V=WjWs*?2!`t5vw5j(y{zIX^1~U z-Lys{B>>*G(CT{OVHi*vrg0Q%eq(wwsC7$EK2{a@I4JB+gZMRTI8A7ezt_`gzTW#w z;qqcXK95TtlLa?l^qDFc;K7Gz7TPqPCRdg?(qUwMr>d}OcFvYngbr{8-Lb;`5$dkB zNK8JZB|pz(UQLCXqElPQdT%ho-?0134fgzU@Jd7CC7%et2r2NnW5OHQ56W`9ZgHWk zyenzJ{s?u>I(VDZ_W0p}Ls@w36Pim^-@~SWu3%Mh3C!V;u(%kH_$u@{nh+|n{8$%) zfUK%BR(bv~bOx{}9c@VFC47X{ zK(o@JPL6>LatSV#fR=-Oe=w0(jPQ#=S)U7*1^D4Bmd>_9MR+ST%2tlr4dp}(!IDdLXMjmtuaS9q<`brl zD?nCs`Ks;D!J&)cSR*9wIhC!AodNgnT79BCRYBHTtV*7LlO;j@q4ARxTl!+k20<*;V#GO`nXl>hRj%aWY3%Jqk+ z{npu$Ab^i5ZY3t436GI#1d*pO^)k9|2|32xtIuG_Nj!ANF5U_4br@e12BKDWNw;r zQ&S>WB#hL0Fx)HcOUkc&%#}+YE0ltr-*%a)!y_S4;bBN|cD1=?7%W?b-dB9aE>+!F zXw02$SM0p1kbf`VM}9*h?|g$2$vliQxrf6rM2*Yb=>^B-U{Z&HmF9hjoivmar|xG9-DahVWxjMq)0D%<{Y+gc9RpH zzj7B*F!+pIX;#jn9J=lDDRzZj{;Bqc{lq05S4D^M^b7pRUr=tf0R3ejZfh{ytN@DQ=*X+NuosSDKctQC2WRcjhj_-Ej*AwzHJDG zGB5qD-wGTjoReay=7cu6QyQJUV!I~;eC73kN>GS~4NR$#pKd1MSHgjFhA5Mfs*2iN zW6EsXRyJ37A3JSY+xg*_!AvCM9aN+){mQ9ex~R!rPX=bCh-^tjHcY?71mh{Qvp zGGNx7jn9R3iW%a}&;bRoc?CuBjVsIb`^gK>)@2SG30EowYUL=)cHz}doPLA^_TZmO z$(mk!`}-9YX};`p)gKayuxs+cB9^AyaTO2||6HXuDyvO_tgRNAJSxqmwY>&Z6D`4( z?<|X=q1Y$K{-KjUm0$yKa7W%=wO-gK-(I*=ZWL}#+aj2jM-RgtuQX(7sI1j;zalP(KL-~Tm4c)!%z`Y)!fFeWNefhDgkUI!Dv-VEU75lh z0boyH_P=#5U*)Y{f6!Y$5XAaO?}zKl_j*5Ezr|ZBb*FpFJpBGA*PWqrjj}b3WUg5X z!0rh?;QQb!ChVQ0uTN)|kKmyFGK?&9@>^p5&XcRMJl_eIN~Z5WL8)?j{_1tCPso@m zTWix&8>`HA6qC@ByxH=c%BBD%bH#Qd7vKxp<|4_mjh8iJkraSBYp)@`$?}cCtm3!q zV%Ch}!0)r0%3|2g0@lbfrRI|NDHTyu;0y1o3z!O#+Y)H@?N)RiFD^SzxjgN28=4{uqLADtXULWp^Zq$oXE zMvbZn@ZOZ*(ZI+}`a8`0IiirhAnEm2JIXb$|; zz(hGQu)qjN;q5p#U13Rm%4sA~PPffLp}JmJ>N2(~?@X;LDSBh%f=J#UC#{9)Dq4o9 zM8f>B<4UMtGe=DZWThn961TkmT1ho~uJTiCj_v4Am-5SYX1-#kctL8CTCk1xbPS5IdcePyj%{9(Agxqj@h3{Cn?!-#=yLNWh^z=yO7+};K?$|)-;gW+4x~_ zf{*jP@g(-i`}E0c<#((tDEBHuZX#V1?ZRUQ&+tG7b(t6Go7C|z@iOxDZ}nh$AmJl&6f z(H+L*jnu#fu1qXIeVeC2%XB-kVuI1d1x@sCk<#E}Ho7pkSxco)z%@qOb#A+0K$ zDWV{z`+r)DO7trvxBl(PFv`}PBr_6p0KJ8AzDFZ+jJtWX1}OzoAO*JMYhSRM|9C3I z5%eyI?v+ZbCK)|b=rz>&Og-4oM;Uq!p+0_^V4&>bxuMyCeEM&zqVUe&q2eWh7x%nE zq$$C1H5?d&q3;)4vdU>2AYU|`sOJT;nqnN6z&S)zf{`ATO+R?Tr>Zx?AL|#gl-zce zre+C}ZYd2yynBkD3g-2x zK&-UvG@hY9UD^Puwt;QDuWM$y>Sgt5uZo!~r|=vC8844>0GPV0;mpviKpwrzsxX|p zoq>2sgbRBfA=HF&Tn6VjaNvG~pA^%Z0L#WJM%W({11r?u3bnF&RpT_R`f>MIR&i9p zq8F7f?fDm>CcnOZ&jvCeK>AY|SzA5+Bb5{hJ|7@ze(V7nPvk2#vIlz~8CUo9qUwyEvpu;-QNY_) zrD7@Cu>@@8-j(CEA!yk1u*h+l3o2WjBkgzN>AwcbUe*Ps1aj&1R_R3>bU}f*=g>p* z94Ep2%SB~F*C!UlPTGagGTlm-*Q&HC@LK}0IGuMB?eyP)Lz=|~1u@;SF&wT^YV~{T zbY(540y6@6^meQKVgNb_@a{O&IN7scojnJd;>cEH!3MU0KTP=8g{v{8$_6xmzL0#g zRW(^;Yub=Wo_}&SqqHQ?{nYdU3zIu9K<8X43D|pB-}#$(*=n z2;Tgr+^@*$om>*9#Gt5rBYX)aV9C13vC&gRR8w2v&Mf^`AnlLC3;)T zf*9Vhb5?F@M@5K9BO!QOYzZA~Q*&UZEq%KfXDr4LFYxm$!+$W4^7sv#ns1sF-jXg$ z*Rhjd>`YDVPF`ji8e<}^^7MxIyDC? zFpUFI^R2!D2Qv1rZ=VRt9^bBu?ndzD0WF&!;>5+hR`?E5D8OYX?a)vw)os2%D-(!i zZH^29OOqqnS16P-+2O<`Q6EEF(*jTd#W33+0U?`21kaulartSA8_!5}s{(399G{bV zum^-tkWbHTN_?0qj0L-6qeo<>cZOM~j?8(T-eBVhu<#T%fEp33zPb$Ea{UL+H4etxPqtPHtw= zF1fGLq#&a>m(B7zzvP07~Zv@^(lSG!FQG89==Cl_m(jr;^pWi z=iV}wNqafYJ#tay2^mL58b7T|Dka*RSXtxCGaQ#nr8&0x;M>L-u(dF=WUt+L@t)~_ z`@C%?q=||Q8DQZ5v1IE4PIabhck6#PxFPvi`h$N;qY^VY`;vG&z=1={*1<7khNKG| z@egUp2ZoKQZRJTXW0gWFzPCB8h#N} z2C)NY2RnI#5m)b8Ql^viY({j}>jVl$0^MOaAg=DsMGi=y+X4q9(0zg#mqdHk53w~y zZwSaok>qldh35^IiQAU9Ouc8h3jX^0%R1$`Tm%0HY?rayN^HuWN|pBf>vNFn4e(*q z06He$vr3igzLD}vCFviqVs%bTMLmcJXA0ZUKQ&O)|;+Em+qTi>I& zL0e`2UF+dSMI*Fld}L^|aDM;%?U`bEK5i}B1cpR*2eV!KU4@b0NnDn#M;a>{;q6Va zFr{$KW(H<0W^bolYNxa(F|U`jQ?Qc=v}Fov@vP{NYo7m>a;clznsP2+=4sj`!d_6z zHD7BUNwMmuw_UewfOklDK);Dp*3hyTjEIbG&RW#Jh{-cG*md@Lq_MaW_Pcos1NTck-A3Axxr5kPK=L&H*(Ta1kR}ikzN=0jS+R*l z6QWh0cdb}ALl7YdXxgxjz*t&q zv2$z%*2~bro$7;Lm43Cuco@!5tGfjm_)7NbOgirSxBq4~;wqO3M|=3U7AaH0(YcL~ z?d+7sH(T$P0;Ap(j?!?U@jjoENB7=plpE~7Cjoz<8PCGy+r1K#0E zOr(mu-S&aWF{a3Ox?>m}QHEI^N%SB8%7rs9diC?i|DSy^W+iemtzxO-PHB(i1E(N8 zSFgR!`Xn?9MV}VI$Q$bw{QtlND4zJ-WcOfJIdS>PgL!JT@)rQa4X9O<+~k z_el@VGtC34UYL!sbi_Y^C9>!JAKu}Gm>Bi@t6%P?z(j2Ri{KwFU-3o48EsG;*$`fV zSzFXz+wR*Z0TRGsDfSwUdG&JFc5pjDgt(A48q+27NRJ*B7!HXctr$ zco<9496!NyU;cOkn}%OOzkq43B`7ZV*a)o*?kGbB7+|BvsV#_*lr8;k=qZe$ zPqXd`yTC_~2l?d%HU{~3mZ$&QkuyKs?M|mTP}td)wkyZN+baOv zZ^mBUr%wSLfr@?Bw=pp6d4(!bi3r%vQS4Y$aLyzKngO)LU_4rjvcbkcnLth^bv0J< z{UwLckm1|6NgDj`Z}$)RA^ZN7rixRU4;XUs1~G8nrs6CNv!hbJn9rmOUE@xZOPIf2t*>);lY`B)-IyGCqmdi_Kgx zZKO4Q@5_VPq|kfaW|MrvWk-<--MV$Y%dsLVa0;52Lh<5wW+~&Hc-57XOtHhz#%qHI z;SL_PMO_42hE9SrhJ1vAhsHkSUrMatUXojoodHFOqnH_tC*s)>JhT75Et|XHYMwz0 z{&7~Myql$w2^;y?1<%wwCS!zCWc1+=?TQV|6N556r?hdbcxGY*ln^b8?TR&M-T9r^ z)L#)Tj38qU5P1nzi$8lJzU+A@adWtg2_S_iMfpchn+JRmVx&*fw?Th~v_v0Y&@bX2 z2`C^bBqK-}X_MSQKanCHEx^Ljmo8ZsAlur_l6d5IX_7dJd57^{+%HyuQ!~7oe%*PV z84GflTr;jS^z-`Ru_B(vMjeV>npfRRtUi0lv)DJN41Rg3F;)tAd}z4oO?8YWQY(_q zf)Wp6T0>LuX~bK^z}wj>QL&>?Kw}D-2umCtRxwD1x;D$$#xS_C`ye}evvA<<2en73 zI^S8G(*qR1fLiF9m6gw>QY=>lDMr>)`YEEX@&p{;=l#R6Fzv%W`+~*zhxLbd3ziTb zSxXOy5!9N+?xPv{()Jkl02~AkaQ0wf(2aFm4Wm507TyP(|=UYAf!o?m0pvHAkBd@2J~ zI`_kzWIQ_-Z=dZvd)!x{tp&8_s|XVE`y__e&(?)k5MU@Aw4+)-KP@4E2K#^&NW!6^c%U_w^g}C5z3+(Qz{|KZPHf zX)~zMD_ST1%WOB=#9gzHj&Ki)QN*D4Y(AajJDoT8*F^n-)pR;-J{n`_Ti{-OYy$i0 zRwK?p(`i?-{K}kXpXq#X%UwUgJTuKO{^zSqt6_|ZH#bEwy{7_hyVrE&_z`KMIFVWQ zMTdyc%{ z!``*OkQKq>HZYuA7G#BP2e#k9qF_|`9#ZySm>549k2c#(Ptr-?CCCqCg7t9b06usI z(4IQMModPa)i#rp?o5@C9N?pR*n5CD$Z=7u5c8Y#Lkn%>lRHCffkmohA*U~T_%s_c z8H3i_{G4njjpJ*Y=!#Wi?EW#7=WYm5MYD2cLi=|&DN&oqH-%`V;!+WPypIwC0J?s@ zn5k8H{a#=?z4+I7Houg6#V4s@n^!VAX)AzO*PVP)b!j!dPdvvlL@J{toOXJM5>y#f zf^yw&8fj%|C0!%Fj5I_5Tc;;o#s4~9DUUuZ{>QIE-2Rn}TGU{D)QAyC=?;ZNtjgJy zm&)lgebJK|N9BHqiSK&dl&~tSBW&dIr6rUilkWxKp{rzgRqgB`C8!ds1izJK#mZyl z&I?NVESV}tX|;( zw&!^zlg6%&E)}P6iZV#pUtAD~NA6A`%8j-si!UuYRYlIi)ztyijB3@jzLlN!tOa@| zu~oWV7qEcT2A zT1L}K-7^f;ygOylb633O+W~>{e&8fyeHjk0=Qo<$@Q2~!b5K;VQK~7m6~@XhWdG*o z2Jds1O;0-*eg{ahM2gIH=^W9VQ*e{;%H$w;xbM#p&N?hA%&(CaU!au274I0+!{>Er ztpv-ml3r^4iRj@Ve7m|U&9++*b07PVEV`vhYGl_MJ*?;yj|p=Gu7l?bDVD?nr`R0>mf00kzmP*9*{S9y%K{i$`vlHuhkNzg{#k1kkOyj}^PE1A<3Lu2EM! z1!B-rVxG}i<*cU5jZm&wF}g~g=E1WkHW?9BpLR>$ZXG5cFt!S(=5nK>&Ftc`T=w{6 zxIp!gO(C256|X(N-^?Tf_MuyAzYZ9;up(NMhekA8f;sET=NPRsHIWE^s?g%!fbo%- zQt#RD-1h;s6SkmOZh1#YD)(#bofTQkbAhSWCRe z%gs3W$4m6JCO#gf(Nv%ne8pXq(-h%23%r?1`3E$BBLJm?cn}W4L1?IZrBc?=WN)=X zUB*ay(?Pi2xWL5RI`-QNC|eBB*Hl!wbF?SbyvAA=0H8Aw%9k%>t*;ufXI|I;5Jxyb z-(;v#=VczyywX}7ptJ8yn1rbHX%qJ1Js!2~Hbfz7+p9SWXln2;O-6p{G*+;3HGZ@i zIAV&T`QI~hFTKdIna01d-;|l`z#RpMDhp|3U!HVCbfhBSWlH)Z(kAK@GYegbQiaZ8 z9*ud4wKTwelK0qn1Q9pfO4pif?K!a#A&k=L1S&$6sZ^w^vx9uMDV9bt(HSI@0Qe!U`Qmt@|>Uy z2|I)x5Wjs0&G!h#S5l93A0P6|ZP3(BXnk2)D_P2~Sd<9BUKdhWIX5X0rQ&x!iL`MgpbJV*ua?a4!{flgvizR`vnziqqL%Zd3nKSgWyKEJ z9s^AVSsE%?h@RBoiZUTE*(+D8iO$sc`dS?GY{0Sg4|I$``NE?V6e3@09C?}MLWXXplQvqki!6e zoVVb>mvpcxn1U!H68;mNff7r}f*lsO(X{fI?(pE9j+)FyZIZM%g)ystMUIWo$)SXLxpSJO)Ked>3jv^4L-H&$wQw)&LgNvc7g7->9GIh!QqQ*G z>bo%?lDF-3lU{sN+s&8$wN56A+I^cac@$8mjK*)17XQY6!%cQzB$}H7?i^6h^~0qh z9*j(%?XsrwsziF||~@^+@E7K{pU z;gv~2+aZS3jx_s#UuO`9T~MCd;CCWm?xGZ5N_V9P_=peQ0H$u6)t7hkC|9mKkZ>tK zM_m&+vY*PI8A9ez&-8F*NEovBtB_eZPYjjPdnKS@aWfP0Vk|6esXpd-9UQH-L#xEf zmaJu3Fh_Q2h&h>Md2=n0+z}M|YpEjewhSgs;B$cf$uMWiR~4)fSRFRPKg6a-7_bcm zA`Ggd>)+~_CbN|~%ZIQ~_}FoO>onAfmT#1!Zpysq*E+?ZQ(cWn7wW_HCi$Scjo%s> zRbmuoRAjN)-&Ka4`}8JZm1i4EtCC$pl_vn*3sjrjIm#vVTsvI2he0}?w}rQZ{C)?J z5{4~Gcxca6)_k zg>W!~RZT1NPLFv-cmNB~gm>IYcpMR16UZfyxZYZ61l8vr+jzY5Fgig ziy{RsDM`}5pYbDfpI4sqO-MaDO(~h?s33j98XE12n)zR1`Za3_sB2AFvS2UR9T_`v z-S3n2cCn$lo5)*+ZX|L8uWgR9+C-Q9T3xI<*!E{Jv2_hub9b$}dgSvkO?RA9OhCfr z^r$&Ot>YU^S{MIWu2X)9Cl}vtNjOif{FW9>zo|%ZCcU$6NKhwx6GfKa zkB;WiDT}UHvCB6D0%ccVC1ZUNuHlwnZEnKvhxg7wQ5K_6lWHd$%fFDl8=LFA8-F*8 z+QIN{aFZoM^j-U8vqYU76B**dEt7%PLw$cjaPcsX`TWE$lLnuJ#K(eA%ZlAb_3(MO zwMK$vQAtmdFS^(8756n8Qx|UQi=r;=RxURd5iatDX1f$iVjJ0Z_X|*=!ZXACcwM+i z12^3$Ti@|$^TV&$x|wXe9jDPXz=}SjWqWxP3M-98!%+mpK!)aX^mbyIL#&a{)pa$g z)!l1Tq>re;%ZVNP6*Z*2$U8v2nFgz3nP5$rYjAF&4xwB26^hJ=H{rI(Y*U?81Y}`Y zr@@r~@R?8M>@~p3e$AGByR@jR-_VwPoX99MtGGOu6&3mXsR6la?cY$H^8H$J`ptE~ z*xjlYM8WCORN;>!uUI(h z1u{Y-i}(z4;r)e3Ot};u4w6c-6iT5K>q81s%e~aJVlVU}hMsamwy5P0EnYOZ~2H#1|wH-y`$ohTW#Z(vT zAO2PQm$MzGy8Iul;Wmj5|BB=u(1Gyf~35$kA1P$ zF^nv8C-}xb^hCa1mrA_%{!6LSJ9n7hM>0G{nX`OHi9R#GU7q*HUnP6R4k8bjRue>K zdg~Y=GHfde1EBuaYlv@@e08wrFC~A%ZY@t_yWcLVT&=t0Jp|Jj21fPs;tsO!Rq0q= z;WX^0@lukTgb7Dlhrwf;D;ZPX*j6vCn}pnP--{3g3Uo>|86nCjM&Nzu1M72S=GKY*TBa2Q}a^y_r<11%r!9LTl zgD#TIjb%_s$1rqk^V<*OJ>I%1J9r=xD6Q5Auwofj@thgAOPB;O7QU>EKmNPpNB3k>K-wg5|SRPhk~k z=q1XL>!Q?c3e)a9kum(B3R>H*L$jSZ!IteTEq3BNLmnUVyH4sV{67yZWb=)G?CW*b zAZ$o6D)sz9wvDG#aX1S#HntX0wZ!Ou8iz#V-uF9ruG{(KAYUMb#w;W4Qir74sn|(7 znb{3teAt$P?7Dtb-pEQSn+&f(>wwDaiROvsIUFPa$692lzp^R{wqT}z`cl+kKwZ49I|dx04)=vR!$x{k=H2|SPgQS}H-Cs^5tXK9Z(b>$ z#a+4Bld)gx;%Y}4RlltZ{&-0(Q1uL>ej*!Qxx;Z95B`MRCgiMx7@r<|TYWzvy{}Oz ziZZdME*>2V&ATaAh_?A8cUyq85k36&pC!3^sN*s?PgJ(UVR^&mut@^whs#f0{ADEV z+AVeYN#^Yilnm^~;Njc5mSmCfj`Lvy1o){ROXc*B1fwA{QRQZXpKDL*-q17FBGy`9 z6#;BP6l;kRwb?1t4K-cjj-ZXQl@6(18wWoVB=uc^T6x)7yu>9mr~y=M1F!INT}#sq zuc+_#(#=vigA)=&x%-P#7xzzx_T6$9LOc5;xRb#;fFkVaL=a0*x-_>X4<1MaN~?Pb zuwuN{h5a!xu%gM)VHzROY8-d!;wNq}Ww+85tL;1qtsmwFCDNW(4;|`g@f@V`xLomb z8U67~-Q&Km7gfvNNC{B;f+C_G-l~LcB;fFWUF)8Kj>WG%4WJ%)zoUAPRv+TH5Dw_9 zLAX6-ky6iJ#Kv}QcBKb3vG^fA*S4mNvAFzA5J@Wi(Q_Q zIlGta0myDt3~wtTS!5zLPHr&A^+_6MSHtB2d*;xpVStMQHriKOAV7tfX^BA{20VK4 zo5|3+Tjq+;ww)AgP$O1C*oCVxrOF00fZow>&*W7! z*jfDeXV8_iZu`hR^QAO5HA6tUhq1;Qs2$%0zbv=+WMO52)*SXba7(sFk+mAg8i>673ZBVvV#ds-#xu>1|XFJZa6t_5BJ{<{AFko3xg>W(y=pazO5 z-cONCZX^?lwAXpWm2&NOke78+k!J~~CB=t-WXk!05=BsupzF>;ea_jWRxY)bkY<54w8EK)U<+3A+N_G{7OIwT$qG>` z9kddCJj^e$5}zTL3iwT1m^)1n2UXa>TfD!sFx_%sea=@YQZ70r1QWplK%9W_WH$w$ zI}8_=81~x-%w;2F{_n6IalI^9v&>XC?23tj(VO#WEfhEp#s(FvYrh?$*F3%p`6v4<``hEE*x3&^(zRjmgO>N;=sdxGl0oi08#C@l{9n;BFOY^U){RK4P<0cm==KQYvf z-J;m?9vJOu3)PGS5Z9cvF8SHY{K7u``GI%lQXYf7t|X@fmD*EmD@Rub^*-$%7tC|I znuV9e0_dDGs(yvwx}Pao6P%`rap$E9rpba39N{(51AhlsC?xB7Mva zjmffhf5Ru-U|I-Zv-D(DK&3s)wt7@`KvO$)FTCca3gt zPUN^n76U1_r;;%XTgxYNL(O)nZLuR28Xg}jh|IdM?Z^HP&Rj4%#Ell3L8Zz{1cdkv03&Y1%>hItC2R1{ro`Zn4uvPeBaV-RAy-#7x zeM+=C>v`K_<0lpJXTx(<{>JH&>F>_n{RTdUU-WFV5So&nhZ3~nJD0I(pax`=@D?@| zlX>rNQ2kT0wAH6#_4i%mPyFSMNywjp^d$MhpGnv5}EH;QY3Iu(<6a32jynV|ij2{Q%k`oAYIS_57Th;Sjmo!hfREPdr+p2g6d&M<2^w-*! z9(YY$K|)(=TUCIO;-%E*`|)&=51qq=N-R%`dDWmMoD-ZM3FWAmj~Zqs#Wi4JC6&YC zk8=R{a0i!`CWh07d5Zinm{n!m*bMF zaz|e_9Xy7jql~K8n^+GvR!YTD_^rlz&*6au7~IDed=GdA_=54W2=dB*=24&-$O|7} z`<{UWAo50F0XmsM&v_*1S)fj8zs|15Et4Mz`Wr%l>m7$h=$bvB<1m|0=yw;XivV`% zYqp6?sE2mqO}dtSaloyEPF!&&D0Hl;ibn1hcroAVbt@AY1ogJyboTemw$&Dn3@=jbfXqADxyZR=-| zMR?hevhmn$yo%2bvkgtosHv7h2Ye0@j`zLdYE3~^t- zead}ZUidpT2}Cy&e5=~Qwx&-1nB}^j>P1CT*KDahp}DAR4WE(N)vv=+i0Q2GHLS4_ z+5YTo9_gtu_$lwS6v$)%FMWu>>lC~de@A2SIBXsU%%-KuHzSSsExH=tf;sa{T53KX zbp%?7xp+Jch5t`G-FFvf;SG=Qj5Cy`zK3`fP6O_waY~i4fE>+X0!{3@fn)d#@GlQl zF3%T6-HPv`@tjM!NuOqLyr*M0~6*J^ViaO_PY;z7@mJ0bt{}*;32%;!pGlU^8W_rR^l*KS@aaxgF@LO zb~-$nnTg-1>HCeGM)cWlaw5R0HtK(wYq_=O)K!1~(@@LO*9iRNN$h~7wQucd_MHFS zOHJ;MBaFw*S$xveu8Ydk(`h+E;f{&aUsFHDNZEMdrFb01lNqD(e#)Ak*VJ)P#0FaP zz8B?nUsY9Wq5$W%N7eX?vStL(I~RW(Z(YW-R7a0M95C>N9<}DwZ-D(xD7%k(7Cy{O zJFXROXg(B7#IHphPGni*aDu;|`F*x$kHzzEp zwETzd>+nxz#_X=KU)>LycGRx0JMAh8ozMwpG(RN!kgjEMXK0Yi=4OJLc+{@2yX-0o z?a<{#c};%rm;ha(?*=v6sNHIJ6afnD&;dnCI&CO~xLqU^XJXWDwHpagXoE%-`R>TG z^j$bBUo@ns-D*n+P-q8<7sVU76SxNFMB{+kt#&g33hmIWit-uirA9&@O6(^nOG24A9oywcg{UAA zCt-Z(WYU~WY4v8_*3TrL<)fSHe(~4&?8edrCg3Sv(vRJsFBsIS;J&b!lriuHv$@y* zV|aNlGi-WJDHv&j%|HO5m6uv_?;NaJ%~n~q8Hkw_#@$uc%rrFbsU|1$CUdYU9e#&y z9ZR*;CZ2Bzz08`OBrlqm-aUmPN)sDO>Yc0Ju11r|G^_C{dd>PW^0n9qbT?9Q_ernP( zgHRR4NDD%OGpI-sHKw-F8MVF(?Sc+c5or(-oGz!bRis2CQ~T)4)pL{RBvenur$H#- zOn!o@Qw<$b57yB-R7?e>LFg||9q23zey73L1wdyulOz#Uq!#Hs^*|M^LIu>3v>^1I zQw2KjZG}UsPp#5%uVQ~o85NdRL@LIJlQbl?PM50H?PxnxP8~}NLW0w7-2B6^^iFXJ zEx}UEPMi|p@Bio}T;Pi27Y82f8}{ajaJ()6!87kf1esNut6M*Hj}9e9I6-Z*n|PZ; zck-bkFGHg7QIZGj36F+bR@5SfmKxR2-aYA#{)6jpDbPG%P6$1J?2Sox_8}!lAj|Mk z*aP?Vp73RG%Q7lN+mcYV)803;qx&u-U}m>J+>&FEl~Vt}0$(ZVhEYgV%K$ZMn!5ut zu0J{~d+lM0nvpOW^Z*BMZVDH_~(nU>V z+;=y>Arb7m^YG5aJ5`2B4DzSH{Oa-1oV`YINZd$gha8}@q^Wg_^ooMt7sm7-eWL^w zt697(r@C+!AaaZPkO?kr3c^~&WtuMF3Ve^4LTpKGr?^SEnY=9U``nl_`dS1PD_Xq5 zPIcqLW)Twt5N(U8XejkjhFsZ6{iOxEi$+^dG67~tY0Fvo%Kyqq1sCezu)(KWc1Yv zD*i}XDo<&gatbezAUB$;Ib+-b1Uk!_s9T6vDEywroY6N_P_c~3%Y3R6XP%-;2#|}J z8;MGNUX#s^%W5o)t%?SfBCqW={DPQk3dG=YtgQ$BLa2soJbS&8Yv|xq>tE=qTOv$U$}|a2*IfZ} zGs3jT`Y zTP7<`^9fbZ!*h3PN$sMm)I;59H&jhUrwO5e)9r$qQak93THAqkK$TQfnh^TP>1Ydq z)TKY3K-*lvW`WaHauOrIzSCb$@~;P!ScFCWMy4NxB>y zrP|bl4ygw!Xay>zLeh-TTu!C?Q@w`P>S~;ti884X-Am0?sDkn+zceGX6Gs6l#qYbR zD`m07yzqCJ%VW`pTdtC=>K+ML1*m7!nWz#{;|}h!?@l?pycf{Z-7Lwm61W+Lh69x5P>_4>Xkr= z^E0nNM5qMT3eS9m5Rq1&jIcAQJF0>-a#pVds*(7DoL^VdD@g>x zNZa1PpP0l8c-gz@6qJS-Ikh(g%80*b)_w{()9buGaHF8VZ_HVjZsb<%5E~d#q)Sq&VQ=@s(MO35F2M?aRnKP?i&O$|dUY=M&H%lkbGRpoI~~~ZMh+zM7qiQL z0}#<7@k<@4e_%!6qCoKL!ST__WK4kRjCwJbS|ofw7A2(UNT3uaPv0=k!Y1< z0#J9SCD{NOaYueHnWILyBcl^_S1M#3puV3@LP?0m9VYjZKDDqVE+^H%TEu?@8Vqo3vS6S=z1>to8QH21s2?rwb1!o#5Ou`&qWpsG<>J!r)w3`% z$bhPKB4?Dt!87xW($~8a>f`VBg^?skE-5yvVWDJzfuzQXlwJ%6+yUt1m%EHsfX?~C zNEC2tYt70l_&x@xi_`yhJm%>(qnVTW{>T#qqLNaxIu?@*G$3mO>Ggwd19a-ET?zIA zeLu4)1nCv!W=$-D3^8EpoM@RfaOjM?DSI+hAXcU1N9(DJ^5PCaqppcs!C@@}`Rlm` zo`CnMYi$Ad_1XxXpf91V4zOD`fd>$s!CTt^4)6^E9;_F>f*_G0c;O5uO6D#m+3Q_K zdzY+jh5^+z{x&{GqC;T1)(QIOCeW-*883G_{j&;h{3>-T$6)~9g;kTP!tLItTN85o zY8Bh?^VE}EhvoJl1Dfo2TA3u)8m(Qo3U8cE1vuTdigo-k)#voQD!|)0=duTw5*Qlr zD-e=Pe0XKF?pNGZipY{Ovd^|!N$s@^;I$k(lIt{rkL(E2mXpNRoym|RO85cTcm!$_ zW*~!v7Pvy?|3nAsqPz?>E6;_)cBd;Wd`W8$not&e39LMjEM#?l6_&OH|Ba9npz;Fj zuqNQt1@I3z+$>jY!T;+~0<>>=SC>>(nzb524U|nzbQuZT0OvU2+B#8DZ@k>V^KtST zL-DPLfpefhiil)u=SV96dSmzv3~WsO(&PjGr>MTJ?58e*Vm z8kAWLhs?N{vSQe*${_;Wk~)S=Czpuz*3hz3-ZUToC#VF{$||#V14f4C@f(~NnM>f9 z*#)LNXAnyem2~#Y4VpelrImh8f*&?RSxorH_mDG@?_@Kv-Wr;}3E|wWWCO;&@>!*L z=(1#X;Gs#YE+_>J?QBB5pvvV3WCJb3tMzJx?!*{ZKB*MVl*kS^lrj4dlGiZEO6qas z5wq@99y^Va;n`C5igcIzq^)=(#=rJ?Wx|Wgx$NMBd25=XeoZHvK(T!J5oL@FpBWz+ zc8qrEqe{WhrHSl-!^t8iUtHfN7uCyM`29&4o);GWe!ES>XgE$;Bia)@RBx|@a&9PC68$Et=f zca5TJir!WwQ`oLIP)>Xx zroZMt!~D$uX+f2>iC>qH-51h^&t@vni5JhKvH(NanoFPT6FD*#$^2t(32=K>*H*;(|xkS`n|J6V%n7=vqcw57K6dE?Wh)FB22I}eQ5N6RFD zwp_}e!~dvoow_)PSE5H#SSAqjT&2K=669D(;zxa(bLqu=?~a7TIZ2>tQO+B_#N~_( zZ!MyR?|#^DjJvAz;-wGfzVfZst4mdO(n|nlxpl_*Jz?Sbik+c)zl*E@4Ay!g3v&0n ztO|gz)>qX@%@T-DxDqJvaMHCva}gBsA*9wf=`E7?jAwGUXU{%gIE7V5##GWpTZ@34 z%SC*$A6i8hZ!ZS&9!lAFKU7L5?@0!7Z@8&+KZ%kN|iC4*)(*zLdnAJ-48wN z=2}4~J5@JCx|bSvjH3i--gL1-z_fh{dMT3vlPifZwz47EU1%&|?8QLK_L(4uVSC>g zA6Q%o!uF355aGk;)#4pnmm8-3! zjH@{VrSv1!r&S#l@dLhe~!TY$2#tPf9u9Ej*K)7FWLb)_x|} z<3bD^r8rv^8=WdWie-D#_^AqMMx2fm;^L$rPE`#N?!13{^V$Sm3U7`Z^sw?=FQO-;F69OiqE}JYUI{EL)*HqL4U5M$8L94}5Y4_a8Hp|t!_Msuku`m~ zTgJJ3VaJjE+BC77OO;Vr5*pU%t{A7Xf1`9C(q^Z6gh5nnm53Z$oC>>aXo#*E(%m!8 zmB7;F`_v}!qTig@DqbX1%7>lQ4PiB%x`A;h29~bB+@KXZJ*4?pF+i}CjbOzMLDhA- zma)?U4a?4Y5V7l@m#8W<3N95&5fL>#x{+}#g-xKk>I0fzH9Z7h%FqI<)w;r|)PV9= z02D9w;Z)LKy~4dH$E&=A;uD+8;{dRQ9%xk|>YW)}RZ@*7Tv0&wI;0UceWCQ?KS_2t zR|%6nrm+UA${}Z5*2yhKJE2qgYvkA0ZSf*1i%_4;LW=izt$5i-oPWFiT7AV_B(O6% z&H=~{?S}%2rBnOC&$H-~3n$c0p{rY($x&F=T>AMpxUt?IOuB4($G()m0q5q z91Kj?^+9LdPX=Rh6u~4iN;2Zu1x_u5%l2VmV=DU5w8G1^FGVU-)eG@|PF(Z_hzB&K z*H7b&b8CqCYhl?DechBlBubsjBbHd{42#k8eK2~&(N<_LYCyMA=>u5IS~m!*%hJ&w zrYtYdKz@}HGh>gB)tVNpKmr2CK~?8q##!HgLXodWc!zb>uLTlb3gw_DH)D;1^Z6c_ z@QqWOC2A95A7s|j-YLrL{KuxnUVB5TJ%;j(dOpUQO9g7Acg@JuVK3-K?1>PA`_a#T zOx4~eB+TsNO$-|b7%8&(E+{9XBd9o}nnc>UbINtUt6=UW(=4xzA#rt6`30&gYi_aC ze`eu80JoK9ZLPQ$1Y50pcYjUjeou<1YXs+#ZNU!_sEBt~o#}Bkj1aE5({r9BpA132 zR+k*n*USkdLh(cnk+yUU49nw_ieEcvZHf$d9i?bf{MEaLrl9Xl%e_29_Sz?f(sOSA z^xO1f#Z^${FQ~CB)Wn51&mL|qw-s;vpcL5)7?g#4AB=3Z6*RdXB_!95;s*%6nO1rE zrOx?&{{{r$2C^{FKIika9wHA zm0NNwzF`t}31R_`Sph@7;P zCr&}T%R@Qx(Z2|18fEGc(=O|HjB@iOzW(nlu5D`#UR*)>!^Lx?aqY$WYF%V$exjT_ z#y>_#zv$N^niTiq*E}}%#1%{2@9`5dOv7nOGX4507t$l$Mu&4<*s$8q&pj7)>Zvho zYcxjPb{un`D@PjI`zYByy8%fh!sWB=|5uqjdx>6aefbqLOFBNGX42dj?)J8m+2MNi z^;!cX^Q**4yvx*Mb-|D=#|^IitB8umCO)+P*}&dFR2vCpoxStN$6;)HzOK*`S>_`h zXZ+fQeZuR0T_Rx1oVsh|GF;X;+MgvKe%d{MWq5SpukKSrl#H(kFB&qfwmKN$(~rrV zTUQX?l6squ%IUTS_{Skc@XVb*JQj-GpsW93VCNGZSNyt#U6gXS+idYC!^z71;Xa6i z7Tz(=O%HZ@26PujQ{VKwq2=`3+B9WpBZhq1TJ5ThKD53@n|x;5k1U@w%*ao;TL5)Y zLV>r9YV*Ws8wWMpz#jhSZ=*~H_TZ!4rCIB?pLwlF&(`*(51DpYqc93M6<*WY65Qg7 z8N_w5aM3ecr0(s8N=*4i`OR-ms7pWR_fT{-7YWDyA^Aa$JAO}uW7=V(my0Ivn2m@;h&LzFQz@j&{Oywv{u-*5k~g|H_d1_V(aqu7us*KuRURWrQ&P z&q>V!Aj~|EXHR=3oE~$-@1PHT~@q8|(YJSn@cL$Zo?(<40Rf$4dD$0eWB1^^G! zuIZ`D0y}6NaHf*JI>`pw5a1h6NT1x7m(xfK4*}+-_i_$w zT;!M6CzfoW0SQbP!>{hH(fMNVNT4Rtu^R}{Sm4}5zu7%Os?s>4Nf@0i<{s*wVpp_{ z@XQ!8u{WFb*Nn~!0h%Bk8^E9Nzrpuhz-ypiv>ihhR^AnQXZ3$Xz|}~{Utj=U8ZaiM zlN`OGAnZ+G9uU;&Ft#IOCQ}wg^S`Z|otX4Occ!PBGqOl?L#?YN`uL`Xj%mHSzulXj zU_XM>1Gk_V0#)$NnlnGHg*d3%2AcSTJKprH+9v?Qwo3#4q&$oO?i!tD{GGvNNXIU~ zL8H!~w`~U)g6~(9eFPcoyuqeAj9o)IpUI$t`m;k|DY^vs!(Eex8hrQJ-gy(!u?hgx z5D>WORKulfhyu|PgIW|i+Pog1TFBi>ud&8|gZGcg0xWC{H+R=M!m4P!QHOL z`=tn3!9QVr6EbfjX6fOnkMiu)Ef#tV6fZ+?%jQbA`X*ALNP53s|E-1+cC`eb7TF`Zw|G+afr2 z=l@RxDHdpSzrv^d8D8XBx@DxvC`u~k9qgNIm$eS_Fr)HJ5AesIAvTYdi;h$;pGud@ zy5=?`6FnlPuGI6rCDf~>wqSC_CiE!1blkyWTQ&fzcNssm#f9N~%UP&50HXs`JEW-z zJqD6ma$V*X*i1L+r(9p=uG3oHY3?=~fxz~9pd?5ZC0AdNcUfLb*ji5^Ls zR*-K|#6m#hcR;?g=b+{V<~lL(_&isWhEs-`W2^(x4J(!!tdvCo{K24?;wKR*i)BfE z1T$YzB8dmy;TL)ei&R^NnizhmMeEo=;68SWsXU@11hEN2EShjmiQy)OuUmvib?FqI zg1!mt`#AS#7FelHjcK|dGw0V=Z!cxPgs`eG=*}F5@Y#x^XXxk77x%nOkS-vjx1khm zA$)Fp*w$dl4TM~JE|{Zb_zAuE%>z-~cUuQA$-3l~n-+QlB09#9nKGsRt?$5J^F=RR`vq2D=nH;WL z=Ui+u_ekyY{9#@MJ$tiKoV7 zEJ<=l+^~lyjTOnb_p|L>UH`{t!~Y;{4@)fJ(YlOjMXbZN2X3P;s(psb=PCDGt+3$+{#J&l)B|tmhBh>VQBs8CmI0xLa!>(E=$Kf1v?4H&8ep~I|E>=!8uBAKq z@Rq%uy0-a-r}y6TC=N44V3 zp{7%Hoe4JA79ilEDvqsW7m>}*{fsH!ce)^Njyqs*%jdL*cfN4^He_*Bf&v1ehw!Cw7 zOlPPnS`#mb+KGra;XPZ$D2h&dA?k27x1r6)Psbf4WTwO;9`l@NK=wbr>4D>tBQ ze?qtX6;n5&O6R9NiQ9Edua|!Pnr?(t{Z06bcmK^)hvCqeVhx_R)7XD)ikQc4e#Ao= zX8^H0vnvQ2juezJ2yn+O)+EAlN`2Hh0C#A=4*HNQk+UXLVaFObVaHx0p z%@l`$O=MwEoTzb0>zgSeF1_zD&%`)-RW((C=p=lVB_aLvq=UK!)ogxxZ|dR{ozf;f z4*z1`;%ue%t1#GmaeIaXGc3Mjc)ViQ;#b$5xLoCycD{viq0KcFf$BcqUmd`oe~hS( zGc_mOyZ@#RIUKLkisRm4W_r!Ki8}Ob!e>D{H^#{xPR4kWzn}2*qCXJ&@l1KW%Gsr& zE3v8QM|R1G>fma-x*+SXupwskwoNvyy9}*&&2^T;N?a6Pu{HkwR|lAfoqs^(iS}Ne zO+_F&2_M}Pjw_6^)^AqI4d1ifbp&&=1jifE&&=^|zbSO++o6P?Yi?TLG9tYW7Pz8jv*BbhZ;t+e+w!cn#72GxFNq1c|PKqOLZDSH>? zKjxj2tlFj?GxQ!K&ATeH3!xosNVxx+@u?>>b47a)`t3B=a`q{Uqyr?%S4e2? z%EiF`Mo6muDa`_An4k}_?*h8DWeAcv*I~tQdvV<|FQxdIu)|5*&Z@X&j->h7T!#_0 zo%i0B`B#Du!wx4|^ArRPs_D~v9;xlsT+39I#WLQ%I*Erz@D2y7Xl!&|WF} zyLd)CETW5_7lZcCR1*DW zFa1$*{P(9yI1YAKRz*c_lg#R`*dnc0K6Kum`2W@LBeiiPo8zLuK)iSg^*BP-a(dht zM!6t-<@y+p)Vjsw<A1sAw|UUj4q3T#PVJb3FF^6e$3zFl5_2Na@B2m$ihq zTp6vn^Xhv89OD7Foj5Fv9nC1CR9rKHZFg!`VJx|)j{IHa?HH2f#r;ZS_B7jL=V^mz z`u8ai(WXe3*g&E;bB_rrWq1p|sj);{^S_||aqAS%g9THw7_mcQX9&YqEo4x|o2J?c zS0PO!s(iZgIJW5bE1loB7p;i&xX;jdmtUtloUn}0vQ>%2UmS#d;oxJ}49?5i)qxf8iEkz;t!QI`9~v+v{OC_^eeKw+d8Lh0@K%+D zch+^-fpxZX4pn6DdTGz+gL9;$iPruw(hkaFAFxAtgU^%G^{isg)79R^*C`GszZ7~| zHUI7xtdLK-GC^gEHvjb_*4B2!B)&j~D=!)|IsE9`_F5G(tps6#vpJ*X*&_{+@xO

J)Lz1ZAyjcjO)14$_mo^PxHVCeurecRpitfP#E+-+P&*s>2Lt+*DK# z?)%+%^WJiZecYg`O8XF_)H+9%>>K~tIHqEuT9f&=l_S|O6r7rcrLGvt|9uSGG2wh@ zs;a(JV~E05sOC9K2!3qEMzt>MZyQgt>7w3oQQGG(3eVi$O27HL`dYvl>bZd7scL@f zrvPp@Xj_upIyOlNju~F;S}KV>79c7LA@%hWoua&j%<^?AT3yI5b;Y3h_p$#Th2E5k z94BQ_a$CNd>m1MH8`RqOI#=@ZHPk6~2Ei)F;d8aW-Ux8MBmnuO$7$9)HO)sjJwq)C zng@@XSE$nrw~OS8gRvjufTh8!ULHDo=k6K7f2U_d+?SH81!cgI{7B|q zwb66{OF*>0F6In_@F1DB1q|FiD9&i{1qKe1y;W=hNBmhDl9u{FzF{mYTt7PE31zTa ze6^8LiJrw$8yWS4vKY)ueW^Z$32Jma9(+&%_=VYC=(5*>?)(~bpg_mRwM=^LkKlo?r?a5wZYURaw-+4DDs5RhNvx7q)<5;IhCA~q>+Kly~M~JVlTf? zRoM2^SQnFp)wQ)NLa8)mXnPyR#bRP~r`zRNs)7w^MIfYNv!yCfB-H{ZCo-|xwstv& zLRDhgS}+8YiP5#RDMP80?fqe028LLwj*kb`ViBn73Z<&BP1{X4HL{bzz-U@d zy%(na6qYd1g=Y$d8QdsX*~uI7An!q~hcIRe1tUMystisD!8cA~Ee1-mM8al^CCQ0m zNTCGc-rpl9-24eB*CixKbRa0vlwX>aYYbu*R^Q(42&K|gp>6GWJ&TFacbryXX;d|~ zqeH9*-erMYcBkGs?XSGhoucQ&zp@2Q<+D3e&-!o%)`11u2w7?)Z9v90FzKK=E?x{` zIS$M@kx#EVL*W!5OKqeL$k+xZ#~+J>+!Oxvnll($30XQxP68QQ!K8zdIJO8xRv81D z7^uL6{=Pd0bpoLyt^s88EH+>f6S6N(KjMa;n~x zOaguMYBY8&p{16hRjkeHhoh;d-^$N(mB;M^6~^mUem12d70ch`LmhBDn0_sve5M{# zuaj81vzwrQ7fj2kOU^t@M-%0ANzcf+AM?gPrvr!|VxXy@_kiC_Jk_}?oHEmR+#&L9 zDjZ$XMpP+i-zjVp&jNfhYfn1U6b^5k&1vZy#i)xPgKjY&)E{wFFTog{bRDU3>gc|w zk!wTPC9`4e&g&ZS)Mlyuzgef0o`&r#?tH5p_VGi|FBgNx0}dMaS5eaaB18hy# zB3{Vy^!D^Qy^sc}_cTwg2QwQnevHJ-S;RfY8;;=Xb`l(LayLmUJ{*k57VM@38wH&r zlvtNk&q%zm--T)XdIk>}tX&JUYAkD2p&CrJ1a%@!6BCAzM%jWcP?W_Rc_PZPl2ur8 zYn#c+utFwhiIVH|RpUeKqywqIxqN2NBZOR?7wY6#*>r}I*gOB-^Y^UB3v01n0C z9)O>sS@bY>ty9X_dq1Pcb96cYMzc2%ZDatS)6ZqNKiAG3NdBmMvaov(zlmI8UQO-Q z)Lu>9)zrS5gCDc})ikeWbT!kf>0C{4^~#?B4II6CZ|`s3Xz<~`zP$VHFe^7qOKxT| zGO$d!PUt%6Xyf>3LFs75_+Xq$q)o!HOp@{#T9?$x=%{ZJQ@_B2% z%;jcu1Mt}-E!UvoKqL*@sAUUDJ`BGNbU&YX7VG&v1QM%aqb|p3kT5ljPg291U}2Jb zU_tjNj%&CpfSXO!u(mQuL=BUHDI|K+eZuHI-f>*-|38p7;BY~Z&mn=i0-hgayJG3> z2r!2u#6?TpJUXJX+#YTWz~QE#fJVS8SUg?<3s1E&QMqb3X;QT*13OFDsmmws? z(F0!9QsKfqFFhVIv}pT6tc+R>ov#W%+rvG9e>`8Al*8;zBZbF+>70 z1|R@kE4kE`$rvr+T8WSz!id(QL(+Ls5sWAROr&a4!!)T>swUNtDx?N7BE#sBfhpW@ z2oI)Gv?4u)O4f+NL_%@^BTNnpz))i-Krqm>85^|ebgCFbhL9S>hzesw1*P#KjgbI; z8l>fgX}BB$d3^aMi1~y;QDv@1BOl7$$s_IqVR0s^7C>qexwNSft?92LeAuBUb0IKs>vX&BC*I`pwqVJHDV; zr0*NQe+D7eI(>&Oq=0yqCLrTM_JG+A1x*#gMqvo(-vvtgr2^Ytx2YyO2JGf4j*?Th zBz0bWdQzGqftJtkR{Klo9iX5uO|VdnTUbS~x5v}ohRWKqOTM#A%H}CZPFSjhl3ajz zaf$cG8K2b4=P#&wzpy}mEX)IDJLI&2q|`i?k0wCM)Plr*iNHpKx2b~s9dPO6u%AZt zPuz6ApEg0xUxF8JkW4ItY-=ciPFT*csTmv`*0ASLIN7 zYhwMZ{IegwX`pFucFGV9f9<&CU}QhYkPi99*8f(&&+{m;?rBgN}wUV5M3$oRK zQG4u<34li5_+|Vo_=G87)F@e_bjpS39biXOVa>IB30CU1W|o1zfoH)JaMQ1gUc33l z#dI`Lsi5!rz3Rx|-AKO*5EB5FO(8a~cC8^@u- z+0hA;U(d9=TeB)3LFbm+zymxzL+>5ufCF@g-1!wAgD$-BE?-LePXzozuaUkobA(*ny^H)@=!Ohb5ve>t&s}K=7eV9;cm-T1D3IWp+@`#m~)&opx0Fc7sWhA zk&4ToW=&t>hfFw8nadn_v&eAIGrkZr8wu82i?l{&Q8xX~q5w3PBk&MdraaJ2Y9)Ji zrcQfEl(yD8WYQc*y`iQmR6ovoIi~H5hUw91#5e+(sa3O=3j4%uwLbm$nvQAuxHk8A zdIHf;e$hQ32#;=|*|6Yn1QhW5PZ9IuOWHUnWCP#vp>v4o@i|BU1Z^i!eEOt*1aMn< zXD%}iCP3}tt4-lm3>Oznc|%uHwj?x{LpimIJ-Q*D%z+QE#GSH8+PjgvVfwhxdsK?r zO2lV{7<_9zx(xmQFzI07xOx+KZ4A7j=5lOnC2Rn8?Z!mMtO}i4E9WB&N&X}eRw3cU z9X9~$T5_gJDjmdwFbIPqHU!>}3jF0`3UaT14-5KHz(^Z9G-c4yQUlXE!ze#8QWYxe z_D`tqX^{We!RddzSW-eOfo|(R`(?;;4g68aNExE$uNk)(w5$h5NV;p{)DJVWH6N0G zSja8DD!YH^7*qChJ0pGU|7Y1GGd)P!6-N8f5Ot`$J20tv#n{{<&6|08b6y)bJ2?Q{ z-z61(-7IH;-wLAP<=d;dt41w4ZKVvAqq^(y)YpxrExF=vDzz1W_W4>k`O(IK zbrnggx0<(Fx*v>Ggr;}f#*)<6yrR}r{g4o>{Whub`GVa+at1QE)S7)3LCX?*n2=IG zwp6q&hf5@-loEfQ8r@XZlD|Y_L=ri$f;;b>+^N0A(h^F^q(ry;nE4T0^6eO?xEuV( z+JX(GrKB?!Fl#wz`$qRLqu}l<&O;|Ir$Zeb=Jh3xH2W}3k3rK1Vtxe{eJtut zYCdH9zxw`>G{W;tZ_BY(U#3~WS6(0c9h-10T6t@H?7MKc3c9T>TfDisx&^WrNI1P# zkHslWw{5fiVE=0`eHRB+G01>Fy`z~@y0b&m*GK)tjyx8jG;8|W?v?aT%!)}rVlo;I z=#*@hg=+$FClq9J$=nG1{6E`%o1~RvjLe01BshsWNUosUL;JTre`D^upW||ycFb}) zzAG5slT8PB%VY4?AyAX&o8@Iyo^aV2$o9>OXQ$^P}yLSAmxLd|?1z z{fiV=6No#mB$(;uhT`VESxWpo8$)kF`!3lyc&NBg$S;6M(atZ1CR1?4yj4GPUl{$!7G9=)fdKle2L$HTN7r z{%NhUVMpqVCFcXc*HQ}QxRgFG4J!5Oke0I-yBJ7K_9>Gm2OW2(Nq{ioUZ;qkFMa4x z(bOqswtrr!H0Ga{{z2P^C<53#UwONvtXO|MHyY?Was2?p=2rqv7&})0Y?i(_L17{4 z2`OVA&+FS>3AMAso5P*;*M~E1kDf)A`nkXrW}{j=J~3qwv5s`N~hxQgBZZw z*ZFck<6>#&jL(P@ufrDn?Z{$7Sf zT&mLdxB}Q;`8d5no-pH7zLNL25I9il2*6;i`^E2ZIBUT}# z))y%)sqY!j&Am-$9gzNWBDL%3SwW_=k7soYshQ~Pt=Xk#vNbcEvpuKu4o~CJ%stG~ zQ|U%Eov||m$S<0VdrPmT$3DYoT5%>7b5qi3BWb`vQ=KGO8GyU!h{kf&fr)z)@6DXM zGB<1MK4Gs6H#6vjl3*^G6NXPmzBToll=H-)96oR;wKg+Qc;bO0+?TBJ|MP$6wSh8n zsacvlPdJML9M1eT6OD}CFAujXtM>hUv)yYwMNl@~M^Mv>-xQ(>L>R=j>g6OaX|M?YQK!8}0 zk8P$`Dzg@!U~;q`S9mT!_*#l54@<~apPbS*{*sg_Nz0x_FhvN63~wcIQh$GxCQCGfa3Drjd;;8O5F%EW{v%$LY)*S)J)7Qind z=&NCxXxrU@m}#PSGQt0ae?n69woHP{e>s>=1}QHi)ypK_w$wk=Z(Fc0gcv?3jSSk6 zjb4T)K)6$iUWeq3`@mvAy6A`!(?~9t5*yx*!~*uKHx>DEN42^-(b|LHfrj!TPRT|_ zvGn86f$@}DNsfZIfURb9rUUw4q@l_{+$9^{L8T53FNpt4aJeY!-Ogs`JNbYq8Iq?i zG11i7!oBcZ^0Jvg|Mjc0c;8!|SVjKDjU0)iW>wUQ%~WlDT6__CIH?BGapqS5dzg(j z722CcJ;RDvc)_3Tw5I?Ma(IzdsC5=-ZYnUwT_%g}dh~$Ns=<0<>=n8sX5#2{E%3|~pg`3kv3)?|IEg>d` zOasOW+1aG6Ysq&eqwI9yua&tXx8y8Ra*++h!bCLtn+Y*9KLQF;Nhphz%9 zb_WvpSEksuSG5o|Zq0|l&p+`>96{6_HBRmLb5Q$3%Y~|4FSf~bhBpmC&L(|zDLN>IY*OA)9f|FZ8pD0MdKOE9WTD5=w; zxX4VdM~07+*_({~$2&Rs`q|Ir3hPU0T*Yc#6lLlt;nRq+G2^$wqV*{1O^J)7vJFQC z`GUD8qztM%y@ehhWJt8U~ep zM(Z?8ES|c1jzj7Mb&h7A^ov!$zSxdW>TJ>1(U?gEq@9TTSoy;8Sx|7Lv}-?+@}0iF zla|U>l6+|l*@MK}UF_vma9$S*lx^)U9XfTS{}djWJ_Am4$9{egL7KbgYKqDcOAwYe zf2B7ltqdw3$Sx(%9o=;;F!VdigfCcfTcX(n%{>30Qkb#4&Qb3;?d_99;9PL{#q%q= zHVJlB0Lo`nwa;|BU7H9?pUdUs9$k&ien7mA zRMxGl=J-iqBB++!A^4l2ybEs*xMlY=IGSAuVJ(W8@9Nraj4?O;^>0e`V|74Ne+7vY z*;k{Tyk6Im!d|T@A-`lstR98Z|6_Qo+TQ1&h#^>C#C%KF`n7YlP(S)xT0W59miX#B zIuXn~Czl|Nx)gJQP=r{e^s~u6Ofvm*2o-0I>WT-1xhQPDuB&Ih;TG)utHN0Wd8Y!O zor3;QwTZ-Vl`iTYcm!a?;qvR_hR%G=K$oM|0i&cLRsZCH(NNG{>ef1kNXoi&MesXn z0>38-|1T)#{6FV~ncek{1}9fv^n7R6W@K0xpFW&XnY^JXx9bv-z-nES!FW-Kr-ll7 zsp;cs*1y;)(SH6S7i4YJle?pZ4TCHmXvB8FQkf9nGb7GV!RJ!;q+5AdXO`t7Mk&*sP?;9 z@&P6)HHMKVZdxpsf~X^{bQJ9eFZ@KWm7ZVl7&6+ZpT61CS_RK+mV-J+)01+V%s&(z zK6RKtVTR7c40;c#%o@&a{BKf8g-Wtt{3h$cjoBNp*AAjx;I`Yc>kx?!*d#CfuBt!3 zQkVyHg@Ldgmh_@waOpFUFJ>a~l?6GbFyL5Fz)6D6F)(lj4{a+7pku%VhyUeb?-zbK zI1I^*F*6T6R8}r$bwrHs59Dy09>_J6-MS{tFF52Xoa9mhTa2%zBRHh9=T4HKHc7Pp z$A4&!Olq5BaiY>YuARO6q#GXcwmoi8wlUf)^w~p2h1x!2=5jx|G1i6G|&_ zvo_-=a!dtCUv+*su{bZ!hNpL;(mVFjexdZ30m0>zohHi6`0SsE3V0Bf9Ou)%=msvk z@nT?`E+^1*=Hu032uIK~+{veVaDse=U-&a6nYL0>HYdc0UV$n-A$OCvliSG|5MB~r z_53DID>%H0mt|V&K3z+Umg8y}WE}PJ?wau++CA`safF*ame;0;>yDK)7x1JYFQxhrB_TbqN__F)D&Gv1~)_qfBd5)(Gu zrVCY8K)JG;-w`Zkr{@PEWvfvpdaz7Z&Qly2K2{$V_>eZ0%qE@LErY!$CdJy8RtK>S zA;M=8Yg3)G9gz;B2?=o7Em1)}7{upg{(XgzZ%Tk$-j3qqwbcBB%sL})(3))*1!=Pz zWSREAkK=Ghzk|viF8p+Q^I&z}F+_8zHZc*axJ%jD*+a<9{qGFE#1g>JH=ySL2L#x< zYj@~aP3XH{mDT4p6Q0>2GkQ+UiB)TwvBCvvPak7bDc_1f>rs3HRPt1uo3{@q^3twe zCgvo-UxW1k;;VUg2aT1z{`23J2YXrt;L~s9a`)ruN!e>H>Odlxzix1L#wM880tMVJ zo+K&D{vA#7A6_S==(!)AABL2*pijZ7GFf>-0)w{b0qjDrPoQaOaiABf+v?6%BH1aI zKDE)Baox4eCLDu~H8Wr1pJA;>OKp)qR3rP{Anwy<2V`k>|41TzTd#x6Zn0@_Wy)}f zQGSQE$nsm)wwWsnQJr{D%2cpBhwJ6ka&h`KS@G=$nJlFwg`E7dse}KI&qR3^A)THM zru8uJjCy$8ghf8@U|?Q8b+NU_8jr6!?0uQk$JPeRkjxtxeJ_tXd0nqSF|T4=e;L)w z>n8Ncy{5V6m8{*dyo~DSjERaYLOSCBB)Vc5o|h7^ULyzNMm1oVY65>-eN{aoPu0X0 zixyXf!A27O+TUf3-?rq)ww;|?HWU*kCD;2(opscT0^qioT-0Ro{29O2ZTswwjY{KS zIFc2zdfg)9p71aidA+X?V3uoFxr`(L(eU~@Ec0r9@c*~PSJ-X*f*^%L7__R0!0tAF zLU6tpU%zVVt7-Xm%05?@EWSC$6}&9>)@63ERNlJT%75@}7vP|)=RG~k>8t^9>VYu5G^r)IJam~Vn7B5av9L4N z$r8uy+QM7p8?WXEGoeg*JzbD^0(VbiCc$*U86L<(rR4s0ax&!9A&*&USM6KR?%Zsa z0JFFLI$PHRvoHVgTVE~#B!1~9SPDD4H(T>gmCS6A@ecd6Mz4lNUTdj0l;L0hZ7DHq7xVFx%*fm`<-CIlHotZG?^09kI8cpqQbb@X z=2=OgO+}kCJkPk=PD9?_d%)!XM%G)uX6(#jN*~EWmUDuNLhO{lCt{@c=Fz_Y<+C2| z79^b;)6wKA1Yc+!?T6@HiSq)-@n7XH!iVf3(@*5Rq7;b@cR9Q>VtZ0!y-@{CyU_DkufR#*!IB`8~8c zspK9<`1hA2(*1q+51Oc)5`^RX@i;Uy)Hwn#c>e#nUmTuBI9Emlv4{5Z$@1*bNIM_u zjQ-=eud>$Rh=VbuhpS)EP&U#_8@novx(Cy-6NhlZx?vohFpbpjUF#Q=TYNjzV*2n5n% z$S2CL!9Tr^M2u4Ou5&Ui-<6?_V&i09-i2;BR~URMW4}AU3BO@jpWnf!9azDSlBIfu zx7Htu=V`FlX{$c;StOllen)d-YLHM`x~(LVxWC;bet$a-On5pm8z z)FXkURBj8IFI`BqUrZCxRfg$XImII`d0{K ziif{PzL3-Iwf`|qJ#Rhq)c?eyJ4RiHYNL!T7zn$mrG3wHeCVWKy$ zQxVLP3Kq+rdteURb>&}>UP3gbS2QhmQuV5~*?fv0)I4`@A0z$`U?<+>`KER3gQ|Ov zX^KH>;@KTdLzT1V^NbDPpS#c(cer_cwyT78X;orsXp+&35d68097*RynnLxi|L`in z#~%pi;jYCVi{iZtjpyHljHA{OdLIj@#N4*FRDoa6hi9MLY~GkZLJG{F3vO2c z%XSvNCIxcnqPtZ<y>$D7+8=!Wbq3{QJnPFP>M3QVCD(>9>_Sk*B3!!e64o^$~@QhB){g9k95q5|%= z9uSlEZ#Ln~CTePYAEUhlqohr5_7Zr{>z^U<(MK~PE6o>4yT4z~Ke(DXKfW#KZZmf= zKJd?{i8@syFAEYfbPz+K0^Sd8 z6;t+aHiesEYO)?Mn^grr1jT{~*!|gSrlImkvDluvtXdcWoW1H*}Ox=ax5rx0CY7%;%V+6u7bc z+%#cF&B<3qziYo0^k=XobFt?@T<{#p+(}cFKWk*CjWPYigmR(q%$e^f*=!B~r@;l+ z`X*^}0r=?hy$#=a>a?48{fTSOTKB)+%Ut%pyIE8Fk&9?`5#d%B6@4(I9hw*m6R zCVL=JOdV~o7oawXV)tjk1jHt}U~&AI4%2Yx)JNsb?!g~&!|{< z!rff7>foslyhq^9N*$@gxUpQtF0k!~PigI!drujlx1J}GXAp%sd!SP0EPM+wA%uXG zun%(0dU1F%r#bkY^D2SVc|^?m=ctL0my=wZL=e5?BaChQ=&*v5^9Bu~-$1TfwBr*_ z@k0P!UY%yKP@@Ak3gnmayIX$H+;~A4CCFz8_FRzKw8<1aJ&~dN}1|`?)Q&+zyFaYIr?at zytMovVYYtibt<4c`!RHdxpuR+_=8Ch?)8QI{66~SMl0)o=85*E^Mv6Pm1GK zq-n}#b`T)bll{KtHQn&a8^jclRqFRwclsS- z_W#XRe-T(I`ZNm{h*g8?!eh0U$*~<6C|-II0GpNN13?2`u>rBPI(OFfeutsEe+o(V zxq%6#Wxo>GziC6+U%A&fo3g)>Df=t=v6eg>u;gyZq?Gtuf3|QSk+kmip{rJT7MCxs zGHwYJlkk~<`g*S=XLAOr#Qk%$mF;B(>k9sdF99t=+No4SoPP)wldcWj0}T322b4dy zWM{3^!+A+(ifsh6P}$|%b&nTvb3s(jQ!mV)2(g(V9EUuSACsjn)tZzsSLj=CkTrFV z*Rgd3T=q`MmJRo;%%fpkp0o`fRffUki(l4Unw`Bl1IbJJr_@S9HcGj5CHK*vn4(%# zQGOM~!4vW~-Wl2lhG6V#OYUs2Qf4x&g%8=P6}x@v#Z0f_$&0J-zO^*JAna z09%Q27J&Bn0?MCq*xkUtX6(`rp6}M&lKC;|nnbR0L>>^gF9SFTyC5Q0wc>NUpU5jA zSO5Al)sEDe;mhZQd1JT)=4F-j44-6m5sJ_xh2+-=^_Gb9QC1!fg)Q$4XN0YNQbW;0 zeV(_`pGg2cZ$op-Y{FMQe1p2Bnhj|)BfI)SWqZoN_fAq|zwX3uaDW-Ib|}-&QKa7* z?w#x1O9kgc`_tryYACpS)>KN^=O?vE`Ay&XGWx&LKyBHQ7)2?4JpX6ZysKl+fNsak z@m*P!Ml&(I9gh&XyOc+UN_TWGkLj^4K%DvWLkY0Wy6)NBWZvCmPoDa6xKFO_Q(YuKww^8{>7FJ4SnsFuK6+E%xE(!0K01CT`UV1I4^5}t znT@QP^0BkwwO!+^NOGrAw|}g%ODSuRMn=7nXlY-8Rgl%i6aaZ8NAk`O>T#i`aHluE z)Yb7Zzq9#vLe#SR$;`O0_ntAxgjVDHXz`J;s;gJHfYJ&T23nQ|5P`!UZoPO%lMCX zlu8eYBf^$@ZV{+R81^Nv|}^WQs?owX(1laKrR;8JG#rTBJq#USeiQCSg1 z1yw=z(}ZDgS9=Ei@W)vWp3By*Osy`6yZ+kJk~>q^dL6Bj<0y$!7*=0WSR9P8z@?^l zLt{O+BX<5WkN@zpQ+vtEx}5jes}%k4`4z!&96oW-6KD93et{>T1tz~w0f4?-kN(w7 z;9WvdjhHp5<=;d_>El`RQvk`qN!xnweu^O3JZak~`6+>90j27Q)WxRx6~ksdhD!c! z3qBpimwL?kYckPX!haj;IQP@U3rmDIYlU{9n~k2O*qFFb;a8U5=;Ij*g(9jU_MhWG zdll?+#sdcgcmL+}5TN+VkSTvn29itscf%6$evD{gso(}K)C=9Lbh%tkM5(U9$0Gy^ z0lg)s0FSoDN6un*1&*k<0Wvdkg9E^pn&K@KkSjA}RJs3S zix9N%4v(82Fz+FzrBvT+8Z&FdnrTYa#%;(9Z4J9N`rx|78tc>JU*nmkimVYF#>#>i zQk3M+En}XxOdM2U1AF-Mo5nP4*aSe(cG2OJ$c+H{imwfs@^ao%{}e7^-H(RrRaJVu zk6VZkFrlMBh&G7@f0A(M9c;c3S-l6m1>Qjr@Af5gK|%MpRj{5h)RSGf{dG7NQsG$zN~=9DX+s#t%DHgLicEaAft0f8y`oihTit z7;0*`ZXO|swZvd4a-FipLkzQ9grKJ!7v8Ed#X3wldt&AA93w&Y+Q>W4b`Gb6+>gz1 z_E!2Q;hl3ry@4Ejhln#=Ad|V@_oU**lw!E(%(1)q;xy)W!i2Nl@FTLc5WM8|2sH8w zII?a1lCaLs)Ty7um~K&8A|G(q=PG*3?B;*;0g>|n&G=BQkWP10l0K&TM!Ry_k}t4u z)mmKtVo|ygxSaRv;DjGz>!liQMhXcx%6d5#d9WN}j!pH!yAUB-4TQJ_z2nasBRGAC zeCACnX|CJZ(^1`k^<>N1x|sO$tjUxrfEYev0!r9A^3elVsfg{zfP8Mn>BS@+Cf~*+ z%~>8vj2<;dz#?pwh9XSO3~>wp$ey=E;R3QI(7PVb%9=Ry33Kip^J(Y_^(P5+RboS+ zfiSe;Ic`KgTSeXwIv?}<-+*%Mo5Czu!k=6q(}OX?dOIqj6NcLFO}gZX!Aw1r8Gon` z+t#?MqxY^`vM%BDttYB(Plbi)a}Y53pqQ`xI&&2GZKeV}q0Tp+VTyVlV&V6t{|K5ml5PX*0kv{(av%+*9sMrnNRUS z?zYR17x~0fYhpKldd^)k>%aDMr`;tVSYP?`Z1#kb7nQJoNTFB^GD#qNIz1@=E0~P( zz&i5nHmw@8jS9y^%wWFP0!Vj*#&?DoNKiLNySyfK;^W2}OxK{?<)BlOJ*LZj(iNIn z+Sp6Ya#K7psQgyyGt5Q}+d;;jQ*gA3zf4}^PX$5WqT+O6)SlE*2YF^FcXfLbDDxrq zq4AtNksEk;tjeC)G37#3dfm<3BBz>sA`+UMTU(AM{h)Wd^4F}b-E== z5#3C)`{lf+4VUZm1rAr>qOK6gQ$e0f#KSqhgj6Vc@0RJ1sNrE*Yx4=WH!#b#gI(JMJ zN9HBjiOM6Rk}vmHLP{Y1>!L->G4*p7vyZZ&F#Upr8JGw6%1y;s>Jk(`V8^$XJNWkO zSczI!p&zIdrA5R2qRiV~rTpI8jEhls8{!8yUZqG83`DaOzM_f}E>4v5t6Qfx8M?cr zn7B`R$31q;Ao*FU*PX8!0@rJx65kg{~ObMK_AnsIC4de zv|1BOPf@4+BIF+il*QP5OpS=Usbwnao@J}XWH>^HJcd6_pv5Iqc-KFs5=is@e-Q#7 z7c{DQ$h(Dvk#9&kly}n!v?U(4&wUj{8^cBd@5IM?Hb*8>9Ooj@-%tUeEW*zilun%@p@q1nh)eQl|+DEja9 z%`?1DUor_(7Z4#Xx~|5E$g-h>h+|L{6QWoev2GyV2@?lfj?_wo zD@1qeM{V;~Ys89)et44BUS_a?1a)zA#vqiv607Iaq*nb-bgENE7>?@AqDBCDal%Y=wIFeM%M{c-&hC|`G>JZy;Rsi7QSbOijs2wE zad??x#rWmajEQeQo8V2b`&Jxp{o76<{g3=jo5lriyW~+>Fu+jmA=i^q1we59N{$; z{QPsUBEJqCAKW~-F%=eH+2$NpO@MtL^*E(;5PFd%vHvt zFo5Cm3{$dz0@5w<{7MKspirg8+Zi*cRtX|i7p$rh#U2H|1Fq1NnC6s+Scd6h3gpE-;-%eoy+FF2BG!-U6t)c z;u^m>2 z7rlGVM99_6{9Ftsgpp8AQD0M5n~zd59XJlXR=5qR?ZOn+A;(GnLB ztL>{tO69l@_R)Q#y&ab1(oh!a>uZgFHPVDioOyY|3tD4?1d#Hu%h;;v^7L;WBF#8e%6=JBOR1MOE_K**rxO1lyJ>F0rh?{K@mq?Gw0-DeIRP{!A!b2pB zs5CXFdKZz={Odir(;oVhou|sAjW2f4*&gW z;Z8@C=IfR$;^M@?g>92YM!HO5#GYSOldP#96i%k~jL;zb5#ad!SL+rc@iD_30NaiJM#7G02 zhz`w0e8FP;e2~>=!iZIsUBD>@QeFe7+6H#=i(RRy-K*=fUWN(E&*O~n4*)xd4j=NA z-Z`HWxJ*wqbWF8H$J|)DxHv2HSLHa{s$(oZFVdL{-8k0d$URL6B|^W7JsS)e>!re~ zap%6k{+Jk8p}HwF%IZ~(o?4M{8O?v+qdP4so$FkUGLt5O6n0Lv$Hd-Tq$)1W3j0+z zro7j-BxTPG!D}eYdrj$VDMO&j)U4Wcane&XrbOR|59;M{TNFuY{P87Cm)U863|;od1YB! z1k;iRy34UO46P=6;C1@FE@s5}^`Ys%y1ni}t!qkO<{bmKW0 z;%|0!KS2b##Xiuzc0^k77ClsGez)N$M7Tl323Wr_ziV8f6WJGX67UOhy}Mmv0oe@? z8DU$WSJ=2#E;W~sW&s6luo2;GUPVaTeG}8IZ%hsxJOo|T&e6e=fCYO)+%7?vfZvP? z-bq1jP^AsL#rtm*rdu}LCu(Hd(TH$s#EbX_Xq?ycXaNf%#QvjP+qT>V*@m-qwxue< z^Z2tkD&xpv-kYh*6grKK^kT%0LWElbTI?aHe`B7c?+Uq4F?J@gY;?Acw3y=e7VHWt z)b9iTO9r1LHJ@`J4zWa92gTE1bOaYCHhF${aVnnE(gk;zQ5S@m{tO_MWTuxd4- zA0iv`JaR&I8Ns=>-1(sf)3ST)hM~K&{Vb&&S4B5EneY;V`Z6eT{#s`J8N=lOb44&t zSf}t2(DEgqx|zs-!|s^|lvSpgXfoR5bc8lQmaq0#*mMhV;Sp-ZxAI(cty3CpS=}`+2l&d)K-Onr8!LXHS%zN^ub(qSWgD5QsVy?* z=KpJLbB*_@3#Ox85PsvBg%A@hS8k7B=%QBL=?0caZ00R}-&=I+;7Ey|BNFc*N;CYr zVWyj!kXb49B=1}P3m@`J&BD}y^#fVaHSIvxxkd*dn8oMtz<#tqUt=zivt@s!KO^)) zrV24OQm6LCXx%UlIsgN$D`b??vZ36(NZLX|WA1Pm;YX!Ho%cOMqel*lmAmx;Oy8(c z{>I=DCVW(1DOKY;cjsa%Z0Ztx?{m+*V-Gy~Z}7TxLXsIW~UJOu!wj_Lt?W{SaES2nEIx ziotEr+2E+P@FMS77cJFfXQZqG@A8}1nRK!?#L?DipsvrxIhmbsk(x37?J{OEcp~g? zi3MZexzT`!E1NJMkYRbj0D(8Dl0eGCJjjDQsEuAo!G#KS8C~)sUas~Wq+5b@_N?1J zBJK$Zonk3J-E8oo2))gR^$m_%exjHF|h!A7~k&|Q;;za}SHJY+xW5^TSN-K-F za_>4m^Pje9MXZPQufG=cwRx^-!6>;bnknHY21d%!ff5Oz9FYw;ZiRqG))F-@3Q{{v+B}*w=W)YDQ&Y%;O zEIFO{Kv2%cM85xuCUQO${i5T`=bYIBm0fwSlt;i#3?U+Sb;rqBGt0~owm3v`vc$ezp+h;o-_EjFEa*x4jsN05)ak=afM&$t)tqIdPftK1nU zrunD%qvZHLFHJeZEo@oxhil@&xuQAXe6;ZwesT+c>7nXoXB$Z?#bZ3g!zQ=23B$+~ zm|M0Wl?ob8p3eYZ4B;U@zL{8Y;9YX(%BT6A+|?kDA-?E#3F}&^EHr*o0|9^1Z&9&j z!|*WuLyK>8KO(S$yC3WTcRZM@PA?f$Dr&|iZ%GC0I411aGFdYE1iv4{c(lspZcCVj zcN;6dP$8lW>H!`>Yp)=w!@@|NPa&B^9XuT5^#g+dzD83fRvdmew^LKe=-QbOAr4CM zTO&)P3oG$~JHVS$dw^s+GK`e^WIl)=`!P|D{g`1W7!tK`Hh6FQwC*K+!FVxbfraRU zEr?<*;i5Ks#&k)YFCimvBW|Z=tDKn@7! z_q;?_Glz{iR~sDgcf>m>vKIwQ#%p5O9}@#Bn!Y>Sbi}l3$L)+22i&E1u3h9jE~KY? z+f5aAq+nT)BkK8iGTwc{`eCo4kCaK45d2RE94w2)LIHH=CVixA+?@xCJD}DdxM}ED z=3Ki%_U!sNpq*+Q zbPLz57!T1Z+7iRKH|?T#9pUvz0MjfnC~5V1Yamt}a<^~*c|eB0r@d-vQ;8Y|H(CF8 zAh1}r=#a5d9T33pd5E&@B{o*QD+^LQ#zQ>Blh#lys&edd0GceIAtwF}9Kmw`0(l;8 zz~X%|QvB(T*$K^xx;mjOeoqzY(Oyeiz-xQC;9ngEK$&`$?{u4UK`8XK<50S^b9@~LZ0C}5cO-wY%Gdr{VvIO`WyLMUJD%he zs+N)@5k1&-v94y zh%q3ZzhPA>oo3Ll-L^cdNWD3D$+BcuRxLhxjo43g#9fM9`IOH>=u#F|76C-KaTPjx z(5^!5lep$GNz~rklqsVCiFF^%2)ALzX{S1}q&Hn(pDe1G@BG(>4?<{9eMzCo=~Pu> z^8YO#BnMr*E9*VGYPt;NPUdvZ{?0Mx&(OA&+WItey1JW*<<9bN>^E#1JLuSgGF@es zI5oq@09RYUkRZhhYK}FH$XpF=INf>pb30Ht&5D+f+W61%L{!H>^3(THdR>fnU3Bl? zDs-V0e*~Mr5sS_N$|^IO7!nZJ9<9)P-gbOQe33?f*s-Duab~4B;70$1(o~*^3XE14 znlO;|s@Dgq5!8BR0BMR-Kv1^gErk8BqKgp;4N0y}FvZ#RHpH+Sji| zit_JXvtSLc^{R!BA)M}`4aq#r;SWu*PSDLU;gt#D7X59ra2({w@9>IuEa*eTT_(*1 zs<2NK_=pd70#moc_K6xv78nhG=QKlEr2xO{pJ*Anb5Qg2V)9C<>chx}H?LSa?Xo-> z^c}V%MU#MrWmLt)UrH=5yu_F`swYBHh>A|moH7o!fY1oB?rB5z9hp&hR;pIyXZeR` zn<`CyPwc)w{Z3MJv^$wStO3C+cB&+8blQSyvEVeZIEE<8pprkw5s#p3y8kedk1say%Ah;bI&bRBz$<`Ws6h{b}n(#ls(4U<7+eHH>Zm8lFpvkh+O?2 z7CZfpXbvyV>C)QUw>ysClg)|Q(9eMI2ABKR99W(c-}3>SjrTDi$3H&Q3JW^!zgf$A zmMhqLosj+ z*eAua7j4`DJgq66n!G9$o~C#I&WQ60hsTNpbzDMPlNasSxqd*L>F`^{>rHS~@}$&~ zh>UH1YZi}{(*U`Iv>^;#x@~K}fF%d44=zidlp;q;HZ<+>>t6QqBaGD{67A_5eznG- zPk<5FTyu;5g`=xp9#PH)GO4@$_`b~64jE@xHnXYQlN;WEvKL)=$yn{%H z>1mi?ova18>2T^{E-qwI0877b$GBq;pCE&~!tI$Etc{GcUAwU#tA1o$P$J)y<vY)hElcB5oMiY zudgXL*FQk(zCm+wKe!d%C(B^UOgv!@TO`vPkCM41qsWzi;>` zKy%q0E_86#a_;>Ew~;h_tx(=MJlvF(<7;k6s7p6RIy&)*!gpGS$L{LkoKl0t?~)2Jbra(p-M03}(IoiT z6>Z>r&`{^eX6iC)V?;OxHxn=dXF4$N1?K59k~ubx9_XQK@to#irmY#8U@_zvQrQ{F zpfD=m|E)y}l@QV6yZqg4R`i#cQf~<@nPRQb1Q9(61G~CBMyO?AhWv?#3Rzo_pO!@6 z*%2Mpi-|r+0Q2=3{tvT$%1&ghiUBiZz@9*{ug%5VVd__39EoEQr{bYaWo9N+Z%uZp zNg;qG5HAfWsN&%xg$fAkab1491dzhgV8I{e0>G&Vtb{tA)JsgjfLYU>c?(IckqP=I zgz3mp=uE2_{#X>JQ^COPe=dW0p+(*(Kks8 zzAPQq4dafciD0b*-!$It{ND(yg5M{S-0pfdQ@!e&k}~(e+NR z`(XJ1=}m4fFNzRDW&HN=KHsSWjaWs3SuMi=zal**srZZS9SFp@7~Jp@toU(oZNOGI z!E^OeV{p&}0`UqOjH};kHw?b<|3_1>swMQdm<6aQL{hdW5KO0h0AF1{;z~9cMY1C#O7S_V6AEMl>X)T4^Sy+FIV?Y$Y6N z&}`~swQv^VdI*CC%HkQQ#SCQ_iv5y>>?1;`g^(V^@D&7*TKW16I@ZGEpkgtb8y4f) z^0ulIDpYPkXeZIc&kzAaDxtPv^q@o)OPr0J#>HkLMmWfSr%|wxfdsQZ#;Ishx^5TbHTttrT~sk~zCVe*iIn zhbbrd#Z@BwUN(@!lciAP>ZD{?Y9a`jwL-xZ@B>fYq*Q&Lo;xTd!5Jo8r zTdqV(fYV2U*Ye>Th~t&*w<%*>stm@nTQZ9_Al|}qSMqBn$Z%tC& z+kh#B+^{?zQ@&b{DR$*x!d@XO5Mj;oZGx6N4OrRoN0a3D)?%{dn+2<`bzq$3?+fOg z(bAg6Q_Fb4!LY&~rx$agX29uPemg3EK_sNDYlU-=m@P$JB?k4NGwj-dHeMGQOj&DB z8xzmEa9#c_>fz-VCDz5{itnkgC0;K;ZQ4VdI zU2q)8C8hGRh)qey8GS`gbNCQhE!@Vn;SA5U8w&4=Elwf`-k=Ykb%27^Efd zbb<({$|60iR7d#1a>l#oM7-I5T=qkvjCT!o*K&39ODJN96tNXI^Atc*@jt-R21 z)iKO*a9L_R=XBx3w^JU1@zhlwz&9R_lf!1p8PaNA+kE*I`xzB?KsII#0c50JomSb#m z&a0jwJoWF6o5&-uRxG7U%-hrd7UXiaA|Cbk*{0G`rMe(Nmm?~6EH6iNh@usr>6YttvJF+a>|@*)vepCFxSY{%N0*x443@5;4SrCe+o zYpR)*{VXxXBtmla3D}IL9c|aKvrJ95EJAkm3DTMRcC5XTooy0m77%(_KtL7{@Ut=< zefq%)F~8OW@@Pz({EixY{c04Cj;==N3!VdQc3yJ)WHpEb}0GsPigr zvNSCb;KLsO>Ev^{63@IKw3eA5mS)bDf&8>(w^0ROm?YgkxGs-jn==f7?f8Pl%(1sOGwea+G^WWq6g=__Z;&y_`4;~56fDKk{NoV<8FW~67&fvvAb%7W6@=kOF;Pqq zKdk_9EQW*kN0TUbX>e!=s;9urH;@j;ZG()_92~GCj9dU`DTHJLmOmaplt6hn?vH_O z9s-LxIsQcaF%a?@4Y%9(&=#R(CEJUyG@@#9r!BMd(kL8i&ZE1O&Zo9UeG@VAv28R51}#YzTs5qPTgG z+)IGh%g~WJCS?UKVre={^Rf%a!SYZ6sF$U~-3}q4N*$BajSg;#X+JL?1FRGd26ux* zGQwf{VWN@XK7R-Y6WxTP@`tf8lEnI10z?SzP#;)-L>z{?(ctHBk${Q$?_!mO&_9k7 z)S0w2f_wy75%RD3AMz|DUH-c?Sqb#N`XrnSXM*yEBvup76}J-2@scFUIFpei#qfW+ ze~}zGWBCsQC#jlv4sIox6C^mmH}_~n1WcPA-|=4=u#&4Dt z*55h5^}dMORsd9+=Jg70Sio=`17YrVOqriH;{7npv033^Ey3_MeOM?0Fbq02D9p-J zA`$|Jegq8Ib{DkHV6|;6Xo0bga|50ARyoW>%J;oL3--9S0)fu_wpzcAs?JRx$er4w z+qZD0rzN0VMVE6QfHCesp>c00=h3y?hh&Ub(NR8-dOU*j-kFD%SjQiud(Nz}1b92A z-T7sk03Su8@pxmfe}CE^BC0r^-kvU9(g)P&#y-|g&NdA6cc2asUey*T`XG>^SP$g8z7G1Cy&-03);k zaM5K>c*;wNh?iSN4RC*W_l+*GZkPUD6SoGEz7fns-#2qY<}AbRX1t;R%dl!6RK|Tj zNNL=eMx9s5_~C1-S5xZwlO->5WGTKii!^iqDM+i~1NTYFWm3)#`;HxXEy7tU1gL$c zcro9Cjgb1DpXH23BwtB>s%b47YIoZZ2#Ylw3zlG6jX6u@?kSjEjF&J=;Nn5f299oC zks70u(D3- zE?V6VmT*v^u0`<2rF}({3@E~AWMEYM-W&jGrCtQX#`~p4DQ_W|F;XVp0Zlwm% zaxWKw*vHN-t8i6EA5bq* zC!A`0SDPMGlpc(tDW{l3-B;wo@3oo0!_Z*P0u6K&+e?g(4#^I7%lV@mTmmI>Y**oD^jth9iIhrYcmU zUyu=DJGv7n#goq6+|vj-ThmX3Gb231==D>cQyTPGQjwF_$co z(X}u|bP)Y@)_6wCO%%8EI~ApoY$I2UqGRT5GxXDo4R36e4;lc3MgL2R3rHYDw@olb zA?PGtnyG8eaIYjxUjln8_sI~oTb}|v^b>WcpSQ+n|P4K3!tLdmw;LQQZZ=cvDY+wsGh-jtUpz5qrC>7Wo0R7Astd$5v z0uIKkjm~hN*l7h&AY3-4E&<4c*m}4Gy|K!}bi~88RG_^zc{!EZT}ID!Ym7e2W+L$v zAjviQp;H7OX`^4srnp?)p$!m#hH{U>I%iiPgwdLZxuo*l=i}POO|bDAK@`^8+U> zsAf2v6sH;oma+->MH-lLws1f-4lKDtP59(UR3nhcwq6+>cIo`6GL7>}^C4XVLy9WnLq+169BRbIum5Kn7$8sVA87pN|3Ezg~ZSp|hBk zb!cI=exN{Dct{$~9dsHscdhT?gZjSw8HLM!ow2hvqdJG~TMP7Xvr4{m!N3CZRi0!q z;}-5g^}BVEt5)eNcKFuF?b28D`d3bhGPlz{rFS;Uy(nNV^YIs(I0~S~td}|V3?8Qb z*f9h8zB79N{$`B$K-2!Uw}07-aNGmA`~fcf1;E4|uDuOR*uNGKGKa1zeCV5p?pwp@ zfHC-yobq3Y5jcAid*~SXGu5LX$&q5DdlyS-(#8*YhQQ|IJ8A$wOrA2WG#zJe)7NF!iG_2zOmNl{fhIj<)-+ik(7;n`>3!Pli4=7 zqTCL%lkLVbu51j4>5|L4Ft{;*i91_+5dMhbL?CUnnTw2vdQX?*wdB54leAexVK zW2OgpU98tAjwTFM4!O*Gb5>#MIioQ4Z_m!3t*eSYHFy5pY4ukxY3ja~D8?=uW=0^o z=aKWSG@|DYkqry>qlT*aP@B#4cn!8+{-V00v> zXYVw}md*{SKeoSO;sx$M)*Mo3PcIWnKWxFhkSVUED>;bC}t?E;#h zv7y4Ij$<7R73Fp{D{ksCj_lJW^r&3%6df`wHb&(M_)hG$v18IgW`S*TsYKJimI>&7 zzBO9Y;vO(g*=6ueKq|vBXn=+h8!_fDcZ{p@C#7zS`V;*~ElD6*yA28<62Opc+d?oB zIYhQ?I~YPBLLuAN2Aj3S1P;ic^S}f)Pef;ML;zncz}y}wI$7wC|ei5pEIP@9d#AE0cb7=&p4ftt0u#T-(hn4a~2y{8z|W!q?*-*% zYS^qyU9LGx$6{w`ayi^IOpuDlX*J!={*;3e6WU0=T=TMF%%HU7cquAFoz+L}~swkJunA<2(ESQN=NGQIyiZ!fYmS){{2l0I^cXh z2;CU#kgZS`plh)0 z(XY{wxIQ8l&jTQ%b@_^I>ALH>O50*RE^cWER#9!0x~X6TUpF5U8{eeX(VLZZq|Q@7 zb-knBilP5{3K95_A0v%qkZWQm^kk#BM&k9j!^)rij&ljfch^W4^lC}+p_-3160f88 zDeHm@E&+}(?4T^)W~lX$jXyD#KXGmh_cRCn9_6K zt2LD?&Lr7Mk@l=VTSnbwKqzw_g2ljQGlXU^Ahg*Ge~Co$%n*tp;6$kb++;WEx{+yk zx2(BmW|fykJ=|wBE7h3HPK9UXro!yxRAUa8L&ITwxXF_-TRcWg72cIc`i)rv$hGJi zHY-)vsbjI9`{!^tL`+bKP1A$)rw(^25V)bQ%Ya2E0ShGNt6{)N_{1~8rOS1K&tKA<*WfhlY&`f72AT#m$&Hcmn)p)0PJ&v)XF_y81C;YpBU19rU?775$$2S}sd-fp znl9qtRRV|ex!HZN;m>Vvr;B=~J~v-d02e^nJN5R-5hQ);#Fv+9eQ+ zwM1O|^I~xdYpTy72{_fvQx)Osr@~ocKzCBMHy|3*6l*^CNCR2SB_ef+D1`|moI=9~ zT9i1TGiNCabnmtlV1H>RbH4C?*is>ru~d*2AdGGLsd0XO>d>963N6jB+|2@TQ1&^` ztz|Q*%M&)&FHg`gm$F+Ev!$*!l;=-VoKR5acIdFojX-%U8v$hcN?ifF)Wq%G56=WV z%=YmgbaleUO)ER9jsD!t2yj<+O2z{2n%ZUDH2N~mT3YVr@l|6i7A?ltN4qr8q7DW+ zb7rzm_a0{g3_g`>mu51S@@s!y!cPFe${MU+g8@vbu4wuq;Kd8>8m?$&(#a(A3TjL2 zL&Ne|4P|+paYYbt!5WWkE%GrgqT~`SnNp@nmxf{vn9|dwj?VX>h$*N zfWQtf@6PcRtHUe7f7%)!@h$W%Z=xIM^@}aGI1OZh^eJzm8EEy33T?3@ij7rh zwX!HAYpf*>I^rQzq2M78p=PkVY8Gc<*uZpSo=k`}5}dy}g@2f@wemj0ls9ykZ9$XZ;Mog!<1l52 zYKk+$#yBd)7zZ0oacYY9c1C)Qchp)|+BRTcLy9jxQxY5it;)~sDFr-t&12?$fGJNX zCYCXrMIp;ZlY#8Dm7$&cLFX_T4Fi}_$86;S&zU-ne~7QK@IJwm*ECbS2{FdgXvTQN zWQteQe2y^E8-1c0S!qW`NZxd2fhy*}g>pf+& z<~>Z@np)k(f$Gu>pecVDqj7s;1T$+X;+C)7#zkma$DnB61bPSc@AB`MK5i&R{0 z$L96Zv98<2@_K>!D%stbAk7)EAkfrUG;u1QH=c+U-z-kuDC9|^+t~WnLWP0R$dHA* zh4NIjita>*KLsDr)E0y=t*I8!De_BOv9%ZL5)rRFz$K{ul-t#dIKOrY3$G9CJj?gi z8gDo==FifZzK}ml=a)_^KXpmgDw^Idk&w_7^~xQ5h6siwTIlXXdS|3*5Oq(mF0YsF zhWo?9uROx=3W}(hx3(dsi&s%>kZwqw*uy(6p{C0h&Go0oU9FRrUpXxyK`^a5k;3Q- zwuC_u5O830WdzzB-?wnrP}Q6Xyt^PyEmN^!{XRX+HtuQ4ATK;im)ST=>%`JP%iPmO zh>Dp-vqJ;Sp@-&zijb`8lv{q$fjV$k9c005iZeR1pvcF*Z-wjW8h~GGw{1z|3F_dT zyJ`_WZ&TWKajBVw!H_yeRbl`%016W9R z5q^*gis|0C%Kw#n1#u#bR-k_mzru4E5@2aM#bXZm`t1M;EzPt8WqC6R$lKv}X@A z)L7(fx1;%9$)3T)8#xbeUXmT16iGzz-FRZ;00Jfcp0Q)B=znAQXG1$x9U-y|s>;Yj zA`m&*LMNk%-GKMk-pc!~3w&fe74i24jXf;{>LTxE9DBUt9Gi7FTHoQyWX6uSjTss# zP=BAA_lxn0a?g~z6ko_%%K{7U$Wd#80OvfKlHcPk z@>zxJG@}IZQJ$=*c4yt;1YE!9y0EziDopJ}4dFAyiRv)|q}>>&52#pIprU4nPi9l7 zc2-^%m11LCn9x6?B2Gs=>u^-(OC&t|e$wY4cMaYX=HH+Y(TP%9mCr0wmPXmRANSj; zgURZb=`7i&B^sa(f*heDl3Sf@*p)-*0}iMPn{OHgD;tZWttrlUu>;o;bM>hI=_pq& z6QBmZg@;ys1(m9umM|t_P!ZUgb;Y z=_#8l8;Z#U;z2Gfl8J=OLOL{LKRP?>;+TTYoW*<{9$h<=DIh+XRA?t34a%|r@qL>^ zL!VgNqrdBXZ!)&YVWr%(y$cz^8o0L5JEh z8i@oXq`^9@{smy`oNmTVM;MPu4=Wn)i6Jfy3{0PcVg2O)U3N z(-!!6`@MbUOqvBv0&AY|qdukYGKppc%`^(dK!qFdGTwWy^tpjvbE%B2x0^+$pn0{w z7C{~7zgsSRSq(aqwfoxV|GGYtD}2k&eNnCw-`Y10*#&6YPjt-KnmT4`k=P zMSZ7N>CEKvV|Yxs2Y|l_wh)GwU^{gq1?;;OuSmAKI7 z;d1^Qz#Gmnbc+S8_nL~_Aw1B8E?S%;x#Yy2Zvb*Zo+jzRD;F2AI+jS#;WV5oe#S~w z=sS{2%K!}~acd7R3U(X=3w@HLery!-WC3b&m_y5OE%^+cp*m5S+E{Dt(D;Xrh4n}P zQ!Ft$U#t4*H6d|F^?dLAry^c6$}6PXcXJ?WRH?0aCbD1y+rS$peC)#2m{Mf}8bE(E z(n??2Zcn5&J|+EMD7Eg_{-MB3e|0jPyUmMjPm;q}?3mIfwE1Hc_Ie82iXvHPDwy>n_TX z>LS&x3gene5fpwvWmxlCkAO|NGx*U_4&+AxXr$hj#E}$P2f5HffXfKl$)WfF{mP2P zjAW+&=UC`pz9!zGMP`wasWYi$8%y2q5Yg6n=Gfd3!`x*|!5G!SzimKA;_C|Ig!kJC z^kh!(GxlwM2DGZIIvNn>3;W83%8*k2|5~4`==;@5kn)c5D>mhT3j=N@Vn1w0Y;J@) z@NTp;`QM942ECN9O`6Lw$(YyNNE{8P`246d2G6LOH-W^*5_CK`8Y;;J$@oodp;h(hbsv}*M|1itWgUonYpdqm0kHf8Qu-ZBCJSkDBw}svY-60u}m$$&A z4%i6u;7873|D> z7ptEMwg315Y%6eVzX_d`Xha`7_M0TBRt0RB|*TCWud2_qdoKDNAmO6GS)z9W@?(1kbHFduAZD?ZyZDRIbh0R0Nc5LV7cEjtb`u2@)5ac0bBPpmG z7~I{)ANs}{Z?f^GnrbSj7tIC#0)%$KirH6QR1CXg5_f}JiRk@8JvZ=;H`T%;uSwiP z>yfdJu9*S3rIvfuN~_j7^!r9u`?0qt2S>P*-_X>BB*xBu*XvB zUB0P;hSqL6`n}J3zk>{n8-$e_wcD1qYx~BxLlZ#i)N^9cuw5fW8jbCaq(;-GjBhFr z2F)8up_3#X0}~5-a|{;`pMaR8r7dqI6#%$34YpPcScDsDx#9iW2onqIw)wV0IJvev z;^F1nemc;>4t01(I!TI(?KHA-^1D#dMI}z(|O*M_h;kST- zqS7wYm9BQJ>)qJRmU>#+dw`L#n>`uU8Gp=iVL1C_>Ns_hkKkW;X(43k58@^uIZ6uj z2RW*LshZx5W;WDtvo_L+jq~8mwrwZ&F3Z>)w&Stww9s~Luw6J#pA_?tyuUyCepB+f z74YtrD`Zi{#@=;Z-wmXS6z`S>Tehi9KI?98xjXjn$LLggRD4ef^c^I`JVAYP2a!-D z-YK1R-bI%UKnUKX_oiStv1N*3x$VbyrPgS7hu&bkPiF4LYO`;la1lHLVv~?jP&bXH zH=~)&YIbvQ@$k2xWDD7%O;QiZwmhPsq}u9*8UWJJZe5C=fpMFBn^{=dwjB-#=XTNV z_O!Qs?cZoiApt>A2C*HFBqXJFy0$a2a`L;7QZzE8Uc-}_V=2p`XjdWro--nH{*$Zvk@!JmeR6cGF+mY?G;&$$|U2qykTOaM$<67ru_Y40* z@3C)av}Lrs6|HO)wXw<8v^=z*A55JeU|P?hW3ZuN8$Py;TqYDDd~lyB{G18DXT*0R zC6aa#0Xo#K)C}e(G;P+rMax#S5Zg`3ZqdQgJ*14Ve9w_ZVX*hv`f$=Q*%!H*AB*pU z!-u{{#;j~+>>Mq%+^bevwPpp_aB|(ZaPP;G{j`5SZ+hWB0^g@I?@~l`Un3?Vxl^>z znf};WIT2+=u;N_=zN@{}M9{m5mWJjYSPxBf_4XVKGG)v3s+CrI-QT;@we)Cae*Xef zt=i0zW?@TIz0nj72iS%T%n@%n+57o?zMtP%3kWtvO>K{+HFBpz$eRn%_JtpR;vJB3 zggx#)8VN)s*})5Sh)^!1J6w)k5ht=Ml1uJIVNi68SaFmqK6<}O&-bfZLA}$}8J*c# zo!vQ|d(VSLp+wqUj1r}EyDX(#B>k+2-mh&NTG8q@J{sulc!W(dWE9j*6FLUwX3^~C zG`D%pCqN+~BP624pxWw^27o9uTbrVzXV`yL|II%^;Qb%`myv1D(eu5~i@ns#eZ)}^ zYoBtOnWfLUz{s{Qjql5@fY|pn`IG|!$H}#cY7#Ox&!&OS%ePrHyE)BmUh@g~p~Tz* zE#0z(wnCJ=f?LfaAhflcbiyM3Br3N5>itbzV*dmGl$6^4iTqbuX3weTd!ZM5sh9hR zqq1^NNXqvqrxg_U*_3m_O8dNAkXGK8X6wtYNUH2>@~P@kI|EbwYWU_na# zzV>%OP)1fnLb9V`a`HQw+9_l};F(|Od4#|ckc|okg~8#7O{r-t614>s(3oAOD_!kc z*SoQsE%opOeJpO@B}bSb752Qg7naTxcbbwZDJxKD6$T67@Eb-DLFJLCHpA7_x3pHR z+jP@*w=Fqg;trGS0Z~J9uRHZ-Z)e*(_8tfAqjS!<)E)6xg75pvCBdl@53dG@ z(2}n0x~}gAQbeTP(tFEnx3SxY?T-EXF**6G5dp|O*Q2*(GI=4HmpXefRdH3KM zq3inv{j&SIzhCvh9&BkyiV5!|dtex9dXGd#i9Fq(#<$#OVlVdBly67O8Jv2@KO&B_ zzr|Z#=^$K*Tp4U)gd|DkBS_LzG$84w`(`w=p@y5ak(O)_$u`Djuefa|*>uIu`4AeFCRw-_0f!fxGdy?6Wm{TLU} z3G63%sZ-K7sJvMHS^}Df?WLU~I?~%Yrjc$=Xzu}U@@8-GR&SGiPC@gyk!LE9dHNlN zGlHi|&*pI*%rTw1Pucv3cAE8VGWEV2G|E@7ThOXd(e9u-yQ{mqr+f9uS87PHk{-T~ zplpu~>yu8&SH92Stcs)Z`+;d#*s7tpuokqiMJ*=5CfkZmk2(fMnwEsTDKr%W6Kk^# z2N!P(Xkm+5+>(}(VNwCeDeih0HdN9uBPP=}!{R*azG!*r{mlHdeXaYau9?k9r$6RMIe`X&bjW#iCH8L;ijQ)=){KZv>38HlulqmaSSdG_g*qYs5tN z3BA4Se_RdrzUe^j*aU|+-Ga49B2%^sjn3F6ZMEG_yX`gLgOGp>HxY`&o2Dej(w#+e zx?;20x>S+XyOGvPQfYJsb6cJbaJUQ}Um)zLlTJJ99E9LadSf_2-V5!rWLLFn-O-;T z3A3ZuG2gbfLmYQvyN$<5r?#I)JJ7)nby&n{XLh{zP9W*5b5fR_-F7c9y@3cgQ~pe0+XrCX+DTMj{? z6BLN#wIU@a6>ZfNHAfY1b=GeIQeC=L1wii>D1dq@^#{YZap0^+(`i8J& zG4Vd;xP;_BMW607eYVf_`M%(yl=Qw*vajNrjI7TE<@WXcZpbU_TMPAVcNCTO{gemF zD)+~x+D|=GQ{T7HnxO#OKg_~3`@BUcHZuFvdSPxQrCHJ^Ob@ZFE@ zcCY(AF!a-}J!xrnKi6Ke<&wSHq*{>0qjV;}@>TI2>ae()`c5IOp}F%k)Nmt>HU`(y z-c;{RgHhDkTnewKy9<$`p8l>Z)KxV#gWZs(;W7GtnEPH>8oSvWY)#zm11aT_IVZflbZ?+qQ{?}Nr@Ma8@kmuO=HOrp};d2EAvgybL!;7zFgNG0VR zL`X$-Q#9R7v&}W{R0$%grhZQX+v$=PWR&1Lo01bm_<;~||JZ0mPycNgn z4{BZO+t9`a+Qcl0WfR46Y#6R zmM+($q^PxyqWA0e+}dtQXGeTfO*hkQbIspR(RHDux33U|>hD-e+`Yj{MDJJoxm9kd zJFPs*hDLj2#>OUQrqq^t)k>?@#%4A&dT;lx_kP-cf5zO4h2ZCMD6S)Z5(&Hqy-r(r=3m7i9vjj(TVRCbQsIhHh@0?*IvAR9Kpea*| ze^X;%{plkw8xe$-oiK~ME>NVl^JL#R2m`%BSlz0g?*(XZZ1{|r)Cl8IF9o5rpJjt3 zCA*5(c{@$wT8qF%+6Ye!1n!{~ZBY-g!V6<96J*}+#ljW?9V)YqBoQdsr_Wj($NMB3 zut1pjW2!hi*{1dfw2#*A69!Rm~HE)K*nD`amqxBj&*lG?&^gvS-Oc|m=wkM z-?--?uI>HxET4$*td|*0SYN)p##WG5i13Av>U9F04F16#P;0>FkDpv`?Kz_Z0!n_< zh)!}_(vNXyebrJ&8Qep%zI}FL7Qy&E3G(AtQ7gN9tqGEtMTHc*ylYhB2mN_;@<3d8 zrzsfyLF`bApmxy2v-a!BL}>Qv_T#l2;S;>3r4mHb?m(@}X`FHCV?zi7MMGhRGi0lk zJm1ts42oyQB$^J19OZ+xM;Q7d4|@t}GA3%URRrxci7KN!%GT1V`n&Q^f$v;2o5%&QGsAnXL+*J@X6Fvl&a}zNon5DOb6Y}!eslC& zF-~UVy3IFN%&P~k0V^907=oRb#wLn7``jF78%TOvyB~PeMB^9SR+$RNMUf5d*40uG zPfg7USM%(8-N)^1v!t9zdDm_DGn9_yu{?zb3iVs+`BRtxFejU9G+w#LruU2x)JpGU z`StBvudxqCW?mEJ!yQMmJ1OK>obxc4@i7;nXqZv7A)pJv7~Iqy0~d=g;NHO`0{f?)~i7ws!zYl*a=&fGw8r z2C*}B_wCPlsdGc{5=6^s*$wt53hG5W56J*VmyH6sR|1@4|67f!2Dn9T};M+I&=l{W-<$%ej znKo8|EhMlM&C?p;7nua(fnw8e!XHl5pe-hxiWsNhd%y#KcDfD%wNO*^!ZUAP_}}f6(e(c&cebncQg(0>$NGn*VWYSgmzMR|&BPm@ z`yKsMk+k}mWum9X-+M)@S?ut3Vb~qoc{V^l<1!Y%qALHh<9W+`J;gHd}0vrVqKF7UVVtg++_mWSQA7EDU z_?bd=TGIV`RmZ|oll{M~RL}LNn7!j*j`5ehS?=(+Yj;Uq^lOA}>o}$9dl%2WE+Fy` zQYQGY&!aS+g7I&7zV~}AKuG27tmqgKnam<4_0AK?ORpiKFlyth09qTyjH5em%fQf) zY4SUy9Psd!J`Ys?*p}bLVX9oe*?Qx6x6Wr#k55Y!u4x9be>Rv4gtK7jl0ZZ~&S6I6 zNrk7U*LFa+%!?Ye7Zo1Ei@vr;aC?_pOqPg;DV1z!6guZwJF5byyO<)Ae*Rmd!utD^ z<~gR<44KaMOWfGuhi3ZEmBhbtP>6rTxow1SR%*l!cGJ-ZD;)l*xuyzTOo?T~ z^6@?d$e6F3+&T7p~7Up>#`GbMx~Xh>jaFE)$?Z1gcupD3&~cOzyfl^!YizoW*WC z2Yik``(*}J;7C6Imfx;+jBDiabfKusOljir;c1lc#ub!iedv_h#)nu`Wxty(@#Y|k zud_Qe#;dYJmioB;;?Zh%-y(7Hnxl@POp&O{WjBGjpTnNJ0%yd=7_ts2xEbV3&qVr3 zYTc%x8JUIMRH%C)@s*ikFIm%9BkZ<8NgXh+{EmAqMv~Jlih5kHGg<>bJ;`tL+d4DaaHC>uyB*`vu)WD+yX(L#&^qnyG}3 zEH@2U4gOR$=h@j=3Xc8nqkbuULSYE$SC5%vz3sH2wiPFoPJu5iLps`d z=e~x8d<$;2mw>VkIT_Zve%zI83;7(88p7x?7zR8!E`JLCE_C04BreQz%WsQSejXU| zHSL3my$J#_rVc=K4|PKP`4P0Q93WcT|Th4Q{edxSxqa`DPLH7P0 zwTlfujHXQfx!9nzc{g*~VU#Q?j90*S7}KFG!sF%3XRTd=8LLxGM`dH`p@7}7AumD( z?7T)vyP{OC@gY$G^lwhsSqACxu_7p~b!Cl&!tF`*ba&P)AuVubmKOQi5RLS9$&yZi z_=%{dCnbqul|Y;}-s)-fiekB47*e#mbQ0fFhuomqE2M!GL4jIlytOxnO&)o4Igte9C!r$k_t|Ku)<~ zr@QJivXLx}i18}(gsjI-p|ppc;k$<~qtC6-Y{txACF`n#Bp*H2a;woqA`_6U$x?9* zv_a3wGI6cvEI%pNIr27Eky8I)s6aX3$+&PZ#vR9uO=E1S#m|lRom=U4hQLAeB9EKV z-h;s~X=8Mlq~z#58^Z_ek1IGbosKb@K&h4oA()H;1-jZE)q^!WZ}|DPQ)5cL+E{J}nJ>mR$ga>{jfqLhboP}LKH&Gz+>-l! zv&D;SRte2(b=Pi$$4wzmWb9L=vHcXApabuN_rii;E)YJ^Hn(wvAtB@LS!MWzCbvxR zn3mCXnD*O$5fpwR8LP6g%#}z5FdOfXspV>^6?&#pD03hqZfFR5{O9!)SXs;j`&zi% zxKzon@+O7=h0Q@M&zIk_UL3Qok_Cn2kA4~5f*eI%fyDCg(Qvh=h+c{2s4hx(E`qJ5 zd;QXAu}F$LV)|hW2P8N5rcA@Wswd<^CTi*aUTCx{sIwq8p--N&<>?Oj`)!2i8HlU``! z%Hke~Pv8v9*HMX`-OeBb(c!Q<;hE$lV7l7s;zDJ;;E(n zl~5yMjgDLo(c5Q-X0)2XFX%jJ{R1^X%CVsFiR{C<4!HsIBh;rlqZ(%YxeP!FMlU47 zE8$dK&RfTGWv@kXgDjVOQH62;s*d+p2V@Zta%6^SPV5)y?OA(h4Awx@uZ)b33#7goYmE1jcD+kl1RUd#-L+Wew> zrtaGS$M5UBY+f7SpfEOPD4B4Tbb-kpGX^KJvxG)!@s%=hoR(a&1}xOOCP8u_WEs78pMNAF$$Io{cQO1D+bC zbNvB{f}QRnszxOxXP*ewr_-)YR5&)7LQRaD4$WxmxP8i)V7D+OGUyx7SuNsjW*mYh4m+wmr1#=9uSlh0QPO?WQ#%$A#os%WMm@cK)X}4&tSp^P7W_(uM(U z*?~KU$8VPW*SLIbqpeER^sFgZk8hsPA3yAyO^bifyRtn8lh&0@3^o%~xo*LAbUfgd zc`Rfkp3RxmHt~;QVx9I!rB}%G*y5&J*q;w;eP*97^!zzr<(Ppsa&1W-gUd0P&!f9L zuAe;QDIT=&Lb>u60o6n`pkaSAxF&M5BCmqTC%6|wkXr$?H)99ZjEZ%%EqE&)U4G!W z6skd8fBTI6wG+yu>QLX+>9X}&tAepKpy3MLYz6Sg5YXNc0Y}kL6eH){k9KwukTLBm zng~xl#dicx>%5rAu{?-`nAphvQp)s)hP!euk zJ!abb#Yc3WWTct};`h_ySj6@5JDidD$>qZyi(F+6N8dtZuc~ z-ylkAnxzsA4>HRtECbnu{e%gp8>UT9sZOCMgL6=>ayz>UiD@-}?z#YW1q z%w^TU01~-hm4ok(-S$;BLlgHacJ3qRwB7b3kS3$3?cB~7 zX>5T(nrXEHWk~L97J|7Ge5Y-yx;)zQnRy{98aMq;0>c_L1@dt#`#22Yk+rtD^Wm8-q)UOM-8NO7jj1HtY+LF->V}^c#D+7CJGpWmSv7odu9< zSbLIn&1b!+&kB5=76Yod$Y{0Tz|IzV0k)@;BSR2GLAK~_uz}e6O{8f)?aBm-ZfZF8TJY- z@#4Yu&=nTiz#I1e$QQ}+271n~aYX%s_-!Mk<=^!H(+h?klsO?pX*Br8%v=-P7Z%o0 zSLqjSr$Z(9Kb_-7Jhiz@|M zP&xh<$1K@0M_Y$;53XJJdVX`gDnACW@oLr0!bz`&zDmqL6xn7I1s4&3{c4~7NxNVD z&J^K70U&J6e~r-*iO(`Sdh$chzWi}&8E}G#SOj#hQG@Y2{yJxCd{x2xZSLyFaF@t! zyG_ohE`TdPKflc5TA8exwIs-^WvL|T`4P&!X9{gb{a$a$uA@C9==#h;NsS$vz8l)d zWY%U$BXkCjaC)NHE7z+At&YznYFa-zI@LT|(55u`@!inGG0XDLs`y*4komwz0g30a zdFl_0oNUY->gH-{qKXP=U_53U4l~UtYV8lfvdmsNxe!}^nFhUkE|gkpJ?xSZj)|cv zxV8NzFSymFtRcDdY#t3>Lro96KC}>IGwf|Qd@gRx;@d_s0^R3qICb0g(A?9^*{--b zGjMCU3?NJnhMn|9*8o|*PhyTlL_7;i&9;1{B&v_32WXHJ0@Bz#*8ZpE)u>90o6ENa z9f;jt#7iePM}@JQgQd+IUYPq*HnV`R$H+)Jz=y_vyk`I9$-%z6 zF6{xVjA(F{!Sq^Gw)!X0Z0FKo<7hAs7hasIY)X#aB)Zqyj-K zd`L>(3|`ax9!chfXB)3>e9iQ<(XxL#XfifnSf3uYN`AX+bPT;qWWz1B6|aAmVyYYT ze&76OP9!Djuo!dWGWfiBDQcZ8#O*AV#Z(SyLAX%4tO=ZI!=k%fEOwsza?AN!>;zv5 z5I+G~?e7b<!d?M7s&rkRWQP&B+n@c_6rF+zQzlyL#GeYYYa$+1s%R}qo zPWW2vdkPBedD2R$?WCXh^5#t`sP*ID65^;##)|a*RkiSWH_y$?Zl_%*5pJk-Mp46@ zEaT;Sj?#(~mhXSk&qY2vB3Wj9(Zeb*`KBncoim_Uttf8&;@x9Bsf`zR(Gb2A@VGc z$(0Isj~U}%2nXCfNd2O-?hmWVeBEWwRSxGW-8x>U`yQh?vIIowJzf78FPCSgEj-*? zfZweRr~|Oq`Dko*WB2KYK-N{;=L`Ye!Zm>gkU&8H1+w~_Fxkr`Yuf5Up>ZL+#6{M0 zAt+3OI_aaB%C)y~tVg?YJJ#Cr+FLLhMX#X>{3D z9_0Bo{t#2G=&tM%zU6`-j*-dGC;OLr^(0q_*KiavKB9_X3ZhrpBGeuvqA}zp(R?Mrwp> zEKFwlDCjyN7o)V@DWqo2iPuf0?YEHY+?UWf#ge^X)msW2{Ck2L8qU zMA6jZx5|eBFG(UB?O(VrZ4t!qx*}mOVWkJT`?UFMXL^X!aJ4oWX6bm#{|@_3ozCdv zr~R|j;Cd(roq+doCNbg0M{K<&aJaF6Qi|d1F4$vWYwq52Ewx`GZgnRyxYKMLAt-GB z!BY^Y?a0`68tU?OMxBp~hW*xlqvX7dV7ZRnnxy*Z^PkBL-lYvb5VwPqf=cX3mM7t} zqV!LHfcPIZrU^<6`fE~xbUDlSF;>^xXp<&0xzVThT)%auQkfs7&p<7QRR3J3D?xV; z6r+^^ffl59_Mi6nym*u!s&?^k=oi}i-h-+t%xh}Q7i#cplTOR_dDoBhuaRb+k*Ac(U7wjf~KYoa!EJ1$M0DSuKvcYU#ld21_ zK^Thq6Wsxc?TCsR$m$XHbscM;1){V5>Yk6hH{J(-2==Xp-F~q&UorL5!Z+Gu-P^5` zZ-h9HJwtC7&s_U`htA)HzDq;BkfPtZPpEmcP}Hli)FJ5=1Zk4O_RgEUo(S=3E=?Y0 z2uw(%Oyf^c?{0CNqauMfbF-3qCNg8NsWF(RrZdRdU=)B;QL5fW!$Cm4NNFuucbrNy z1qtu};fdg|$8N$|H(xY0BN5V!jkxwOJF5&f=Yp~5`Z>edxuZAn;he5pyVeHv+E(tM z<|qTrgG~c$+J)KA3VlpdkXg9zm#`zg(=XX`2EGouhzXP686SJr8yz(up_&H*ZLw2F zt^!?5M?aG$NF#@D-N!_sm>5Jf@(CcCZ8}udutM>~-&d>R>6h!q3ITD6h zTfz@iM{Bi*`%<2YUDK%Ta0wmt`!moDC&NXxE)TXY{yI+|x$5VJ*+wQ~R`P`@X|kHPNpc8EXW zF|l$f2C+x5e-3b_bGwCR{L*Bi%Ba&Qf^8S99g}|Na7y_lu3zt z)Sk4;@@|T?MtI*^B$s9Yajs?TD0T)*p+P|`zVR%euLW%J`346DEDFzqbtpP06e$?! z+?DB6N15as=r)B_`KZKhaEH(-QgBO9jMKRjsK#@O^+C1P&Qli_pRG>5VmCTzE$;Xo z-#n)sy{v);h;xm_|Jr{PoxV?r@t?u_p=r-XVJOPvWZ9FAF>6_qNFJvzbTFq02L zswv}&{A(p<{BDSVm6=70dIw#f`V_g4cSkr75yp_ib4XnVk!!Hu*EkkW&}F7sEr06`xGM$C3D=9d41*fN6wMXTR=Uc zA5uL(`U&>4LJr#K%RP?TcrU^FjuxWy6;Oyk5}utIAK!Q$FBajropmGa;Co5xMvTg0 z!laJI;P{c6G@|JOyzf7O7AhJ4&OdaTOd*ASVnF`3EDR-f=yq8nQ0}3Z*n6xQkD2qz zBmEuyncn@eah=mt`W5f*#`zzf$-JMn($KZ}T{Dw3H0=H4&eSi2sDqL6A)6#CV|2Qt z;sl}=3WxX~J52M)L#Ji$>t!5q1na4C03I+@yj+WUQ^KqAbEZC@e>H&-AL6y!M4BBJ z(a2w5y=+4NQvanCNkJa+FX{CU?T|_|kCx0Lt}HCWoe|lE4Kv4f$5PTJI>I9{IRbIZ=B{9vDz!+UnFTE=i|1MS3(30-WcRC&SPG^9Lq_!h1~ z_WjO4I54wZDXnG4)r9Zn9f{a!dj(AC5`gC-AAf41c-HsHN>{M#?p!Ia}~>CGZF}fh~sK!TB%ju5ul?s%woRw z2zxbNjFS-r(Yf`Z(y7jxoKD%23R8R2Mi-x9=?ZGnt1RO_hHAs;86zS!O=^ z*2iBh*0patF1!zqQbN7kj|A|vR^+wqttTS?+QmeG8aB5Agl7ks8XOoLw(jH71r}C* zYxkl7^#T7WJ;1JtH6I`^m2D;Y64TeoB7qU=qm~o0w)K>=8k3DRy1H$}LEkzj)j`g> zZTUgTIwzIE3Zwg`dMG#@*DyueLymrs^mt#O^caf#^e)%7l3xj}!Lj>w%9!ZeouQL# z0s#WsDSfZ^bl#R26h3=kWm{zJnkXEbab`Bp#B(3TAFq!cfGF}a{Pm+&IM)$Pqc>^O z-rdjwQ@m#!7txA$%by*Hp!#m(XzR!!L)&Am-jwPmhZ*;tJBcGI$Y(W5TMZ@9lv z3SV2VilGrhba7TvEQC}wDS*Uw6vg)5i^aQFe4)vRPI9Ame{*@4uv0!9{jl=u5w&VbsMcO5qT0`C1&+d@*>{0JOW z>N}2S>C-EfDTLPrmqPOFpj(jcTk}I_l9yqqq&D+YuS3)d!bORsBVI5w?&LWY!&w~N zXVOcZuOt>+K{+A0xD;{p%6-xsuoqP!R0zQ#duOX5N7T#s&0S`>!QlH7WkZlD#J!UyrslDw_p@%yjQzj*)<5tqGLWY?T# zli`T^DXRR+!c3nQJi#y0x8C6;$zS|+PR`KLj+h|0?xK-eo_`2*%GLhUHIyZ@?dgVx zGjn#SC6rtlyC=I?pj~qI7Yx=T_1(??F&L3uDq75hR%Dk1UBmz*9oe^)-E|!X*IEj( zb$fzbdx11|w9xpx__S(`L8wFFRB!!8KtT>v&pspfT)i1a!(;7SE%YCKtl7X^U$@y< z&@`k&>!=Xs3?Z`90D??H^_Qh=l~tVpm#^ma*S8VDMc;%<)bnRD>D`l4Khe_c0Np>nnDTG=&iu=Y+iTOK^7RcWJ&1{Yx?;Z|$B z2;E-%SsWSFyHrV^=-XMU<9%-uP>lDn+vocWrL9SVopDM0$zjYWtlS{qvqPH zXjF6}y%G{OnKZ9e<z6j>sXu27Pc@!Us4x8fUg!T^>p~ z=e&Q0Gxz)C6S;CGlH8!>-Xv`Hy0aICNp2?f4hwk$ngi*C`43K3yZkONkCo*~5IGdd z=eh2rC&A~AkXNE^sMZFel9TDgMV<8}13m?D+?nRKq#EOR?5equRXu!PUkFF_YjP8! z@sCpJ>4G;&FIc!rz<2X9+u36#Kfn3#;I1J;2$&%aC&<77hjkl7L42rf(_+7pAa$1E z>$s`#U~>Hn1^;o0*S(L$=;Dhlj0W7Dq#^Qw_*=FK;=) z-H6{agpB}mh|y6eGW7T3^Ft|2_WL2?DviA(pU8C^qc{E$`JYIlQ5aP7cHp_ys%|xL zKGFSmpU&oiaty~paLO#tX`fD2_J+AT9b&IGG8|@#c1;=xyD}1co!+|oMHej>hMz4? zRCmq>Aq)FlxM^YxHV}xjf?<5Vm~XG#E6KTB2!wVM9MN|%GQTA!{zVmnwCI~VD55o7 zk0_aGpm^avXtED4r_2&hWr~o7Ud;$77XSNUw=f)csOog5`caoE9lMfKowiAFj%3nx zlN$_GrT@p?PG%qNQNnIO$zfMQNVgI3yR6zuoa+-At@P}7osKg;9#zD-aWZj-)Z#hN zhcalXFY3E;mxUK}>_B_pd-6`1RSU{%TUL$NxkB~47am`pi=4bEk=bf4dv9OA6(3eV z`ML+r6msWmrO^g#qf$<(aInOSzXagO3(5N8=PqIoj4_BKEXO=!&h)4WBdC0 zX@p&3VOatt+1r_y){U9yp(A8MKgPf3EH}gm5Xj9)5 zIrvug4S7&O``0PScdNl<16rRvA#%d3yGgq9QRb9}613OC8(+dwnH6`i>TkPYx<-`b z=>;1iwVc#&m~j+~y1qkxeRO+hA>NXTn|JGtPCz){wz;JNJzLrA9diwzoCy|xm=OnN zE9Pry3HDXLj*^}M8kWRP;m#tkksy8>?84na@1Q>EY}`;cmWov3ibC-E&Lw6am92rs z621v+GflIl69V42IE{6k$L;m~S_w4+UA_uv|JfPxGPi3e`kfO$Q1<`r-#zAghVmP^ zv*qa_>0cO|0SYGQcSK*=Uy}wtkTW{{)H|g?wTTL zhPwT#l0H-*S(?yxi zUG)A16C#w`^NK`q>_M}YkgFOWPAC!ktt@{JLMJ3$M6}NIPI-NC_AEspH=OYYSr6y( z6J&b$Rt7&LpO+4kiV{!bzKkFtWud5`n^ctl7(GvgBb71-=DU3EpC$mKXSe-OI`FB# znIe2cCI2KU^cs7Zb_6=;1J{hF{Aj#ePJ!|p@xh!+LE&J-x*_>@C%yslaXU;Q0dSt# zedzBS(7q_BvOa8ZOc?wrq5K!pp&-qeARFcQ79no*K0KKFmkm48^n<_;D~Pr z!5u2!?E@(>qqmPEHsZ#d?0Fj)m^lV1>t}z5UcL8{GsX(=qkvas?A^9q7v0x=rt0JK z@f=M`@)XiaD~o!VJSwNGB_6w4aN?b_JaL(P z6cxUR+@cVo*RNleo^t0~oE(i1udl;L6oYheD^O^xUolOHMD*3-Y#kwYAr1Fdu-}wQ z)>M<(*&FxUI(?0UekrAT`JRtM3w6#_?RDJP9f=8_Njsjg+<5)0)pAjL>T)&_lbrXX zzoPR!IS?wQ9-DAy`XA0R+NxuvE)#YI|65kt!HrR1ZY-7i+&oP+N90Fnm}i$FhmdB& z0*A<>1AQ`nZl=TJ2u6~*$cTh6@Rhq9=hI`Sl0?rmJEH3k$@}~(4c9vQ>W~x8xByw{ z)o9VlAdubzK;~(LUt?M2>#Axr#|-n{#7Ssi`{Bg7%0cj2G5&`6&iO$gh5$H6UYG~A z1=7j+UGcxUb9OVJ{YGBSf|$P8tO`-QXj{643`{M*T-Sa6o*=ebnV_~=mwWJimxKPY z4|@J`*N9Kdjj3=lRMhk5pxMT+^qK+Zl=X{~`bst#iFg1NTD<;})UDJ_yxga*b;b;r z4IU1l^C>Bv(S1H8HT#qe9db|dXTM;WY6c2KWMU=TpRujw{TxCEQpnO;4l7NVJlD`t zuM{-|`fTdItA9ei<70>Mu|rP#N^b#)Y7uyh2>WN92LFE)tRX`3F9pl zyUEPxg0QZZBLwsHf9#E()@@9LjLkCX7W|EX zF|m^mZ9iU%d|kCDJA?;VD#pd!Wl|6i<|DNi>rnB%Bs-zI$NR#*vR;GClB$D~!ho*m zNx+0N^y$LCpd*ul0z|aeCn(%jNS%xSBft?NL@_~kw4T)3`h4H~xE8l3K` zt!w|GjrP4omR6pAoUAETkrb}eSP1|<4mp=w_>3F;b!aSyAAcDH9lOL0&H0)KN!CU~ z6zPs~OAZa&w!MD#;@79gmUa+|CeI`!8rV5`?7#dk|1hfHV2|!x$Ea%<*ioMk1slj* zw>@ctCy&?;iZl?<;ViEkC%)VUMmK~@6os-Ml@c6}mNSW0bT5aNJG;+bpsQuMkH%$P z$y>)Z5Q}dqZ3a1^7LjYCEgn%AgD?NGElAe~^lXL%ih_zmngY^lNnu8)#qYII@S*tu z*3~hPV^#&t|AGCcqKPt@s^@>(S_Sd&>)ceb7fwG5Qmo_VG$S>~5I?}59&Quual7mV zd137Kb&sCrEBu<|XbB&~_Ei;)esiv!Kj{4!ESFXRJFPsI3T#Lub6!%ASB6`sk53jo zA^PLGI(pjcgJ=By5rkc}juLr@aRZaFgmJ1V!(tM7He=~i;Ld-614A&dm?OHb)(qoJ zE5;?4^fLF0Vh0akAclMRes$sv56$$KHn#l5xg`ZRatAOupKIhtU zZQq^w+D{_`8I8;P^RlHoUQ9uAw@fgWZFJ`=I1vtnc*@n10*=GCdBD@62RG3b-i%PC zbdO0_fvin7ZO9A=|8jO4WDVKtNuA#TNo(9tCKQNlDV>x+CnpO1H^x0!v-{sSbgo=M z#LBCW-lmWAd@-RTjVap~eOTx)!w*q#{7_O?UVPj6aRXEJm0?d?$5>tZZ9Sf9<@<>) z>+J0m&8$xqu)(5`&E^beubJ^TE{$KO&EWWxrXKpbsSSi-GX(|N^9c3EmkOK#n{0-cOZ29?k# zxEQl{YFN0vcWO*H>&H}99C^UHT7Z*4^oL!`bj!AF3Qn6H%jOSIiq($x?#_1fRb6%E z7JhmmRv%%(pCwZAU&`%)TgK??bg8Zxn#350p`_=XnCR`bD15M&78#V38@D6# z{s+faV@ScI4lgg!zu}%2^{;`csG>T99})_V!D5Lco!U87ReO4u5gjt^PP)3sK0iio zT;Oh8$!O4$f6&wbEh|hG%KhXx%I$3ccYtJhA`k&u-)uZX-V~#emRbEn$z}yH?J!!q z9OX@hgU8peezmw_xxFJE^m$$Q?!~i6zJO7&1Eqj?i|sJN$rX}~C|(MRfNLRglCP_C zw2t?qt}1eJhkp$I7#XJ~$dg2;N%0|sO8&`e;DOvp&bb(N=6YV3o?;2_EBgDyD{$e% zp+LvLTvwrj#Lnk=9Zzi1lpFsB zB&Qc&gERh{F9JNd#avI{+?yC_5{z^d^9{_+Vb`P<#{FNU$z3YH z!=|K}<70XW(8vMO1Om=fs&<+=FINX>>pBOP;4VXlb(P?dwPN1smj?mgv)TK4UIKpn z=WA=r3HG!MgBe8_zxR5;uhU(wd=LQ4VL$H4a9D_!GqkmXhEMZav70;w5R!di|9JA? zJ^elHyRDDg@Jm(ab(gzoL!YsqetvGp%c2P!q;%{dObqovdkEOY4{qhnyY9w&m3d@(Q+Wt*r>Uat-TyayflBMj7ay@;sFr5)E7s83!I$kT zupyRhf15VFI$C9#NPg;?gaK!EI2Z$O-NlTO#$`Sis8)o0eEkaU9M<<5g;h-W1qPaW;4_?55Y+VAtW$!vD; zS}!it3Pi6Z5q?B?w+{>-9dq&O>Lh^&uwmrM0h0?H_D#3c#UE(}u>wQ}JDP7SK}wW+ z!NNkXJ!z;Z)||D%qd;D~GMp$*Hln=*x5OB|v0*+{3ev8ur@8-*m)6Cl=B=KcfrLFE z^qa2i$eH2@FX>UBh2;Iz%A${t_q8d3mQ86CjvtW0!O@ui&1e{{t3_v_AW_-ZT=53i zTcxp<*2~K9#L&~}EG8d0;&C@8YD;&1k{V6q-?Fz%uyaYaOx%3_$sTm zZ9)^n(&SlQmWd31R8qh%FrQ{CdT^(+&Z8HNXQyp>z9%de6ZON6XR6>WoI^*VaU7wY>BCmK zY44~$#%<%Ap+0M>sOJ6MBj&e%qru7bnH|QsI^S!FPF0?cjgC1wD5Nj&i=+f13;^VP zF}K%Ko&X5*-}?IPg#$MA$(uJ2qJ#aPc%-$Jlit?LqkhlMYwwVRpAfP4 zjua1mS69Q>ynYWhQSPd(UL{;+HJ{5!2U(VA@7uomS?Zw9YTFHE-rWU!&+ zQ5D=M5v!?uewbD%XJq*F*X6faY#XucmKC(9yn6MDh}HkGKpO<7mi$DsWQ>X&V)@@v zg1<8|#mq803X?O`BX@Ei{nyr115gaHU5lP^pxYh97{R6v*Tk$7Rk4P<(m4EYrv%Ir z`SGK)Vaq)~1G(wx)m&Qa@{ub!4uAVr9}+gn)Z*H@v>nh0jJ zAx$&Pv(w7C+MmdS{u5T18>doe!15MEV`%Q$y>Cz&lbP!eP_rSv;ZhZhQI!4@G=>e! z9;mABCx2U!4s}c&kdI!LLYwH^{YamrL=C_I7;HN3b2D0eqq};c;x%7xfA15q!oL=P8kE;{9 zV7@qN*)aj1d?}!t)?3m8)LjI45v*I2_;NtyKt`FDxGp7!1zlq-6auYJKFH03K5rdN)T z*ev-&}0w4FM-e}W4Zy&YcKS@n2;!!gTJdO%%MK> z)K$xd6hV(Vqk=8Y7j4`8%`2VJ4icO7FbgiS`As~Bsu$nd+GmV2suScZhQs)ST?W-g zkDH_I9=>4Ip%7O)@aFni0wa$eZ9E48g6`RUD~irpuJw;0`p$H6Dbqtg7s+f_JP*2; zr9WiVekpe6NZPmj(_;#`QAN3Pf@$r@{K(1vMR413%cMpivQe^0CS)|1>@8HNZvk_; z_DO)$U6I_~`ON5YC=f4)%@G)-H0wJtV^F-J()h4I4>;&>xzc9!96TN&gINxyU2tA_Qy}S4sN^!tn+CwMj5T0 zy~z|C#LT=N_%bkUo7zdSyEEI!tx3NL?#0SgieM_g=;BXSuh4Nch%I{YVE&_RcR?Md z)}}&x)@y1J&GDAe9T9cf1#t(RPsI{FVAI130j<8W7C|m952anixB|&ZLqohmVm!;1 zvepZd>b^b5nH%1>$b((5HpT;dZ-RGswdXXHfYKh1$`k`FLY~uZ(_z(D$Y88nh5CEG zYfnHtGEdBwm%d0^;Mo20UG^SNm31tIi@qeh-X_E=^Cv0!ydpljs;@G_l()RZVkGZEc$9Y#B_>UfY?=Wv@=vHIzckh-{#%&`G=JlP0q-ttlFlYQRY~rAd2((e2Sx8(|MO;*o3=p;h$dX5lK9Dao`O^1er2)yyRr*CjMdHT zMPTha_x1{pv>$R)D@dqPjgL|x^X^g!Dqo3Y`}Zz4+h)seiNY}YL@5wtp@Y*DQe;-6x1DA`m=|x0&h$3Cn1;T^)jhpJZ=a~3pn|xW4lA>f zDsJ*J*WzLDyGo_`i%5XZ(_o8XaKxjS;RPKeFG(KSQq(6fL&3 z{F^H0Dm&aS%R+ntxo3uI|FHkW4~`ds!Fkb_)}XcS!}YEJnbl9ngv9;Y_|k)j->y1- z2LVm+DGK~QV{hILIqSILo_k|E7*Hb9W;HzM);} zJ<}~TrG};k?q=4OA4{{hn1}vr14EdHghah3qyT`&K7t~3S&3fxwP|6Bo_iU86i&{j zCr?EF*o^)&gQMNwEX48KR7%$illl*OZ>%tew2t#MoVCu5m~l%eHDDXSt}PCNwyw~JO0_giB}$Ogp-qVMs0_Y`_pUpQPI+Jebj_}y*r7M? zgAvcnB(`cCsZs7?L@yzoOx#BTfjDiWjY~=sII z2lvA}QJ}8Y8kwGuA=t#O2;I*)kz&E;?*I-g%U{^P$Om&w)cu_c({kgcs;5~EyCK@aU%H`*eaN4XfYOV8#|j(zy|V13kYeV6)NYW*Q-LNyvH3FbLT_Bf96=JUb~=OI6X!H52UI9^LGPeZ?dQmINWE6q3P|q#BX04$Eu=3tJdFp zv1f20-sg$1Z}Swo?^+#n=QsAsU^R42fb~;`Ccy9DsDNZmRL-CBhEv@MvEGr>YJBfu z{{7qSOv7Rfrq#HA0t$l^|L2!C0nc40=BpWz^{S84Kw@)Zx{FQ-sJ&` z3zpbr=sf=C87BYhnfG!-c@~5w>MWm{x+J*dI zHfrPu9J05IBMDaQ0En06zbDQDN=w+&F|Kr%OFJ=P&DnjMv+t9GC;puP(4_vk9cLLX zvbG2Dk%xjuJ~{huEp~h?ng`2s@vo5Rp1|I~nZS{NHm+Ku@|=>h@|sG*rr9%W@&5;y zKxeI01dXceeLhS{}*ie2O`(mM330{ z9unShBqXI~y7u{-k!8y5eCmP(K9J}4r~d2<6t-uW!x4K$uY1$m-u2!AiY6gZEjwed zTN&0W4T{@_iVkMh8{x+jI1l@O934sFBV`HP+L^bjGMwh~X|2$&Vm+sXg{SG~Z1uWt zAd|rmV)nUyUXLgztTYsVos%#8*o63TUJ*%=_D*38AS}P+js8wC5sSv; ze|-Sqdj3)vd;1kLWreN)qrw6rG!hn8Y~BfOmAlK zADX=3Yft~~b{7#?rAAa$WocVxSts>}kVtm`S}a()Dy%dZK`PLC-uG9@z$Cy_w_ zpYmNcRp4kFIF?)uH8mM|^^#Mq8k43vQm#o}j{%K1U?T6Jk6G2L-yk@UDnE%weDc}_ zF{Cc(D%+S@yeV^vO@3!_76U}?RxOz4%AA4vs82n6<2>}`7gFO8*1N2rp-1&6;126C zl}S3FY4wGUSSg|bp96cMHM9I25!h6wWZ~GH+RHjkGa4`?KQKfA6!X$4?ZT(nbZ=yX(N4 zyX;Zz>1x!oGxZoU1zYg*1sGM%-U0gp=O_ZlfjEU=vKCes)@x-&dFT(~t`Ki8 zbfsSMrnQp?H+iMWm)T=Ass+a#1zMdc%dMR#GeipHF&^NY)kChA`!c(Y9FLzWL9s|8 zrQ^<}+scS0JwgIEHHvbdOvgXMr89n_YZ}Q}l zr;q*1-qbm-uKGaE)1dIP7gE?M^ooH^K`?LRRureS&)ym0 ztl;UAVkih}dQZiv`mhu}4le}j0gn|56pVrw7&y7$KMXN-vM+4@k^u3mf<_{YG?K5G zpkHU&L7(@2iV;}+63Kp6vCTjB>IoP2ZQ=@!7cjjDjbHMG#H`cyMl8yTg)#<^3ac~&DagSVKff>9JrV*;@#Lq}lg|vK zSyakG7B>UjSD|E7Dbgb6_p?h+{`}MXP0YidHlMw4dYThvf9~tzc?O?tv2FCAUS--e zS^FjL*=DYalB&spLZL!clu{mrLZMKoqQp4W@G976?Re~CC5bm`MN3wHA{h#*)2vi$ zcK;nx4;xN6^?~>a4XvKED$?3SqtR$I8jUtx@zb0#yXni^ae)JkR&Ng6WZ3Ke|)UNg(tiTilS(NL#lk}mnzkzR2ftn7TLzYpa|b><>OWL`?goZdhH)oU$DC4 z6`nr|N_tl9!o-`k@`IOQo0p(mfa!-HCcdz%5T>+DRhc$143pL5z%UFeaLB@j<+Cy} z-C!7onH`!b7DM`n=<5G|p&N$put8BGqL~pDWm&AU3t}gt zq82T-nki-jQ=EB)4x%EW$7FeVb7xT?2!hXGpS=^ZkY~tdeVlS!LS(TZn5h)iCmt!Z z#ygUW@PB`E&x-%!vv9bhG`@o{nM)_`T13TtWLK-mkS55TPW8f&koJrd@*znBU@BJ+ zG+uF>m%>BwyfG>a>4<{UD0U$ zVi(GbCod@0a6q_A=bka@1h=(_r)bDaPZ>c%3Oj|Uj39_fb-1A9gdm7yCg4C2i3Ea_ z(+)(kzi_^H;;(ml2Yi#;1*ddE{C@0+#SPsIHY3MYU2)hMoxe)a9goQ&-=FQ0d)g_t zZZj023k^HymfW*;%{#S^$vOA3>3kg`erpVGxXLh^ zZ#+vJRHv9u-Rab+Oh%l>(|@wq(p=_u@{dC3e4(_VKb*wM@(Cp%<>o-vGM2r!k>3wt+Qz$}rL zny4ki@c3UF>r^XL#JZVpCb&a&xFa4fI!xvw-p!nY4*NhStAc8gsBbgWk9B4f87FFL zYO7n(MLnq$WOOVDr%E`H;RNE$RoMlxi^Jh?;VQ|+0nMC37lKPVS9GM9wRl2NU5Ax0 ztD5|9&1f=luHJS8-kWiD;Bay?F4~=Na}>~|sivUjk~j3ls@RDp%_>7dI|U_u#KhZ& z8~)Qdj=IWShw4QTDGF4mHt8JG+z25E3Thf;dZL+A=zt*o&XGxO2r!3A zX?gF4iwZF*5~<#&V9+tf1gwFo4%`hl>%w7_QFwGGo(ef22pa5eRfy141R_LGI>Imr z1OkCTCrND5ekjJ3`NQ5FGKg$q}TV{itbKBi*@G8wivs*8Csc)pzKYYUx zx9*DL@xdye+70jWifYG)hKuxJhr~oVwnrTfRJK^*0{uArAG!V3?;XIHuCKb*(I-EL4`S zJcrDJ*bR|PCPy}^$dgyH<(v$%0czC;AR)k1O8e{`V3r!xrw%(23u~fSSy^VQ?1GXT zsM!o#%m_PK3u~6`BlD;XtgOTz9`J4TIWox&0p?ICE$`iMQ6VNpBGvm84El_ih#g6# zi}-fc%{u8&9qx$7cM~Ra>B`*zE4z>Ea1|*TRbY=Q@KaGym8=gvt4@&GrSY(!zx>uk{qafAj(EJlC#N|R+HmWSg9%=-yf{WxMt@O=ACKv~C_vmq zys_x)7>wc_{56a5j{Ls~w=0*BdIZkwrnOz;b{tg5`TuI+cg%ip>w~%gU6+E>(syx*R1+v0$t7Rh`jeA7wTbnO0g#_KusTz-}MQ}2Rt?QbTn8}iSxT~ z-*d%;Etiem)N6VS_#=hF)82p8|Id*y{5=x7>Me&g-gEgwj`JJ32R+OaI>_N_7Lz@k zehVs}+qx8sh=pSLVu5%*kzEiwiDLv7&!%Ubi_Oi(2NyVCSi3%85+Zg=fPw0Y*m9j#K9El542+RA|lFTu+>y zCU?#){ey&r9F6*cU*yWKaxba;A^hwoU|LNX`gc;i^62C0nV#)X*5D}|zWo~}RL_~9px(BT6uowV< zz$r`CQP=?h5L6W12^Ut1T~vyiMk%;GfloLPr`K?LV=g*>jlZJL8DNm=eb$Z#1L;(8 zu*LDaom?N(j$KhHws0KTdUlmA@$)y5Z?Qu(*E`b+1KP^nv~Zc*KWx|h6JYTjqOZO)Eu8uU2Qdmk_f0j3Z;CBV>J)Ta*fh#2OkE2El>ESb5PT~Klp#mH#U zOsknpHcXkBSLndVgsf~B$=ncN4wcdidpBIfERhJBi%Qw>xDodnuM<=WcNg7Ee240A zM?AiRFqumy?gAK@eG*-*l2Ae?X*%gHPEB;08<{0>v(K(%ggUgxzwnP~zncm=gS+=f z*M9MRVxGb(2)+7R&^Cl4DvSnVMKLUT74g&J&)-vMJo|S#^BrXI9ZiV;3pbb|Xu2+r z?JK{1s;zMIN7mz??0$#Dbk|keo-+@+vp17^*Odp?!*uJHx`*@{59(`jSoqy|Xor3g z@SV-+duUB<-%9BCeu2rbaqu#v!f!$O^PPA8IT~X)b8i5noTV7_*3J2E&0X{j^JxbH z#7+q?G#7;p0ih=#NC5!Q7umK6xsg+-kfI2@+XR(dEl@BVwzM3dFdJ%8-~unuJQ|7Y7tD4Siki5arRz+o3Uy5d~e^uc9%>;KRh zT;{L~B>LZ82ImHIOqTs$l$!?%1r6gQDy2R4?zy6;e`#k<)`*6!i@%>KD8-Nei&(X_ z*vAP7QN zQD<)@K>P1ItzX1_NeIkW-l0;@eSS(ipNnc@ zAQ25)PwUAgS2D=WAi25V(NuOAQAL3kwr7vs@@u1e)UFRJiEi>c?y>Ec*R6 z!$kR|R@LQ~T9n`Q5b6O;iCv%Cw|y9I9s?O_G~A?WaCAdHea?JaA*rx8B9R28NdO2n z8~^}z07$V9g``~}nFQF$!@=|PQ%~3!&tZkZU@$alaxfS+aur_NL4L);U@#aOfz?0|1VO{toDyJQ zs+a4;4q&_}pkOqz;zd||hbKl18Wg!I=n~<2yiNuv-M zs!Z0jMM76X-2Vu=iu>-?OW52Z(@{q|jTEN;DQ4R|o3q{aWC`R1({4LeY#tt3u zD!nv^G~{550}qa0d6pF&^6Q}z6w9ljDRFcmar%Hr4?Tm5{UjWNJ08rl3ck8j9Q~+z zG>_N^{!*xRpHmVD&#N%_VftPIj8^c_20J{|BU_T-oozML*)`fAZXo}V}aFF_qFjdj~MHM9^GR z%0h0k0~jw7C>RY_ywI27SE*etb=wDouL=qx1O@pKlqZy|t4| zV~bz*`=#M~`ZVmXzHowq*qQh@GLL_e?JZrF!JH!(;nXy{^FD7Tt^fc4K)`?j03d*X zLl|;ate;G!9TKiR&2b=hN+70yj}LI73Ol+F6$u?tb9L8KOyxqwf;z#t?v z%`uT;*T6S84pAvB@7-`wp`AHdBO10YrsoTOK*SoaWvYa`+iWJ@p(7*;kLtjSB-fcr zCwZC&gneXJKPksdR#TO#TC;~}DwRropj4$&e_4O^cSSxC=FOWoZ(e#y=vBkPix)4w zX95o1yyHC$=CyvGbnw>eLOh$?jrX1sfA6czci=^)Ie$3~uuLEHMMpPGAI9nH>fT$6 z&dS2;!VCH8z5ZL@`oHAOQm1{^ZsAc-h*|2B>qr>|vr|+I;OFHFxgU}n0!*cz`~0-y z^OC_p!aCM3PRn3HtdJM1LvnM$E2ylXG=YsxTMY*r8ylg(Auko)SQK=jB$vQO_;#m> zYgxjutzj4sY#=MMnDUsR6vx>{!;{kNgxvzBp2Rj2>ZsX?gM-3Bp{UewP$(2ifrEp> zp`wr*2Zds{^W>FK8P+*+IZjQppX%GKf6vs{LkNP<5jvetr_%}8PCP!V5H#Qy?AZWa!gHzx z6b1kQ0BCU+7tjMFw;{Rs-+Q}~R7L!kf)IiP?-3mi){#G9*kP$&Rh!MFfVLIyx|hQ=kn){!$IW_a;Rs=KsO2G{I#KuVhB(k0HAS_8>Owtb;C;taEb&yJYKB^tb0)jJf%6{60te@bxfBxnQoe#_UPumaRrcVd0 z_Bk=gZz8AR$NwWZrpu$3ENk)j7cEQEAHpq-U$!ib9CSTU{k_wXiZ^=vi2E9dT|%Ncvc~3z{g;U7lG5OJ|}p`@##9RMBdseT&sI< zV%>4kO3_dGD^m3FyY2Ru{{LsfqTxeZMsYG1QJnszisOy>%=;0K^Y`cWq6yWpE+O{n zr_ymx)}qC&UY0XxN%7GbyJJ#w?;9TJkWf%W7F8*d5*q;q(tJFeme&y!8Yh6-f6QATCJ9&@aQhORFQYng|?>or&g5J20B~y zsYuuOm#+GM8DO*emu45mn$;dV&W{R2L_`*~TCG;AuTV}qENYu^42lS*Yxanzn z95^~R9-*WjQ;OaC!_qb%m9WKxQ)r5!26y&(!sW%Oq-r4{_ZS22@+a8dq`hT($wg5V zl%n3E7Qm;Hst=t~45E5}!!hFc;Tv&0ZLKEm^*u_?>)l9vZZfdvYz3NxL zRp(AP8LzoN;$Cc?)mT_@SGjRG8FsO?G~AOdu|5BIn;HxnL&>7aEpI2o^2FxdLK=Kt-P|3;d_@a<}Px9i{9JWF5xj*~?c!K8nj z|4r<=rA?~Ie0-d8Hg}kWgZI&S_92z+9}W?XO3Fj$ZU-J{8l!E=KgJKh3ft@si4Rr- zp2m9Gi})p4@ST!(leby7=l^k#(K#Nx-K*6WM@@K)^Rx?)=7(P}o#f73{R(W|!@%f= z9G7TavLb5j^z;;mvuM1dwL0fMJL}zTr3bv-@bH2MdU%$eq1*_7r7uda{YAd_Sh|?x zxj4b@v_!vxzr~>-M3P4(-DgUL;qjw-5)?!@lnRWenax#41K?#Zs69(X^2Sl2i%xc| z8-N8i1_@-u=cM>KRY!SSfD!qI8S_AnWdmHKOmLpd!}p)n+ql^gp-})JM}iu*f6E{K zFlVA>75cpzYb)B#BS9dkS210T+!|voI%+9`rmP0U4WEcD#Z!Y?N{|pZv@^aFF9!Zw zY^6~}XLnH@HJVq38UQ((tZ^B`kS85bFE9cL08E7vRGpVNswO<|ZSM%~y;CNPKM22w z-yGZve;Ak>gqUCq%h^-m#y#}RR3IMlh?n6|jm1()C(lV>p+M!^A!%?3rbe4cwNu&u zCVWlCr-jp~?S(AFFU&F6Km6s<@i|rc_Cs~p^0(0!jxQcT+x99Ag*|7lG!0BCGDVw5 z4UvzYTwQ=`Tx?o0cSDA&(NwcB$hTwcmSSG5#33N+f|``{P@ss`=g$RDo#@EJ+CD(; z1_=k6i!VI;B_933N&K66{qaO{;Tg|4em&SH+|(D7!YRCZWf#s#$cS*ib*}vR;PZ`h z|Id5=`>Nsq{>Fq7QSZ6MYQ1^n`;3{`5WnJ` zqrVRlKGTqV{@r)VHeNFdOU%=~j(>i?e{**V)g<`nX(<%ajrGji!eH=lw+1Wqq=tXN z@u9t84GXWY?h5#LOyg#PWa*>y`3lGn@6t?v%wO;!zovphTYA&SS)*S({!xqrKPI>@ znuzWmhZqbm&bMjffAO{h{R#Yif5`9Wi(te+Uj*@x-}Q0vlIs790BZ%?yxt_Efto;T z80)#S?_Ra&m&SQ*K$EbScG&M?xaU*I1oNT2n35zs@xs|;Giv>b;ilzu%Z=s`(EimQx0b=;G}M3LKDpyp|JwHsKzp{kntS}c zez7m6`-}f$N;7iZ7+Qfq6-lQdhB5iU`!IMeZ1uO#tUsR?S%`uG!yVpIZJOpB z(}+g&KbTbg(Eax)qFtxH!};f$Uo+h%Kij-S%`f4<@?Yj3Jx$`n-(mROW^F-aWq;l}T)uU?ZYOL$O z7lY^DlXd=DE)1HZN8&j1GK~M4H?3c+Z(y*UP-pcO?sZs_Q6(9>dqy|b^~YrlJ_Qx$ zA2lUPFh&z76j9NcrLY};7$$UYKl;!^iF#M_pv*uIUqa6&z$d04Bcs1WHsvP<}yyK|@aX3c5bYjf)P?%fu}ZKzm&Q`-KU$lMIBte=fap5a`kh$p(fAFk z4l9o{P4lluj`86w+);X~YeJ5i{2Gzn_{Xq8EeW|ml#JZu%ALoHL>(_52=eI9C3T{! zxi|O2RIJr9=PmXwPNgI>H8se|98_{`yLF*expT>%B83Ke>`rDXlb>i_Wz9j)UM${J znY^kt`~i-XlNwgx-<<(G9d7oR;c``Af;a-KcJ_>F_B8?ltKUviHa_oHAoq0f$(|Folo;Ge6vT;B|jl$Dxzd{Nk%Mr$r!*kiJj) zDkW}G{XA6kRg}lQX6^sWt&=ZD#{0hp?=<=f{2z8+k$=x~{*rgRv^E zPOqJP6Eoe%*W}}9{qk%}^LkVbK15^1&`Hl+SnSQt$Jp%6yw=#?T2zr^uA+ZOM0VZE zJ6brr9lG{n^f26X+#&58?e}fV;4W*|RZs|Z3PXmSYo`4kFciGDaQ`Zhmk`w-LT6JKVdXb%*a z=bKz@axIf`JTvs#I9?jL@_#&B-ujQvAiSf`@%C~Nl`mpi6uEM78*l3=5-A{O?%t7O zd>c$jJm<)s&`N{Sjq=B{@8@gW2Tnl0@SWY=h^Ihv-2#AA^oZb<1(7XgZ*>!l0XnaU zOJ&bVuyp;v#~dtSxJoe&(qnFk@sNzG>b+nYXPrhpu&{}7Zq|&O^c>_TuTAn2v#88S z@g=lFL%*c-(=eVa{jW(;=D}~5IK=MGn-2DO;kTFh_O7$(-kuBJQGfo8X#Yr$0EU$V z^lamml9$Va8!^;7v~^UQP#HEau;!;n(w zJJ8?0s66n?jTgF$Vkm9RmcKErRn&jSnKO)fT_w1vg{FGi7Z#px)P2>^-xP(JG10vJ zkE%v1EU}`KUck9N zI;~m#>E;EA@HN4s6$hA)+R?yBkie$EU=$6`C>gzGoR!F>U~jO$yC;mA#Z;SoP)loi7(e?~QO)hQwUF7;QhL3~Z}bv@RovtljOMH003# zInIP(WJwAxr`vCwz$P81tQY7=!NN*7PG8S-^KmML;Q^US2d6CF2=exX;EneeSQ30a z-G_xCQs%nXtZoG)k%X>v!ku4VdHtYsUXO22_*M9W*?iDljyTLESl+R4{1~Y&Jt<%c zykD_)Z{fp#_zzCY2Or~^E(i=9%+puD!Ghqz5F#;Rd6I^2w?Vn^hYuQ&3+`ylBh8LS zm4Q3J72J=XDjK$7@ERQdkYho}rm3H|eaFY6UV1)l3AR3UrjR312eHO){BFj2$7A)e zaIKuAk4cE5>8~e|#*vMbjC5>sOQvk=MOsQs2@0XKZons|`uY2ehaTTM2SDOgfxeJ~ z?BSOhM66lDl_7{fv{ zXkU)54f{m=2x#716`b6hg=7GWF`sKXErEGMo(= z@;Fs)O{MI%@suG>A_cwxD&)ZsoF+_2#PEC*OKjah?0Fg!kf2|T`%|3CzZjEzlz>=x za1?uFq=XZYuO148v=q@AxUP%fr7PdI#ZKKDrDrWHvzkrRTdjz8V>CBq%w{&VJ|;N@ zB|TJ!k7B@}S4-o(+4w!JBNZDCTw6EfC)Y^EmAM~5;Y2$QZm7ySlPp2coLjP#Ce@DR z>l%!-yEaY4pGjZ?!i}j5(dp{ad0D+C|DoqXVnqP&c)W{4_t1Pa&+q|6OW$!IAs}P^ zJ>p6<3(b7Vk#iLTwV!qeAnD*ZfyIT{@idQCDy5^9_9M@&(%gS}*AIY_n!bU4}6 z20J+N$3Sw)fcH3vqMp(6iXa91)#Z*Ri%dbG$pqEWC5pXP=jvH!?EQ&?qIE=5`1ttCdl(vM4_9E zgI*iz$j_2P4`JqrjO;BmoMJ7-&GZO`8VaNei3*&da6VuziFbZYtYvN<^o z8sfS+x^B^8{<<4xr?aIH`69|Cuw2XeI>D)&3l~AWS_$1n^5v>r>>8hjooLOMOsA2S zo#U{6vfbc!Vv>5V+TUk9WDU6FSb|*$gk+QSP8M2{kWhB-^u6!teNQSqz0v_3&)*ln z7cYwDynwc_M~fK9jxsmF%GAwu8C7vsXj}X<%^0XFT8X;xvyN~&OqaYPR5!)KX3#(T zXI8S}xje+Z@rmfm0F}!_$jrpRbx6l}Kk)Vd%8CG7x2Z5TX;@!IK!3kmRSQrOTz4A$ zgawZA`6QyP?~~U(!gCb;9qiAz|6gB&d6xYCFR|L~44>SOW>OqmvXPOf{x-(%Ck&pd zKWB{o2osd=nfUJUScUvcM>;?)L%m`!uKH4919bcyh35~spij|k*f&%Bu}%)pIP9BK zEn9g~*o z%ktqR#Cj~q(`1WwJ#ClItHbRGXVdN(+7(DsucNp?DXFRc(MVs9z5JKGsDY1#fl3Kl zE)z8Y`k>PhNefU5=4*K9A3Z9~$Tb4IKCx$He%`T;2XfcUbMTK zM2ske99Q2GYa7+2?U7{Z-qn80MtlR{BgTHyiks&T^@C?=`BB&j#r39tPJu`=Cd1CL zi`DY%bmvcWc#<)*QtqX_J#`4;~1ai$}Jt0Zw#v zp+8L7F9M8vKfo1_KzzJMri4`Rg<}ynZtE&YWmOD!f-px`z9cxLslf1SJYPQLrEYxWf|rJ20(@P08HB#IpoG=)|{o2pJ<{{jlj;_Wb-1Ghcz)d5DZ(kK0dGz zn9!D34yA@O(RtM1mDs|31x$Rw-^aI;k3g<}N6VS=84;W!3+G>e&;Wul|e%-p*-vytY8P4EHy#I5%K?oqU7|PID79jlFh5 zIHteeyG{PadnsUE_zAcb1H8y9KMTLckB0a6N9W=jb2-mJ+!y?+z5-Pv0dP;%zu&*> z`^!0{??#}!^Ikj2JDxt!cRJrC0xq}tW2(HRTDvTx54R1jn@uHZDW)1}=FGUv2|=(C z(rwM4KLOH4lvf`G(th2z$o5jf4Rc-WowyI$9*>5K9&hP~O$OIB)mFNW0J7e?+nWAS zeXCoqTjT*3@2*&7ps(g!kpG&*A2(n8vZ>R&2=U+~%atC4M4Mts29W@GvCHN`x2X@( zBx=Gj1ZB3^EsHt`W;2{}x(=um1PYSjoK^riJ5@9y5eaavP0et6 zhF%n>iDZStH0MgezGq1Y)SUlm-|d(Yk~Y;ncyw9QT9E?iYv93VWbFENxh*^UxKZ^) zvH}@6sK+&RY4zEQ7d3ui42*}}NKLNx;08kpd05 zM*S;yHG@W>PYWIf8|bFnl$HV8cqJDV6JI#s$=Uu;mFgUHY7tB_^OgM;9w1`zWmDa+ znn@?34B1Y`@@uuYrQP(T&ho0tf%j~SDp>RP%EZ*nuVWU|g}(Gz+6MtuFBc5~UNDs6 z=Y&sI$f2RE6d;fy$370~mQ5}lC4*)75m$hw`vB!Y0*M2lu+gTx=&5LlQm;zoeJ^wm zf!#~b|4yat&J?PT!Qed%JPMTek*LSn%B-QEPP{MM%%Ff)qj={qba4^;By^1){-meB z(0O)^CJK8i&Nk(_yZQ zbCOD%1Y(`~8lTLV8!V^5Y&pZ{bgwEQ-~4|6=UO3?5sFrWzY+;dT7#ve;4|c<;4_rw z77tMA*=yBjiAziPXw}{tA~m-LGGRd#fh|ZxF(i&ki^REJet`D!9y*RBsDH7btwv}v zF%NyI`+cjWQnLY8EkS{uP-0FR2jr_9Bw<-|AK0{j?7l^&=M`85qr7}I4RJT+fg9gT zN-w9hFee0;_0tWD`(4&xiokle3I(fKO&Hoc6#-&d8gDab>0_ zoRWU&=$yz_>@8VJOW2>3fr6!H@>z&52w`zED=ii@=B#5*Mk z=d9yA0url3)@GIUsSOUoCMv6UIp9ua768fSdy+Hxxh)2`1156p`_5Vi-&}iBBYS!P zBj2$%>j!wOGO|BnX1n>sZpSB8HYQ%@> z-q-!-;C^_8ItV{3%cNo8sb)D8y#0HmPGpljM$V6(~SXvl6mnULkQHktFr z1Xb5B4UH0uyq!$)*eRF>qwgYIT;GnE51VcA>1bV*IX{EOE|5ftl0C*OE~+!og$pyiOtmRG|LtJ1llyxGE2|;z{pY? znw?#avi+4>99tVyUM{<2+6~K;uWV$$?#xPd={c8%<-4-7mowS*Giy!L1mkEF-(nwb z?ibv!tD19|+BlwiJZOBn`kO=^m8bE$W*fVR&;!~-+B^$&Apt$-tG`yO=I`>~%hUb%Lp<77JoSsCzP(m2Bh24}`*%$+qxnn$7__MeyuN}^C(~cL~#y@^K*KN)Of@jd0jht zT3FY47;(U#_XBi?_)*0K1IEsGc@q&Nw`lF22=#oY$`C$uadAR_cndELeoIjZ>`c`Z zM6M}ALSN~q(^KNu9s@(CHQjzNn4a4UmM(OpYh-|=R6d|K%@cdd-8<5Pk*FAxvC4Eo zD&VPi?1IQ#HsP2IkrG@|F*uU0Y4NLM(OI1x`La}il`1SF1W%!;gIxuoBr=e`$)*}PMIShE z&p5n*K7)W88$(_c156vmw*$qL>LbOnkcp89%ubbcNXqc>dtMWBSG?1!39H|)RT*zK0JGaxCbLmIK=S7l4vd549 z!&fUy!~p;{V79Be5HiPexYnrZ7lzeF7L$|96eDT>HG<7|wxz3s-N9TRZE5olJY7%i zUJlb>bx%;z^U+WNdcLv2^$w^3Ku^@3erTupxv&)igpI7&!Hq@8A@5WOO+|QrD9)PjTd*A|iH3pLnP=cmpbG_i>vN&n}EFl3=q)Wto?Ix5=stJ@A(V2RU%g zksD(Ztmf?c>004l5AP6l-)>MoJE&2X>S{Ki!mAs{ls|a~K1%-8bxYp)=zU#Ey=6zYhmcF_fjW$k`}cG+0XgQFAKe$9 z?0M!+y93T@03wC&;ft@nOew#*uDS9;0RtjnvvQfD1bo;CX}LmW>JzU{y*!;qF{F#!CnZ|B*W<%3Dq#Y=F!3O~ zPIiZ4nXcD9p)=d!Zb5zejhTioG#e#a9Lib|G?Im_xR&XGDKH$hDVHd%W>j7y0+fTj zh-l~l0C&p*CT7n&QD~h}0Ckpjmno7+*Y0&~&$gJ2k+%LA9u9ZpXgzKp41`PWM1<$0 z3^W!TLx?JUY3EFu!v=ReNtAXrLOj6676yaHGGaP0vzo2|9{GH_-%UE@23U3)<{FSR z!<68HOyWj(V1S?eZ`*L}QYUr7}!) z<`2?8TDs9DJ($a5m0V&nTy|`^tT09)L9N^zlS$6LthdSC;r-elvKnC1$g`j+Ij%^W zkue$Y6L(SiNL?$3Wn2#CKmt?E*;hGfj)bM!6ad~;@kQlfjoE5Lsc5-{M}BO*<*Ds) zJ9|eR4;DZGPBpH&9NL~X>{WioSD#71s!tp%2(!WF zAWP4wG>69OBs>-h==-^`6mc@Uj{Rf=&VcLjif7ZakPtHR8gWgM7h#N@s4X3>Sst`m zSLrzsa}10YM6os1HjpHhR7k0}EwXN?aBL1@OHJZI(%q}N!~LVcccLt^^q4(uGB|HN zjB1RgnoAJ>Fm z8%o^}?(pSHr~XStg6~vpIXt6bmK2?1MmkVv`2bl?qnyy%w;*YzPj~rCE40t(FPgf9 z5;W-ESiFQ955&FrKw_~Zz#*l_m}OyBqtWP&Gc|B!pf`F0Ju!{ciCjs;EX@z&l28gF zFhi*lgd`)S#)@)&5-y{u94&EEW*rq!USvJx?)PT-?LV;?FGZwm_(nN0|;C6M@Nf z{tXW4f@dh>EI z0Ain|wg4Fhz^kJ{q_~!_KX#7T#KQsHtS| z61LbT^oq8fmf9AA!SQl#keHWt$=nS|jvd&e;06Llx@v<)y1V@B>F^j;ER;>h$IhsK z-V0=Z2}hDmhtU{LvCB1yJOWv?JH^w;nl38nl0E)`MMr&>HQ>#WH;34Kni>CPlaskH zVU~^*tgNgZjY2^2eu5!*cm@-S(dJn4@I}GItZ9UE*>uRvw3GC6XgM{fYYQOerfu;+BLAz~TIux9LpN!kf6W-uAbF?x}s>Zy9j;%Aq(6xwE|6dV(xhSXEx0TvZf0 zGnK$BcYF*?*wQw%bbSsyakW*99y2p<`+G~?h|;GU#VK-~2o$oz)ipU(|7vfyt=Zor zDj=rruTgjAfD?|p|3n~MI`-mL{}D~fsyn*PQ9DXTH3I~5-hLUfyUmZ}Fx_ccnDvw~ zX-iR%f|zAuDXvAvSOBA55NH-z5@ykyuR@#txvDXYx|ud|DP1r?<|!sOK0hkPBABw3 z453e!A{DbC-weIP9&c@eO?Yc-vIt#(F2%91B%s`ZM!g^-rWRD zQi+&$toY_lsI`rkVH)t1lp1TE?_Q}%M+X|~l!ea_kZ_5b0BA%@Lh8QS4Ou9Y9*jH^ zN$A>ZX3wa|VIK;86%o#nhWJwj&MGm973hwl5VVjGbizdz^Q0n)fcSN$ zdQeh@l7C&12P(iDa0C#S-1*h5%WvP(OKO9Kk<@hKEcx2m-eApduy(>hHh`S?&*4w8#73sW&*$a-YRcq>(~U}V9%v~yWysSk(}GsA1eTz;{tw-T&KHaAy3HC>*VYg4mY zOI2;eA2PKqpGDrvl^S-G%!NR?9nEW$pnhs+$uh+nXGJ;f<_-X?U=7&W#2t@k^G&#y z!TiSBSV4|09{`mO5&uXJG-T|r)7To=C9#PTT1BT3_AQi$@^YeydB78Sd_z$j@L(-h z>H~t|m$w4-rsM)w2t5$yF#oYmp98nmC=gt>UO-U6@Iyf8m+z7(V1&g=(0-hPMJN%~ zikfzxFBP*+2S!lASoQ+K2~AW7P^EA26e<*Yjr)LtKV?Bcum}_nSb(pqk?bwx6^*Kz z6+l7F|08$)dm$+x)^+qL zpP*%qmCIH_JZ=phobe}%Pbrls^qzo|J32RVsBO(bwUyJmt2 z6Xq&44yRD7$s#aoKVh_npd$CKcZ^Su>?B|nj$JK?u#|Aww8F+Hw5T6*D;gR0?9uK667PSmO>n1OXHc@KX5D>bH}Pj75v|5TLkp%31B zVIKIWC1-NYV-bRI-;zl>l4Az+NgN<=`#yY45^}sBDhlG$faR$lam;&5@jyQ7bx$+= zS^&Gv5Utf?E_zP9?{5960q+Ms{Pp8{Sk4Ssg%#IuW#v})uUN@-&Ckg9wtHTPM2+`D zeS2DZ0@$Q^>3PCo%Q)jAEo_ruko*M%^O4C@wG2T>-%>>elHT1?jTY+!F(@S4);P1S z@nu&u_K{m87#PsXxmNm4kKt+60-%1Hsh^cPoRbrCVSrgK_IK%KM!Shl?yu8p- zDF$)@uHSG5o6`R5BU!OoA%cdatmHzH4B%V~h|~hB5A|Td8$}V66l+|0C}Qvy3>p%? z_>`K7mvbk$kbI{wn3yb}M>TeN?$xbKnad2KrHxGs>hC%wYbjaA!ep_iuDaArDw7aU z+mPvkKO=$bnKyAVTzf@KGb%CqjN9UCFBqa=W5BpH7y)ly}T}Qv`M>G)3sTyWqMZq zUdemDfR8R9ncc=XZAlv36uWrI*MTqp6P)-O>v~)32|&CDF(%>ZM#zQ^D4lo3k0>gp z&eR@pRud2Juzs_kSh2(+8DV67W3e;WlB}&vv6|5}3v=oF&(dBq9BPVIx6QZS&H{B* z88ipTm)L&<03CnMC+57P41aA!yroSs=s$%`7i*uCoP5krrIX>2IL4b+Kx*{AO4fKJ zdd;2a#6OYewBY8y#V(F-Ns}0R>W$~hr;vP>&m>CIBiJrzs%><9gl2jHuw~o5iLGwm zeSE$P&$Q;@`ZVb@BAucqTIA+PV97^D1^Nv28TMGPM6>86|FZn?S%%sgohJgQrKRzr zV+_tcsFDWkEa zgJriu>0V%qIhe-O6?5hi<6PCr?RiS)g|w=gJo@)jQ1-~EA86-&>CRn_Df><^T7f84 zlm9tOE*%ig6lHw3cQ{N_3}Iw}qTF!|PS+6J^@L`J3azuXhkf&+T_iE@?hO%v6FTnL z5Rlo=aXN(e{*uRZd^?cKbm~Sh@sZSNky{zjNoveGJqepVKnw>!pqq}-Sna_aA04h` zgOf^l>MXHPL5~P8dfFQ$v=3x=R6Q;N!l6V7f9new^?3Ugp2+_?%)}UPC>78-)AjRknQ&e^suv{hWsQj#dCYZ4Od%>pE+GVdbJjC+sM22CQ#ozW+UlstDReNdmQYDl?uR);JrvPN%4~t9 zC`he_jArn}c|Ut=BbTH`!{S)na~uC#DBu!>xd%pa#32S_@0^RIwbnu>!i5Y@VAoD= zWMfuAC{++kb>W&J!2QL{&_|?VFTh|z6Gv09k-_J9)7`pkL0KG=>{u3>54t1999+(T znZf2UM}1boOxjf`uOk%xK~cr1$HWX4f6Pa}WrI|=)^3tK^r{_-53mog5AYB0)RG=B zi%UqSmxQiu*)xU48hH&vo?1G2+IHK17zGFm#;m|!GCp-#Rvj=m(LLt0f-2mZCyqC} zc5|rc;b2KH>*R4=#m%w$bYtz^r|o#tqF;*23Wz+Uf&q-}1JdbT*x0>ONOID)LgJmja_@(dAWk!4 z)%K?pL=*#0K?Tnc+h{78c<(p;b;Kb1#RbZhIG5I=7c#f`;(FE zaur~HJAN-F34Zr~^JsA~Q9S46DB8uLdjmValO11r;YGuLfiJn-{-ei55Ff5W+=NtaS(A@TxGx|f&D5vKeM!B}%Y<)| zJbAter|{T#YEp~Jym1(Sm=-QYwS#)Pp1~_3FJ`Esehg;_5-|>ZMJ(|a))O@ma>Y=E z)V zr@PG1PNRxIbr%ljl?&H{jf9QFMG%|KqgRE zC@R~IH86`zD*T0eGNYdy<6x)yieV0|meT$dTnc+)og9H{%TjuiOT+J-FFyYcjI-fR zf{^woR|{g>M9wbiG8gv*R)jd_U zB2kxdc5Itg+(jh@e%6%4!6`AEG-ZHt8O}p%AfO@VCDE#gvo0oBhc8Q(rUKI?=Ljn4 zeC8+b7d5o)osq+!N?YJ?C%vX`Ta6>`GL7UGi|iME@W~2oakK#&r|cYIy*H6Q=ga9f zO~Fe;u14IN@PpH@?o)H*ShQT*bhf6fqLbX?Q(f5}bZxJVnl5dRfh^cpD=Gmnk)}~` zUyE6T$A)-x_JLe&(Y?LZQzas)?x-+2D$=#x;k;(pwo7lJ@6;>l*V(6g-Iv6e5G@so ztfuOpQwgTM*N_*wI<*Ax-UXk1cwhI@d56scpc01-KPR+>VS#}te(}q-;9c3Po{rhm z0d~-BT=vemd%4o!_0wz1PG-!w4yO`k_p#oNK5{p$>AytRKqXmS|Rsx>WTw_Q8fgB}Q}pkvz$|EsuF z_EE)|(@>fXg}G$^Y|KitHz2#BjIMIniFU#siL9KoLY1yu#K4kqtcmK3$}n5PSK_0p zZWr3bLYQGiXJb^CM5ZoR-Ub-(@SGU&<%(Gsb~dz#IlnJ8>_|P852ZTQZcp+WL%)eb zYvt=l9SB@GI=J@!ea~0QHjSSanxnr3we2yt(}Tz{5G4Wn$3pC4HtrNM?>N6r5Q+m2 zm^VpO5-#CM|3otvr%I$O3~2mX+5Ex!m|F}!;6>qwj9PYOS}WU$N(H?#e^4PB+R0!T z4BNLv!fXeY`d-^+*gQfR^2yT9$}Z`)6&|!CHjqrqlil6#9~r#$9kiA>6$PvvdEsfz zw#k&tkN8%;%)n;bZID3@b-F}{!nIo4JSn~jKtC^1Jaekuwt|f{-BxrdYFMMR5InjOIcs?QmGI^emL^ zHyWEA!B#C5Tyq%`{=dIQ`Q{)Wz2x)=P3G)A00gAnTiCF1n~%!`E|5ES>ZB;qeLWYt zDHx+HsqDl(`P*Af$^mbzRmSR;3WGel!nldl19o@Paxw#igqakt`iP&KTW_>-v{{y2 zO^Zb17lU$VbYyeheR1qHTEp{=U-vHpcKLtwXS&Ilv+lOX11yV+qR2tzLqG_D>Xr0a zUF~t<8@e^1XLNuC;O?EdL{=#}pkQ3B_+&L}io=xz{}7Qt;t~o1*$y_Ny$-DjLu|%j zWU4``2s6IkdbFw%++Kjmz4kE@FYe>}PjPygbw}MzQ4jv;M{RGVNXbYXp-XlNp1$0x z(SamFY;q7w*qYhy9#;0)>NIyAm2WqDIu_wBzG881#ALPJ(0&FMHa2iDdsHSnFBka# z5NYlwo-paYm`OXCPo-*SW*Yc{GOGRlipEw3o_G{($`}k5Ghapt%7^YSTT&-(0*Bm% zoR~3a&3cq`JM$m|U(n(pRfj(9?}*crxHc*| z3;Go&?qp;!j%-Zj_v2Sv@}jC$S|w8w@#&lNzoi#`=jG_?k8_0Q`~RE1gPq@;kgzXc zqUsraO)Jl+KV>P?C`tRfugFzfRvEjq%4}ZZC6t!rrJZo&+ z++vYXLoC!NYm+u<7)fvjpRWCGngh!0o9FMk%HX2TWvuk7A~K;L`+%=`y!$Zp5nr{c zJ}Y1Md^>vMKuyYw0sF`}(B=OBcO@5486t~-12CCd)W_xtGi^J=;txpspL9OXnVu)# zmk=&!5UN3blQwDBYBrsZZeBZOeCJpV{0En$)HM=xq(g@Zuru+5Be+8ZDjmze8-qvBb%)}7xTye!CmJA}CS%$)O=15PmGmt>J)lUbW z`%Mot4O(nHkS91}Pe*-s<(ejd$2nY$wyIW&w8QDhmm8NEdmmZ3lc_`wRc ze>hh=fuqW;EegeYUIuBK>@ST%b$;Jq;69Xg2<3{z7=yovsk!k=EE%;D89XZ12EzfU z8i3S|_qEf_5RJe1^94`j-u3iRbUZDSi&z8kR`?BQ_rbWeK|&m(#!DY9(D6JzKC0^u zqeP)vJwVlkPZ*)**cQ@t6+`aoZsInLY_m40NXF<4EBqF5Qq9Yi(di>>Haby@ znG?ie$1cG$10=u}nG0$h^wd{xl+mbrabK)^r|;X|E~E(JG)6MwVEw-BtYZuuYwz2Y zG02$R)v)7)Eo7C$>N*e3)%|=kX%0yw)`64D@Nmo0-T-lfGp9Zq^6QptNK%fqXDfCx zaF&&$u&0p=+t)ttos4F}a(Y^|Uu2MP&Ox^4e5aMGJkHKiu8U=FKf9KA#kpWV`9b@h z&AE;9-C8YKT5sUxnW?Qd%qXaCTFU*`Khi?Z4B+PGgxqs^#2BvAqIhFHN%kJAkU zao^1~c3^5aZDqzU6;Xqg%DSDekh4%S(%)Pn_V(3I=N1Z?8(;NN*2c)_#vBd5X;S+b z^vzj&0aH-t)_d~nBz{=oNYTr6eyjG8;Bd3HMxI)EU8`U>VIvh$H{NIHW=iHKiBB<; z&_|#;nElMm?B+Z%Y^DnW<{%1Ta1xD;_J)UP)pe+*!sJ~35z8zt_U59&^31hWRVihgS{=h+2M-2Uhz9DjQ3Y@9>x=D5t~x^yOA7#xb6DI;Ndc>Z zZ|sy`+$iY1$;k&K+qI6^V#7+dOUK7m=aw;bXky`$=eU2Ktb^RGVp;1`=ZiHXfdVyH| zP~t5iZQBxR`Wn;iR2Ujy>$M_p0sR z)BMqZ>WhhUv@0epg6HYDs_8Lpa>%@}48-{4(r_}&c5|$wk;v4G4@%W^sw zWexT$Ayw*u84fjWqx2?dY@<$Vmd(%%0C0>mVyb;?#x8U{~aly9TtxC^uFKQ!`a;a&KWu#zAloxQXZFBhalQnI=X&Cx617xLk zwt~tJl@?+_QXG@K|CD;Bq^FtEi6x&Gqx{(+UDplihE^zbfLp(Wj*gjOt6NmwmoOcy z1^jV&6vOcBY2DSJ-5SPF-{QK4GYkw2I>-x7d&ZGtqSe+aWmBwn?Q$U_&IN#C^TZ!+aY zgGyMz^avpSJkxfS9wY=Dv5rp6@v1>Gv+kI_$L_L;sw!$$n}MAWw$4gk(GYv5Y21Ur zd7_`7#H$AKWey<>UKYX^g##@fEE~Jeb+G#_dEqLhL1=}x3&rIR3sq#|#8Kd!@FRUq|#x_0o@u>>`1^i#Lr|-neNU~P-k|Ni6fxk%R ztOe)J;w8lb(jhNCan=AMMmaF*eRYLWwf}*>)*prQ%s|DIXi9bO-sKcO?E{}6rL-~= zBnum2*_{-|n-cCPIqnMvYCL3}NYNcyMdlBn4$`jn^}|GpL8yXGol8+rLr{yZMX{fs z4z3mLA(iUDt;e!Y-^lgsI+J38)ow8;na*oW#^6E+KPWS4XlRBOgor3L!}Ac)(9mc# zJoZ2}wffWR8qq0JFs+sl&!|`KQq%>p7*Zbl4ay8#H^T4W?70v>o0A_AF2`)0bMmDr z>7WA$0)tVr#e6dtG||JaVa(S_!%)-|kh0sdf0NBF`&xK(+e|oJhN9B%sRBakSMts| z3FSYdG$4}a`)n%k+y(7b$;V~Q8pL_Vb)iEpC-Olc(v12CX%rPfZaNeb$ zf`U+QGxe`+T;M69;vsC=xu4ZlNl9FvRvotuToy!4F*wl5Zu#cT;6T5M)s%f48?A)!c^*uF!rB3EHIP@Sn zOa+5nYBMZio5v_>&Kuvm8=B(1|G%ommxO%a$^Nptxw7WhLULs?{@Upb#xr46U%}+Io2&&MKzF?a+PHRlZt})J%3r1@z35 z6DX_JbCG(|u@TqqKKGn%>Ur_U(v+$2?QJLB3$j=P$s={%`06Wk8T#G>%)mMy;gyqA zeVMw~w-TdiJJVRYuTu>YGpF;lyD*$R8YUb$oNp7xE7StJKFyt)w4wDu4|{wBO+e7= z-|pzB8^yY~He<_mKNnZ66~;NpG)5Xmomfrgt;~mwD1T90oudlo#&00%CB=aHan zn`7e(jy;|jNL`fUy=$=p<2s~;Zej8zmgom6Jw3%!u1Z+AX<4g-^9hZk&6xaY%3#m- zZdvVzG2$;6LsoRcN=T6oDjbbMJGsuGj|-WICNwlFhPqiS5l9bi_~F1x#8) z^1yS!GzvgY?5w3Zd34@9d%1`{D`D@|ex-H8u9y?FEugpAnZ-U}e6z2~@IpxIEi1gIGSg~E(p=~X3wG1 zIv~2I+5M2goaPngM#Cr4BqAYYFwIu@%0@;X`UGFJ{9CX+$9)Y0E%e1Kt}39eLje>(8xG%WYbn0{Nbq(>IiwrjKQ!= z@@ZtdSm#ota9P<+^4dYKq^DCs$^0Au3H7$Xl9F*P;@&G^w&0&aF^wQLvewg_I6Tp( zjjTzv7Cwnma+abQ^y_a6(o|BColsiiDh>_+B?b`%R!J8!A z+S^u0Ul)RYk)%VnVJLLEb?#P|Gi9emf`Ht~h@S85a(11e| zjDiwT>T3Zw$5n9sSq_L%DvN&-1ZjWWzzky0Vd zvWJ{yrcz%u{8_ayJEb%-1KXO031|eetq`=KKc7pBxJK;!Y@Ts(SYf44r4h7>SC8X* zM-QKLX?KReFgFzv@~LRUhZszIC(|0}n;?(?3qn%}=;GS$I8%TV87>hyuG ze2IcPQkp+UE0w4AWB|z)9PXlhf_5OqKD2srtp3MFzH#A#IesDjNr z4Nu8}$obVm)da@Owb)MVqU`jAw6xuewC&RiA9VV4H7K!W_VC7mVbEI#wk8ZXaYmo%jjyBt)s%*i88HHn1OSx1|YJ>qAFdK!)Zkmk!VEb&5{oU z45v0i5{x(j<}|2?eQhL#hG`(I?3@bKa%Q`9bXI|#pkfIq!_(3?isPax+$&Z+7y?j6 zTWA)QGMyXJR2+jC)1!{D@kNpp2Yok2+KlDGn%Xv0z;UVIj6cVj6W5j;FKoij>O{IA z^ne=houD}cjEh|w*SEBw;tyUQW)?X*5NQ0d{FASQpJ>X@@C$GJgU4J+S!ZbkDqk=U z1&q>W@|NbPw7kkH-2)!$=?-aqB7MFye7a9Q`|}dHPdj|YA1||Y(_+4u_%a~44f_=0 zYmzGj?&s*~I?fA;x!ogf4jl`65e-}>G~wm-(Kp%1S^RNmw@dD#tu*zw4_0=ZGk1+N zUsYuLP1Rc*7z^DRK`X*ZmWAyyoc!-)mmvmL+7-@{wEQ}zaV_Hys=ZsStyW{jNQW+w zw2B2+n_xjQ9PUK+l&aM@RKg2-xdOwA1|95{o;8&BA30s{*kX5-cQVwZN|jkmstF9U z*km2;^4GH0@zqAWT${~5w6(^5PdC%7Sm2^-tsFEz#l=`3j5F0Ek>;h|uEK$OZ7tt# zJ69o``wLuEBbe)-xy2f`hX@UAdTk<62l_Pnr2F)karkd0OgO9E5^(`bC~Nlcc`S1^ zbl6E#I_d1e-w7PRQ}Ge4Gki~3FKeP$LJ5M0qn9ylVae=!jzRN>*rk8?jJ<@pMn;lA zM<=HX`UvtB*e}NYNfI2%zVhVoiCi3PpE77_yT-!y*;Lg`K#LT6%yaAB+gP3yvQsh~ zZV5?bU(55qpk&J=MW?}0ZA>tKIdWR3gEq({0)C*pHTklcppxZ zny*dWZR)coHgDmu$KubAxS>^Y#0)9jAnsiJ)+$g%;(4@BAvbp(ULPjqS1$B;NkpOJ z+*YfEJtqnonPT_}w#y&A4Y@M17B>se@!En_1%zG^<+9Ur^4sZi6*{H87FlC) z2ve`&JPuEAI?YYFbar7v#rc%TeW0Gn=6;QZO}ldk5XHxJ-}!$jVMly=zSg}WD|Myh z3hHs)%?N*(ird1J7@gvcol04B*td|#V=4p~xl9CNk{!Xd zd&{uScokGGB14IXhj*dLFQ3%ZJ|}Pd2!(Z+d^J}t1~2fT3WuaZcqDbJG1pcotso>^ ziL*p9er584V6DQvBsFI!`4YhjhJ(8LJXej@ObtVAs65y;Ya?>D8f(@BL)2R(Syq#`2bkmxi z(9EZe$*|(+lklD-52)tCRUoH7)ozsO3W4VN?Pp%rqd6O{XhpVa@LYWf*B~Lri)1Y> z$*+sZb$L6VV3kMFnAFCQsgR5$2{bhyLVD?P{Rf2(Qx8zPrYv2sv=7IW1VJe!Xw&qB zKXpn33FQUw-XC|g)tQ{{;XivhATE^>6MpjZWu|Wu-*ZtBEt@)?$i)ur zF1>(T2kKxMmpDlg92_%SYji=HXL*xrCnvfVd@gSi)dZNKno3|ssmR&mIuVLg*M~hy zDhT5%vC=tyKIx~to^)|*PjN^nZXFVrQuLCL3Q62>);djuR}m^#Pmr^oIH0>_H@z?$ z0Xb?t5KIWGr}=PmoAl)K1x?epXh=0wwRCZa?KZ;p^5*1LI=B`q(uKha*_a<60HadT zqqcctr-SjFcwLZIl}A&w|fH>n0&{VVm6eINZ);Lsw>#>eIAcb1oGl+k%#_B z4su9(+%NB{xs_R(XA#O(k<`+mYA^JL-;;RY?7<#G5|Ux#9TE~P z3aJ#s*&y^B0CeSpBN_NwP&j@at@9XLd34_*9SPN-*3vZavv-XJdjSd{^xSQzU;E%P zU68%%^&@NlLF6Dt<((o~aGbUC$LhXL?lU!}eP(;-mW%1?)Sk(PJe-r?LRY~mxG>)o z1-%lG;dkzrYBgSy>kAB6z~LwJ`@l1;;ZgT{YII$ATR`pd7SQP<5?x?Wk@=26rfQ?` zcS7Kh`0G`E-b;`HkWOl^)Et5L?3-gwCW3i2aFwRJPlZ!~C4ik+Uq-3{%P{rTa+!3W zBo_p|Gq%uhg~tx7J>F$(Sj#ncj!4gKyxJw-YmpONElYujdaUyA2-+yAtCY$n`07Z9 zQ@5A|LZ)U*j7^{{D`sz0$-frvNJb+oxkQDit1ht#$)O9w|8wJ4cFB=$34Y_YX>3YF z5SC6*Mrdjsq0XMNTBUp?ioqto##;jAHRi%~f)1~O-R`1$JNy?l_3(*N zhpwp3qB>d1Ek;LXw98y4a@^g6DeSUM#1xa0E+wr;(GS5PUZZ7%g;t=!2{AaWKrA|^ zSbaf{_D#{L-d1*WgimJNYlT`G{il(RT7uR(FjS?});?5WZKyfQ278{lVT*FM2H}Dx z9cqbW%QYP@qWrM{#$iWXVrWGg7ReaVE`IfGIMi~XA!oNvm87^#Hk1J_@mh{0RNq(F z*3EdeI=a;P$IHZ|=uNkx%NAoxAxrWFp^t&kd&IM2piU-RtdZncn}UN+mXzaGZQ6D) z3J2~%y@NrLB2@f>Z=FzxMuB41F257MepZcle*+5|EU4n+qlRV?g&Ot_zz;skDO8|N zltRx-Nx_JuTT*-|9rRL7G%;4yiLl7&5orpL%lja-ZXB)_m~?N1)U)(CcA3MQ*i^H-2vy;Avz=vd&l5^7Q*5W~|#VGU&{ zTTrgIiw(-5y0u)X4Qa9D>lr(2#m6AXR~yoek#e;_@&OIz4L5DNvDn)vt8wxrfc)zEUJ%$Y2+yGZ-ntJ zK&n`-;3FlI(=&(cjjt(DPjB>Qb(-F%G0J*mW>i}6%eI0odK&FYw(OTNCo>63t$e&#AD#L9}oX|{!wrbBFKg2Y2Q)SCkI}8 z84|mYc_r$p{^7B(Yw7S${=qBbv};wmS$uA81|d4l56ohSXo(94pAN`X|7RrZ_2^p9%XPz{_K~Xj(4KJ zjE&5KpXP4U%N!of|9x^Q8fcDs%N-Ztk>V!p5~R;dWeCuyUD{45c^bQ>dM$@dK}%%^ zD#vXPzoP$#R^X^H>C9=+7k$#)zNq$vx9d@j0Tagkj6i2Xk#BE=wqa8DO9x2!r_-Qr zB>Fkt-@f%&*%~{&y9gRxV9E$8JEbYtJx6hMjz4wq-6@++PStayCh&mNToJoG(!EN( zd4*ay|8Nx|Ac~DIiTFe@eS`tfRYUE8ki@Zd;shtsV`ZCr@JRiSbh)N!Bg!+m@RUqruW%rAWYL5;tx=)SF~Dx7_)jCH#D zG4(`-382K{<_;yF{7_8>d2s^m@r!Be2=kP$IlN;{D?J9bgQoY_lZn^kEGa(h*Q1r1 zcxK)kal)Gsde?aiT+*W_`dbH~)+A_pv8sALIz%By1CmX37dv!yDV%g{1 zgcwln;b;EX2kzBt2IwgPT1Sn*RgccouG(fWfEM=br41c*2p?KkR| zL;yyVn7f6=zraugi4GJ7g66wNDEzCIcL_B<4WIJ=NOY@E0*S9X`_-Pfp=w}5tC6s2 zA8YSJggGfK5!@BEwXDv|OyAdUY5N9Dhfle+$$7OOR5-hO`s+&IVZ+`rpQo$<8x`L( zqD!WqST1FQ>Txw1r51%Trp{G9rZEO#SiQ!sNwCc9li@eT!dWX4`$lDjM*iPAF;nkHQzm-;%*wEEKE+Cj#2) zK*cQ$s5awEH_zwhpF`J^&&sthfcWGn_cJF={ID zeCi$tI(#294?o$zoWLsWUfgP1!-&SPK=-dY6O6mF6kpV$JSp;b!@obYS3CFY;1oBX zDYyASTPeyp@<1HabwXE@jym?6V7kjmhHW+upvrn@l(z3=jji|J%I=bAR(ET(0YDt2 zTn_$9;0-7~vd#u*jx?Ft)x!lJw08KBxCzIqy;EK_PzBi!xzH*q|0!v4iPsEq&7gDz zZL}^IgddEckJakvIECrOG5byJ)2N3Qfe;^UhBxaf0M4g;6YBKAXqc7txfcdeTy1I0@_p%s4=Jrp zRAsC8+H~P++r~WK9y2<6cMTkAb=;EiGocZhpYpC_wVOY^T}7!MZOBp}+7}-Jt=dZd(EB6^965gFS778@F{Cmx zDxRudns7$Yuj9WET%Rcy$-uoXo(~Eh<-B@&bt}djLn||zIwt;DUU z#7H)9-}IFQ_O)j;?wmf(&!RYcrMrMx>sSJL5N5e(V^S!BhC^B5pz!|8p4#LoSnikG z+Z#Qq7JZ<%jv@yhR(dV_WaW$f5F%t&Myy$38|tnNJ|oL^B2$J`_0Eu8PyBJOhfwGR zPt2|==z}yX&}I)hBsqD?aiD0)%H|Ab!l(P>Gc5gEN`m0`1sw*8)-IptE8V#=gLt!1 zjs5JQmP)Es$qM1p**P+wbisS1@oZ)5O~{3FBAE_}Kq|G5ISD>yZpVopoG-7%zW%@lA9|&715h61zqz>;$t?otI0InienHxc`pxdb`=pJAnh$Wpb z9$*7Fq$^XZcIr)X!aMZgj_ZjORA@F=5-9R*Y*_zYL>dvi&!)^R0o>| zn{U>{i87qbIVn`oJ^&s7-dHOYw>?teg0PXGIah-!a#0&4O6qQ&QLZgJq2&p?lh<}G zrC%ud%%| zsf~J016o&W%tWpDQoWhG4QGk4Aqa(DLrXbIsv7c*GkOh2Bi?)PTf&g`8M3{*hCJSy zw^CVQ?tO>x1z+@5vL&yn*^(%T?BgRy0)T|d97mv}1T@cEKkgb%=ZJwgQ>u&E1~kRW z8yE^)9Q1T?@}w(kIO^;*jnhf@0XW@PZwVaQ+`qEhxgLa5ES-eek7i3^ z7}pUUkiM;$yMFnbynJg-xY04A_h5+~>}UPu%GXRP{6S7>0faXjP7w|~YJG3TDX|@0@qH~6HKcm z?HpO-v`aSHw&1jgAvy78zLNdSb=P!3XTBQs;>UI$F&cV0rGzE|WW71t8L~`lfLi#9 zrf>0yallkbU%+xZ9$G?e%s(r4R6(^_T)k7}S`n&rXTL_~|jQQ~@va+Ta)ExUiY+!#kX5qQyCleT|zf z32j4%+@ggfxUBB?Ph<}`A}ZJf^B3A)6B$|Ul#6;GTM%)xPU z90hKUi_0pexjMVqkO07b0c?IHprb9dC+T)pz3okHRXcs6gB8!TaxSgdwhpy{9klqa z?b?eX?)*<>;M-lyA46I8{ETkBIry4<;)a2y{|!`mpkv~D)xRO`+O6Q!kJrM#H~c5T zuf}3daUAvOHHb!UwNZ7fBIXpMb9IxUl1BvlMBv+6|Dx_JZeigve2gko{Bpl)zuY#* zE|VEMw+S{CRZl_BD@qPo&pou+!z&)vQNSCQ5v~u8aIez4KTSN4Ba|fH`O@zoPK~0s_%RQZ1WhR}?0 z74ljsDK}&fP8^#M47m=cvn~|Ws3)WD>m++4f$f^-f)nmr6>-LMy*R*?@n;u$9Ai8- zixjTH=#5b)m4}TCxXt-8H%L4NKK9L{xl%8wDQik!{SI8CXORIFbbPKDW6_tc#f5=D z;q%!g+yFm7z`q_QrLb-=#5|rza55|hJ}8Dafx{ENW6x`ARQ~^{NrEbj6xSU9P~owX z(QHqW>$HWcvvi86#<$0pyH}UJU_;iXVo!TuPXluc(qe_{1{V1Iwq<{WA!%OIXyu{W zGcS3P(G+z115AXE7){O~sOq`OD*%_2ZLBG30eZ>SGd zZLeOtKnmgbc0Yga&Ago#IUm=vT#|3VJofmRYgPg29C<|Sloevl?%DXi+A0VQI}z-K zK)%ch?f0LI^}e5mUw-iWdT&c$%Oq_1nRmc?c2eluJlU<|v6m$Rgl(i(F3V?ri{}kb zORSSvNz9~!8p?+P!`t4T0Ln>CRx%>!+p-mO84~vF&+C{aA%tNoLo_zC8LSQ@SSQA6 z8cxzvNQd@}C)z!J%3LX7NHa6vEuF~%Uz+&Y?&QBo`2Z>{{U(AIRC0sm24q&prl}A; zSZH99g5~k?^`MXtDc{j}h$Twb5!3$vVbespAHiW085S0|u%!NyqfEooO#ReiW2c2) z1dnttRzp7U>DIfF8nJsF%x$ z8eMIKoV+-qO3EDw-OTPiHXd(wr_vMz&N}8!3Z@3jsKi>xPb}B&89iX+P;SCGog^(r z*w%f(eTSny^G}z@K`oVuSFo_g8kp2fD!-O%z@i(R0PA#R<(Yo$A!PhzZDn%_RS$6R zDLec?@R31tlYsje4y=DQX8V)}B<1MC<^FsA2{B8gf!?T11G4su$Clf1ApWZ+ez-c5*jIKZT_$v(15{r2l^R9@^P>=yZ$1gj*CY6Yr zMWn*DLzYyuNw)Ce*UFiW5;sJZbSkHX66ZphAR3K*)c}VVHclXkjrt=9>(oz&bR|CI zpcx|zsSfDI z0yZkfSOq!|L#=dcNS5M&*jWMq1AkxSI^{9HTJ<`f23G~7_HXiU70k{_>oOyb+dNM> zi~2*=ZjmC3uPd5kvW#T|N(EF!nUegmlblxw!KmL(ZjE|Dxd4@M(s(iNLRUFh$emXO z;6t}v{pgWMENZsh(h=lf)M<3N)#?i_#o1*CUYu5TBi-*x(%xtMCUTiw1JxNZ0@g0K zFN>f?DQ77Nl0Nyn_^ZPfY(cfO8?h8sR1?bwwBOQht$2~v282m96 z`~XAzpv*k_Ez#;sS$2Qvs3h|d?*a9Z2!z_8phY7xY8CXFhSX(qD&wS!cW=`Au!{DS zF3i_aGJeR;+;J3?$V_SsCK>a}m|-ywVI2B7<8-k{4^0vtqrOxPZWd%Wmg2{fwUhbk z0(4K739)Oelf9(Euc*Hq0y~2kM_TQMN~ns?H0?D7=%tC|TH(>kgnVq0tSvAw0y zHv75@$+E}7fIp2PmRAuq`z1Nnynay*PNJPvFZ_0S>1*9#5BM&Nq%{zV38n@m)GE+M z=`JN?!NT3S(+s~OT*4(>!jy}K z-hiA9a}?Bz?a<`|QX~i6a-s}Qr~pZ^htB3qa?k{Xub10!7LQRD$o@}cMV&ux4(W@V+~?5`1rEPPEQzt?u?OBKR5k;(n1FKyvd$JPp>Cf#G+2ZFlT<5m$Qzw8?e zmjYD72;Iseu5sW%e4KQ4ig_dGWw7;3#SdrSj7?5HE?Nk&=RHfgkB*4qPk|Eniv$TwoN$r_XR~mG2&RqIqzt7ybMEsq z{41aM4@U!83FFv*c*}O3&2bR@5gygvZO5aLlsQV?nLe4bV}7Xf+z7@gTZRj}o=w4FK?TB2{nJrE8wn0mDT#Gu zPV~J@L;(9BRCGYT{?Q}lI75L*iSeJ{=7^f5X z@vcRUB;TwO>j@+rGuFCQL}VNGe1;!xL1*w*UveT>Vr4ZXTFZQ+4J8x!4^?gLEdX5|JT?@KFb9{UfKRbT zs%535#{Fba@svavC?T#!(`*O{U9FiUzYYqO`PApdC+aTT4?8=+Mf#4S?7HA<1-4p> z&}bqer8Gu++dS^=LMvwhGK!p89#S%p9Jl=i%_2eUN8rDWWozUh(&( z=p#f#YV@XAPc&jfOG^D27t$(J7k-vImj$J*HG`{IMOLWxrEk;GNCv1g$S;+T(ayN? z|7dUvz|kuElJxp^MSr_ngvsj#6&*@=1U^uF!>R!x6_u;Fcr>pX&+dNEls77i9Wu3f zqQO%QlEDgdmNqG<(Olk+%Ud-%5T@k?5vT+CcY@_sOdQ()c|SPPiF$ zM^Mk7kbFAY{D(858HC=?IFuZkt=@MKiZwF&|3BnTe6k@OG zGjIIK6VWBOJ~&2QlXxI>Y;-vqWy+|s^n=M<>WJc3!~r;dI_guDm`Znvij2XeV860u zr^xG+8LT9DT16Q;m|B^xsA=1cce0naleTsbA|vmY%c2v&ldX_rRvm38Vt62PV0WSB zRLV^~{aG56H#spg{BH-dELq|9KPqEG*xrlGS=z z(ay#vLrLjNLl3L9ui*F*GBVM{%H4KF5=IrXnl0#lkVl>-R#@U}YGjS80>~O$<&CJ&F!|W?BnCxa>D{ItBwWoC zk8(>OetQ!q^k_#kKl|w@1r)N`vWSL1{MpIhL{ezK=gxdj?+$C$Va+sIbEE9uq&Oh- zU@5ly|6Cm`=t;&K?5`N9jjC_qnka7h-&_01ttG+MKRs{IWi1ms}DwteezQSIiv1ujP2Y=g4F%$0k=0Yr0L#J^cW#Fgxv) z=_B!t<3O`_?_Q-JazyzPtv3L0M^)(i?y0Ukj!WCpp?gBlB+)tqNoF9UN3G*Cc9%qtx(`nCOs$DIO9suwayLojR$A{?ZI{b-F<_R?x)>AlURk*qfgEusv-*3Nf~#`Lmd_S|r9VfO==$1tUQlR>z?q zjb`A^Tt;{4FR#V=ue7r3Eahlh=MJ)sap=Mc84VEU5&m|@6`pt|aEBm&piTpnsI87b zM*AwT9y{)6GDnmd;Ha&)R}@h(XBbiLH@eVg6uI0m`pvl^B&(M*{&e8hz0DA0zsCmt znhu_tkp!Zpago0IptN;g4c_QNUKHvzQ(fGA=66aUfwPHp-S|SoO0bS+;uDOLZ9Nv+ z_E_2G*4>)zru`@(;FLn`u}GnwGlKqXdxSZe-CRC?h{x0?Ff22NO|uUK@ry5beITjp z-z)YXC32GcGdQWOk+4T9>he}co4s*EqVB!U)&3d@I^B=aiPwGDx8*mzI#K_5s$8z`Qf>~(MU4qqY77Bl$63a;i2ecxFX(%TmOJ&co#*}Gi?gbv6>CFF+ zBMs4Uwl==Kjn`M(oRW^|;)2(0!_cn^i6IwqaXOP0B})B0C@3lMyDn(R4>f`38+2Sc z@f-g&Dl2*Y>8t#_Oo#c!wQFTXTV?R#u~}Z?@ZXf+t%l(gOxY*oCTrEk-#@xxe3I$0 zc0PF5nLVW%sGwSaczD8Neh+5bk1amsJLFTf$RtiCqt)k5U*kwRt72(On7ZlKSrt-CRt zkz6z_gk1gG9IT02B)2c=l0(ja5SmwsPpSbVBz|bAu(u7{fvM6BFl$Z?;aCFrzw9UH&+T#3-GXx zHAYaFJ|E8%o}0f$?#cYY$(f~B2J^tQKU7DP&s4G2#8DEVvp~N%UbvH=J~>96W2cLhMr zQ{(old39Qp)AnX3m|(cgAJpP^07(K)H5hqbe?sm0lA8Sk))T}V0ohPoUU$y!Q8w6| zaT7+@qj|%d|N1a+GPcVDn9P!x=bX>5|E&&mecGmB3@K6DKP{lt)$5582Ypl9=%ki= zIhsMkU_>hly-(H0=liDfs$a1-b!Etd|HE_pPe_9Q;N!24lQ-h@w(==+V1c)VW%~$I zxuw%D<#=}qXUgi=o47N$`?~Y?*Pl&0AQCTwMnuHOD3$~w%6{vs!gHV9Cbp@6O?h_U40SC4hWH8@!y95D+u z^0XpY^v53N<4D_)oz)^WV1}c{U4l1RpawK5{H17pMA93wafT?hAUe$bAh0nvEv&ts zp}PG#+qN%@*=Y)#&-=mNm}!wtG1x$fGBA#%=f_|@e_{FsNCBn1wQmiLV*B;9eFV}> z|98m*vC(w5*OznyJI)~ulEuG(mY?-hZz~EF3UAZh{3E{q-0iRqu~;IK__L zevTK4uHk`d&@CXeFam0D!PaV-#MRiS*+)7+)(H;=xB4yO;>vidP0s5qkFSi@-|JDi zFIs5@E=1`wI5rqvpKJFKvz3LD^s&?>xKx zBF36eed%M)d^$C6B==rpJ)qGXHnC{jk8>F4qi`bu%$qA`qQZbRvStU_mY!F1FNG!@ zxU0$_R#W0@47eL}iKwPO0X!<=OP!M8USjSMpOGNhotN7uz1{E>*9ULFF%&zK%dzRV z1+Yh;Ir6>C++&)sp&61_e=ir5z$(|lQH%@uOia>mC9ow?GLLpZUAhFS5eE6FGTY~O znf>Kxe_U3oMzeg3XByzZYjGZ+;X}!~?ZMbEAj;sU zw6H$^Ruwo?ob@UqB4!bI8%8l0zACzQD98Jg_Lyq z<(4kT$A0I5$ePV8XaMLL#)eS1y-on~9#k87xro+}CN*l*0$(RjppDr|E z?oms*NtCrIxJEd_(8N~Q3|U;m*|!pS;zm%^mCojaw2J!)OP-yXee)5gu&_v8$G@va zde+6Gk*{T7)SOhA^khWDVr`n?gI=}s_z1O=e#-2QsmU|wd4!r>gtkXI&z*0J59fzA zsdd(JwGU-f!zE&e%sL5{<3zg&nI5I-L zjIJntqz=%;_|mbnBo5(~WhStZY=I$>&!)TA6xcouRQJbBNx*`pQ#7F9BCkw;KRdcz zjaJDi<_hIJygm~k7vQlZP_BZW-!5DPo2H1_{+oUJp4xwIxHTYvm`%X>G1d3qhkgQl zL3`ZckK;QSWxAo1;BJ=VZHST|Jf3k$Vv^ba69`Jo#J>Rp*JY-RN!$WsLf7pZ7zX>< zxU7W5Sr~DrF+M8`z9GJ1t6MUcas1f@A)lJ`EhL?Uys-Aa{d*HZh)ezbcZ54 z#?+`3oP#ni;C8o!XQaJvOx=BO%Ch-^pkD0%#LxY!w(AU`pp1Vb>cM4l{;_8iJqOII zBz}dSQDj-A9{|M20=agK8Fa0p`Gz=0_(Zg&8rTxZlRH|O!xhJ5SqC2KD<9eKnC*zW ziPCFi<6seVgh$VXfS+hc?XwkrR~qEa{5%8CtwU!3BoFF`OX61SP1US~HRuVdZ zV^Vsom~?}>8=ETzSm=?EBK8kVoNNt%HQzc9@y+FH1gO({1te(r_ec8A+B1AfFM@Qg zHfdq3>5cT}EEX|6bdF^7Lr2Vjd^vdzZ$@X8Kc5sdFf@oWdixOyljCz}J^!-MoAd`f zuC#HJIJo3mxs9bEsX+hZOP-M3GrLpIj6Ejvi<}sSA*0sdyn7edZfl}!W2;-a=qYce z2_dFTxkRVy8D~CS;S=7wTY&MED&s2x zzdOPS<+>GAb*<6$_tJf@@Q_;UufaSRy7jQ?L!5z?IEOE>U`uqPW(2EBeOO}*Lfz0N zapf2D>f=%o6Rg2$p`?TVHVeFmXPRKKOmHDcJP;+}=Q-i3es55wl!E{Ri747^Wki!v z+{F!+Nw}z~H2wZ^sivm~cV;)1#s+B%MTNavGre6qHle{K*4B0nE0u9Ou|Hud<7T#) zl_gec&7sD-AgAQ&idbPGo@Q&m*o=?$$LdoEnBL0Fjase4?oECAVc7-v=vX z7pdYfevps@N*T_N#w&8G{)bA|qfNd&9o){0Oomz6+j;$UulqaihFXCBRe227tn;h9 z{`T47sflhwv}b8TxZdfbRgL{X?Fn{%^j0jr6hemq>b>*|{*BwxB=$a{ZjOWw#Ki;U z3`^H*Tu^?Rl)B(X=GHgJFTdUJc5n~u(1K@PFJ~0_ZOX~KXEz(OVV>cePhN;&nBp6Y zPygRDl*G4Y^5WoCaC%9*_+NfyaZ>gCq4PTNYMMz~q8HEP;WEWgRFIF=oWl&Gnd&6W zm>6YXCIFGr>#PCOiqgb&i!SO8pgQhmE(I+El1@oPc{Uv3jrW+TJAC;l=~{a-E-hO# zAGj1`cxnIT!CQ*vq&xJ6JApg%Bg5KFeeQG(R_mw3_4-1Flu!aBDuLYV1nT1k*vSHSB8z!egq87!Zwa^QKX6ma8tc-t|;o~M1T=| z{Q}b}vz>PF$rg>uq2X-75&!=KSSI@7^P+yK?w9!Ugur%D#z{Xn-5W`m@K8Keo;e6P zcJh>L+v@7Qj)W69ue%KfgPrg*(a%*&Us0-sx4-)Y;wEZ(J>Tf9W5epw&@7}+i?#*XZF{Upx@a~Gzg|Qv}a$bAmF)U`*_qOb>2ORW#9*bi zv}8B#9aI{l`F zvMOlMmt!{nSnS;DT51H09Lp0}0X968&-+iLVNaz=MI82qmifs!#`jC(wi> zL0elzS_2kZU8sX|7I2#=Ihy%CJ$9Cg;cIQMs=cgOqi3fWJAed>wCaAdP+-@B0y|tY zHsf5iw$$2t$0O9PuuT^S^CV(=CEZoY6sP4SpjJ_axwD(r`*Apv4DKz@$apj`UXx z2>lsZ&Kl2!%YGS^g*i5Rf^b(!A2!AO$}d_ZXPRHMzVL-g8)G$kxb?<1h>!2hKhge0 zuQrOlW`f;#y1NQVdDnLX^b+B-@kO0fniCCpl{Zl0O`+YT(v+&SK2;T+mu|r;Coh1 znS+}Q->i%T#_crU86|?4_)6YqQSPI5*=X(^i2ej)y4J|J^2o_#)AgVfxO;#zVvfHvbrWXdqErafUclzP(>eP9h&Fy@BDz&JQ_ zlXclLejvU1@oZ#G?RtT_bB}3EFnww9$6epN+#OFTq)gqigFBdh+c1XEH#w1Tn$?%l zx51l4(uUQl_(t=Ili92??j=`VO2(`!(?|R1kov@Tc&5DYcNCYG?Vqi=8i_vx%Q3l! zXIleOmiGqf)959{79*~mil7Ih4lW8biOCPu<#X!t;x9V{+L&0rx^a4cfPNCpd#xBv za-G$+EYPfF<@^N*K?yt}=kP6#@w8l3=Z+lw3n}yd4IA7ifCx`>dzEAnbqaXQeuUiO9%- zG#AenP$##I`cpdw8<+T1{B zB6SKBQhF;6eEP)O{*El$@VD1cX>iT!A$V1`+K^%3LLwb}RRK^<`lx5auO%+415 zjz^vkPGQUtxWEU{ObQ=*Nial2dZS-A$bv#4&co614ME;f#FE>}5!kV~IP9pSv>*bf z8lUre>|=A+R2JVdBf(T0L}e4}-}iEy#VeUE5dSr3g(DnvXKu&}_Inpv) zFgHYBg4RKx-VQR(NQU_nF)upW_ut|!Eg$@e-{;g0^>V@lu&$mwwwI6D9{%jSatssC z{Hq;f=k4#^c*!(i9cgeiLzE0XM?5OQc8PWG{tzXcnHxY|xI(SKM4!z`{N~JrdkS;U zzt~;c8v7uAzmI$o6C3|^+b;$>nla^>t#eNxol3woKV$U$Pyv#Ermbspw7o8>lw!|I z8i*g_`&7&?#RAV@f#R=|O$yE!6`v_aQA#!hhox`4?E7o&mc?VCVyU82RNgr_rn87L zVl;)NbU5rJIN&2yEv+?IxynDCrxE9)=1xD4zotLIB`!_BpTGEP`ZN5s5{o-{#PuNQ zWQi@4*C2P^XlV2vv!_HO=s(nTt*v>UDFBiYd;5i4m5oemjh~_#xVe>@=FGKoa_Y4! z#l_76LA}A}Kz`R8T(SgQhv@v2oQK@m6H~fq%a%=VpstmnhL-)oG^F>M`a!kSx->{M z1eO_KXV*m{xzxYx{g@obL*SVDL2?~O?fj_$-@7*t4bD@)Vg(^G(dch7Rz}8*hN9@; zN&i9IVmqHtX=w73aUtd)vovwqLJUVn8*6&CeQ}R`wiLFp?)vFlW@8)p(SG{E)^q;>q+Azc?aj?AARy+X%Fg;uB?0DShG&p+_n^KUE(HIKc_ELj?NbV^V1kNBs?~rKhQE|n|23m9u(5>1EGEtwxfgHH=R4>0B zBW7b9^>u9;53F6Vb-Q+8Qtwms3hLB64re%c82qJjnO`-a^@>5t_bOuTxqc<>qN+_9 zfcIVU!fjuQH&!!Ww*;QSMm=&J9z1c>zI+o-dlp+Ua%#{lQsq<8fPsA_smfTH_yIyN zJ|aX;SnX&l^NA^681tPUzyHp>aYJ+B!u9abQ;~k8AFnK5^V8chPFq;0^Ma$m0%yx~ zeFrd&1(77e?2PEiSqZLL$z^OOqKM#gb8h|;tZ{shnx$anIRD_s+wa30@JM={wXAai zu27W#@>=XEn24K;43F$j1hlcoik zzAhJ^X>!?wL9YeZN+Y22x z?Q^85%hyXD@>cg3r$5G^`_Mxi1f+(LgQUpu?x|V11#}Rqv|APSkM$<3E!VnncW^lf zfR3JYbpxZ1Vm)dnQLQ)`zq{gYNk!GK^K!2wEv}aYH$x6BeaiI+=bw_6bRF;@f{v!j z+9Da!`$x5u&ZdTrrlaLfJS-(LE%#%zd`tj!Peyc?=8fCjlX{Y)y?pDKc>?cew4^F` zuokX*-CrWdc{Jsi*E#Cw=uSW&YBqe$F?E(ByY5sh zCP!=rHNTyjMko|IeLvKBUJH6OXHlQN)!Kh(1}WCjh0)0xaqIX!)E|%WR4OcL3^$)8 zeaN*$j9Sl=-Wy`R$l|HngC`3Sr%O>ipyAgIx$_peIXokKdM0l@d3LX`=e$k6%4hcn z<-to?l@GBSr_?WhjybAD{WM-+uyzN_`ivNcYdV`vumFcztp2A=r36W{i=jFbAYwhp zz2Znvl*!KZXpac* z7-0cZYIMy%_~2QvSH;I} zVvM;RUkQ60@LV+x_ob@vI_qmP*u2MBMcr+06Se_YmBkzQ^5mu8j~%J7(M}2clniwT z>)E()U3QgpkuPmfp$#u7&AM8{Ce+`H{gLc%D^42|>>?9VlhB#wXLE`HI(BsW&x0I?FGxI=p z&bBCMqO0(rd3{bChSR9gNg-<5{%qdYX} zz$m%iaJvWa>*bGBiP0b#N8WQu6eMY7kPIB@L%0T`!UyBnIBc@s2rxG{Z4bPZX&VBm zNxAQg%YlvjWXY^V^o_wm`kWwW2;5VtJ^n9ORgHZ#o=;k4Rz{oy1imW9iKll0%)U+U z{IwN#a(Iu27z8IxCZ%5WoW6VTL`qhRnS9;) zq&PS-+PHR{-E=snpKC(9lvZ+Y$alQ<&APG;75!Fhejb2ozRI0?^iHj~mhT>wl&{|i zR!CR8!c|1V)J#uhP95CCMeo=eGwksbUIJo^CWn|em1si^Zvb$VS$k3fxE|F_XBrS( zzpfczED+qM6skYElJ}atkC^iyPl}|=@AAZ4>0L76;+DQFHtY2K>qh?WC}Q}gjkQ1M z2e>^pK=l`?5wB|Y{kOj}l>&)(JK-7!h6!88Dwn<*qD z^4Cu8f~?F!E)V)HXfkN3?yIq`0y6mHznjJwb3l^NBsy5e9Z5^w^YBFqZDvR_sxJpS zPio2@y0>qDKVm(K4$DA5%=zY7F5jEdkC$!L?2AF3WYm&^K0oG=Ct*$1qf&QiO z_oC-8T0Ai1QiR4grt5Yg)B46Xa;dH;rMwKT?mN^a2dTn9(SRctE`glkOA3rmzqmu6 zkkR#Db=cGvQKr?9B8yj7xwH(gEa0zGq=YW@&EcnYqSY^A2_b zN?T)4yn(l~K$zqJYE2EXEp{?aFZLFCf>&eYWe|;kvaK(GURY(UQR3?B_2h_@ZJ%=A z43-w&OQdM)tHtxWR`UAEx*)p*CglZUO72DQi8SxvH4~>L8_L0Ygkb>Al{b{XS4)7F z_{=&bO!o54GVW<`6p)R6aKe5q;UIoPWVzNRrDrb_Kg?7Xi8NsMskqk5eIgyS&zoLt z!5TQ@8CZ4#n_e8L!QG{L_$^PM;Sr}xy4QaRJmz{YlUp~fj*mF97^n%ZI-N{K|7+T- zzM|NAy|5JEoMRtV23mE-MC&1CE7B-|@N!1Gn{GU!>oRY;D(p$-e2%!tZllLKoV+Z( z`79Wqak0g;|J83COlY~q)51&b7vxK6sW4`kp?k&oZ-o)wE^Ywb9Tg5 z>&B#k{YQ9}1>BT_+iys_5r)^=<gZBbH)H9qy`(Y>y4)d*XLt#CMe62=%m6&2h|A}emVZNFhpvQxC4 zheD%Pp~8x~v7_31YL(x2xDsZS8VB{nVy^m>W${^Egf|DZHsyH<8orZHEePt~e)~m^ zkKlv3An9FJG7s>?t4}_{@v~4czW9h@IqkHK}ZT zQ-hT7<^iIoCvqrME!!xt{Vwf-iJ-%W#p%!R+)MQ!<~^>K5@BNksYi`EY}4=k9z?9Q zM)4MX6Mkc_gI-HqBgEBS)!p@+^!lz2tr0ZBS6O%m0{G|<>g+Cv5u zjdN3Gvg77W54DBI{BqZCUSc~z=cJqdBR>QCQNPHYU&NbSn<2z!oW^8vsiZHvES%^$m-SuQEuh55BR4&0a*(M8e{y7ylgDi z3a0IChz{Q;dV-4-?`GoX6pR|rn4DW!=VB#y;LiFa-nuzIQBWJY(woXJylVPQDQVGl z@x70oE=|8sYa{zrClUS1K|#zFJhcQA@o|+&)PL2gm(amA9W)QwPzBzU^aV9`Fe1DM z9f%mmlu89eH8_sUy1%91pLSr@2{0@T1UFZ#rx^tfus6R2MPRPUjci&6t?)tJM^U`d zE=4d=B)oQR%g7Tg$Y_J4`0;BZ&{+{EVOxhk^&5_I*@sem!7~^0y=U_IMo4l#*U<03 z4y&)oKCxD6a;&VlWA;?oOaa8X5D~(AKUm=uIScGgm04O!vOaW;KoxYicFwuv(!S!2 z(=4`9a65MFM*4FIG#dJb+zQbK)&rADdaY%Pwr@~ha&lw-~49V^%Pm=lLGk9I9~MO zAHVL^N#S<`n>rgDZ5e-bjV=U6Q#Qxq9J|Xcn1g%S9i6RR=U%Sa8PGY6#*6RBuqoi5 ziV;clrI*S;S)h6!$r!tXgnbHz(NE0(_<+&EBpkwqqd!wGrQ3B!c5;GexSI}S+qsO7 zY5GGmL+l|CPL2yNrks^v{i0p!zvZ}Sg=A!0t&uIFF?MZ3EzmN{q z-o#XVqCPd5e`PWE^2`R=Lb1%Y-fq3n3%pg+*76zZCd|OI~24mY!5j_rW zqm3`$0b4hg$IwoZaUU zU2|kDFhK4j_tI*U!I5QH=@>zPRH{wN-UTkZZ;R@AzXZ}?WY8$SBC3dgy>d-dpAvj; zfn;pc(DszE-P#O&EtZ+{5WMLb+*nswfloB9MTUUEfKU8_ZUVjf-;5iLT6^ab^iVWl zUkiheNcy%+Yk(^12^o#kLD1P>yDd$Qd(p6<8@0+rk0Qlg7BcwS=*dL2HullJ68m!-a4@qq zT~d@oUGhTvIr&=URi$;GIPjaM?kVyDx+Ym3)-$1TFUt4>eGjI<)}sZA0+Dt_6@Kg8 zZj$&BX2TU^iCJ+Cn8XOM-s6FScZ==u5jP=~z8;KCKY8|(SqXd;9Lg-%o}#AK?H=8_ zbDh>F)AK^%n~CVAbD@hq)py>lU=sW>r}_AO(L6M(2h>!~H1P>7--8HJlI4GE`VWF` zm%Ncq@2+on;HP9XAXdAoaqQdC9%jvBw*$=Hbqm%UB8Vq{f5XryYKr25>b35c>5Y|X zbIa4H-~L`p^ay6yexan%eu_e8#tWE)Y6&b{Zug#FNAtOy5=;Nwzu^y`cgkt1$( zAiPd{PzkWzPpnifTIjK=bT_TLYS!jYgf4a!;Q2iH)94n5<7ark5Ji;SPC@l1pbr?J z@hhNnA>f+XU=1!gYe}d_G=e{;ihU7C^fbRqP}kw$uJaso8kb+|&Ic?|RwTZcd3NDTJDg5if&U=Uv{483^pn6LrG2=?Z@>Yqw+T&W~8cJd_|R zoOWnI+K(jA9RPy+*?hE*F&$rG3&k+D6UQc*5Z9tAGa|#%8;8+kwS9P<`8f|}js=qZf)8mBEn<}&7B*X*U zyUc;tzBq6loEeFmdJbdDfxqellv(JTnSm+TA7e& z;3~zalQmaSrF!ARr{m)DhXFZ^ z>WT!F`hM8cQq(y;;z9EOK>vbOZo={c!e}8y^kHRukI#tr>-pU#N%qJeWs__ABgW(& z>_h)%YL1KnvZM<|Lu^Cj<nZLKX}^;4E8W>nHq-% zoDF!2e_Mwev#Ugl8rSaBKqmf$V($E)1?jLa54np&;st>(LBia-4Ci+3nUpqbAY;_n zKkfy&)sQq)UW+tm$gg!P)-N3uJ$UFXS+)Sk3sW{i2U61%kn6tGUHhj{#ZJFN&N7(+ z+Wd!@ygO6-(E04)a`*Rs`EFI^=P*v}9jsQP*|48=_lvr{KQGc~C*96t8E^z=pE`#m zwRCJJX%!Bu;efg;6)dJ|comVZK!pMffsMS+|J?VACcxh+9$dp4!=9?GoGK@e__4=I!iyW57};9#rK^T$CA{0tjKgF!oy z(i$f`@%qr_$$E}3$XZm>bt&i35qE1&LY)iZ&a(0==RjnXG#IM3YS=e5N?@uEQoJ~s zb}70+xzvpWe8oMBKK5$f53X7vKeGUkVneHE_?b;7 zuSFM@UT|yvmwp`7^na0yT$nnZIR}wdMv_j@Lu2V#0>()<@kr21mIVH54p^zXxiS(4^FD{43@ zS5G;^b%oa`P)M7T7kwnXayf>QZn$c3fS_gI4F&;yR84a9*P!Rk*#cE(sYbjYjSK!e z=hR3qYn2~eI{a~o3XebGrQq$&p&ZCt7HA4nzvZ{49~N#^emn4bLy>3U;!`%rH`E9W zIl<(=xk8y)(LuZc3G+4%rl9cmiDPlQ7!vu~THlua1hN$CgoShm1f_+crhG-hW}nw< z_Seos@X82y99sM)xc)8t*vnf)Ug8(Mp8{fg7aSE0>0s1a zU(doIoy&TPwbw7gPSev-QQYA=>5WyuE=Ay@`@|PL$&gsXft>)+lZ>i^Ex#)I!e%l! z9PZyI6=HTj*a+QY9c?|889TB6DNGKg&umi`NA}M9pA79=A56>EGCT}#zQ+)S6a(zg z3gz(XA=Ze6%OQsOjl$geeODm7v^g$UPDD#PdvEfuI5lf3j@A-(UHMjAXxzwho1%aH zSh;}Z3Nj!#IRzdLeyUB%hBT+i(!Tse?uagD#W{n-5M9oQa~8$x(0lZ)u1Bu|vI;Rd z#nYj9>w;^oK3}M4>yi5B!*Z=*p{}VCQM6ycD;l?U#j8-bD>X+nY*1f3U9SWRl@ufh z@7jXmV|nTwmh&(`GtD#zEZuEKfa%KWB=WKEv39G9)infUZM)~pOnoLe4>t+v(LmL> z(5U_m_YKG|zJ+f2fPhhuqD8ujInKMSiG0ZD=|dxRC%vYysL-PVExxQF+Fj~>*nOi^ zHNk`~H9V=9$3h2)fCU;nLm*o#d(}kdKCu-^KUvUJ9(g4{SH)lcrlBjrjgQ(VsThhr zI=*ihQ0NgSbRtJEdyc*`mYyMA3Oa?8aoYzPFYiOF0gJn5v5eIJCw!ZiIN*u2YJAs0|>zm#;NtU8P~R= zV)_&VT#0^+i8jQPgfVqxUcN;aaEfx}a$S>4i_y_q+J>u@HU*fvbs`{@%QAgVyAP)p zBR%~?zwuh541jck=xWdHFuu#~Pl9?oYzhqjc5Hyvt_ZM!0=bB=y#^~N2z7ousj-amkk%UYBzqL)^#^a}$O zoiZZoD5HWmZ6{gmUrzvBqj8A{TE552ybyig!uvIKPgmVXgg<(NJFdg}1szsS;~;iY z>(1N|pSa-qNnj%pX6#Jwd-sxK=8;T8U@_E$GTG^ef&w1n>>mKy8ubGGOH%5Pk_UB2 zE?I!RdnpW76h=me0{<74Jv!U5Ve5MdYHf(trk zcoNqOCiQyzL$)Zfg0x_)IeB@Z5~UNILyA0warMYuPmkVO#+76gP(b@|jC@i^CMCgQ zaOM>q($UyOb{=mP&eyZfrvfMFy55rN1;%D>qKA@45FEFe4h&EEf)a$a#J>8PsIDs9 zM*y-^xg0*ncclOkn&PQ%YB`P1a-truXi!o6p*r)!BJz-S$YHp>f(rXluY{U4)YbsG z>-V6xULBRj1eGK&DP2XfH$B>RiXr6&CJ#R3vyhjHXGC|gx#&j2PO#}@CUl#{`a4eL(J!5}I_eC-(vhJUQha17W~)N%stK-C z6O<oB6LPW50DD*E-(VFx1xgiYfQ?jk@M|Yppmju0tC|oJKelrhOSe zwtc-uIcH`qpcR*i%myl1_M+HF-2l^{a%*0#AMgNnLT%N=HI|R1Tj%CU)h~cbhP*IU zw~EB}Vc}(L8?2UP)hn6ENd7vOm1=Hq;KV}tin7s#T^&PznM3y!q9LmJ_QfYs=>IZsXI`XniDGuCvoo7IDi7nx;+cn>u zAr0b@l`{n&@7Z6}-f8kG&&G^|YlziPD(Fd;HIbr94%l~NXHjLKOJ}PokNQMl zlU8~V7jB$Fp;Kv>Vm3dy0jWeX4+t(4 zPd?*He?&{dld0=~>D!_gCop7(W-ht3BKflk@RyE?=J8N7xA{g&A$Q+nnVt(S71$`I z>oYXxNwn>RgUd~Ob@8z^^la30U)l4ZahyOUrH1KI4-N>bD+IPo`Q7^Tv+*)bccOpj zUoVC}^roQDOps^Y&ml?Dflf^hYU>KT`&ZswA`!SnEN(;uF#7XZQ|ThAIdr0nXaKY- z8$^50Zn3zT0xSoefs$*%+i)WU5MxQ&Gv>4ow@*lJpDKDkC4-0_Mat544u#yl)axms z-RrydHdBD$Ql?mt%3pU|)2oK5wJ}~{0cAqR9r49M)8PHL-A`2jo;H+!q|`CW?oLZq zd!$>Qtf!|dH-MSW*X`4Yw-9&_jhE67mG&AM$`iH*w^HDVgY6=y(G%PzdS8aNN#K4? z*pZn)-NTv6+M!T&BKgci?;?2zBf^pg*fjH^I7W;(HeNI4-+M0f8|oRE%k-yNSyvNdkfo4T41X3Wgu=krYq32ZUDio4xw75U!26NX1v zkHvyF<%c*yA-4bO>Mp$eEQa6&!x`@8hz!qfVD5DD74}OJsb#Vl$H+a&e zX7JpTje7IfX?{~z8ju(0c<>+@vUBhI?ldl)8j)l>|S%A;#PpZ+cr)5BCD0z0Z+ zL?+@RqN+eO=)|v;*#Ud5K9U=mghr@?olCA-2eM{EdBnX_ZbjP=+J7@}IFy3!cyT1I zODB|&`rYb3o31ha#%d-EfE3%s+g4=fPnVNk0)|^ssL}qVb;|gkx(FyS?J*gc`hq`L zLWGar9+n`so& z_AI=Gz!k49&R<*HA%>b>YG1ea`uf|1dnchGj)JH-0=fjUkYaJg!FyyP>{3|D8h;h-iPUDE`xoQUGkd)ZmLg!BrUfOFx*9f=;U5je=B!C?) z=>e#5H0`*t_bWZ%dPypb#F$6YEL)m!W50k90aXKj&CR=LMNp(LWdk_E?X`X)Z2f^_ zF?_GHFI@`^VfxO4Eyb~K^m;s@f^{eUS~{sMHNSor(*Hk?v?H z)X2V4tG7&6v)s;5+BO9`VjBSsbX1m4=h$kTMVZ~dXJ7mU_kc<9UaEqLhC<09=x@SJ z;LpfOs-(R%KIH6^uBQkgAXvMK>RzVhV=W2!^7$+@}FvCvRy@P?XT= zx5*?^o|tL^Gu*y>=9X*bLBr^XKFUdf&!)>R<-IR54~HKX)iukNtsTuO6MD-S;GrUd zQc>b??mMnM)G~?ejwgnzeEYLM36)>1uPl`L3HBy9Ug=TsvrMR}4bRs<9WZg6Id@## z_MBSn1_OX@gPj3>Pc;w^Kt8Sp4zx4YgG=>qgrmOml1R0dcyZzR?gK^=Pt$ zZdwZ(gT}4KSGgF=C&&IP zT-+#?d@v*>Y1@}ZzWoZN>?bVM3Kb%*tO;__vx_J%?NT;AEHfPoCp$(MtMi<4JL{bM zQBKQ)cdcH3VAudfGa=DQPy9wnTCJktAj`!G+Xr}Kfd-BSyZ}ckp$)E31Ks>tAqa6@9=?j1|L=NI38wABmspq!4DMd@A^^`B=#JbPkq9U)wgQ9pA!v-6%@&8t?DS4wPKoI=Y`zCKGHx?+?G zaOiJ5@vaY@j(LAgqS+opYOyaxCU2+S5Bm8lvNfZdo}PY6DEpKxNo6c4PT>p~xY4rn zN}&*&_b5Ee3T4CF($^qa9t$&Rft1H>7F01_yz}~zp^ulAiVzeX({mb>nIDLr1PG9K z#c*8D9hw^9(3`tzAGl)1(pk zs|Wwy4AR=s(Ml$(nGQn=iYe4&9aeh-$cI_msH7pwLpCEu567CKhLj=;tE-^;Nx>8E zeMUBdKK~jr?P6hh9{$-c79C{^?RZx43P_E@#>*zD|CE>#?9%-MaM|t>1N?$%o(q#~6UY0~yPK@u2lUT2pGCp23#cZeDi+7}{@0lNt*s@o_uDBf|L(sg+Zp zJ>U&UGz?0B&gDNnR^yXP{Y{2?YQ%@`IGvna&TKiHf4MO}a#_2RLyAMjH-0`QF)ZJQ$OC8Su)J?CL)`_`?7*-_l zZd`NSL@w50ZuMiEPVCvx0chKxQOl?94NbRln+$3NNWCbe>KQwi` zC9jp5?RT55Q(78BWjTH|h-@_xIM#d|sI!(m0G7$z%mw^72h~Oy*9r=Q7RK~PHW?te zhOjG*iXht&7EC#|*^ke3ydBPxd%iffZjOw|f}f%ui?ZjCS4WjUP`R;BhE-2fMM7##?r&&su&3N1GeRN<*{_x(kfU-!O%_2Z8&|+nQD|@Ywv257 z&9U7OYkl_}7e1OfeEw)K;nKXSd-j;!SyWCn-8BlRu_7$;>Mm6~nlQMD6Eus5oWf^s zH>0OprgTgV;QXt-z@2jzyi^8UWaa%o9RFdtKA$vsZ&*g=-s6^m{X*93vGTQhh=##b zO#5F2VEYXXTSH>rEfoD?eBgieLcXoHH&67?Y(kZ$8BKU!fPWw^sz zPwj_~rT&Ny<|fWXOhfOZR$zo@bV-zy^vMeS9aS02!uor}rA(iu17%5q071 zxB(Z@F}_CNjyV!(Q1uUl+@woJuTh@bb=Pj$Q+uQogryhYIIv%-5e}DwU|G4~+tzy> zbnr)k)o%Qq!{6SoiURd)@cY;6Y!?!;A|vYWRu*uI){8JC_iYLY4m&+P(sYP?_ZH#_ zoofqC9T-|JoEce&?_SFf7i~|=ee28`C)&PFqk_1w7c_npWZ?k5uADjrD!a$O38`=ajF3L5Q}B`up*HKn0rma=G`?e zuk`s@jsRB&{HZlp2ob37QiJ^hW@klDE`-59EiM}_-Ps#pevKvL1K?F@M_b0bi7v`n zoejbGS<^5enBv#2jCsm)S3M`N&Rptfdpd*Vz+Q?jDC#zgvPbn&>noI4<1qZA=>b)p zLDXoSv}?h{4-&5kI%_m4>3R*SmX|*}ZmkaDkzh(jmHVvfPH5!P z;-;sX0l$k{TZZ?h-@c-1SL-cp&DLQbDYJ7}m3L!-P&D|B1PTTT-1~DPtuX5*IfBAH z9yPcf={I1EEf@vn*BCH%7zXVg_0U#PKd7Q|BjSWH05i)0@J^_be)rQ={!Rxy6}gI3 zMfA@`XndI(Uwb?%nG{u6?ygfU(8~&2)M9J*(P>CWMnT7D8f`xpRo5T!jH4q-ze&&g z;VRKBay76euHM3m)ME2MYCLKh$IFjCFdh$*f)ID}ld~|lFC}6rSjn?_xHQH9A0L0g z!uI}A&?xYKxg=%A=#jPVf>b3Yo7XR5?{y5?H$qB5 zNkTaAsirn~QS<2@3B@PRBsfHue187&H&!TOfrNBAIRc=q3^Iux#l)d@7r7>C&|w1a z{~ifF@|QDwL;o`vJuIW>_vS)V5D(DS!1r{M5|&f#3%EqydvwQQWhfABd8n@W`ByW3 zt(ij0d%HAVf2uxF`c3+@`wVi;x~)jqUiEerZqh~(`dWefy6lk?=8CKnD~TYi396A{ z0bVdjA`%m_Q3e*emL?Fp2bb)-33)pv(J4HAgV35v(jUlkWj#;?9N0v#xVNev*ry;a z%P^z%hwZSJ$>(YOHXW7q?9b^AOeiakVDK^dSM%V{aXjI!uPen^3zu_Qe6%wvPJP^i zXpdHs_TVFzU+n`OfBE=-BBl5Lsrix6wPj!^z_&P_#a*I8W{`3Co;X*)Y7IwOmcWe* zGtrh`md6a_f-GchRo`oLWuYL3;=$hD>RsEz$4f_J>fF5`+kQ$gz%48$+ZwRPQ1YN| z5{@Zr{|Bl8u{}C7*meZ|Vm4~)v^AZ_;%BeHz*R7VEsp6DjXOTfjN*c?m96$IWv0IE zDDj9iVgA4yLspcFpvK}?e~vlSlR z^#9@GyWQULdvoS3f=P|u`&am;?EaxV;DO6&QT3Jrz8?j?)wh#3h;v-TBXc?6eXQh5 z?ee?dFd22GrJZspE#njM9}RHyXjR?dPkDC4}LcrJpSMN!$Rm>aGq>)>%Wi(iDN_D)eQ+rIhl~b^kkJ7YGGN8&pp*_O zK_2f#Pcj51>T{we83Gd}=JmkQ=v5*d5F2}v99HM-r4!T$tWPRW$jtkjA(4)C0LJub zkdG_#f;SWO0NGz$zBaR~UR;xN-xs$@xUh!@NLHFsp?B3KPeu!PbKM+xczBLnp#uLH zK0dxX*yV_T;#{0%x@c3OArC382%X5&$ml12l8GHb8SC#e_-%iqyU+ z+sYwF@O@Reg?fP=rSig2QI@XuNfv&S@WE@4(&`Km5-_P}m12ttRmhoXjo_E>z)bhO z{)4GX7+ZA+R;g4bSNXk-J(3hbXV7P88*9mU&XRuI8R$vy2*ZXgNtQ%e;dW}yGu9kV zjvU$*FH{@OwyMVPmMcj&{wE0~Y!jvDnNpapO*A^MaZc>9-9j*ye*jz@W+xb)i2IB2 zQi6aQ+uHI%1PnEn6)f*7qs74YIB|EwvwkrU#0kloG7Z!qM{#7*FmS4p1zp?o#rQZ} zmTj!-6 zIh4I5RK>hujB}mm`dX_$aw7)p=r!xWZD>C;|4FoyTcHwNX<=mR2<9utrf)5X=2!l2 zMfx8N;oF6SOV3gJJAHXM{7F-qLZi!Slk_&DMnRCmnuMccL)C9`OtOm8*@= zHV;&JI^a)`Fr>mEZ!Q?X@5mRtjyE7i(UP?A$5ihQ66VAmle{Eykgq$@C|r zkX4GjvJQ3qp-h*C=4GR#;S7B}u}!mv7GRh)r0(8BpN9A|a68n7;r2e57zFIAY6Wr; zGX%X5+cIe-(16Ho!1;&Um7(0D&kOJCW?7?JhEz$F`5s}R5b+6e>IM#!dnq@*k$V+v zPOOo&2efPsxQ`f3+3^Egaj|fO#dMfxhPa{c>#hue^94s;ze@C=%!q{svR?|AmcQ*Z zylI8)j~V!PUVe*ep~#YJvC`-g-T+m(NE26Hh*=AqtYIXj{mr56omw{|y>dwzl#XA# z7;e?-VN~v02EEk*b4>UTR>Qa&$#|(R zmPbx6M+=fuVS*&P(Rs+*$jGy=rzB)466(U5T>dpL_7whZw z7*aa;jck{jWHMs4bE=Gl%;d7K;qjilfd~~c-cLC|&!u16f-$Rap;Q)-%y{a13yduX9 z^fgxn&RM8$g%d2?6EP-zBVVDJ?k1{GwF#H}#w8Boj?Xft)*BEAoWdkx?~4|Gok9z~ z>#8R6Bt^`hlu4#l@>W?|Cq`XSmqG|hWi9r}xp~_Pr^$SO>+#Wx*jWTWx46gt@G!?6 zR#t5j_|#ZbAu%f$IgW$p&N5bC4jhXOhU?^qeoz3V5F#RXLO^qY$ocG=&1oU6RhkF{ zgF5D;HqW+bO?}c#NQub?lQqtzX*wudi-x_%h)33S+nIvQjMd!O1FesWc1F`$>eY(* zzwtDvsj7Ibb*u}JfEo^|tD00MDh}jX>CLBPd)y862JEE^|E-c*og)9jN+ zX8{dZik?m=n{htzQY{rvYC($%v3*L(*MU=Ieh91&ayz7h;w*d`i0uW{dQ}t!6~;eS zcAUJXuTDg<@@FV1-Q=l=F@=!%b09$*cv9$1O1gNto7vOi#CVqra!)n&TMO)Cpdi5r zDeMWRFO7bUu94Z8eXtb$elyGuq`ePlK2CT<;H$%@HYwYLju=bPgKIm0{#?Cs zbf7rIL7WBO*ju*|k|4>af|B%SNh2Uay>I0t^K%yyJ_=b3N-~)X@XRwg5eO$bciGOT zBb}E~T*uyxh4At6gQ;(kp0Ci);@=4rC6pG@)*S}TQkl0#O?oZhLuKPcD4@3J-Gy9i`h=?P z=)>^X!x8|eywn7l{- zp%0TQ>*D5FSI6&XUGf4wpZtU3esv5C@ofV`75T^TPaFms06!S{)%K&6K*f{pXspQD zQ2OKd2k#Gch@|iaC!OAWZ@DF*8fQad|L-)Zn`2#ptA5POZ;~JKLyq$?KWg{E9g6$0 z$aI`U{CXAD;?lwg-39lG{6tJFF_)7|p|0^eGMWTQI!`K&T#vPfDh{*@?jAmaUI13r zVR&JFjGY;g&%ubaKW=J8PDk(e{<8DQ*RCW z9%aIlPNK7i83P5<-XLfBRBOz{E-2KeNL7@|L|tIMdkCkNf=7Im$GS@;N`%Di2Nnt5})hrjM-!q$c6C zaYzuW^fg6dC0jcS;uDcYTajdQ!;U09fV@pN%Q?**N3tQ=`D0W}9_4nbC#O*s4h}~* zC1Tod<+8TO<^lGCM%9x^TZq|;a$}pFUwk4NFMnBx9NE2g`9?nNtwVQUiWE0`^q5@WgdOWCwUuge^P!& z2~C2$^@rW%M?}`TVY*4kB1>}+75)t$%R1r(tWBtI^)l} zJa8XyJ>gnUGAe)F+~{n?;5~n zacs|XYVT^@Jhnqi4$ahlP}BulzMA4$KxoMiDCtMI9DnNsIGq4}{ts=pWzEc^aGehlgiA$|FAF z;q?Vi_283xp5a{@bQDeTV;Z*uH?CI;H!F_fQPzGti`s3dJ3Jn*B`DLIgU#~*d;K6L zO#}ER%F|iy6(kME*tbBm-W%D8mm@v!a&IuG>aVWCNtR!VYg&fkrk=X5vpgECH?OfD zN0yex1I#j{hO9bJpWQQwPw#m)4kXYZQ&D}IH2z*p22KAZ6^8P(0=MWR{1Le{1ilVN zWN*4#@AL_otcGdt=wPV!yJur<^CH#%GY5G|BX#I70>nsECr09h@mGoCxfW(lQ%d^+ zP}#;XJT|m{2p4XYu0_9`u_SF7Y%4PTkY-(&yeGWbpnZ+0YVl?D20=$-SKwrNF?@}z z%2Wx>{J0jnPc8VDI>Iy2dDW}Z{pQ@dpi<7u8z;;Poitx`*60v${0o*}Bh2U?U+~K`L`og{Qdx5c>ryre|ZfO#Lw@Swx@St+XL#*_Rk-wmKYetyJXUSEJ zdF%*qRsYXXwMu^bo~|`zoL%DUT{mEv8!_$uBTcLsEAh6+$x49bYtaC@y_5 z`>R04%$Z+wQ2 z`=#KoR^z%^Xs#i-4bN* z>|ZsD*`KkjRY0iL_91T30K-Zg#n5*Z0lyy4B{U7xd)IlbteY4iV z#U;1v!-B5p{W?}3--Y=CP61jjc^P|oO&xI0&aj8pb73;emwmfF6!YuwY4+iMz-72r z%o#4vUA)aUN&lSSRKKuM{n`Cv!3Qqryv@h4BoLqA1LCE`I-4YFkm!qhdjynKDB$+N z34DT8NPuMX&=9Hb-`>s;ni0EWY0GlkOV_EJ#pWou@CW>q8XkA!x%p2e$q-2f%cWA? zp_Ct?H_>sloq8kvf?EcliwGq?qCeJ6DqD^#WEz$Xe@ci>dJveX9iucLUnqb=U7YFQ zkY}Z^emf*%qoj6mZ$14pWi#E2%P;&KD4@*B;cV%_m~ru8iQxRt0mGW{anM-Igx^)F z-l+f3i*Yr81=neit8#{RqyG=yOoRaqdX||u*yik!#knm~|!k#aWAKbYuQk@Orwem@~ zJRc~|%;n=EN_R{sn|#M#nQzCALe>Fw*(&eprA2%|Kl?qK+nlUv7klYv!S;il{mrdO(C2^4}k(hN3&N+^HY|HR8I;3)L&kGW2NArmLac zYcu9=z1cu-u~`u6Vs%8ZuNeQs<9VpmhaRU4(Y`lr)vK6_*n!dW49=CGomrW zWDa)0*YtOk;TZ$E-|GyhZ)arkt{<~!Od_aG6V{PG7SDlPe}y*^tYwSad_=qnl7=mr zxpGy6Ml?ib!OR38e9cfKo<+He(B3HkcwUm#Z{7Xp%+Dn`8nM3LluYEgc%(T>= zjS4Re$g2^oXzzlb()}Uew)c8L!kzrO7y&K1RaW)*MSDenwc;rsbghPEm>kj{`HXiq1Iu{5qYuL+^Un#2M_C+uPStMU4}y zt5{st2`}Kww*?4)Zd*epUe`BL`K(xJx(4eA)jexfW%8Mpa+spy{_4@g>Hg5%2hSG;ic!a#IwlvZ9Sd_&F72d6=}5h8Lq9}0Sn@16doi{_X{Qml9>9-^p}A%U4! zamomVX4GqDa%KYAY*-<8#uU*^AmC#^E6ogx=I~&>z3A#4t$39uW<<$3l&16 z9v$Z4=uxkPMc3`PjpPe)Sharc+)|m2LrPY1$?0jpG!^%Kx>gBPg-EA#J` zghZ0u(bZ7$ekwnesQ#rmWy6nEaXO7WDOZ?#PSd-O5p|Im+~=4LiCP|PE<5kPRJGyS z@a!r&=hb)=4yU}U6>xIF)Ny~!y$EZt7uq1u14{u z_cWl$fnXHQ8y~PMn*#A^kw*5bv#LpZ*gtc7rG0G4IMo)}f!^Pgz9UmtJaax$@aEDt zxwLJn_u99$tCsI6;w7hnImMiADN$+4c<|OsUq~ zZrFAst`{q=#sXd~A_Be_?@{(xB*SRv4+`0Td_?>4Ohlw3v10yp`xqaBw-u24cR7uanS!Bk#S6jajNCyV14gkJtQ%VUoOBkv?s4j+uSEgF?*O05VMqk z{#2os|E^P47Sm1$Zh%RMT@qXjwZj^_|WP5yA8Jz(P z<&ufucXC=7uSOMQZIC$wQEXi`P_m3xWR56satjJqM=axb(3Gn5C;G!~V;;I_SfYhjDt|;0mO%Z|cGe1l-l-gD%;r${G?+M_*|9_~hgI z&+|;>{7f!+PF*QtKDVD3rSomk`&i0gR0)cb^k_o@5!Qym-Il1P{OjTmPI!|*l$^eC z=%uRbjgbN|uT65Oe|}6d^0RPQ6lw&;ku!PDZWnO(3f-C;5N#%qjYbLcT_y7s8Xf9d zV1i&JG_@oSi{VYv*J%k+oE{=8u4b>swqT$cC~J*3&ZJA(7G+gmT#h*8uIQzgfHR03 z4veO4JKTWNs#>!shGWLlCuI`J9d>PQ0-dG-!3PMB1rLN%;AM+1w$uUGLso$@N3+~T z))wr|e^a6vQ2UK&%9DPl0*K4Z^{9M*ppoc%+1Ar@aY-tz#tp6z5$bV?{e)Ud+Q04* zp&b69%g)%vb)`0PRv2_uS52~0JjA7OQp<2@1LNU32q#l681PPIhZ;yKnDjx6`n5o^ z=Fdtp7j0hp4wO3;I&=vso|ZJEc(ftqexzR|(MZ2?&#r#4 zTBP+dW#EYyNyFOy%`0p@DPNGPu0s;w{si{r5jt|rxDi5`Zkf9TUTk8L`=AwJ?rY3Oa@vpLX{bqQdLPBUt5^2!=4Fu0fFJ}b)6;2OZ2fLI)J9<_ zhL*j2C6I@Kr{lvdcXaRPxrwK-JPNEWabv6A`tms5A6yHI7+K2h8{;4#+}r2J6M9Nb zQuUP=t#WHKyU0(1#jlvTOCgw+{YEb^pk8rdsp`tWC!isNfJMkY13X3`0_2`s13K=u z5=v~Y&FMxHS=R3?w$2!mwV2S7}^@YFTEusUIY?XHBPWQnE$BX?FESmD&2Hl375Cws!rX6-TR&Ap*Wb zoI*qak+91t5g|8R!}Wk}2yXK2fm47ggbnWjS%=F8QntCy9!brQQ-l{n9?y_Maq&p# z@&ceoJ(W)*A4aCCtYfw{K(h+4)N zKhOtI3qFQ8O143*;}W>DgOto9^lDDq#bZX=7gMfXXWVY{n(j{urMcL}5?d|?K^khB zMlf{j$~aGnc0rbaS|^;W-l9U$ps2dNM~RBB!s7i) z?Y+Y~pBaYDso-h*ON}YPhcx3bFkw;98`6Z)*2u=WBTOy8`F9G1LW4v!!+uZ=qIZ6N zOF~3?jIatBOeY2tVC8zBu z-QIT1ViJ7fw489%ySxsglMkuSUj^FcmBmg;)NQ!j1(oi!F)v^ppSqK$MR+=JI_5EURR>##PI6BZtA{TuP}QKAE` zgsYDWQ)MV*S*_1sT)rYDVT=HjmA&LATv%5b@&e!8n)gUa7|Q`6qSWbeUPlBBZ_zeq zRD!Jr+VmB1ET0i8R#=c@1sadxM#()(uEv>xnWH@6Pp!(~ti`FTRXEZRzFtVL#ZV7K z(|F|tYHg`)+uoXBt6O%`4wK4ScNq_28>gQ7qD@HYY^1!X{s1xY5LYbL&A5@L0ud>+ zvqIyeVGTn-ny;);uov=oD4zt~RxKw%NUfnedXecjnf^bmSAKx=pAmzZeo@S-#R-Cr z-;pD@F&Ep^ zS21Y2J{_U4g{;A3jitZBreAvD8#+n~W@PDJK@{tUj_Tax+2CB#rpZOPjbRi1F~TmU zyZBwq$hBS_t#%~Qt`Vrj5L@(vI%CxyszCdthk5%05DZFxH<`@8W(!$WlFv@lv}sy^ zR0SJq+@d9eGTvMQ$eLkLj%4=B9|eP>B&cLVZ|YzODvM!$%E(Li?+ABHTf2JW=5c&% zd9kS@c9~$1A6kg}!w-&WXtYXssipFRLrOY}T1hNX#EQfiy!ipPEaj#VzjILLZvll0 z^%czJE|Stzr`+<;vZb~1`Y8rCj$!V`+o~YWHE~HTYML^p%Ag+4U{Jnfd80-QI7Yhr zjJ-}sYK7%}u$Ou+&bNnC0%*`G@0Js8F9#=rxFNF$5O~U}+YfH-Gob( z7dK$ncPpEIFE%>D@BX|IdE=N|ztYa~b5LJPFY1hpF?;ol`Ja*1MlS!Lq$n(Nqs>R- zkPYAbOA4~(H}{$T z%)rb5iaQ$(g1%>z-}V{5JYGdb!mp=#9aS5#-cNdODxJMU(=?|-Sh%fi&tgenfVuu% zWwUUPAo#FuUD!GXE6guRyiXw}BD0{=c2feVan1!uc1D~|H?w$Yhq|*0*<*iMI&HgL zK0*JD)PhV%CD*;}zha_yODuDu#gHB;PH5+l7~4l}gsc0?+DW*L83b-zg*q5 zHZh5=8E-XM%j|4&alz8wgP8a34CL#_BS*EjKZ=rTx0zh-b(@0augjQ|mtDyHr4iFF zw+z^Acc?GEoMEj`!&GrMPo*&6w7-q!SQu5>QWr;kt~c6WnIk>ME!L3MdyJv*tEdpr z>u7ahfvUAj`FhQxAuacsI{lYilhmiqe$C>2W7V6wrF4BH8F8!y9FBNSuH2RhCRa)- zeEzz(q{1x^d_HqV@cW3fw?A8+a0n6-GV#2Jf!NL z5~F_K_!`yoE*~UuBy=m8Q6{UJ(A!WN#ogoXDuR|dOdha5e;PM*vS!98JIB6}%U)}v zQ* z90*(}#Lmo56^!Z+7uI9_$#9xvth zaD*>Flth(c0kCEtGGSQ96{u_m0*v0Tf#ZN$aMkp+Rl82LJ7Z^0XAUdfh1V(oyDAy< zwOm#NYHTyzURWCag_)0ALncGNT5$=Hd-ZvOajO#Fk>Z$A=X))aBduA>h@two5;ti^ z5Gf92sW#9iBT@+e`k1QSXSDPXj|*ta%gPlD1$KQ% zCLK-;rQBHdq7}3FJv_^zuBbnG<`|4yHalFGU3OEF-Gj>-jgLN>WP^5q9V_HLM_-#2$nQW zOHV*lvh;jVtDE}{{p_Remo14%n?)<<9w~hu{621Yl-Q0=*))UGRyPncms*Tu7VJKH z`7>Y4xYeU1PxI0p)W`rrQ646_6k1!C4|^{@C-iQ%h|=P1fBYU5Ihd{)#O?6OPN}`n ztE(daXIyY>d|tg`ykV6yWJX>S|FIJtcL6^G(f);8zi_8J{7pY8ej=%H0;9e?#f*2egqs&Oxf^IS?}W>kg5 zm1tE^&AJI{l?;tz_69KDuX1H z)u!|B)Yqc5Uz~X-WvD96IC;plD-gEi(u;fB$xGN~=T@GU6CW_q0Is*p&i4&)9eet4D=fgYMA9zQkrqju%!T1V-)57R8 z3Tl;ENbd#~APl5!t9W>g2*Y=cS$LP1f+^&xOOUH>W~`wLg-Yiw_0nw(w4c;OQkE>I ze2a9G_Xe+-yQ07YIlYbV>bj}y5;mZaV&`yuTsU}laCJnAp1aMSy)6Mc!@Kvs40ATzz(ZH7mE-sHYiUgmW%q5MLUx8tX z^C!d$1mpd8+&JtC_*k9C^m0(4?=;7oBpzT+PBr#NrHXCiL4G0}z0+<>{1M|mrq%)j zgJx#a_n3z{o15%=8y1OxFxnh5m$BKCU#}Aud5%={2zI9>x;~nlaMUH(k6uc;|2wqE zFdI{dv*nzgIqtLK?)7bb8;nD$ov;*M*fTGRAk4>4B9vq38osBi<1Bzj8A%Dj_3+QL zHxov6&lX;yo?(9_zMN=|-GpiHh9Z96{Uxf!Rwd12=~sDAn!i94MG~+z(6wL*r&y*> z5APNLc_C8%+I$MoOvLm3f1o;cL~byyQvJm0N*6$|B6jn;70cs>k9P~&@z3)*4vRzh z@#sK4^_U)4=*4c0hV%U9pRTJB@huzacXK9oA=*H~JO3GZ( z4K0e89;e;<;kk?sknVFzeS@m8m(q%Kn}}vn+zWTSSS%CA5fApX`SzXLZG93MCpL&J zh;uT%=uZLRkD+r|(&(=%?cI~%x=Sm0caYD@9zGx}hVeKziz~K`es}!|#gfwry}lmroSm2JeT?p`AuP+$~ zb#nz3dDJ@Gv{H+%zMxUZOM4qSlN%Ht%t)J)SifD`SzL% z8-iZJ%Ir-6J@(24+2d8-RwM(~J{g?a!aYoTq<7>Nn)Ya=Ah}3K#)C33+p& zbZM(VS8_pc1Ra`Q$rW+wSS_;t1_jLz0irF!HnB5%MWN=mju4A{RMpILw`C(Ef}?3* ztahm%Zfomo>501+$lE;i@HP;OuE0zwe-c~}!d-4)%P9ra+b|lU z!`e2ZT>}fLxsacTiqH39;ecFb#W~Ukkgbh2MUDVdK@If3WW76VjYr_XF1Eer{nz*d zM|jU8f8>ke2T%MHxwjGP&>_ryRjlw&+42)l<99z)Sa3gEg&6tkKt12uKBZ-imCr3C zA!;vCO(9pF#8#ictujs>s(y1dO@;Ld2{o<09=OC^lfG_6V1TXK0jxaJ^!6O;Yc&$d#PcvRaK3=E6r^3Y?_wE{h9r+EwUP<9du8JF+U3>K zp%@s{W}%=&m#t%abJxFp;?bshMe28e{AQqr*2HufHo@?=4Xk=MTW@mls%%~Ysn?1o>_ngP{GYtZhMnps~b*<>b&uf;mg8hO#oo=ng3B$fq$Pg%WKovSeS=7hw2Dv_=1 z&8};QCg1o(Y_~NQ5|AzLd=F=0t~RhzSGIb`%jSB3=MK$zgw? zS?wGw_uz+~DHb0;#<@Ng(bq&xV&?q(7=zIU>GQKQ>#NC@Y}ShS;SO9SBXyigA4>1~ z-Y5rZ3#Fxnfvl9$g5|@Y#N7LhGRsReRi)Cu+J6R`Z9ess5~j%+D}(fIh4i3>hD@mo zO6(mJnGNK)ESFj2jRX!w9lMD!&?c)ng|mSeXxeSXxIWWLR@KfE_UX~CjM|FRxW;TC z(WWL#RShk1WXq=H4D~@vP#;o>Q6j=4W$5#6FKD}qGs6(xqvv=;Gir8}Lsmb#X3?YY znG2E(QAJ2PB@_1c-E!)o7<%XIAs=fn?&Zat*v;ZKjZsH=jO`b$%RBO`B){cVuYhRQ%ekeq+me z*AGe$nh?efdRv*4db+jw%X5J6i6yz(oVL~kv6`THlTfkmLE3`cmp|d7^)mybAja<9 zal87U`8ayC+yS5;W0iWnaQ2Fmgmi+?HXKerL3)XVt@Eec6gk_m^xPQ>B)+BcVDigLHW05OYrgX&W@r<8x$+el<48>&7vNjF))3Nei8#Y8Hl2B9bCR6tk| z)K@8jShd;!=KQh*5)kZmMURX$9Y@oGcBR^QJP=X7Y)YY$5nfzjd#7tD^)x=&1E^j~ zSsSJWLFUW>co@5I7Q2XeGBEJx8E9jsw)0&hWAkLh4(ijY(*elx;cQvz91g6+Bx}yfc^2aY3dGXCN!5hgdqiE-^W>8Lyp{CFl-$;?vf; z6gU*D!6de^1DW;`AF~LopkqKI9e4B5?E}!5T9mFMl@hf!G>(&y1$HLZ zs)j`a?$@~-tiIA2%b}fg$a+kqb;;Eyy+i>qfji`gDK}$BZH0wfpTI=aBqQgxKo;~r z#q{2(yCyL1-cy$QBgp+6?%=jG1(=WZa&a3;G!V3?G}wp+IK+CBmnWGD5ZmF zwlByYE5w~=)0eTJ7M-!|43MDyk=ztr$=d!gf`b-erFmSR=$QzcitwH4JG^m?1&h+A zT0iMN$*jeIsM;>^IiPd`_8h2w(5o9uSg|%NY*>Q}n&iXSR)9U%aU}1+JRc=Ca20sZ zu~=h(f=( zkeQh!qY(4$%z&u64CyFiu*Yr_pIdWaTPwoDhC%^guGl-R%wcA&0d}ZmVqUEkX8zK& zbDK$Xr}F2^HxzmX8PB=!@<|az42f<|olbOV^xjv6tu`wqsdVu(1lWBDtD9&JJHF^f~gibo&E z{znI+W;vNVq9;BR5<4*sC^nUe50uJp=BDW%KGr>zmf zv}efXci-mFXiXniIft~y1OfX3xVt<#fE3z8+uru$=746ffCK#NH4lT+;dfDw0JPwN zryNnu>CynGVPX=ekCCR+J^}{mhYN#I3x7O!X_1*_yWRPk zj1;wjX?MxGi#uQCkQhQh)*oR2_X}&4g7WAKHCkbb)vR1Sq^`)z3yqODC1ok?2)Rm zznL_z(wvCbX3d&}U=O&B{8J(#MRGW8k!aEwISXW$PbqcXVdKVwN`ZVtABETeZ1X)muuNssLVNXA8rO1X?FP_Fv7-QTU#s4LWUY3 zV?EO5Cp~qTwob@FooPUQ++x(leRx`HIZdtRD{ycBhfg+EnMRP?@2Y;&cj3Ktg<(vA zigOf$w{bK=b>_y?wSlb%+~x`Kx!VH*V*1`HQ)VOpo=+ACpLraMni9LLCk!imAT|J# z{MZ(_nEg9y!0LhY>S}&7?j;{8#>fbCxRiYlm>MuCo8oB zh&x;A!19nL(8P`OH{W{yC|A;BXV&!Zz%>w^#rIW6K_A)_rPyUnGr|uAwAn zZD#to-tsk=W{nmTPT+!4MH#zJ7!6hsAqB~;!V)*J%GC=0^rZo_;UKkbAd!zQt+Y1X zQ=~}Tri4`_aa$F;Gm?Vrwdp-ptXCt7=>A0n5mh0z@{GA~yc4t8)g_vXEuguC`e9^c z@X^7QohI2K1P7n~?0|P=AA^~4#i249fS09>EdJz>8wLeUx26USIXxF@4!r7&HznS5 zm1fi0(GJ`2I=m6k@&`X{FEnU^;*|waIqNu)>62iBMdI|fMG-S7HU-KhdN>B_UqLbP zYtC#ZoXxN254(Lg-|@5dZoSBOI)@J|I?9L5m_&5SK$`ox_c9PoT6XIF!PM}!*;u;_ z6X4NWI-$MlUj5z}W1+VJQv|f&w^`7Et+8+hzh(Y<$Veqj*?IX5a@zyDZFUB> zx~aI*MYgB>pvTf!?Mi2@L*bVR)h{ez2#j0BaJo9B3@Suzr1V)Kk>hZ5ZE{x5@GfQQbnaP+gX?SW(zg^W(?3U{@Vm3;}`x zYma4tsHJJ{a|r{~HKp7E>)M!&XMMrBglsnoDPKqOZPeez=}@0<{1Vug@p7}yT#BaA zr}tkxui)4P5&#qQtBJLZycev7+d-ZjDV!lqA2B)zw*Lv4GmlANSvtb@Sc5yXqc!AN zw}`^=#TGJBo~d+=OupJ;YbByJ!4S8|im;#d)je*@?Vym+v5!Hppx?r(jkWI{XHSTG zG>4pQ4K(7BRd;#VExN=aA^4%M7*TlLweyJV(bk2Cz-?|!KLUX%4K@?}i}W~>!{nKT1|GS59*=^SypAYR^&VE~;W;*u!GHdy)U&Bn zqiEnZ+cZS&glPC9c0|dM@YB_2u?6&^{<|(Ti083Vqsax;PMpYYFE+yn-x=AFua^q2 zE&KQk?!|Nj3hc&#Gw%R(z3Q@Hf%U?wR}7U^K&k8!;2nYWq#q9#?{k&TJdM+ehHDOX zdYXlvK1T|T2aEFC2iq#9e=BeZ#r)#<1KONq&-4LrOOIV6O3c#h8lQ~ZjFGh7jyRrx zFrK4|zB43po+1Z&JjYfORxsmZVS}klFea9Oa$TbK9q>dA$=xnc!B>wce>ttGaojZ73PGmmz8_&AxgHvxz(rU_5iqvoe?y(~M{Puf|K zC{LmcdUle!{NKeFS!7SMj1L7&v3HXcQ#vt?i5VNvTsw0)%XVv zzKK8>XlQ3ZH#Ngk+q1r`P~qTQyIpl}=@or3|ENB35Rd`Y$rCo)OM!k}R|INeAHf-T ztuZ^;vfoI*43mqnKGv2omun@qi0+%sPN)g-UAg--g9lpu#rBfzqG_E8++TW@EIeK9 z!U$@4Dg1g63T|axu!BV1(b}eXRAqYU4x-=fEPHriVbC1A#WZ|r?OECX=glZ+u^!WJl=;LSG zmyIRIm%937f>U1A=#%Y$aH07VtJaSQ4&4cR$~VH!o5=&SLH)!92XR|o87kp20e_X) zsAJenA0kwIGf&NR1a@g zJJnlj1F0=M2pO+$Ye9JH2XBzbK`Ya^|cbbk+oWc1URT zm854a*_eRK8A}G+1_1fFmYpML4U}@QTMXwBEZ*jrEspR1d>6A-zVL7;d%-76|zsdHRZ{;>t^(-M>Dwa>S8@O@VX~ z;@pi6&Zapwcd(Dl17b|$SrI^5eZ>%+^jTlK4y1AG5v`U@OwNfEr z0x8B(UnRDQ#8>&FEZME(CI@BdOm(BM?oY=oEDB_$__SHGTO~Y=8G68sPTV@JzX<$> z$SFnw6FzXpQM90G$08~!3*?`HfWYhb#Z;Rn7=k~|378R(tRtqgVjhUQ@NMDYl#yJYt#5M zcto}=Q91EodDH5HK5AK_v=Y_eD(*85j(0DoNa9gcNw^#(W7@vgacXHhZf`3kO=p=4 ztq8e~Gddf?%7_$kG z^*0WI`9!QydYIpbHepp|t<-<1Wh;Z$MGi}`WQ*IQ$2# z;Ft-8%G2Cd#J{LIFYK@YCMkxLS-*WB*w^?LbpP20!=?-m7yt1tG-pOQh#EqTh%ZXZ z=!_~&)bB$;Xo`?XuCa&)h;^jRLT)>sDy66t;}&vKV;HGn6@+q2ZdE0pvb6weXq!J( zY3A7=!26S8*$-Kh1wm^yhr$MyvAvf&s#BOyONj%RRo2BWdt@09WWNDtP-bb91-`4T zCGqH-@3kEbCXqq$#mX~7W*}ROX0emHEg~?fLt*q_nwGFjSAmVyzqn{^PqBXL0ZtP? z{Sa)s{=A+7gui3}5z=iE=+1LfV|&yQ=3f*Ia>GQ^?geFV9}(X1ljlcUczv`yux6cF zioD@-_~OnK3fLcT^(c4KE{-1kQ;^bvu!|relui{V7X)^2pvSgJiFw1l>}N&v88ajN zGz8`cj=es=0y92h#a^$Nv>b|rl=tvie_}F07H#_o|2}tJh@(}{)hj2`KzRG-v;1KZ zMGV$SfpT+b|Kce7;*054`Bb5=A)s_G(RSp<;@$jsh+kEK0qj@+wG|UdZh^~ds1xeA zk~&4~KqamBP-FO5SW^W1jieycI_jhSAhRD@`ZVzf^|)UK9$i4g#y9g6@b+2KWHDAq}eUbK+A3QpqmRQPdq(bfH$Hac2i5FWLT~>(_+;sS|SDBKg@cr8bjn{gx{0;^Z+) zg66*2WK*?wnD=QHvj~XL=~q@2!K#Rr%%igDjyE>2qcE{b-tJ$XV)Y=P#=e`fN){p^ znWT{jEOZ}<1%_@mcwiO%lDVEWG)0A7Pv^wkp7bEYc7U{L>Y7&Y_}IwFkceFAjYqA< zwQ(DbpKDM`pUe-8shbaZHeO`3^i0Vp{Ft_~D@ii(lMPikqg&h-Q90S-=yA+aFudy1YSf=Uq|Qsbe=fZ`b&?>=o_DsuDcqopQ{ z7%U@vt+*R(WO~GGX5=t~{=lhW;_+gQBVj5Gvu08G6$r262DBOU9iEsSy|;DBvN{P7(>S#dO6z|ROeGOLLe*C9|r~X z(q_GYbe-h5%*t|7s@#qQ#K_Xb*$GhQ%-uaqy^Zc>1>mMs@j5^7KV$eQhgx|;HPtVu zt5Re9tyJhQ&op;bTGlT*{C{&haLn(ATi#mM0mJI9mY zigH*5=jVDc6W4E!ato`nntr-DdNdgBSBFJ&vsfJZowX@r!Nm$sC9{_Q5j20+DK1C6bGLDgKTNUOby=Ej6K7^|!ZO`m zsCpOjat>mFLDn}a>XjE46606{RgRdW&NR)g>W&MKdQ9K;?3Zq+x1#AkEXj`E%QMbTPnyH@t87r?eFGf`b` zmj|1}!^RGF9NB3grnt!io4#w;K{AeJ>HYwu`$j@?1`)*;n~0D!kmryMuD*3tzgGqk_Y?VTxpzecFqWwgOR0lxhR%IVe046Rl)Y-|bqh&e-GKI4T~ z?&VwS80!*fZpI=rK~+6yJ+`ge^QN9p#tgaQQO&BYmjP*t0Xgm422E<)4;G+|$n+SBb?0Yn->uL${ifLw z76RxX5mOmoB2u0Cwrtg(xbX!OfILX2Nq*ss;>xhWd_TLwnT5nt=0MNb*{vTxegi&> zo3uqQHO zr(UPwcL9*oa03Bi+AYwS4vhq;u7``cpfLkU)RG{tX?UzUeJF1cUftaLjhNKt^G(Vl*doB;WM^>g6)Wa`&|8 zeu1lN#4vreBJ&Mg20 zC$wg90I_XbxzXc+`aM%~Ygbk0a=}mD=-!(GGvAQK8rrx&UAp28078!kEBU{#gzyfS;*!5_&Nx5zzpKuB3^p5totZ}9Nys=l_# zh_6bQq)OaV0*t)g`;M01E4mmgFiWv*y0UpWmNkxBy~X84!dOmfTigWgG) znG4MGt`m6991~na&=m6s37099p5efXF#=rb;}Kiz?oOfVkj{vsU1Axh zbda-YW-x5i4D9>&jT&5J{24rV6Igyosimo(bU2){(!V^!?E301)zEL*VDKrAI|d)w zCc$G1QN4f2v@)d!G~916ofPZF#$nnK)9@>W)pqShp_5#bpdyBbjw5Alp(DUJ_$(fm z>^EozaK&l6Sd!z#(3ZGM7VUCQSuNxe9|D9&b?Z@ofPEX|dz)P`AY(vTd=wOMyU}zt z13UPsLja98n4P`2Bxr)!B?LdkJ$=mN-TqACKQ$Xn6R^EN8uV6dRvdp0e~qB{Oz$qb zZnPb`L!(zMbTmhh$91##5nwhDbtTg!xh+@iCD1sU*>r&Pq`C3#gf&fp!5!QmujZ>v z;0|u7wUyFMpXEkw`1}Ui{0F$<<{$brz_lRT=hc1{mp>Ixa{C{8O_uyR9%~aS?tr`e zor?{P#xxGdbFy6r(Ltefje1`U*Ox_w*_&7LH%(-X8u@e``edX$e*a`mEYEJ}-mhkz zww_Q`9u%*^UYw3QO3d~0qZRBLWdckFdG_6`sC9b}+53FU_mrgeGg3@hDsIdyL5Ap@YRN}$}8$*8k~Gs>QpYFn;SCC|$G zObd{M&5~1jGx@J0XBqzzNKgw=u_xCx#vpqWdbeS>3?i|?%HxQ@sD(qzT}T`m$m3yB zvdQebvj1@OiL{M_M$AzAlPfFp;;gk!Q!lqYZ!4_QpVS)9Q!^KRYTFNkcc@j3GNfLFWu zy^L8ls&CJz0goBv4b7fjKlA2&mt*bJTg>b5f=dCQzJ?Zr z#Dvp-|95%GFfkJd+n7!RJeWNWKr&({mKsyBU2eDUM~GTCyP+td+wdFTVD6`=coWQp zg(@oXVUP?^{$*igyh%XsOWIs-2j?ZQ;4Ws89rt45@$zud05o__p*c?_W52|@j=M*{ z5pY88P)pR;W|8DmqE8tArfu+s|Q05>GsW^E3AdpQ9B zNY&`u%9s3jVBX#b+6TKO7pBiS)zC5ol}G+t(QFt@OW*57UAC z&>d`PE4!n+v^(2{}}C0jQ%_*ncPN9XFmQH8s(jq{M|SO>yi*Dsgqh~3>LrpWFQRVdS|ymjOxb52qTQ+ z+G1!K*rUG!uRSSG;O8E~0k*54|9uG|p|dJ|wxBsw2Eh)2c6RTpXrgFF{!oBTc1;+J z9nLWwgU&8fI9Vqh5HqApvM2Q>qlyK0#r_$rRDCxCG>Vw{N#R1b@4HmK2CGH8e>hSw zD096W?WK7!peG438BQ`~syE{E(^1Q2WV45XHJBqlC4<#P$3Qupwre5pc!R8;HDx#1vZ@B=?}1!B}>N-_00~~S0i^>5dhyxhCk!u zTS<@!CFSC}Q3gX&0%ie`EyI=Xundh?cFSs1vqu$&rFBMl%PxC{9U(%VR_tTdqRs^u ztJ{7pCQ;j3v(zGDoGEyhc z4_&+8+s?7Psct_*-5ZNP>!PKBl;pRe?P*(A_E;3qyqu~IU|60DTI>^ATH;B6r-^e+ z&%y69{N}*%73j#v_y)!fm&}Ujpt8XlOz%Q=DRIpHMn&d%bgUztlef6^(+)X}#8iO5 zBHyi+4XxRNI7@o2v<_Y-ozM4c3JRJUI{zAZE@&$yGOR(!G6USILcKgcHwyu%kXEUHB>2 zvJmm7?WrQp%I+ebb@u-YUE@kJXLg*LndlKI7=RU*9rR-YK@OZAH!$!cVC7TRsB3>< zj=2n1MgZyqvZi|VfRt!Ht^`DeoQ!s7z@@oF?0prt8|n-A;vI8=@QqZz{^=ED2~eYr z{cX9RizU<@b^_4U!_p~-m$*PN0As!eMFy18nYzf#(TBgDLVg<~qc>y)qc~>Is)9zO zD&u*QF?v)_kgj6-W_Y&1!lwfD)f_b?Pt&Mbr8%Pu0L zHJVEtTheH|;O=Fleo#G0$_2FhjDHBgp9DV<53ugL+&x)mqueR$OJ{7nn`l@gb=rq6}G)BuU`j0uhkKyolz^ORrtqx zIs|U&MqB|MrcZi>+7k~J5Vz8OcQMt0CCwD7X*+35)iV=c<)K3-XV5pdx1=SO(9SApV^1tr-!~Z~SCGt9 zlH`_bH`Y}0!9NvfwXBtto1T;!I%9zx&B+zEnT-Y>VK9gkFbBzxCSe~fcA)pWsm@_d@2vXn{MZv4~0HP9h=x_0|H1jY`lCm1}z%79>i%ti?Z z_ZTdtDpAQjEe*INVdu}t!VjDIk)boFNmwv#-c+(dX(rU1!5|g~(^f!>rrZk*3e@BD z5SC7Uqi`c;h734*or01)Q#kFnv{@j@MxmpjE!pjO!I3FlLMLPO@jm=DR6G}9*NcHS zznm=cd%;a&o8JMM6$%L-qN7nd=A&Fj98WeEmh}*C!W&g~WGg~@Lj758l*`gUsu2NDkQp6L0PCzb=C~yC6cXV*>H+$+>YFvCu zaM<5b)-ph51G(Q^V1)ZHt4E)XknQGzxDb$iSZr|RziqgPMxRuoBwWKZs8t}CL)UYL zbL!xq-clT5Ib_6hrBPT~Y(C7RVMbUnZ5{M34BI3XnDZ|RzP|Zpq1?1kBxo>kMRJ+* zQt#oiXzUpuV~&Se3+?=Y4J*I3HDN257^>x|`u?@9Ml$_;&Iv1>)enRxCux|w1Wl8K zhPCN{)AP7Wj`9&}8_%p8rVYl0QJ3_B-rtRzI}sMv*!Mf#N}zcz0kslzE>m0F1hrBf zy?{j5JyJS_hb|Uo2=+g!OfhpzjJdiluq>bMo$WWLjr%1j_YHp+#r#^KYx2p0q3a})AB z)wzgE#yv1x61>x0nMlvIGj(wh+aV@uWFmdS= z-PrkN4|;z@{wn*m`91+5q9h4NB04via@P>3Iqs_PwVbatZrW7GA&1RgT`4VY{(`c5 zaVFq%r&_F#q_2MQn}8&x5^WVHVTO7OZCw2k+w5&{-o+ksegZ`ll<9j|V)@cuN96!6 zzo(d$!89_g|Nf?Ne9Sw+hf9CpXbeHBh=fquyl_Z6r}qpV68v>^WbNW!Ms4%8%_2#GZ>( z1JG1g!xV&9ci>o~GbPI;2X7Y*-ziAS9GM7kbPv?DtAO-884PrN%yEp#ny9vdh@27av0x3w$iv&pv)4SSBCTX#S>0RxdF$Md#vLT`kup`u;I>IUVXB1$s zj4Wxp7m3yTdJsRvC>?4eYnSBCj}*k4zmeAqw(nN_XtI7oHvHrrHK#(01F;%Xz41>{%*<)g9jVQ! zUY{ty#3a^@tfm7vi7oCin19~>=buHHt8l~hU>o;?&R8D~=EMmsIiStVGvkf7hl_cY z2K#Z|lHtvE2VniSAOG0zl*1dAX8lSgL{vdJ`sps>>uI_Nbe4%K!B7PXUWeZ$CZlJt zM1zaP$!G&Z4b*eHeDA1R?C6&2zQ4w6uU-wNe;_$oB|ubTsNk~;y?L^ehU)fPUn)eV zW@(;A3?0Tm!6o}W>@OQoGlA@DETrLj6q`DbFRsaV+sTf{yvP1YJqWE&ub3$x8vO@jgT!zxNni`Y>nhLP!ag)PraYZ{j6E0RoI)le&8?FOhX z%x501g464#78GB1=GUu+EurS?6)Lntl{NpKeC?Tlul`a<+lkL z(d9aDeZ%JNe0(qzkmw*PWEm?%v$7&6)24kG>9j@MlFisbaJ($`9at00<%*)aLSP@* z_n&fQX8*yamiZ$Kt6;@oy^uM#a(;!(52yPW;q9FId>x=Z1 zhJTtMc#1HfaT|oB07mMg+BJ{}z|$$i#s&3IJ{=_}ffSOd>!fVk{=0Sx{H)wkW3QWT$1Mf;?bTwI3CjMttCy&(e5o#$haUG z(^sTFgUEpAgLE2o^-!VbXI}cEWJIs4p7u2Q<9BK#seXD%BQ%epF=2}hAS()c7wd92 zS+u=C+Bv@=!#fls#j!(utmL^Nbvwxs8|8d2nGjVxCV*fwIFW4@G-7$<^K7-aK2AwL z9cNI_>qsJ(jM}OY{`+YuMB4sey+at~R5>H99U&~8=vHpTd*Iy6mKK6fWm}`Ic&yJY-VV|>B0G|z4kWtyEfSu>!8Jxxbp2%>#t#&DY%IRnFYDjt zkuFB5en@)#cEz_xmN1~05_03snpHMRW}!ORYvats z2^Y~uOSt}NtY&dm2BmW~l+g1-J`s)6OmEKu)S)-Un|2)tFG4ol`u4wRW0bg6zFVqJ zjkU~QvSrI8GE|{Zk{%X)R{ihiUmBCyvHpF@$Hy8FLuIGO_H;Tyb@MEabHN%;3v9I`~sO8#der*7K$Y zuTO+;-aNVI+3?)p+dT>Vh7XK0sYa1IwtSX<$5v`mjy-qi@iYCs3>OZ}TOQ2Zr`4uY z4!K{t1%!5Ke}A|p3rKA`bx)wyinTHVVM&2SZ=MRHM7=@?Qz%4!LLwp{Dp-^8&( zyOFH`3CPPy+v?oxEzs4`g0~aa_g-n3okuz~B-kqPkiguqr^&<>c zcoa0%#1?BabS#+i3oVJfGx}`cM#UTdHyxMBlZ&T#Y>CSPwy z(1M*}C8-}lOFKBtdT@hip#-}%h`DO)JNbIaOkD2ZZXvpoxgAFB=t9F{o-vp_LhDgm zuAZifaRc7adc6E-XKeXkW1>H1tf}yxV|~!6Ff??<)(v*^iUAn??!tv-LMV1%#e}bG zy@Y+PLV#Ey7Ro!UJYvgmesxvZ zj|7s~6$xM41qn|N)@;3cQjynW?sUq>TWUQZ5;!c>@7w0c5ki5N5-Kuj2gKpQOC67j z!89~`;KQbu{;z}Ar#I%fJrTUV*0!}hD_7GM+dMuzxb3=Tj^mOs#?if`ca-9EmSI!nEa9@}w(b&zDFW*GFuQjUI=joLdiFa_K-AAJ*E zP(Mu>zKMvs0)h~0(iy&=)D)QD%wzXYyfcTig^7pFtkKNWb}P0UTanRfPH8?Z#B2SE z6S|lBe%y$qYRYf6`{b1e8Mv9l0$sVJ;Jj)9AaB-RotrS#^tU2Lvi5I)!2BD+Q|4Be1eWkwziyw z%Vwr2U&Nj~T}QX>JdS_718!Hp0FkS_y+Atp`;i&!&CY6}J)(y06V2o*S2bVx7m=w^@MOD>mDG zRV#SC3ez9>EIz8aj!o^M$Pu*8dPYLoHUe{X)vIgP(U`$%%_X@{_=?K^t`V_)duCls zO?6u*#q+}a=AA;?#7gh*$gs;aedc&+>MIg1Q=kX?tpTRC#^IW8IE-t{CHMMcbgG+H z0&puwI4{@zjV2-gfq%6S8rWvDdT~hqBIC7}6b&0FfqP4lakF8m}ZZHe%UVhD(7l2N39=@;L}&mB<#{Oo@5by$9D29mSl=kl)n#kIt5 zMiUtNxHF;&YQXA-pTMhn;`3B7tJutMOh6sQy))b6e_6r4ao$giqU*tgJn^^3&@Ww}jqb2yB^;7;G%ZF%4TV z38o{?ySlDfurE~%HP@I~vv74a;yQWB%uh73NS(i(SN;mO+Xb^9FCd&mK_*az8Za|_ zY$t*6B8ipg8Zot+8_er%>3W+E;NB85uvPIRckC)+SKHP(e#2MH)o5iXbOd&i)sIZ~{rP=J0kKDs8W~$_vZXzm2Ne>zmU!AjDH=%DN zyUsqW*Vd4wnAy)aNzdz+rfoN$^cK$`*M`iqkCto2rec>_4cE%N57<<0K1O8B6HU*@$QrIebi@;OgQ$==nz#45J#&63io|$J1MpU$Z2zMID29Og#g_ zWjq|krog?%*MW|L@^B=c-6*IQED*8-) za|sSH+w7~yZ*q03+Y~<`)v?E8NuWie=qdJxO1^vY(+-TIE&UC|4q>C3=+X+8&d=jZ zDF&fM;>+3|l#fx}#m%YnVW1fyVK6^x0Y6h1d_G=gT8!9ozSe2eBrWH?RXAnrRTQk3 z$B(f%8!Tz1OkgvjU~Y!Lqx_|0MgcN&unB}!&G3ZYYbkn}w}K4E0Ix%q^$~E|4urVx}~H1{JEg$_B>{f00UtM6KUV)McIi9(}`6UG>2x5M$460 z$bMk7#yRAbQC#poS|g<6fm#}MZIjrL5;4n^ac#s4s>>KrJo;qQi06?lI)l+@2&pkk zaND0vf;_82g4=0a-Dq$+rB_e#7qx@9DuSC7QmsxjNw+lA#0D78q+`vHu)j`dk9A7J ztx6by@_ehDHp+fYQVmeO>>6`6Wfv1a#-g-*!*{zgesH_59<4{=a;LtO@57H0WEs39 zD8bEjmUDqDC7|9h^(JpTy$@Sl0fiMmBWH5P8E5&7ms*$G@Qo`q@ISn7SAX>b1Jq_E z4(`@!w19SBQNIt)Q51Ww!mE(DGuU@u1TVgXpa>| z9Hzc$P1W&Kk%bZyZCK9)n(ZF&rQwD9u|t19uh2A3ry#yvE+2#};Bt-u9xAOD(O z(NK%x1RfCWCCLYqAKvkh>L<-6B9+HGFT~ji<2QLM&FxyYlm<>A9`_Clb*HTj;j<>wR zYFCLBbJqc#B@LgyAc-~!Ua18040-U|u0|VhmbY!9P}so`f7g1JYlA!tftJ;q$;$!gFnKCGp z`C8Qeu1Sz7BeeQp0)*e4y0xEqm7dHYH*eSV4QJ{y@_!mEQ(RU#4$gG&{90rrEN|Jo zjV37i=CWQ#l6Q}QRn5{X9E~<*eRa_7gM^^9SPuk#f=)wN+)6 z?a`EYkSQ%_S76PIKB~+Ge~f5^c1Ha|-Nr$8Nv2Tt<4!ZK-}7}P8u8?!58cEx`YT=za|7$oJHX^svY#9t}H zIh)O?Wc#S+h#gUpbA38d-;aih>cYDOb@mJwh^6JiANau#10*HW(xH2w7jC4ce+`7Z z{v{~3w}-m*58hW#GIY<#QyX-C34j_d|Dy3!dUuIK%7}NS#K5W=Ubg75ktUZ{yyp@c z-as5UV}@#|*t2q^<^X24Y#91SUHsDtCNZ&?#1a4{Vp=+v@E{VR+~!}^Et07NH9HhN zI)j&0jF^&_EVK{PtN{SdDb~e(e17>`o+4tV^{J>Sh84@JIu zqgEY0Q$M-@X&DVKk>A6wc-ib}nd=#0)u!kKg!ci>n5?Jyq{X$NXA2(Ew?W~9!lEHv zyX-gsB9VBO&Da##+ma}ZRGE)yIGsHZ^;nO=bjN_QS}`d2;}xbj!54!gmfzS5?(lCo z?f?be6F5!cLZv|?MMnYA7r}DNQwCvBawzrEJM$d(o*NlobmuUxmH*&Slz2F+S+tBR zADN0(8C0>9fHF+b(am*T0IeG3v9h`dkJA&N(EvDn8^3aUt~J`h8t^4n&AECu-X-8F z8Lsqv%g)opfcWrWja?p<0Eo(}9hSE?Ti$X!X&QB!eFJD#=hY<#x;5ZS^F083Nl${G zhUAJqdM7phbm$P9`l6-uQl5~|@tvQ1@_78u?dL-e|NRX8k<9;yj)Z#l)Pcl8O*JT0 zu*mBl`-gp{Sk!&Hr`u^AWYRACk8&r6iQvJef&y^skr)!coz! z$f`X%U{bN|VPMX9w?^fEVvxCfAvxvg;Ry_vJoA9Kfy|rWA)=z8U^~&aqHpM$fsp0; z#x_J!z#5Ws*ojA#1@xe>FEOslTSv6oTE%$2&A|G;8fCj@>=tEUV?llC6&eAD<;*6} zliB<(xpT|&eW}d{pS*FQ!t4hOqjA$6X!0};sog<7GjhE!CG!JS5gbb4?GCUzd3l#NB{=i3^xV}?5G9+0MG}Ixhzy^&>VOYN=wmq-{s^j z&@+q~Q*J{<4kGXg--9#~HFFHQff)%6i*8${15WhjugAFE&^wY5j3wPv=E-=z468jm z%waT(Q;Oe<>KG4L$} zedRo{$E`;rS44daHsZl$sp;Bte0(8Q;MY6p67`$TM11SF65yl~yrY@GR=KZ^$bN^c z#m~A8Wu&V<5x?s-pON`GoWSUnDx;B?rwkGZFgzms_Lgb*f1|24rqi4FO4zCGNL};fC;W95cE*gT%rMkab&H&AH>MsV)Y~-WrB$m$v#zK9wdt57rhP=kRJ^h2%NZL9@27FLQBADMXx6pTs&M%U-3P;-d6pehOGraTHWsmwXqNwT&xjqguJc{9AMi; z<%Nrzyq!_R{SBM7e5Pph+h!X%;{s#~iv|nkmH|M^3*aSy{B0utqo_IA`f44x5x1)i zO?veQ$O(#8D?V&_MYYC2lUj&m=9Vn(Ty-Rj-%|sTSjSCo-h~0&s2v#mM`@hdR~YvV zZKR`D>fRQzPJiJh9r~C>a!g@$noRVG@~ZJ&Ee|yAvA`yi z8WI2Nt|dfXb5sK2=TcEzmgxNs-c=!*&zlViu5EzA9SKHz4QF@)fe-rY;dec{{efO_ zyavW{8z`aBwZ1ci$%0_=+W=yZQO9OAa60H?gS?W&Txtp5TL9>PRxx^qP`M5=!HIwA*yzU)l?5atNqT^g))$_D^c{V3;-ZP!HHxbe&)ft5@;W}!U(^fSD{Ec{jrb~c3cQz9|*sz%+ddYwI z&iCP^d4eB#R!n7H4lm9A9w*W#<`s$f`8wE9`=j(^O4tQ!A=ZcnhxG&zo1DJK!6Pa# zqZ)`Pf*K^A$%v3UDtXW+ni1Gs`XD0)QIL0snQ=(&-a^L!k#jt4PYR}pj2V$PBlvV# z#ts^Zsc(NZ+mo`FWPCOl#f;nGL&WDuy;x7Z_s%a@_~MRI^t`Yp0?$@|-?Ux#*j%58 z#*Z!cXHtsGTU6GiP@{K^Y23ZvOyz?&i^51Zdx&cbvG4xt)0$e94MImRD{^^MWZiPF z#)CFjJj70;=|x=3Lk-~?PAnGqJbnTiUr>p4>iPB&ATf8Fk-Srd^-J5&VfRd5*MQc+ z4i0pvU`*egco!^NOo7WEU!#bV43#}BO`|gqM(5z>L34KiPIky@!#Uq_NFQKXP0=K9 zBG7tyi)oCo7427wy(-AtuHL7brJozv8JrEZgBb=TF2lQ|HTmp`>3;l3%$>HwR;?nr*6rR|H?Oh4WInYk%0XL)0ygt z9(Zc2Qv+2BoP$|{_699#1Zu9+__P_2G%cN5f%w-Z z@Q^=2$9$M;`I?vU2miwv@nFZtcz?dfGylWmb?jc{`x&Y@m;dsmb$_|=7k z%<6LHWsLVY{Qo5jq9S%H^6_te4-U%uS`rfT!um;Nw%yaMgRR57O8dmKaHcv54H~*0 z=2i`w0EgUci-|lxEoqj@Op|(G2p=6bIQZy92iq2i28PFkp0$=esTZHXQ5uhI zMdfFyp0J??F<{>3oy8>igYVr-AnAMlaR30goncJ_H9|zM+j0l~m8gioaxt&5=VF+Z z;em7bO{Ue-Z(h`7BU}BnhCMOh1p{NHmd$209f0mc*#iA#2=N_SYg+Lehaoi^;=`PD z`AU=<-C712LiQzb+?zExx?nZ!XIF`r|AKkw#PUgrZG+p_fsbM&sK+UC9;=}zz+*#8 zViAHQV#}a{QPsfPKj=Oy9#fBbd=ka&wYebb@MfFnbA1dUX9Sgt;!Vt|mLkRDOoV~; z^?nM`lkLyb&qCmg*f{zubN(%!8ACk87Wf{DJeDvB%5&0d9=0F*S<&qMNz#soUC69N z@PGEB_?e6HMN@rXwqA;D&%pX)`NS^p-Qn26_FUYf{j=9Z2Fve=v9Ao&9}>&%LYutL zHJ(W8p5++5cvvOPOHA8Mc^+oS2p?(^d1ZiS&fv87MnCNK?HZW!aATL~9l?^01K{gd z#W+p?b zbR=vX@{9sEa?P zpKMqM3fgbh*8-%>YAw_j@8();jdmSLb;&HijJjLbb}P^odRv(L3+dXtC@W~NPOkgI zbK&+RT!e)elAq1QpR*G{nPXPfIE>{LwwEC`kg%M-pc`8J1@N;6%s$j5E=p(%8y;Yy zbww|)0N)N*!$!Ny@aPMx*AJYumK(FAFy0b+ZS~1xGy*vyYOdUQ;RFNxPg^-_u4(ty z*Z4~XN2_q^Q!tNrUg$%W;<>Qj19}CEyl@WAe^s7{ZDcwkVR*kDv}9~?K%Qp|-5uLS z-64D{g2fjAt_Ot)Ed%=FOUB1bZMiSrVRE~ZME+a{T$z-_F=}pZGej@xXmfe+`Sr7J z-5`fQjf$)Ya@==xXdS{(^=!IW%aXjXXn=g#AKG%Y;7gujWs0HklxM4$CBfX|&X=!P z#UDHu2KViazDFmEm8nUMzL=#}WJWtTjv%#tmf5v$gf%aM0$WuW4lps-YE%4uxeT+G zKbKP@S~%SCNcG4`4q! z4h2=R6msKCgk-3>Qe7Eiauy1^9`Kh#ts?6#)f!;b@8Dhg5ctsF-W_HCH|T|m1dVul z+Eh0{nBNhE^b3JGGSqUOEMj8Xsqcz-Xirovext#1R_J+KJgfVwW{^)fTaisa9x14N zw7M2t8x`wHDRQQXr>ti)kuqd-h3K*cM~vUv)I30G>+)7wy;jb_WP(gp=4&!s6n~HM zdxLbu%X21K;&4b$3+flu=3WO4nC&ILM`)32S@o2+V5Q&u@S5+Z)V&`wuIEJn{;S&wM{V zjfyfIQ*c<{)yB*qz}8_t>*GE3`asLJs?lxv?iCWDhF?@^`_UM7EJSZ73 zBO>C5%-akqarZp7e3`ncPGCEdC+YA$T_9o06exA`5B9>|i4RlM`nRbbVKzzG}J`|9g zIF{BKkSHgh7U(em`Z0|S)#`%O)Qd%|%+v#MCS%Q>LwATNJ<^M24mA^Q$MdwteAIu` zsuKu&KcTVOM&bP^{9p7ntgeO0Z-`ZQD2p;t;U}V+6Wz)n2ob0-;2y&pqwQMbY>!P$ z9AXR4#c)3<69~D;79Z&`o5V+dLi}qysKKO%O-xDA6M6Syze~k7RSL+Zhrw6?j?nvp zUkuBHPY1U?_$pIM#ROF#9Vt5K*OQSmbab=bis((=U-#z7)pDL}cutAEQe4 zGQWwKKRkq|A*xk2Qzd42VFVe!MzmmUCFT(+wMWgH>h*mir)mq9`}-CLhTj4%iUfwW zlI*(b@KwllY6EXw5T0XV(U+1ccTJULvWj}{jIl2~=rVw`*?xHShi8wl8W3F~60cmm zfP_DH1R!!9nRO;sxtVvVYVwv-`A|PFZqHeb6**)H6I(R( z*|5co4`8x@oYH9lG2w*Xm24Jmf?Qd;3l9`w1qDFElez#rr~ikhd z&9QveAFOy(4tq6iKV5kE2i|k~QEa!UAjdf4om-`e0m`y-lVXB&ZtdsEs+|-2?TWxg zccjA+AD%4(thO8n5+w5jDanUP!`+kIZ%=6G^@)(?vG@bdOO8*{QQ|OWq%|tV+=@nOc=gjV3a)+4ikAz_VY_Qfv+hm zU70cw7sZq(22fD+7>BQaK!5-N0097ip6XCf;s@G7Qpr^<_2(-`F=b%~QeAhtLv$Kz@`BEWN`0i?uS73%{vYcwK#0qh87b)2mGuVQNdvx- zs17xNdJJ2M9+RQcn>EbDx~=h=Q-WG`km*PFIYET3+giu8f13!B zdUVtZQ%8mk;7#kvDSc{D`b_8dOo%mXsEWpQ6RZ+S>QgQW2YfD3QuS%sxqwob6-jOD zPNrSi-&ae-W~5ZBf{X*cC+<8tyvY|K5%tZz>o{j4hu@B%(xOm1EReR8PeT?wT3V59iI)f8$jx|Lr%8<$b+y9_j0r={4Zs!&?=l;Mxt`Xy z+qqGj0)kIpBZ)yhQxmd05Gg4)OY2U)@x;y<*G*yq5D)e|IhO5k($HN1Sdt-jJwu?m zcmiG~9BdXJ`u(ng=K{&9Dv~GuZTE>;V|M%NlUzfZ)4#sDeqtNXx_!%l1V~H~PDyJC zl$ffBoB=AmbTfLb7&VNMGdt7FskO6^{DH0CjPvw~jANQQ1g7#EX%&Tzm<_N{7w7@ zRx%SL)mf{^@OcIhD`TS$S8s54V9IpVsZ9b7Zr}|5JXSg!yf%8U8%2f5Yv?{2OAa?) z-5hktuz!11|rx>4NgP|YPAejQ3q0A_d>JwEQwcO_cIwoKBjz-V1d3YGx! zDI@bzX3UrwVvhu_Ro^l*1`2qNcQGpiXIQc|f@|KWS<TYj;)A5*mic>h*SsT~m1Ltx=lcZSw)?r3`HSuIx^8wQaI}ldMtJ z#|-CCNcap^S%#j>V~(3d7q-0OsAw}t8Dw?!XuL@zn+1pYo1dBMcJe3yD zia%HLUOYM!;{%30;D`?Y0rgDz_d8E!(%pO*BKLZ7VV_mP=E@RcY-b~HT~*e)Gi51D zFe`2)l5)5m4Go9^Y-PjL&|<*S836|pMz>ASEaYeqjPJ&4=J{)$oA3&y#E9FC7bG^Y z*GAR=HNC>o)$wx)0UJ!p zHnsY1=NR1gLTXXxoEGF35Dc=IVjuBit%JwJ>S*j&Ra<;Kd79btu2){ReOFKOlf|ns zH}O2fNa+y@SUBxpxG3;;Iu>s&PC zyeo$;KVupHd3YgL^5-(q^m+F2jRhoxibA4|a@BMTJ53FfG^wQIa~=N=pjW*r_?YHe zFmSAUY@UG7`Ahu_g|&ou-R0Z;#}Bw2J*bi;b)rjrOas?BEM#ZG_Om3P(v;fTb1n$c z+3|SqwA2m$P6=~JU8|~1M1Yr+L>E7NE-4zGDX0uB+jnP(f_M#}4q*RhfXgJ@Z3`1& zSfe2kNx1lFsPN96D3$8z zB#GbMg(h!t~Lih*j7v79H_s|$j8nPzOf-_77Ltf7INWLLZmNl3_Ub;gwAWV33# z1_YEn8h(5)F23c{%db4f*K>`QMC)f=@S>LryJnm#vkh;)Q3JXunOZs(y#~0aLDB}=`c}anO2Csg`FDEBTgWp1uzJ6EqEqobq`;&KMqz%bgbbIRy#C=w}Wi~AV$b@ zjZr3`YR5U5OTYx?Rj5V9@J~q65rW`lSdXaqLpRLTn}{vZ2MFmzYC#T8ZsDYxGbsxV z^r)n!yV57@x);r#F(YStuaGWe%L!yW4iNxx)0g0{7-?d*-w-JbV;9XrxO58w;I{6M zdi40-#&77h;ysJ%Q_f>odM|N@BYY(2&ivdU_1 z3l3)b#J2y}Zj$&L|%Ob~Q`M_zoqCm-p3H9hEGUKcfLEzVufB7LgaXI8i=y9>%zJ#IN6LU)yHd1CFD z32{18EThht&Y8(^8W844liu~-Xi#P1@;BMNaE9z4^>EKV>9NHVfA7JZQOslW?F8Qw zE|Rr{8I~z~?Dk~dxzee}|KAG{=+s#h{Wl*h?DBGzCUj~tt_B;w0`4&zxSHfJ;j_m# zVNVybGO-Xpn>YtI=L*@aXH`R3Y3*L|^`1hHY-)_@S&PY9fT5{vpq8j&SvMU6qcBeV z=eovc0uneEyEC-p#BS1Gkb%XC%bMk_HGp(eb0LdIT@IOk7qq}-b$tjTOXh`t#n_wp zx4l!5QzjQhwExv+mXbA{nT4~k#@+~GDab(? zAbl;dp+awMu$KAYlG~Y&7plW7rqymXnl3_R6cfpfDFcnCm=Iv6N z${WhJGv{SFA0Z>-7o`)!{XKWNqc#I4GeEZVCj-V=vWIHuPd|ij*a?Qcv6Cej#(jA9 z^L}eZP>ba%gP>kmvTEo~N(QQlkznpe3?PO41&pm!t3S$#F0}X1*n*K%y9??r%b;3) z|I=JYWH)`6;d>LGgt?I)-Bs&gvF+5l&u=~sFTlV%Q?X;_U2*$j$JuoX!b;fk|H1Pq zFwa7UX6Tr1jlFW&U1-}s83aAhg8ShBF%=O5xC+zHo*HCb-x8dV9~t*be5;)(q|T0) z?2d-X!f^!QB*f^Sswt>{uQCy^k2HMnc$}_ArrS)|8z#b&cdTyyj}LpVCXJ!ZITG~; z;>Ztw#~R~jtzgHI^_FU`8oppP&X&P$?y35TEI&>Q+T42u#t^qhwwd*@1(qfJa2|5K z^}8&stnyytNS+H9^2W)x?ICm&B;LZW&eC>Ri+#(LuSbMgU{oi@4s;l@b0)WZW6Fy8 zJ*UhU4!M4-hs{hSH>k~9iFwYPv1bNuf8?ZcG+-cx>~34zTzl4)g(bCBcXty{0ffTm z$cEKD$7tCe|8$3#RefSoaZ*;(i9+)8glsl!hT|%-VFdAcWR7{gFt4%CY2=#(+Xu!B zdYO&Y9@~0d89HllvMT?UocB5^9~ax4TcKr|yFZcmbA6n?COb%{P9dfPz)S@lefsP| z>369kar*iYsjX$F8jfk4z2(a@4h)q&0lylr++RLTX%vggW`M4;bJ^BCcTI71+15MI zrEQCMr7QKKy)8a!$XdtgSGk#YuH%!?*$Qt1seh$!G0#T@DhvW`wCh^3Z^OL#BC8di6W?Sst1EmnxF{hJ@L;=xnhk^%N3zuHW; zdE|%_RbdNlq#Fooa%KLss{VT!T=viJNR4WGQG()qN$r+DO)(*e~t)Dq~fy z`nAQNClA}+a(K<>bIg_2^ie2B;C83emZKoiq0qmP=Cz$1zl2s6#xUS`tQ&D0vs2Wg zI1~gBebRi79;86f?-zWui4(k1x@&KjUQIdLZL?~j_dM@7$nWEG`nk->fYLUsqbpNg z*J1oKcn6oCSIy{Lh&$0Dh#)%|0R7jwdx>SVNnRQX))c-Qf632;&Dia){h5Gg;pk{M zn=E8n2`-?oi)I29NLFvaPPS0s3kBS-c*^Kr(IeV$lV`#-cZeO`pW>2-_mZWcZC5S{H3@} zW5^F?19?!tLhP~~ZpSkLh%2T5`H6fLzCvEst%qDaiG43VLOiocvc%SDsjJ*tOQv4H z>(y9bu}K40zpV!v1}EVkNV(mm57s_9v7X_ZzqDpOpwK?5=t=?M*Uot+@E~I zf^kmy#Ocl-2@(aj61;_>6!nkH_H-DGdwrj2k0B-o0ZAxz)hY3#hK|5B)`*kTRF zFH4g;j`o0;vk&+EY;6~bd36Ge4fcgCnJomKy8r`=dI_jF;0bE!bPV~h_l}t?%67e} z8B6pYHsoc*g}wW@Fgixt*IBR{@ZkTh1H&}EMNS>Wr=-k2WlqRbcF{KbUjRgaf!PzG zCw4+!2x!16c&$s+MAf#galT%gpjUHU;ixyO;3z_gn*JA#h5NNs3;{zziiXe=ctLV! zan%;kSF<*)x|V$TcJ;;mdQs&$}OCgz@T8<7XYGcv13fyumZ_^k5y5WI-`rQ7(oU z7GibV^6cf&@&U23m(aba7t*z*zkXbN`|{ot7*B<;E1WPy7gD?HXLH1`jI2JNAjyfZ6W5b zfwVWmd3)UW)NMC(MhU+{Q`2uoQBV+|-7E51oDV{Y5_@ZR_)*ssiCoSXB8o*Vh5fON z{G0lW^d*5z3-esc=a4VKu_y0Ud5o%3|MXkk;P5{-J}se7p}{X}84xdbI(+BYad+uY z?>+r|;kN0OIH%p+^6GXS0=9fh3M+n}VlD$E%{k$&D1)Hm@zV^in>V;_1%-#LY4NR- zxijyCPWyiCdc#y@;O~BzcC6VhWe9#g^M1BIxA@B?^bc$>MkhRCKg>ADc)Mz=cY{r1 zQyS#I=a+>Y;dYuEmVWfDNi%}CH9QL(XMW*+Cr`t4^f}-Dj9Lp`)iMOu1sh`Bm;T(e z$Zc8&B5n_BvX&qd^3FG;o7%_&uZ8N%w--`WemTWFLOQEfJYfmpFNl7!RISnZ)Qo4Vs4 z)+S@vOb~lG;Vs$EkDNba)PKYXB*cQV33yTFV#TgDD~DzSpQd4e_mYK$>1PHq<7m249B_@yaYacN|B8Uv_-QTc<9)gc%qGSkM0pVkJlJ8#boUZ2*N^5W_@~)1!C(=L9|sq{ z=pO{dWB{@e?X#Pc4g?(m*LXOHgMl{c%_^s%Oq}qyOC?!CxmErftc&{>t6rM*Pwwc> zccVsGzL8$Ne51qf8UT4>lVutAOnjr5K!JjC9E+rKxx+&TZg6NL+g37KxvAT##$mfM zy4q#q+(JWvMaPyAr6&Evw)ZoA9Ry=hFH^s60av0UAM-F?qvt!7 zzt?WdA1I8*k6o^c1pV8(6v^->jl4y`=|v&8`{ zpi%Xh-=C^d|GXair^#tydrQPsF8*_NnSGc~R{fecWa6cx3Zn#MkKI&_uRP0KXJ893 zZMZ!z8m|}f$YjS^kLLu!=dw=5w-4m1%IcullWqUp$aHyLfB5bGfBvo{TSe_a<2W^m ze07WGGoP;td5z^}32RlTaz8T8a?c?D-M`GoA3#Obv3&c#znp$#7ig5OBlFuV8P%1H ziW|m7&ZT!64mbUJnjqWcNY%8`&jbA}bue$(k=VY+#Zna}tbnKKKsd+!PV+*A7exiP z#+2~$Q*lIt)-C7go;q0Hwxy8xh+E-8=G`?6yG@e}iqR-FZ3b@zAUtet?G=%Pz zE`__|S+^?L1oAc3676hw7UNJe(pNUMZ19fEgN%N&W(}H%T6^YQJ&)lV6wkoBT%)jnjKf`1o>o|C zcs3S}Re*2XHSF4w{yJm2x_0^aN3=HhBMu4e*zbF)ijv6Sy z2SHz4{u#s?r_I==uUoAm(@PQNMSBygeQG0SnRHpBGmISi*G<@5`eB~ z*x|h+E&O!|`X_>p7hu;w<4D1wb+GnF^^?sv9v^ppyAIGb!A8rjjq?X^kKw3BC45@I ztlo_<>AAz*o>RK;lVyp2=>{fkY7T3|Q~Tczj!hP#a9Hcm>n%^mXUneQRV#PRfTs@uya z0-lF;d$#nHv1Pij4~>$}_x@MDP7h?-$o(Dx`v!7|ra45tkXsR+k9~u^bK?^FVHkS8 zAx^`H0Alkeh4G;hcX94xXmz%}(M`31V&%j1C5U`SsHRqf2`D6uJV?BTdJvUYW$9ij zC`juYlDaClD+odF(!UNwPQNIYSi-vL3419fCnO~S;DG&)H!m%ROE{_n)9q~~N6gO* zS!y&=Yep*nQ66s+jXH`iB)Xim$iZrlZ8vBeC_H~p+Y|Ta!>1zKeh1P>5>Yme%Yo;E zD>LBi+rpL|Oe`3x|Ncjc|ILVz$F1Z!!kgqNeDQaD&{^Sr&i~l$8>M6=#HetU|528~ zYcx{$-9WgTk-HBv(rL?QLJOZnBF!lW>nkFsXN8k#>eh>vk3IiXo0)BNs#pJuye*KO z&$~osEjc+cWyaZjl%rZRi)klBQA+gIowYLK7$g(^Pc{sDSay4gVPWWY- zA%#TsxUo9i3F9cHh_z=3><&oO!SeCkNvBU(NDhP5_A_XxZTqer2T6NdLM40%56(kj z{YjL{wkzZD(lSCTU>6VV02q;9l8fPPc$WSZq{JxM=TL@YOBPApKV}F5dvemy2u>w+ z)c3JPB^1zL4~w=)KR~m1jufQe3P@HD=CEkB^l)~+I zHPM8uuP(z=jP|IW2KGj+kV1UYI3+k%1j&ywyC!n22>>ZC-9G~na!e%f5!bH2e6>HQ zLjQSwh_o;lMEs*;^OzO(dmbU1ph_V{=^(-mVnJE-at?|Yl{uRxm)G_@YUU<*fW~-K z`Ipa&GD~K^!&}w#b+8Z9o2l!r{D&)WAtth)yV^8j%v-MbIh=sp z`Qx&>Vebv@GoXRlWzfKl(;p0da)9VrzrZDz`NP`ZlQ-p^z7(FU?2+_Qp>T4V4~r-z zuCi`hQ^S1aS>VJTon*ze(^ZYjD;+kA%!2Ff3|{^v@y&Ad`s4u_J;Df_CcygCgVG$S)#A5=7BSKW9JxtbSLrsCTz zDh?u4LQPMv5}}@4GS?UlaV_slGHyoxP?-S4u44-0%DnUeqEQ_SSl1!z>pgFRYb7#C zgIkoZu`qmxq&18Tx}`zJp6jcBT}h?pSQAkZl5?OrghE?|chQIDhJ+|h9VYOOJ*8d5 zm+hg`!Fs{6qbx7xPnjU7MidM&J86;}|CWKGXs(FO%y zd>j@8Riq!okE7yh>S5QoqLfR%E`7U|-M{c~Yc&9#zWQ7yMHiukLT*XJf3bY?t;p97 z0Wn??7!9aD4Mj8R6!u+XF)?+$2C1o4n~U6+APeZDW)}B3@yGQZaf7oS_tBgM-*E zUtZP022GJ8PeaFR>MJ1-!7OdMO|O^P4FH@W@t&tQ+ajj4;FF?lJ)au}!O@s9{lv$_ zc@j?ZB^fcA${O|EX7LKN{6mRo77rO%lRgMSy7|d!|Ki`b+y&SUBJzgcwpN->@~ui^ zQe@k07ko;5$Dir<*@$%kCcUKt*FDqcAbNU->TXxzx?EiyBK?-!ZiTg9&F?0iwPBbuSr9Sg> z=vw4^nqB-0dDmf5e`4(${f#V*JsBqFw*v}hw9QY74D8$Iz`+vzE|84RF(a9(#$QoWe?sWGUw-BCEviiG{HSH_zE;3{A7QJ$s_T(p}(3a>sZ z=07*?rR=@-&+n>+gvm`J7EWf>6hFa%@AZz`sY2Iusn%HW>kO{mpzIQTE!aC`IZz|h zu%?d(!-7DRO!Uw zNTI^BEI0JGcAUOWBx2aPq%V|S#yi!x;q*& z@kQ)T^*xZpIYP_@a-}L%Fmc-D{Dt0Fd~cFn)@n)~MnOA!W-##LB*n}7!^LcaeJYLc zY4eY~-u#4jMm??^5Jd@kmSZfeU+C@uKX~oEh^AdwEm4XdD6Dm`K8`G)WpuSNz`kK~ zYr>uxxE!Ea-i0{`ajP?4P1e`9^))!5A~JZ&jXgF_)85?r!U|+|)3fSn;A*JbDpF{# zcTYTH;DB&2U#D7Wh7t2;9}jS3zfw+X1JYmevT6ddrKE2n&qv- zhqBeD(Q~e?D-a=$xfGl)579(Z;+oB?os;hS z_CTf#nn5oMpCtBo!x8CejW99bKdoH;%Sdrvp`lf z?gj?qXY5#subMvmx4(tI=4*7eYheYuIql)Mv$OizK^Zhww`t+|5Zr6@_MR}>50 zv$Ns#qom(p>5|o+(nxhvYBXy=3xkzo9IbW`RV3FXA9a0-X*>`y*%GQOBG*_6>L@as zd*`xT^WT~+k6f-mbcCva{Qk1u5A0yDq0#ZN-g~X4ZjPvOWVTNs4zTgwAf|V!w}JmU zL`|o!V`;V<5cBuODW-v7=yS%u2k0AY!GF8`SD!N`%6JFO${-E4I0EmnCZi7&^HT3e zIk)Y;$$8aFqUDOhSr(WbX8kB`m(w`+F!j-N&vc2wH7-L5DCi9SU`)g+270XI$~~A{ zv+&DYv`0R^3+uEjj^gFr{E8L}Xw5FbM#gYfnO+kee7|WM;^MZzkA=k!(KoSWdC}N6gN~WzWyrH^x*Dn=5Y&XmNg`E z^i6Hc_g^4Z7zR?FKZ5%WVItxd`SEi-1ohx7GR*PJvKX>F zGJN@r;JcR;aHwk*>K@6RhMlAg8q#AHrK=&P%R0Bb;KhnzlRtcOvxQsV^2YT7t8ca# zW?LmSrJoV24~K`>{rnqhtpm42yod-W67>)4m?CFo?fg(|y*+dCE%>Lk@)|e(hmo_4 z+)~8zvnGU}Qtz!iYKs!GfinOU4w2r8(Zr{(SnEe+S4TqB2Fhx8(21dx+(Vt2^C}0g zL`N8{xdC{Ihc~$NkWc`08Lhr>fi^tnyBY`NKIkNp41kh7lT}6&j22`>6utzfck?Y`0bpeBzEO zqVg<9VW#*c&qV@TGJn%@@paV#5|^mS7kafpGf0!P)OjROJU`2PMvDIEq*}pyv*>q{ zW5ME3pfo@93*6j7P2gu5jWyDu&!a(4J7W3&j8tT>D7}fhfHfrkLe%MM6Bs$sE1v)H z9};0mnQSmxD(vMox?GYyH$j9gz*^R_0g_O7&JTEis=V3!3qYrk58JAGf&Y)iWEe7 z$%GDYP!c1A40ptg={ObYEx}c3Eb9Q5_t(6pyq)-moK}R#|3q0*&1E>Vrv#I zctmfS!<$;m$}<9CuPmBY{KRY+=fcwr{`yC~LnB^=?hZ5aGY2Fn_%pP?fq1^(rA1+I z@Z$oH%PXI*1$#RWa{oL`Lc#XAp0A1ofeb4kjK1)^H757~N?xM%=wF-it@;JAqovkRXoLyXx6a7u@p;FdNH^DkJ}rSi`H`Vt;07z7)i z(iz^bq3^5h&UnCcc3z#%!8%Ei zL6Gsvy0ApGL?NK*lHHBPF0GW;**cG&9v>L%48HGHw@iy>jT&xA@VZbAo&>gBHBtx$ zag3as{?7Y2^OE8|a|HQYEG1xo&MxbJ!Rnt0NJSXqKo^09X2>2PSzJYpk3v%sFkl-4 zgJRs>skTOXa>Vfd9xsujwXo^GcyAvPQh=rJt5WMPPv-h%#}d<$dkn-@ffPzubXnGF z;)y4FVsuG<;z`)BvQ;423||Eg)>G&A%3-~e!x4y4@n?^|+^XF#o|(8?{RiDctX0Wtv8 z{2d~{41os7kbdcr?_(lwu93osVb1ua6xENCH-0gDdW~6)Wp3 z4gclWHHH6kNjKM9p>W2|(N;KoN2tFIf}60IP~RPW%AYyM+3|09yZRKi=PaiG#%OzO9^fhM15Z@7ZHi-(OAeaL9)Yhf@hk?kvs(GT2s4{icBu z<^wgHP}*f8@f=P#^w06CWE8~D;6yJ0dhD+yfZ@2@H}lPewoGwdeD}Wc8Cs1*F3TPk zsjzCfgcc?>)`G{J^=uTUPgh$z|62T)&p2bU2db~W5FML8Eo6by$3txaAgh8)w3*fz zqGM4WmxD-H*`&-4%OcDck+DfHugu3F$Ot`$#{EU`bDu$tCrRF>K<4zQy%S>-)bFRb zw3IFZ^#QZp%y8}E=v063oy`PvmUk6mkMG>GqsWg9MYP*b;o`0=s=&f1-G&fG(|jdC zZEXFZvdfq+&1(e(&#}&_nYmT!j)Es`qN1=_5TK?Rzqw}A$ZZ;w$MS+IY(SBilY?tY z?cU)>Apqm*cdybmcg_&Lbla)Nhx_>JwCO%=NHKo7rTHDNUecl+-1*0Ida67Y*_bR! zk6Rxs+lsu|#W`aB^5tKi`PpfjVlEI-7~!@^jomce;$4P{Gm~Guv`?(og>4n|zfwXP z>8_BHShDm>S+aETmsyJe_@dWxNJsyaHU{HjRYdl%Ceu9+SYuOp`se!e^B^pWY{<&$ zbY&76NalFbSglPkZN1z?2{Qk}1{{ItFwso|WG?JK7MC$GE$PxJ?JN2&9xtAD*qIoB zjM-PDnFjj;{K_1I4}d3b5CQ0Xb?@KY_xI5Hx1HOyt<-(*T{|dl$rvUg&o|!ylz~1y za>aA_2yOoo0ewOWDBb0El33HYCC*%BPOQ9a7$wkI1ZU+}xGoN%!f`5uoA7B6-Tm_} znV^twF4UL67cPMp8k-t@Y0#;U>2bx<6O0l1I5xrr5jqT9_7U@>w=SNasbTy|5Y(VY zbPrCXqvmwjOh_IKeh@-o%Oa&vEO8&1+3*48QUZ=Crp^8{+diGv4mi5A@<1h{tmtOR z2m349oGr*=%aY+uUL&Cprf<4zK$8+@mrlRca=+u)-UID%<>eu)X~k#dk`}PRI_wvG z)9ai7;Q@!}D9Wc=kM3YGqZ_Pjc}d`;UD< z5L4w-Rl$$k1feX^`*BRX)wfH~^H$Ef@AV6JpYSvVrTGDkq|TQ(GdpKZF(aofGIrw- zZV+-Y6z|2z>D^a421?7X3&=Cy9Fw~-7mMP4YQrzV2?qxsSEMqRf9S-;XU6GtH|+SA zuPK23?^v>psMYd!4?7XnuMHVo?_RhRV(hOh6vMp4i(Jr_BfhC=Hd6wyO!uQ$)`{p% z)pr;?i$2Nev7dQ1^hij}-E%(=MOVulib*Rl+0|{U1-3Y0j~6PqI#-FU zftbg(5Z6h&n9Fm5FPePp*lQ4bOIg8`u}cLe45stX`e*;lvw!AUo_Wq67Cw#zZbHX= z5#(|>(m&wy%o66*u3;OW6k#z`zLO>|=9~2FJ7U&eYlI<_!51GNXv_Q`iK!k8Jqw`l z5Kk^S`7v{ZwUO47=;!gzI2L)p7$1`bOF&$TDhOBPag7}uc*cZ0!|cV^s=ESn46!Fc zPK%bSbjpA#_X@evR7efVHfx7DrkB14uKWp~+{=x_u7CE=JSU(jf4aTd-42mwPNNlt z=o4aDZgPhe_Gzl!5lYUEyAu_RYj^VL^3uG&`+|H&CV5tOp^|V@Y@S6!P1a^b!b|+L z&JR~&n@!YHL-rt8vNTW&9XRBPP^@-$QUeHn% znT>2|NJGv(X|oYZkhi@qdTJITd!~y8T)LfQ2OdffrE~eIsC-4`s*gO~V-(N7M_)=w zMWxwBs4%A{n?WOSqD*Y%P-_{D=CTV)$+Eh7Ld2-8Y@BLnOCJDb;69ZqAez;Hs(hU` zHk9)?s>8rx9P>hoPpDvh94R#jpkbzE4Tl>lYs3a6%b7HqcCjaqY`{j`lBZkqucNQZcw)h7{F(%hU5n&sxrpnqWA*pxo9KjYVcDg+Bnv0AZ=d)O7l9+DZyn0w?MPwp$usjjGRm7(*g=c^4MhP7hd#|~-?e zQDg}$*ueuz-UV)^syydsf0F9`SMafivlpr%cfoPwooPe$I5XG;R96<@V$V=9N71+w6BEMQkGTW}zuNB4IQOSb*SjZCTrif# zOFKELqrk_#W`+W^{6+sJ03Y`>+7t0+oX3fltxwL_*~Jr5Gd_hxt4*YJcIfXDp28w7 z!XxEt_Mlu->nxcyti+DR8I{5N{G(u(!3FgEu}Yd=*w+~P8BaYuK`K+z-NLT093ZJn zb@WHn03J4qYNrif*0BjUuzsXmvRdod<7-!E;I5mgiD|V#&ho!g9;m;6I{|>~@pa6DNTVIjME~2L=4e^cM7sXbb2ixuiJR zUg#LTd@S0aq0#p(A6>v9#d9C}HX|0-yy?PXj4;?C;o(>3Tgr~BnoW=xgMpzJp%cf$ z?Q)4iUGN4h{!|%l)GOv~`_IV8AJsMVb?M?i>;wEA=eXu{>kG=#fQ+%1S27-LBo5hN zC{~e+{E_pDN7*)kVCCgaj`jJD3wJ)f7_5`A z1HtT;djOgKxF`THi+us`Q_XDvfYHjNR)j;?OZU0!W6ZV-;q{uxqPKR<3x!j>sX#SK zF6sPT>koZloUZy5bqh`q2X?Qz7Ipd((O7Cghre_Yxb4oi)0A>Xw@F-a%EE?Hu@S~F zx%6D>8qX7Ua@|sClv$!?pTb`PeW{Z2maXn%ZNMiC(12=lJDd@9YV%D#}5h)+nC0^WL>I3|#JB zogocF9K*5PwhaTJNaE1J!T3gk_G3dyu+~P6`j*Mn9*adudnnon{qnid$wT!4Qo!Zs zjZpl3@wQ`F;pHAicH|K=ft)~^HpPOB#O8jxIe!G|=Nt*St0L!~-sHiX6P_HGr^}Z3R=E%F9Frf^GIJ>}x?T0G;|sH<$6Zw!_iNI}3iE)%P#1P8A0wUT zi0W-()z{Gju179k=0=o1zYDHjddh8M{U$ZxxVTSwp8YReI=|kS<)f|R%pg@(*^mE5 zYAhGIaN#mu%$b=Cb%D&jTf|MLd%k>Y{T;vjeiK$Gwv~ol4xeaOb^UdxCv?=+zA&t2 z5f&mFWDp_#zc_nxq?3_uZ`=GpE;k;&txwdv_56YE*(H%|#|%Z(RM%t#*@@xVer1CU z1}4L9n$C>+6y~@(y+ojJr%Qex20A_=dZtmCK$yA^GP`ROUVa9*rn2qxHjFT~KWP4e z_`4;4vQk1n`x#Ok8kTyOjZTwrX|^4ZNv|2%2T@C}nGzbQ1rzZPDM-zAZkF9NV6n2E ze0)!Uee_a&`M~!|O7nh5 z%}C}vC0yOb*H&b~0-*WIq+wfqMo1w=dl%r5+H$Qj62}7&v?PU+pYf4wCUQ4hkb{XF26{QI(rB=}F%`s>T|1)*wdBWACy|8xYVMEEFyE zQe-G|`yodZD+5^;Smqu$*!hbu52Z*m^?Fbu<-MFvHC@_V?O5qN#1(Kti_xiE?Wp%i z*$#jPNu;v&iJ3v8Sc$hF$$c!#r@hson?EfpR&sS$4I5pC;dghz0>hQacO{<26@)X< z)t8*$T|)fZp3HzbCRiCVK1G%^CeTH$`Dz<`1bMD7f`a<_$V$9RQkWy>m%;lo2;4^j zP*o;0j1KtTvbD-NLpQjE)4c@=Y$(cIh)?%^`xd3adtUuG39?n`^q8kT=`hBx55W37 zi|G2bLc#b)<_qx1;99>rpfRbaDTn<(`T~gXBhL_KtKQg?!}k0zT~Y z0PH4EG86Bb2}axBT;SZzDv$Bhq*V=|2jeZnYX3Zj!KI!FqkU^|pK7 z4?w=VYiqnGxx%fTynC@%oci3EEm~JQ3*Kjgv(aQ~D`?u+Y|2Y7J|BzO;O=mH{Wf{H zsi}fotvxn^JwegnseY{p;sS~Ho&-{5&eo#DX^S&w-K=_c zvF9ap$479lRuc`M;JFM1n)b`iw1dxi%(1Dqx4`!(?KQ&Ots~;KTtB074CqSPfnr8^ zmNaFWW7QfV!mWNCP{^IS{-<#FV%b2+*&$QyOTE>|=_BwLmgdF=3fHkVtvG2$IWyWS zT7;B9h^WU<n@TivxF{S)}-j;gPGoGB0`g2zaN#G|KARdWci^02$od_SiJ$tD`et(STf9&!3 z{e=LYs1X9OnE8t*`@$vh$HjnM1rJ#(4e~XQ*y~4Ejx64;0ojt`?hal5^;axjaWsO$ z!|>gs8d(d}pV~;HI`gh2?bO5GK)jLOQYy1zY|~12ep`XzSe$|)$eIFa2G6iyBYpK- zBDMv}PhjwF6U#-$laA{!|5-!D;L3tjL$pH*O!WDY5+s(JodQV{4$d`I2psqJ10D|O z5Sc^-zY4kz75fN9GVIkl4$aQ!HFZvq8H#F>%= zWO8f+NDwIYzP*N;sDUD;@-^~;KdXnpUV-)3PBY9`=u?9B)BrRBv7b0NbmfXDc-tGIF z-{Qb1|Jt*mK*LM)Sw-_kU_4kcP>7zWj(1kKW)DigbpwH7S8d&1KcIEpih?s};30_K z#K1!j;5yY(F}e4K1s4Vbfhg`GDnq6W#Hq&X+xG=x5q4$qyZ(I_Ujd_P_df2$~%FM2u{;rsf<`P662D04XOrh(a!0% zAlB-hHOV`DG;oZ%7tZz$imih4o99WmqcehB9tNMxo+@DA2+z%gLE+lC)~kTM*>9%hy)pv~ytREmusg$prJs@Y1O&VFpYqB!J+3`(0qZ}Kd*%X<|0|DA(1^;C zbA`@9+veEZc0u7Fq7x@HknyqC!^IP)gtyhuL);dt&!=OJY&M`b8!IE3)#A83e!-kM zqI+pte^O?!wF(@V**UVH_m&+T-g7G))^iXU9SfNg4=p?5`W!|EsPugH*tOFgR45_8 zs{%xT9QfkmwlqOx)bd0LA9MEIW$q8HAgL4>GD%Q&f)Xj~I4t}hbx&AuGE zQN?2p)gS7M>QjhfZeSt*H_QBXIRrazW-R&1IXJR@TJKZqaRpu%R>|r>y5A;poZ`)E zGVLsec=$&8pThJ{y_KApDuYQ=e8k2An)U#tI%n%lpWIv^=0j$qsd+QbUmtcLy(;b))A=W#LOeXQHiuBVA{7J zqYW4oJqgO=-upZDpdKd9z4z^ybYg4zZRKKp91A$JLE^>hf>7+X-Dc?bs}=wNRKl4Z zNjmw4i&>`aQLLaI@qGP*qvMF}ykc+Xc=Yp=M2>!xsUV|Wa3`P{iQ|`>UzR}w4+Gpj z`DgIu!euIWY2Lu9!hU8QxgK43;BEd{1LWDmq%!2G>q+rpKfqSMvvlP*#InRlACH-7^70zuYU)a8$jL z{l@W0NhP4gC>w#Vyht(Y@wpX+_cuXowX7VG?7c_Zw8YPl!*ji%xa zcV~suACwE7W$wia5Ag#_Q5#m}ZS~`F2)(b|zVblcj_z0sMA2lXB-0O>G)g=3s_Ma>1TF)N^rOMA4VBIrWk_#9);S^&+h2{ zqWpc-9a1Dd-LSQ}e&2i`Pz4(=KRshXLmbgi>AC$&VJ080CPl19x@ldIx2%2Td24bP z6W~v{A4)Fj;5-Ze91`wtB6jU8Ks34JLr}PL;Y3YgOci6!WCw}|Vw#G-f0_!pR%7M| z(PdIr1aGAZ%aO1zE}KnXT6+MdB6-ff{B&=_?Sa_GSAch>?>~;3jqMXJ^vKzTxXI0I z@EDp3P49lQsv=CR=temf<^_SdHQWmBG?(iom1X6tqnhS76LomHEW#ZX)l=0ZxP-Z% z|MKEuhaY1_R67>N;*)cNH~nqFtNnURm^F}eq@8raKn2lLjqab$r8`GpW%=bc0)E0! zNI~5A(`(`n#jOUw;=VAtHCEJGOeUT=LnvcZGT)HF3y^wJbGnqqN%qdl^+?)e5 zFYR!}lWP+1W6h!FgqGXX#R2!ZsbSIC?)K*np4$Z7uCmg9mP{p_`Mz^pE-ULm zg|B#Gl0WUp8fr5%-phjz{lm6T3u@q@vSwLpR*rl4+QpXOHc~4kExD>np$sUPYKK;c zQ5Wrd2wpX?Y?`f9??VU;xg{YZ4i%CU`_2gI|7lu-cYz9incQsT0&zY;c|D;9*&8#t zSuG(wZ_ia{{1rz=tY!?;MRmic_?J#aTAHd4&rFGh(@z4;)46Ge98T{aUO{7rSVtRUKO|V-_y69LN;01jOtHR(Y zacZ@Zi(jQKeQU#RKr%z9CYtVYJh>1OeeC~^}U~Vs3{Kz5@Nb* z-`@(gcKCV7$j;Wa5pPxPX!X>qt2YZY4KgPVoN4fT-N>sxxQP43OqpYQZ@|&~#BPBm zG`s|e@XctUK6ll8l5g*#?e+8J^CP*4*Uk3m804Gs7&g-sh_Y&OPlpp0kAId%H7a5T z9?A1HCMKfbZ1r{i9Y+a@PWb)R)ogSnR<6C!dm}5|*!DHaPGfEAXGiT93S>~wUd#t~ zBONA_czBWP0H&sKoBz!DaN^wl(ka6oW1B!m$vUuY2OqnXO^+AWhtDb3ZY`EHao}6_ z=3HQ#;7KF!480ORMGk8++wt_1O*294yCZGWj!@JqIV^x0u${Bu2mp z8sYH-96wGP;T2vv23`LmgJ%4py>u#%mkt`z4GYo;Y#k|f?d#)DoOG3V%c1j>u?2t> zUbNaLINlPm3k)B5(RN#&L5;GqxVFnq_IKyh`)mI;-)ou$;bL)TpJ_i#f;=kv79V}j z4mNYjNeSPbi z*VgCIHT$SG1zM^}nQr;J_p+jgFlOp$Xf_Cdg^LdU;SE3StL|p9wuwg`G`_3Lk?nG8 zulc567(O5P2Fs0vgo@R&-_c<^XJH;>otC{Ot6wC&Vu^*_Hvf6tqNdN$Xbp}kNUwMq zz)*ib-Uxi>ZSOzQnrihYkY|nq7nYv1N|Q=8*L?&Xh|_inV}1HqMFV`g;T!$}Vkm!# zGm{N95E#*&SD+N4dLyN)Ymp)J_|vFTqLl;Ez$b)Ynl z5cuQ(;}$7zaX)aj=@z}_WgQy zQ16cF-5&c*W?z7OQoaJyQx2hU!B0w z>9-iUcA4I7MkAIo6JLWcEwaSKbPHfmcI75rHNx_Dnw!H2y(0%0WD5L@!$M8^_mBMK z@Af>{7G#@W^o}ou&*@9U`%Pmb%HaAG11v2=AKiq~+A9sgM0>fy`M+!gv3b*bOwwrb(un--g$w5<={*BoobhWz~#?`M~WiklVvTQlI1 zB8ER~yq_TZX(QdLgD8yi2e2PO z)O?#{dT}1YTx8ea`aKG=mg)(4%nt%1MGbFb-6aw$WD5K($YJ|?o^hiY&2f|W2*B#F z=|vnPJ+$4@eGDPDeR4x2jDGS!ue6y^USPdnU2}OXD)RL0glAeE zRRlY*s`D(1o`JiDJ+K%^*69IV{?aoBVsM<>!Si}ZFiaM>f4naQAK!dphhvf&^D!)hxWWC3$DGd-#=i%kx{d+l?2$*j$*B~Rvha3bVN}f zBnzrtq04GNyqb`uVvj_=?cO|1#mjaxvf1^%pIy#@K<@7!S-lv(4E7<2Wof!HFJ3W< zhD=)Omii+GKherb7b`lBm}EadF(InNBKH#?crqeYfF7q&9-k#_Mf`(L?*+YmK0DXX z9~%Yp^?Wzpml|Pzp)sdGOs%4qK8qAmECKi7=`MszVlLI; zW~g2^kHNEKUZd$lPr-ZIqo$=2Mq|3gCb>PaLeC&1?ghP7Tu;vX0}FB)fb@o^msha? zmMkaLE|c|bmrZlt=r zU37?OxLXQtWa(lKQk-zfq_65LR> z)cg!0?a^%$``*zoU%Cqs5)xhlgM}~J2&Bi*grF&AabWT4E?7J*b_($}ly9^RkbV|=-+s8RE!2PlaYze>b0SM`w*=j3T^2@Jd z#TRZpO5^kT)D#$I=ksI9ke#^_{R7=9!2tb6e%D{NDEy_ozF%=)zD%wb@@Ig2FH=#e z-#)?QjJY6(hN%d1n)D+D!=o-6e3w56dZe4y@gzRaG65VMoGX9MEyck1bIZBQHu1(! zlu^|Q*$qH7_6(>bv>d27?SqCYt&Pg-WmDEd^St8a-quV|2Z0;O0ZW^7zgKQ3oRU-rON@=2gnj3`9w_n3hZrECSH+5>^|5QlI`*p*?0J^iE61h|L27w z*$BME7%Vr3Nhps&4B(u`qJ?K80gd}U?mS}m9#$ZIzL{duv1iYMG)k9f`mURrnelxJ z1&71L+1`R2t2@SN<=kaixm}%zef!tRm-ao#JMwXC%XvrAKDY$3o!bs3R8Gs43>S?q zzbq3b&g%rXb>7rv&gRT2SoQNfZTiyH5gQi1g)BrL%pUlo4KxoZn+!e2blNf4C-j`l z^KnB*8l^{@5PqbOJG7;s(Mr+(Hcw5QFMPoWEu^^`LtBS${S{IEbUr*^ewC+eTNFt~ zNZr+Ok2V z0ZZYn4t7~&JC(VfHjQS6034kZ|Bj%=tIVH)f+bLtSCY5wIgoo@K?c~rBA!N&#pQ@7 zHVCpQ!J-u5QdeVLK0Eq02vU`R;G(qYME5qZhYisNu3}IUUrmXMUW}rIZ3C!Jr7jy} zB}UE~Q2IkpdO{5F#cgmqfy|zQnDw}}D;Kbf82B`s&@}Lmz|eS*f+a7xJ%(b!0A5u2(LRBJ1Pa0H z`!sbaHwjd$@N%|AePtVBm+yd7qs9c8akwr93Ro6wG}l$1A$1G8TjN~gAOkXUy2Xt*g&$miC&_|mf!qCJnI)ah~}Aq_2V1$e?4 zGrxS>U(H+#Irvr!EyUL_q$ttHITp$F!jQ4|w|nv}Q)_uU%G>h59z(eW8ID@8?r$<) zdyrrXd*bpXH&K{Yoqeo)uI?}p4ol!uaMzoK>PE6p6C;^L~h?_>ewaeGXLlZ*|~(= zw|Gsw`RPg;xAGP8BTS5$%INkdw=XB`LHgLm)hX5Jjr)5k4#pD`*hXm&?qrE#C}9_b^pbM*&}~@2b1s17V_DUA@}WVtnqOxV1eSE2rR7#7M3gF zyr8G6KLGVGQ!{+~|9*7Bd!4_&p0>qY4f0}C{hlcn<~gF(c!TpR#4$U;iJ#%!$q^dD zEqk^Z)gCs#zfAdy*evzvc5qehq+{NZJ%zm2IZnQzKP`12+!N=rKFfnr0!KS#YW78D zPrLQq*e>(P136{m@9_$umM>(x*lpWMqv)_7poFEpoQ%99)0k5&C*1Up!kvEl$l3Q$ z9#JElwmDj+(O{Bum~-O*Kz03P+Bf~`aFg`mrvcy%Y8ooome<}cxBOu{1=Agx)jw_e z@WBbvl2qQ6=r6r81Zi97D*vM)3?K6rhfg zzm$Xdb`j7_&@^=KqfBx>7@!K4f@2Xw21nX2dxhVaVx=s)^kX-!orftneM9qT9X_eK9NM}$kMnA$0E-{Br(3RiE<#MmQxWlDk&*NYrK_U|uXVzyb(*Uwk!N5$5Y_3c+4 z9L5h~1aUo|T@~PEt6kEFTbrLe@+!9Hc$AvMJuCO-QwPzzxCB_?>NWzsG2HTXCuY7d zZa(aqe4=k_b)`0Q!sSH;`NqOSX4hWymu|$DO8Bv_=+D!yNIqTjxm>US{sA~KhPp&O zd#b39Pu2$MA6wJ12zl#UD88?KFB4!xaPXM6pLq4KU*aV&>?o8k$?m(q1eAZd4#Dzm zZ}Z}UV3)5|-ZpUMj($vRwB@}nW3_A0g&h$dTgS|x*cO4V#0kh*e-RaMR!x8TEV1EE zzChIVQ1QFfS~5EW??r85$z0pnPrd4h1&(tLn|K_Cx-^x8n!Ib~_Av&VX!QTwhPY#l z#Fhj|h{dcAH`49<_w_6d(y+GhV|bLr3D-k#V*YpOx7Jb6fGdTNb_I0r)ys#?NvwgafgEn@9p($HQqfO0i=+lMv#JbCY>5g zUC#e)7kKXln)|S4pBC|fCW8*RBdK39ek3sG>@fC+&Gw)(VnB35nNa#<{-nn1>a@%C zR`-W9!GFFQ_+R5c?IGe{v}~|bVfy6NRgP8tR)6i36<{na-mvBHvf8kPFs)kAYKQ~# zAn;x9&#h#&|7n0NBH(%xWa7W8ej(}!)|;v!edl31UKQ$7@Xa;a`JntG?l~ZnWou({ zDKZTj(dZr3pdqa;p69ytKA*(!oA!B^Aeb@rASWnuMz$0i9JMv*o@8C*%synm?+L{F zK&xWn!a_C4=90>671W@y&|X@t-IzLVZ)!0-^Pd_wEB}saV-P+>n{&l?wGBL5zTVMS zPk1t<{<16eU~x@g@R0HH$B+@_kQcBd2h>9!s?w1Ef|F2>AxLaGHB}h$zPLPMyCgj; zR9hiybyNt`Y$WDV3AaCh+H~=?2{)2`DY&a9%8qZfi9|c`B)?nhzhUoy{4g+nh=L1k z2xx%7N3va94BMOxF3v6BIc#r*Js7jRxD6uc?HTgis%fQ!3xeUf|4hWazsP>4kDyzH z-Q8{Gne`F1PPzfSZUZAXtQ}DLwdYJx{6{#8xMiLkRtL8Lov_35O3CWrg^L#xKRe%V; zCEFVGxHV;v^a0!JtABf)Nd{Y(p~WWHx}HS5JtvQXkmKX^;NzH_{0-04IpMDMyY(|y zj=EV6N_d7ib!ND6c;)q{@8ff?fXehBKHT$lP$bA-F(Tr9%N%sh-;%SGRW^Gf%$Aj3 zleZ@Cn1_=}$)@pf@`9iB6fI1haKgQ9Cm$rotGy+wPJY1eV~+?N?5G~dt6=o`y(O*o zOQw$3O!YarYk0Aj2>7buxu<+2_&n7Bj3H}uaK`&!J7$EtnF1_T_@EVG7)r~-QMC#O zo5RazoGx{Dx?`as>J1hZlj`n|5^fwN<2AbT-Cxkw$yXRSqsETyna~JnGiS`GnuEbu zH^%u_t@s~szx^?hfjxT6k-`3Dw@$~P6EFHs-pQTC^br3Gzr-DOxF;OE&G^uoth z)CU2F@}SBUPal@6@;zOi8DiDLhLIuCT|)RfH#V${n7c^)xk1;le%2>^B=Lbbz_sva zt!1Npx;*6v1*2waY8`WDe2WQkBaC@i7z!IGB37M5~R^sr^v33{!I$sl2 zeN&uvbVZ#D;DOycV@XAy;v2ydNmnZ3ZziXXR=o!^?9kDd8I87f=Gcp5zI-WAE}G=! zp9cny>)1h@7?J`_+av+7{GXu?PjMTNmhv_0T7&d!Hz;4^$9f>DJ2}Jk!8M_cvmeh( z%B6O9u$>tm=G&(3qjLI#^{gk8mEeT@uBgJ^#OrS?%jiT1#ZxK8cDjG5(2`|$=yG1m zP#x#wQdKv95d4j*>v>g}URsuE*&TW|25oJ6eJ?4h8m@JYEB_9#BZOmmTAvYIOgy^; z>n&V<46}IKue1^~iWUG_?R%xOXfESZak=~l#_D@f^-Zdw+Fl67;qd$@HR{I=_DE(C z=f=oAYqN6=YUm?-08>D$zXzRN9zxBZ?*8!r?+@tkKq5A*z6&>50pt=qHsDBch1zLv z5sM2_Z@>cfTD37Y*BbKz?NMe4R&#xKHXM&XArVa|jYJN;xzf~rXk~dTeIOXP^U^dh zD5DO|91YTv2q;E^ateHk5FSZ=zb2`303sBxiBz%$FD`fD(z`v zTQLemZWEcAMG|H8dsQ18vuMXl4hgzewA}^LC%9&C$ zF|t7ng|ZNM3TjBN59O8>xbqY&y=K6^62(ux2BDZspN|1numQx-^DyQG+A2tv_>!nu zMd=~0Lsq}Lem5<$wMB|J)ROo39A*q5+{Iz1kweQ~A9;cbK#RnDzr3I}ZNH)6;f}+Z zT0~&~4e2mQ+h$=kr<)NpDy+9;X%)5X8#y89PJ6or&JKfzKXW#IHzOxzo9d*mWt~9y+O6!)cNeKDdo9y~) zj4jD0@t~3?8A5TDx8=hLslCYkN+{apx%v$lqLEv0Bi$Nl{v#uJbwV}tXX;#0Qra&( zbTe+^Pi7BkKR;}cDYxA{Gyeuz%Q9$iIO@t_#?8KH4}gjbQFUsQ0$?uaKDc>ydG<)6 z(A^%sd#OT4nEqY(RS4^?m4#6y1>XH}kdKLv)wWkP)?ZN~ADn+FtyxQ)hDM>MViDm( zrh=5sn5tEdr3O*4hUvNQmL!N&r?9mly5-P!E66~V9wz}H#^nd!>A%g^EFr~J)!)%^ zmE8y9+y$BjgQJB#zl7x-$1zthm+i6L%Ig4Pr++zo=es>Orbk9hVQZRT>6_{r1#So(Isv(%zpaR4Rb5^kgh7m{3F8tc9V=aeY02;D{>7d^o>2diz+x?~Q^z50P! zFlWD4+%>SB&KWrHlj@g~_L>+Q*6u(uZ9JaL=xZC|u1B%m63Lk}L6k$WJmj^JuX@(u zYC8e_%VXDIN@Z_ePJ}`<-j5PlQj7H}VLTvI%imam6&7MooR``0%r&hk%qpEE9?9FM zfmCq)q7r-xH_)qYM4e!GGm*;+!}PC=Vh&F7-+,qWUc(1+qXDfx7@=bp~~)(TqS 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 Psah$GwaNdR#Q^{S={DW} literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt b/compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt new file mode 100644 index 0000000000..4b3edc29eb --- /dev/null +++ b/compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 b/compiler-docs/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..462c34efcd9d6b70b42359ca1a1d9476efe43eeb GIT binary patch literal 44896 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 V7)~)yDZnpu49h_gZvJhn{{a>V-DCg& literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt b/compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt new file mode 100644 index 0000000000..0d2941e148 --- /dev/null +++ b/compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 b/compiler-docs/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..10b558e0b69a74b8329766fffbd5f64356c7230d GIT binary patch literal 52228 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 z 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 D0=ucW literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..181a07f63bef8f18e42a5a57463e0e60cf8e8035 GIT binary patch literal 81540 zcmV)EK)}CuPew8T0RR910X~EP4gdfE1Sr%10X`=H1OZ0?00000000000000000000 z0000PMjC|*8-}C`9O@YFAjE%C~JjF zs-Nd>FvisngPvPk@eZ-defIzV|NsC0|NsC0|NsC0Z(n|hztx*bx|2_vHvJ0%LIDK@ zMG)mc@6LsAA~2SSbMR?qU;{#4M0k%Z+OjepMcu%)f~xD|U26Quka5`*;hsz|EoP&K zIrZ#9ltpg{#MC6M^$hwwmQ+^jbrk~fkE}>y+Kih|Y+g|};AykXo}EXLzrfgq_&7i+ zhafWBx!zaPy^U#`1@;whJw5bIJIz~?z9V9W-Z?CUnki?DVMY0=qCSR?8ea-qkpsH0gT1Y92IU=uTW z{wH4N0i#peVnf=#aLDelndHhwSR<#{!AiwS#fr9WH#D#fZcWoP%eKz2;6%l+!vC;m z!@l0JtAKf2p}0wl`kOd7Vvw5`Ar?0KoS^jLvCoKu%}@w8N5*{L7j27(Oy8U6-7qmi zP`X5(p7BDfrVON0xFzP_H0-&i?!JO}Bf4OmT-VZItFs9na zlBpfrXe^XHJN%khJ`L{tt^Os-RpdWe>F^`;Anc)0mO^XAPH{_D&Aq23S!Bcl6`yr|7ZRG+j>7@*^pE&wo& z$Ycdhp|*}vr{?sV)l8sfzhYSXtDfQcZT3JLl1m zSvsO_{bvkv(mui4~4z1o7kK0K=0`~Igx+5$vafP8m38BT9y>;-$4HR~9vkG(v< zo;~;d_yD1jQm7;h3XM&|fkF!;g-{em;6l2?oL26piSg^z`lx6~5gWFzL{UjWUmM5j4yyAA~}HpZvqUC7bG@?_g+ggHbMw9Rc0@4N~7P= zuK;0z1&4?tMtc+XrT`L8^f%f`*Eqnyn(DsM6RU&c4|sslKVz~d{9Dt(f*34O42BYf z`u+gjyS=9rkSK&PGm(fFE7Iv#>NdeQ4)bfU`X)^uEa+&a(w()LC^m0ulKZA*eficP(3_3!)deZAlFIA->^oxPl8 zo>gc$izf~gC=S$N5Gr6aREW_)5_{5lo$Z#!&ZLKK)608JUS03rxBD{NNoWEQPauKY zoU$gDULj#FL&(Y7c2^mOrS#BW?ERg8Hw86KlO`HO(HUeIaFakT2bm}?sGqa#ZyUrg ztT0vrsm#yWTLHmxCViRC($l@R4C$bpa-ZTu|L;@w4Dp-#he-?q2^Pcx1PDCvpc*Uz zLPCIqm{-z>)@)MQx^7+9PPLOiZD*Z{bpE$ty7EjC2q6Xpa*=a?Q7u)O+hJb{-_H%- zL>IC_{zoQ?TH=LhyS!3$=r?`uHa|88FT{XYMdWIJl7u$Y)2IIPyD#@A>LbYnzHHfB zRwmxB{<-qsT!%_196}@% zFolmUSU(lYeFL?t8EX^GI@1d@azW9 z(j1)E!okwE9d2+a9RmD++_!G+@3&Z(Xe58Pb`A9CedEOi7-)b^6;QC5)1VVMDfs&O z4uFy&X@H=D#`NoG{%xx3zdI*A#eVH6s1)s@9HP0%!`O};meZZ!zz*P94j4lq2Ml5P zWFT3&0CPc>QFPO~!Nnx-1))AmLn)&A zy)^x|kMtku-({(g_Cg+FR5&b>@=+L2oW;niQxqC?AvuspoI**2#5gnxqv7HE`&8da zcMRag%sk1)zR}IHQl>zeQd;`sRo^x$2-p9AGcD8p_-ue|kcaHCc9H+@$2^QB2nxiyNgY%abS-lF&u|A{i~|0s|`R5=w+JCFbL-fYJM%Zr z>>}&}(qa~ra3FaG0ntYQyhJ%*7Z7g|*R^Y2|seX;4{a|A3>Ff%K;G4gv(JIC<25xD76t7b=<9j6%7)xT;qO1n>&0&))AhfSdg zF+;mXentn+e|t^ozbhC0^q_Z5JE>rfpq>KS$met%lgtft*jwkkWvc_ z;^Cj)FIrwsGbxte;?%68EPL7X5Ps=m=o4a>r~FCNb1$n<%?f9ZQa2Jseh>uzYpK%R zefN_qUY9B-owYh#njo_f9Dua9carv2-|gfy$!2L4wtiO9VM15{ig6GOKp|2lv;9nw z%oxN(lbgV66r~CWJ)b9Ob}|nuP*0%lr{C}(8k6PYST}`T>Bjy;5L{6{==bgSYJqK3 zgp8MwP~t6tBzCA~@4TJRWI7MZLIRN^Jif-3RaN82xYm9l3t#pd^L`9*H5gO=+OVVzg*+-_yd=_SX0JRKaXp6Y>!xh)5wKA|YfXQ}n$3ceS=Y-hQ=El|>6gFR zJerE#rzt_TmKp>$dq=2ktS=N!AP}evY36s~_y2!8L+8DJ#=gICj1eP7L_~{-77WQ{{nYvhW-Pi*P!m)T$HGhyitDM-C^GhqO5 z*_w0n10Vz#3(%ke>+>t#_U%TFgsh*^BsjVuRsQF3HK3IKvZ4izZa z4gwHhA^>TLp$mp85bCRsFu(u|`SKAKTa2*MDuknsA`~e?C{>E^m2ZGrIB^&aX<#g| zh$Ehokc3o8hqOwMbO=OpBat!j$&>)(?-=CYIAn2BqiSAD+N(6}SDp^2NC#G?!)nqI zwdv@3bbKQah@K!VMNUQXsuXr9=~Fi5>5Pg6)vG+)4|hQ*Lep(5N!V~jzA!T{Poqr4?Vv(1o<-p38V;h`vG$ShRte5)0)ymV>RzViirGi zEqI8bB57o*tErKunB!*xfSANKX~w4Cw~5tu<&)B8g^IDat8x_)a_A=fm6Q2$I!zr zX!sEZj6BL{yFL1t%U$8vlmMFnY&hBq=u!OT}d260t$&dVhW;jab zWjdbW49A>zMENsNZEMe4V zd?~k^&p4yc6$P_u3uP^rw#?#rmyuDuCn%B9$1NP;Z`*FGKojKG-CtT*e z+(M^Ww|#9;|2zoX@non24Syt~9PPwU(zuQH__Fta37zmEP240-@@n3!7iP`Iy_t5I zj8yJs_FKN17mPQ_+_OyYp=+ahl?P~Z;^Ll zGKz(RT~`fnIFi#lwRNJ={?wp|8BapZzs0DiOB3kvZ)oU2-dyKyjW(f(Ds+#9Ggyke zoyC%syDUrB*;`~53~EV*Z}|LRC$a!aQ8tB7sd~J-#WYPLTAZ0O1o?$zDOs?~VdA$i zh{uDAIM*VPy7H=M$YQh>KFYivxBu7PX}3C!CPq(6Sp9vW^R@j28kgbFv!km z(%xsWCQ%I<5|B!f28g4jS5vhO2Xj`EvpJF_Bp)tfv1lTUP~wgFLN-Rsf6&<{IQ>wp zOjMm}_>cuiQ+QE`ES{Fn30^b}08|J$Mu0LXV1oyK#G^9OkcJv+tB(L6G#&`PlB!GD z8u*l(`A_unx}u-Tn|_5aKSUyZ`!60pb`O`_a96P>Uh9Jx4dA&!<(9q+;l~_ZETi?Ch!W!IJzfB|m8gUCN)Ai*RrE*0To0qIda7g8%OjuwP zOyWtUYN*;C2WK#*ccYw$(H8F#7Y>V1MeT@yf;LLC(7wyCec6v`k-~rl7m)<02mwAq zOv<7m)^pBtv!h-t>%%mCbk{U9yLqG3H6$$ZWIl9PYWdY#(`WP6I_j>kJj0Fcg~mb@ z<+WrtIYA0Z--NsMaRk2F>`4|bwR!`){qfSR{go>R)O7cRj^jD&IQaap4`g!i$T|{6#34Qd=3zjUb90>4vfH%zUpw%d z&iY$7|Earv*K0rS`+uJQ{m??Xw~Ab@s%O;p7q7v82?z1Ud2dNKz__-U$capH7$0d7 zPuetrU$P(z{)wfRlV&VDm`6*4tsDCJe?JTo7$E?JVd#Ny5~Jd9zw$B$j?{kyAcqJA zlu$tp4YbgqCxlQ87zx8fIA$zZv0=x76Blkgc<~WIBvJT@CWcr7#1T&diBzB>m8eV= z>dUtnq*ae9Qi{$9g@!DcjF9EPF~a-zN;hLwSW${~TsCafxD7VhV$mKHmBr?8`C^PE zlL9Pi36mY&#)+rSI18-^FYlR`Ui;S@Z@u>!P|2ididr;PjVNKG;kl$_97VWXR9*ep zaTDMZ;WwvnaCmfl5(-D6v3MexN@udUe4$t>SE@BMMJUFZ={Jl*AJYnnZ%~{b8~zdT zL6AwIlT3=6s3lA$e_U(4{lWN1|6n2}LR3Bm;yzyi;gw*Hxh>oH1di4n+eVObZwX6O z;)UpWZ{|k(`u_f2f9Kx6Jz^e99$z1)C&PA6?z8;Kxz_pS zi+;7Q4_9!3>+*^H3g3ri_$mAz%J4RP4*&7<{3@R@t0JzHnxWNfuSpYDW$k9*0a-*I zK^mT*6(!!|t2g!6Ugyn@xE4<+>roZY<6BtyAyJ7*T!v&==4Wwo@_8xL_PSsdS8GX? z^9ITFhI%hi#4wcMY#>362}d#YG#$+?tinVTRkuYKQ!H`SAVQXUeQnltduMklVzd;C zBkdAnX=y}jfFe$YQZ@<;&z93dc!eT`g>{D@tqF=uG8Scba?m_1S-6G~gW2-ugV-sw z_+Y0sfObz2k_agwEpb|dlr4vag)7Vy5pj@jzHkuxg~sZ_Y9QM^RY)SDkVMFcBQKz3 zKv9cKjk169g9ColPkuLn7d>kfBc^A|rw?MK&`e$SYQWq*>u`SXh#$2AugxP5;S_;z ziHJEhKwo3Sm21<w8qE?%6%nSx~9AF z^xU`?_n8C35J>5HSc+I8bfMvxEzOXyAT!3)fHN69E+1i*#D(q+M!@J!<@7*?*BQhD zbPp++u`ftsm)MFm^geN`aY0r4pbDsBt7ro?VuXxpKUiU`4=|kS~ws*YiJ@5O# zhd%Og`J^K=U}l?hXy%D5L|MG{!wg%W}<0%l$qN&ZF|AqvKr%yD@U}{q!HAf5DwG9flS7i*5JudPgsA*^7Mr zr?m@b#4?7aIbHNmHOdNMCG+vw3Vpv=FYs!R+)Q96On`yjhPrM zL}JB>ojAOR6ctU`n2l}i>?s-03@cYCRceh^r#Bcu%;5<{5}87!(HTq@o73$IJdH09 zio_DBOs-I>)Ecc$Z}92Mw;#X$0vIBUVmJ{}DMh0*m@GDj%i{}#BC$j&lPi>}s3mK( zy6CwLMw8iMwFT|(adO`S591LV#igV}HgUo@xKyHPXz9ezixn6DO7Kndt$^>O`96F& z_F~Z>;3o_QuA4|w$OOU)2w&LoorL_zpYPv(k(S>iv<$wM$#)fr#O;0WR)h|dyYVn- z&7v5m%n6HhD9x_m^k0>x7fGK`nX=}V+7*8=>_WlcT}2$tM$|49EEyJ-W4XRyD$_dw zg{~}xr80*WF2xd$)8vyrM>5C&g3S2m0WCuN7%7`-1zDcR*uYVkRKzu8V8B$tGoB(I zmU}`t;hezQHLXnw1>ciG>(GLvhMV5VYFxJa+^Aw963 zaR}C}m!;NMX zoP>y3ZxW$~IK)5>+i0oO#!1Fn=+3XkF##E92#k$U7wJ8Ng#B06A#oG!S0i`Io}j-7 zBWvkZhJIBth_bD)Vp*e4R5FB9EY^!t1iQ5-I1zf@UjI&EjP671ih0`>@qA;l7-=1= zrkDu&J9^5Ryka0GwP-7_1Y>Tx>JK5c-9KS4aTEIxemAU);=y326vd4gXkt!7qyO7A z{13bCV4%?Xc|BDu#xW=Y4z+m@5?0lzmlYxv8S*<28ghLd(w&T#27o)aTg+>avRcAY z7<)^8CmawM4fAx1;x01P>HDW$N{V*^0wI>Dv;wB&tOSDW9zk0VsFxWeteT*1{(^ke z^Lj+H?F8#l`r*;C0oJVz3^J0iN^F&+`Q@nsnFuOhB{hfz;o^pb9B~rMbQe!|nNfpn z=9x(__A+7cMIfS*h5);aj9pTvx#rGU^3H11ar1F0<<#j^@pP&qWBdwKo{UyWXVzIy zVEZ*u8@Ih5>Uc>b&@wrJKuDa0R4cKb*qNe#+>486Th-dJ5dYa3I6Ve=SVcHK{uuB-@>q=KYbNnp1_c%SZx5Vv!mu}S|M%tly--R(6Z5x=eL46~pR2c@o z4IwH;LC%M{#E8HwpnyIdZybNC=@G?ZRO zxTo2Jl8V0^J|>ROH+mtGgc=D*tRqPXlls^nd?$9caK!Mz!2(%fAhaQGlJ58x4s0eJ zLrgKhVABamA=j?R890b-Ptcic@H{!P2hN)rK67vg!E6og8gdNuN;nu#)9jLWVn{*I z4MNpPGm=RunPXa2T+=ScwG7QTPVaqOm-ULr)yn_jL;)Zfy%prH+@ok*ZV#g0X&OIo z8uU&L?C0S)zp$+5FgOBITMUjyWm&{||M}1(#fL!%eq5@ihAF9@pIR+-j>2 zt-IbfR_@lIF_ZSPu{|&@mg-oyVIcQ}LSu2w0wHh=o=B!LS?q9Mn+@{6e+)VT)dClj zN+?9kH=-m2p2;L6ZkA^`?x1RlP)z6)T=N#L|8_#8r7KWIQn(~nN6XB?D4~Ie8M9G# zXUW&GPSRoueUwoJF2v(A!Ise@Hbz;1M*Q<9?+px^um`y#-eL% zOy0t?Mn6te2Q21ip77#_3OMLE6`34u?x-M-t5iNbEh;{HFP|evU!^m13J*x424tD) zLX@dKL5KILSNd@a+__?*EYZaC!&k&ZMb#+%5GSK+*F+l zu2`fHNQf1lQbfIXq;Wa*%96_qKzFh-)RL8@QH}>8T$1LHNb*ohCLxndl`A2F(JBmq zV-O0GS=k_moCw9N62TLYgK-w1GZN@AgpeQ?0xc3lm)Km;k3a}j?wcoxdI$|PAwg3;G4wKE z$TfC$9RBg4R&`$zoZHMlcn@aUaWtLwA_@X2Ba#Z zrb@Ns7TtiFGTN1!HJjY*^`W6ojT$5XiY^+1O_oGXk)cY-ZdA(llY%%*E5@Flf(vGV z6DI{X(qzrqFw!21=3rPA94{h>wn(x~ifV^O%cIlVU@%gY%CK5puU6ZTPM50J=Nb&z zMq~XZQ+;N0*kUPUwbpB4?J=^MtT3C?I+q)kNMityE0e|L@?3=?u2yGiG;MpT&D81I z#!XpfbJUeW%YtA8#gB0){!Bn9fJt!SjY$y-VlrHKXG%oEm>LR(X`$fYY9b@&VPIxp zVda6aLwICGbc}^6L`I?#8l5q?gvVzBF_B1Z2GSCpo*9h9WM&pCvDul!DGlRh9=|j~ zkc7fghbW1~St3bNc~&TrQdw82lSb2Kk|7z5*<`Al&Dp{tSz2cs+tNI{WN%-0a7d0$ z+1uqXUZ~m!)T4dWh=J|Cs1pkY z{V^5~$QLm^g0L@9exxCfX4*JY|1UMi6K5jvQn>#L318(=8k)J}W$uc%`GDVrAX*Ij zSdO5TsNdC?kM$(lOnE=4Quz%iXvzv(P}HU$^?^N*aYj%!RzH~nccw0%lNAeT)iPbZ z0yV3W+I4ugK|bGtS3B@#AKo31?+@X_k-GjAnyzFYuc7&dY`KHBdujUvbVk(tIP@gw zz7+JQ$$<=f%Blr1C?(!LMqctXB7 z;IDwbhRUzlXG%3$VI*gAQV2yg0zgs_Y|t+#6O3d=(M%YYnIJNgWIn&enQ1zcL|TiM zRz81pGVAMSQ7AGim04^_G;E^Py^c=z5J)=+M7t+eEcu2ivIwVtWorojIno?3C82Ge$EmnC-b_ zHQ|Qao?Bi!9)z8Gl62}t){0N%cEb6WU~kyggji#tZXt?iH zKliGaF-z`SvEr^bJDcad3k|(bXSmioeHqbo9tMYyfI6a3-HbhS#B#<3RX2f-IQl&y z5Y1SXa9`EK^-f)Yx()gufG`u{690hncMU~V$SJDz!x{QH0Iq^680kJ76$%*ui=26( ziB!6_1h!{bhbTW2zSI4nY9#{#U$g!}t>{S%Nd03rtKysoF(n)wHq@y{ zkF-7?FS(%Q!eKdbeyw6YL?Fd|98Y%%YKgqY_~QSI@J>D60j0>vpyqpe8dNqjXLM9# zX>&rnIWj&O>;;Oe{1B{pt-Vkjng6ID=2AW1Nv5?w&3;+}T z1kMg`E){{UtZmXomrXd_fi4tc)Rtd`y9#P(o(mxaz2wkgQlE{-zrlwf2u#Pvu^$;2 z^b+n!45lTHY2VZ;zTEhVdKdTQv$vJS36|kV&dQH_$^RNry&~0l8!bT=J8K z2?C?FnEJSx*Mh%LYdTq2TUc6HSzA~m=LI5ckZh6dQ0>tv3>hY1=^Yt8RfcA=ZekQl zr9xGWCQYrFIAutaAx*lfy2kUWjs9wmmIxI~xI8{6X@-@va#qgDD~3@p3Ki<3up%y1 zY$a$Ilt3myO0t^JsF(soxNRYV3u#nL0V3SC5aILq5cbgx-2fpFf-$*V4niOV%jM!3 z!Hn#zUTCSMmR?FNwbZt@X@=IJb!aJVi`J3q&^in)rFA5Q(x!qByaV2OhrI&`dq=z@ z21|F6dY=O?Cc5_CNB~TpMu7nRCZ39XogF*o8b&LRv@(Nsz>H`LUjB zRWWHH@5mA%WQio`L>ql5polgKe$he^P(Z<_@<1q)i=i;baEy#)cuvB}EUJ=^!V7H0 zN*c8wZTo7a1=$&t+Dfv77AXCe$DQt)PlTNZ9YrmYT6NVDNi7i$U+6}BWDkz)0g*i# zsy&evy<^!ywJ*-1pF+&-LT6{6dq2!4UVK&0{2#OXDX5=3XnLp&P#G}5Z-B}mzX1UQ zMAiVHwR$x)yGXs%CU>PXyrr)0XrDPOf=B*TXW5h}Ali0WkSh^E)mb+sI%pnkphOB0 z@ip0MuCp!Id{!ce=EhELG|}AKBZw@j#r_%IK0IhC;;4E@EYU~v=ooM$Qgu!+M<)*U z=_KUVDddt<2W*|r;53~{7`a5N#kuC_yqtG_iD)8{X>;RJPIMEk!d2$z>Rfb9iFzW= zlN*&Hpeo#|_xJrl0OIbmZyza+C2>mpQeHK}>@Gd(9`s>a?kd)vzL$1r+$piQ_>3V2{?)IoVb& z!Z)7fa8PJR*r3sHhJ0h;$$O|6TFXJu>eGl%O)o#vmH-syJUNldQ=)H7^~Tn9vl9a$ zezQ-+I4EI!-s-R@4|Mh-s5BeM?Z0?6Tb%NC?|4+<(dU=Cx`xNK+VV^C7l6-lUxT4X zfU@N?qfqnXvI{@+F2+kZo_BBzBT+i6pDijH7YPY9G>{NC)Mw!rgyaw5soQ2fWnF(m zIvqsMZZ=jT@4})F;K~@c8eYGd_Ss|hv8@KX+2o{tAWCF-w0^jVm(&bmiIh-wN(QRs zsOkP(XCd2|)T23kCPiN%G|te(f-m<3kJd3ki4ZAc^6~H{4tL&dY5a zuz1NNn(S2y4Ojq*2FuFq`4dmzzI*7SaHJrARDvE8W{Tqu7EYyJ`88k113WPw`vwCv z7+OUbbjove8O&Z5QJhM|X$>0Yf|j|Vt5no{EyRx@;ipjwxyXe)6cSI4KsD?c39u>< zqlO6;7%jvk!KEOGYU5VDkP?&V(5geLd7Zj+>(Q&v07AyN(2s}W8z8_4b>%XKF(3=W zvT~Om^=G@*f<<{g9Ww(n10w?ya|X#sYGGkzV`pGu7BFf6!!aDgF}!R6Bx69?utZYL8f%82i_&W9-Y6%4d&i9b(0T)J41Qh`y0E8Ska3BIi z0O-Jh1B{1hOGp_dqhyqnl2I~BM$2f5reu_i5>rx2CYDh$ni5ko2u4ttYde3W9ckJ? zJ2D2^NE?Yxm?51Af+DDF7?UkFE%pMKRHPaesY+GZyrNNaRHl^5R29`k4bfE8617DQ zQOiu*MARlkEm7+~F};p^pWlxelQsY7STe^WfhqB6&*+8Qqw=`=k@!4mj)wyyZ`;DD z3sEU5MN3hk6qQBoXlmOZl{z+$m5a&(NK`6COHrYeb5xLK+X1Q6*+N$}kf>NXXVdSD z)X~|^E^_vTbI6+ln?u#qq@f{070(3BM8HJ7)O0!gWJReKqbbQ$>`1 zR}Ene6{!P?htOxeFIKW^f-qwwU`!oZl`?l1#@ZF-D4Gb7EHvfKRcr)rl>jb=`fPgqj+d`vB63dI@G?Xphrc(fxL0)!B znqtZ%eVc%&TdtlE&~6^)P&rSg+I%L}cG!E46I$sk>fpw757btdcF*2!nVysDP!fKX z5u#HuGohh}+EcA-!hSmU6^MNra3)KRZ!ltBK1>sh_8#(OEc>dCH}GO@*zAMjNb4*f=|@X0T`k(F{%ilB_0Ol z3Lp^N*yKo>yEzfJ%T0#TxN(LJz?ougpET6^E!z(w*zqpNH&Vxa?##J~VM@caZKRa} zM!3(4z!`OE;QQXDW#i+~yAYomMJ4E!*P;O+H5K@}ZAaiW5*XmshfRmT)U5~1ug)2D z!-Wy)FuBjCCA5&;jL@bP2X+OTuyZkQA0F@LLeP{NELQ6tDt>En2pGbNMdTdV|4E5z zk7_PJxH{`*^tbqOfR#q~^{R8?k#53lL;oqoKTb56I7ChOu5{0o;PWHA?M8@A_1iP; z_FG*uzz}}XN6~RJje^cQTDpLmN>EZMD*6h>79(Rz;A}Y>ww3T)z?6%GRyD-?BH?)$ zt3P4Yh9F2c2;Ga2lb^v5ixGPh^Tzp`Ed*Am+(Q}4PzQA~lu1p5AcU_j*u?`iKIH ziN4eZ1kz$Xl-85zOKm_PE!IN;R{@+LiRV%!rQinx5+XqqhP7$q!dzHfn>NNg!z0A6 z!}2W8^7=f>vplQI>QZ8gq)3XU2#TahiWE~cm2gY~Bi+pz_G43;o6ES|TE%E#6WcZS zXyFz6wD9LK3;9G=RGACZB@sU z;1|>f45h#Z@*U#6L$UXB={Ym=oN^d11FzB@sA;F+OxGQXI!u7pV2DhEj0i*rC?gD0 zXB^N#mT?Y{hLDDmGSWw(r{!8>QP!waHuYDT-nz>iBSQvFD@bJ#btJR+6%N?@@IK8o zq#G187hNqIsS#gT8Zp@?G0^yGPO=_hlG+B9CWK#6eE4+x0mN^gi83=^?9z-l7l`js z*$G4bHz&pHIAfUl&|&#LKW|a~KoO4m5<+@+)}hIsHXI3UBvE5TiE&|sz6JXa6`_Az z$;oNHr$G_BkwzcNHUmx&ctN#d)5ayUyt^KB2Ei+Y^@@oq|EX?qdg5z zWzL{N2)JLOXT@)G@*0?eYx;W|Iz$!f>aw&RxCG+(DvWt^E`O*fZ$D?GlHfyIHvms0 zzWz;aqmZLaOJ{%Z2yVvdDc8ck&x)pNwu-G;{f2N7P=)dWv@(T5yC>MK2_7;86&^8B zR+~}9*pdy(_t`j9(XL7SpeakTZyghZ-z0OiEjWL8yP!5N7DBecbKR>`Dn`;<9cL2r zEE%_1`H@{Y76LaYu?$PwQm#mU=IbK2iwKoCXst9+q_dQw!ID$dFn)G4C?8vc%9%&SNv(xJ8W*%6W^O~__vjnD2k0#aoj9|Qg69Q6cL=y`fWl7sZhK@Tm|2RI<<| z`&^0?Tih%k&mK4B4Pb(Md7xIde>-qs2!}w>B0vBMDp83r&&9{+Y~4b=P>&F=G(bsZ zO_5T0LNa>XG&z0qFNWZQN5eefLTu?u=(1%z3U*U;R9AzXsHTYI1`$Z!Ovxk?W%@y+ zI0{NxT-?&RrK>Al2Dfw`RaN8VQ(d|YZZ(J^l1t>6At&b)AT@5IWD1bWB$p|ZDANyW ziWEmdDT^qRsHT&8h=iYym>0xEp%FwOM8eNU%nM?o(1^%`s0IlcDY8mj={eMM2n1C% z|CL=@XFzhS5e#n$z{nFIJr3z{Sb=1g%SKtCGFWMXnwn^I3f}-zQ+sd{IRpd*4L4TQ^o~bggO6E;;}V z$KtG;m^M*GK}R%4C`TMOK|D_eW&}YJb_q(P0h)k-pa1~@1qu*=fWSckas(8>A$rY? z0t^Q^j;1pfbcu9(+)gvjI88F>Lh1H+$1&sET+n7ec0+?ZszE&IFd5epyyBuYUH z#%>5aanK-|jAPf<2(Sf$)Pbadk6`EP)x5AiQg^1O(XY-!<8o{#iZ3}s6DNkgd#XQr0sqIC0T~`IIvSJA}drJ-L9M6=+zJ|~% z#C5=s7ALaaa%#Qr{ZLf&lHrfejfG$Nt)+t35r-TCuG1yP?c#Udb_EV@agC zhb6U{SPj^%^a!)N_UPBCg?{Zu;s!X&k;-dRmPXm}5$J3iJTpxtlzkDVfs!O5uqZqj^|yF~4x~4zeGM(&r_N;9jb!n^ z66B}ZX`S)1FsW$79`H(FRc^$Lg5rxVx8)c-ueZnw}%#wCjuV+F31ay!jw=^z`6O9eoVKRQONMNZCZG z>Y>+6+xf%!*1?u=g7pqNcRzRD9aW*#pv*++T?_V4 zRNc|#wsR)#QPwm=f6$av2$98bn(KtR`3Qbc2yEl;L%5_qdkj?idG5XyvPFk+}(h&g00U1wAhTVDZVI^|U ze+Qok!6-G^CBYG1fbK%Ms&F!3me0#fI!1RPohtIrYGl1jIL6v^H=8rR<8Atd`>mAS zi0;R}csqvFZuWL)U!K2E&O~`Esq^bfaat<JqBz+zLUgLj3V*gom;ONfITx!Ng@Kzn zN~pi@CBFEcko>ZmufMl6eBXUwqXKvpj`ooYSm{Ak`fe$r&QFoJ|B2r}*9ii3`$lpV zs-~J&Ul!Oe52`21;0BTn=YReA(HXhMa zD9u7AU4Poru1hTMt%?n(+5h|-4Ag_-0-HzH1+v0k1*Je%lYd=>T&PMv1P6mIYGm(# zcDde6_UQwJr(!beK;gtErlh)5p-(*)r@ig-jSSlJ9pj96=%w`c*{`OtkMK z=h%<_Pfmt2L4Hax&IGq9H8k>+2WdDL zIl&eV_%7M11x(RJS}Goma||tWu;>ausm%Z60#*}nQ0IW^lo5$*YJh+` z$I#>Du;Q-WDzs@sxZn$fg2I9WmMP1Wou_23SESP&L4(W9Ej3`7vP`qZ4K6pg%x8If zhOV`Rjv`*Gnkd0gcGL~&12w}S48j0;K!(2{4n|MzTT!j!(lCM;_pm|gPB?y_y@Cs=n+!8)_ zddphDgtUFJLhlHW1TJ<5*=&p3i_NhsUjTPR$Y}`?L+$A@+wDDgI;*<-M}0XX0Rrq? zdis0BOZai-kK`_7)P)F~Rz@rdx5XOcvK)akGv~C#n3xgSmcR^N7bS2K$q@l!#bs0B zb>F?H!Bw$>C6S1EQZ(0X$pXg{t&Ervj@KGXTFHnbTywSNp1$U$^F!v^wZF?2@pVHt z=yzEIS1T)bU)*3)Vjo;TyDi~Nj7`i;Boh}q25K_;D0d!PIbNRMUViy=9fNN+MP2N= zikZvF>)LjtMz_VBE)HEBP@FJg$1Yt^y5#FRD)|bG)5-^?kaCbzJT?o)zRlRD-I>k_ z$^u=W&v$sJZiU&{GoTYpJqXGIrGA_Wru)`O#=Q-lKnWBrxb=@wsFv_Qlbxlp`9F-n z6=Fd+E9L)Q=pwYlWxOjdQZsol2>@OS{IS%}vN)-oeLWj5EIzqWRQGB@AZ;e zApd(~C9N%2CN+8umhi%V9izyg7*qc-`DFap6cNeh_{j1@XOrh=hKvuo5aieV4+|cAu*BqMGQEW-4Fam;~*vg-dmg(X~MtK&* zfmBrRu7+*vdiRItRSd0)pqDeT25VpjMqEAI6W6?zmvxbwa1&3gsEU9JUE7)YM?bP} z*d#*NilPmVorAW`EE95C2;bLeW{~99P>E4t&;L6`KtYY*ZsZpermQyMRF`+a;<1|L`T6zLk z?R<3;sfL%)1`pBCoxKe(my@Z9yAE9*U5ZgP7A3lCLN^{|Ig?5R{fR&ah1Q^UDj1g5 zE*mQL&o|NbB<1AO@Q4npL6mUSqp-CCc}(-kehhP)#WUz>`iLU|nInXc>V6%HxXM_v z?mLggaq`1iHy4UF-^oyK=f4V1aU^&~PdUKm37f8Z=HHfXFehbK{&H#)pl77UD@{Rd zBcX=}O(XYx=RJgsMvg71(FPTgeqo^A4p|LYBvh#}xx4zPY>F1aWB+NIW$G~BYlFlK z)jE~w@&sxHvkXg+3i!9*I_k)&xY)bP)!Xj?_TnYeTLXq4BAWMJj~*OnpqxQ&s4rO5 znx#rABN{`UN&}{EWK~R?aHBn9`YJD;5~5$fijj(^%rk zm*r|4c(3O7Ns$0(zd(3Sg?Wc{+iEM_-X-*yLy#KK$?c@~rXYoff**YO5f&f7WOcLmolh8+w z;B$E^9Jk{!77+3bEKn~@V9yV%H}CZm;{eLPoQ|}pWpuUQmqDvN#Dpf-xOkCyV`3MT z6}eBoq$PmRz-A4dA>MRW4UBE0yp`A>PyLkL`^3n!T@u(fY~A)&WI>`W$nVSLXJ4gm zDYdbZJJ1PXZtDub%|d4H&JJqL9HMnQJA`d5wIOB0R-IYJdLD(`~TVdTjpEDYHoQfTN|tWE3JmZA2)K)=yn&Y7(1T;`$s*2Y(^xKeOjknQp}^>lW0j>2R6o?>(g!U-9~ z--JA_|43X*AvYmU>OeBN_`LNqRS%M_t>q+~3l4Q5-B8Cvj@)Ei{pe$@p;9El z8y^kRC?AT1X(SZQGl1QBv(3K5k~Jhzd`ozH@++(u8Wx?NSI|mWR9q5l1Y9VnaZ8EZ zLqh#1L=B0!AdwO(>8ow(9%R5D0)%Rl@>N>uus?bqn>5d~Wd`*VV~DX&bjFZB^x_|; z|DwC_Sh@fa_7G!4ypPj@eLd2Ts9_Mo{FJQbiAIC*YrOiNlFh9x-i^Aa~->iwv{o&@C^7?Zn$=?FxyCqNLIF=e@I{!nB5zSbKqz_kN>XU@$Qzp&pOsG-@iCFLkiTCn7F;RmPGE zg+bh*|HnCz5)&|h;Y{G`E7GQty<9))Xu)NRy17N}En&gl@VJ<)DTYX%@-#q-()~Go z=iEHRvu=Z>o;|l{Wr%Tqu${s1BGpg|UJ*4kT>*#^wS_F{OaMdct9x^uYjzqy7uu_P zcWzYe3sF=9C+l?`dU4b`N@*JHjEV^&K<7856<`9vJ|dX(8Dvkwo_si4b#eVa>XKfe zsP(iATOE2%WUE5Aq&*6Nq9-E};jS~RXiFS~ItLk)W^-r;SNpCEX&tFiE#+d$)(S#P zc%J3Ct|CttpdIXrK&=j&QJ8YV!ird0=`4K~$x2nPpCFzr!6@1lEUJO4daM|StCJy{ z_1|4cv~?aFaj4_{9=9vbXj}OX+1=SQ3Wn+<&?7kdbZ$^PvKmEO`!p19y`YqJo$8)y z_zj#o5uSf4xFnMjp7RTppn33)${l4=nw=C3t~01fug_94T(W4rGG=3rdFEdx4XSL; zjX4oSI~i5N;V6{*3{4=VHe}dpwZuxu2&T~PxBk$Ux?1D@D~fV^cC*+)9~4(AaIIJe zLL3;31}s>pTYhxtEw~}1K+h1C5b|VvM;x|X0IHq#=geiDgjB|4H0V0gxFy|L9brMa z)u0&Hf8qZ(r_dk+d?{CP&>psH;*i-_+h4s~DUyAq*CeLAn`q6$yre98@?`0w6KBa> zchFkNYpdi!)7XLOw`;k7JFW0*Y7zSw;UV{ODY_1@|2eHf?O7Toa3##+D~O(jsX+CS#`TE7b|p- zaN!6vXi&a)Cmfa*&zgkot`66CKqi-h(<&M7%$3Q40<{ZS$b zE3_1zy!~cUhwtSV5EK>>6%&_~(k3kYy~~(r3t$6*ZVzTWLp?sg5qF zQy4fh?9D2fTA(q=PAPFyz|}O6odNGmRA&)(9;Wl5T`+-n;m61>`8d0{vrs+7(EeUl zULq3LdyU~GO~3O&Q_f%0@RR;!@S?;A;0b?C*?!XcFM`k%s+ZvO5^P@LX7OV0Nn-?v zTR8|rTsMzZU5ID6mw?wJ-Z!WHEmjE#9wXW*5^?lL>{JoL0woZ@P%6EV%xU1CRev#k zs;&?gD1iWmQt1}v7TS6&Hiyl@+`-(zg+}f&7z~=PG+!YGgW$f9LS;c(Aq`1G5|Lg>Lu5!AS|Jf>D5OFes>uoI9#DsO-hB5vs-eyFw! zD9;i(T+nJ`<@$^PXPXK1J#TC)Rtt~4q;VE2?#S4o4!>>2lsQijWd%Z$SRx<=60*S2 z&=wQH_5`&2JIk{>UL+?qhARmxX)?Gr@VP2b#9O#qLAQgr#kWn_s&>}ape>qJmTpj1 z2eFl4m1*nbtJ}qfsPpVv3D@(VjEP8+mAJm!5he4Cic|p==@U(@D_vS;(eN*J28Bi> zXas+Tf4#4UeNlRb^!S81|Gk7aXHswm(`L{KPt6R@gi9az?>*8qeQsWu2ypapYJ|e| z>vg0IUErp5-Jf=}TP6<{(_MZ{VY=%YQ<<@;%a3VI+b9v2!{bD2i^&F`$6^^ea7@Rg zc~wwUQdIhUx1~3`l~l3iyis=lB<7~F_OR=99l>J&DdB1@3#GivAHYGy?z5_Po`W@Ih*@{5ZLW(wClLH5CkcP0|;IQ?#aQfpi^@H-Re3K=V{Y%z7=T$9MveAm>L9s0n3hV(*`l?_>7o!Q@FG?~Lne|``i@iJ z)(N0e)9h)MGVG2}UKdy$un%vlk0&W@)M43t}4VEYF9jt3Yvz^HUv-|KN2wV z;Cve*1q-*_KqNLvjEJ9`H9#eSC$nN{^IJUrB7mg;x}GdA4|HUx zS?aoGv95_bu3FmAy79V*Y0sX>74a>t3O>spky|#aNdw(W`iyE=MBG9oR=G0Emd>6P zj+-ewKUT=s%ANTPbcCs&t~Z=LvtRw=#IKZcpSFDYUp8V>ocwe>@Dnu$+NWR1g;7ts zjZgPlu89kunQDomk@fpIiBJ$%?-1*V|@ze8Dvklzj($s-~3rre>A{DAW@GuG{dn8 zxfBUg0w3?x8;dHd>?DIv(=O9=%STg53@-4`?H4)Vki-$kNF3`pZn-F=h|DAlg+L%O zXM-W$8-vZO(EbLogq`on;`L_f%0=i@u(BObq5TSmSm(gboKL$J#9|4<|MXD2hc=P! z(KSCGo?WXjooJx*{T>K+P?uhcTv^PM!}TVjg*l!Ra**eE&V11>=0r>AuVZu=h#QoJ zIpcEhQ@oygtnrFCKhn-^MM*&Bnr2lC*Cusb=n{IVr*EKS=-7yFtb@AT6p9XlMxzvv zLZtv8#Ty!(!E#0cKtmkq+=mT{p%{vxF#}SP>zs5>k~rzYE5TFZyNrM1iPmjMNxWA9 z$E}%!sj;$1R##X}v{8_kD=XI&3N>aDrpD4T0-dD+)ENhzk!X|zNs$z63>zc3+z^9d zurX|mU>N4QfmkGVch_kb0NEl8VF(jr2tydc5su*)!Vt#6#2Dfr4B;3DLp~8CMT8{M zvE0##pz*8IY0x?mk&?ZPC@}(e_KS zH^>j13zmR`n)qui(jXEffCF95a*`_V4Q(K*DNDR6#+O>V zDWd9BZEqH0D?2g@a5K)3fEG-Awc@zFX56K4wUHpUzy$1vErU#}iMo2-y0lkMrN;1HT-mSp8 zH%IcgzR-l`(udyD3ZmBIt3VGf+&?Nx)=5NQ>(2IwREPzBVQkfxW}cQ;%IuJw;+vK1 zRuv#LpbkTkjIS%jGYC6JA7_;k`dvD#U&f+b`M6k*+fz&Bp|F9aUVj`y+@cD3+Wfi>z?G#iKOf8-3yuhnm$)*YY%=;4kW6{5k#Y{iZ`BpCY*?&e$ zI~SQvMPT2Si}KB;o=ym9#Ob_e{y32X1wPC3iGwYEsCdW^)bmxlvu8gYfP%n!Bw*A6 z1$}>V&_-Lz@vdcD?{2-_>kIY1@r}i!D)fm&%Pz?N>aU{{VJBF#f19vwU%{MoQRSHt z09yo(Qq%~ABT<@Z1E)4Awbk~+(_M?AIyf@aPrb-^$?KdqT!ZaEB9o@lEw>=oe%XZ| zh5*poMd&a2#P6qjay@tH)lH1obp#Ol$8=zCgb%_;753_mCpK+h#{uq}%2|N&3Koh~3jovx0UAVy^%zWXRVfK62}ubP zDG6y)88dTP2@@&vpn`=WMUkRNQKSG=3%~*ZK!7F>(P0J?bO3MA^C5sL6_a1wx) z&r#tii%^7bgG1<*>uTy|3Z;qCgw0`dxB~Jwx>_=Z3Wkb3%;P}8$HvUYLrTUa3L`KA zBVq`QzzD1#){kk-UTt(|90DhBf+VCkffJt1%&jeK zED^^GPQ zs*ca;nb`dzZijs*l=ySBc81eDVxqi#pS0_syje_0s33Bbr29bWE9sOUr*|7S!R&RI zFIr6yhn;?aMsPhTG9{LRS$QImzAviK0bd7PcY$JzFaVvdJMo@8PCLbkkU~icdF>4O znpze7lS;_1rF(z~$p#VqC!Uxs$rPq%shvde>iG-a#xR+ODf3mM(zaZRI;!ex$AoIpMaB{Fo<&Jfg! zD~&;~xV!KwQ0h=7E6FC3QyDrC&fK{&x=LhFM5E8A#W!5_(#z3Xo>$=TpB-+s2Z=6w z2&_5^bI6%GW5~S?3JS1*A*)<>JuAK!b(Q7b3g+M;NcCpS0F$ z!@Pg^y&VqQF?)R6a4o=ewgVfhe4`5yW=jq>iVkL?c$XeJYG^ID?Gfoe)%2RE5^bSP zYSpH(!q?I}QU@<>UDR`dxcRq?Y?q2H;&#YC3nk-Ft)0QFb9BU#aZ{$)2cxm=+{Tqt z+ptZ&WOlU^^>b27VuYhWTn}x9GWEci_t-jv;A%oSG~Eq;Ga?0dth{qRU8AX$H`}Ss z(So(xudKIn#>PNMzwNtfVi~+{ikCCN=w=asiAnQ4lPNGA2pLjcwtI{eWtYvmf zv;<18pEHqCM_z1>=gnld$(`W5vrQc$j$2I#=YV-Gj>|Pb{5HOs6m6mg2QM(bkg{xl zvIva|5NN*W=B4IZ@|n$I7;PaY-Ci6kU+lwuTUfLn!IvD_=%_DethThUdL%l^Y!{6%leitQ`-jhjQ8T$o2^ojRrk9Jv<|0W`522~)`wH~54fggtwB;>UBgpR=^LvH?fZ-{M-rP%&X zbM?MWY!Bt>v~SU48SfW(PBU1&<&0hzvPOG~43|5R!DAt_fuJ}s^hKB~fEG+Z2exi7 zv@8^Pv@sEh^#>DZCr(K(L(#gf)Q3uD=I?|qOc&goiEr{fs@R_UPtAJEP6-~{CR`AU~UlQ zv{MuWmFh%F`e@plbp8MFg~lhY-XQnIKk@RqEgLSnfYGpkXHjES$)| z1xQOAej))B8ihuoQD{_{_aHVUGM7FXOZ_lD?004kgaQHYb&vQB!Z! zu114VI=X#hGgB&s!?u-1y6Mo`!?|^9A}bs0Xonrw4o_CX*7LLfLo zAOu2S1cqP;fe;9a;0S>d2!SCevK0H=YiHn|P6~u%L_1{G*h?v`M$V>z%4jk&f{ctB zBO}G=i7z8%~%kjGfR}oG@0L5>=RT%PC96DKkYvOObF= zoMoe!BB7X~oRBibG%-amk;o6eFFgF2&?G1_uoMrP~(_M+da`S*bLQ-8@% z=0|OJ>^G9?N~gI^;!$8)-89hbnA!hX=V#CfD~Ssm-(%Lriy$HEDN>#QrR{Gf{+!{} z%8B|#{%X@b0;0|JSn-5gWKRf9p%G=V7&Q>|SExi7H&R=f8$s5jXvjEq#hpI0s&ds4 zja_F(Qj2HXEvz0r5Ua{{3zP-`6`L~b+!2}udIkF-(S#o2Khd1r0nWc6C4DgAe7n?d zXz{Api=Bx<%e&BIWEbF3k6R%JwS!rD zs2!>38k9_LAFDU=k&hGuj4Q^>$r{^)mHxBD@v*phmZic(wugn1X{~u9>k%*FQIQM% zB7sIO5RnGZlP50B9u`OHvF9v5h|Wkj<+ERDOU!LE=#1;t>bx2x7Q=T46cUf zmZszSaiCppk{&MuM#@<4O0RJbi`P|UqQPwP#Bh!29Cg>BF=q-J&(gMO9s&K%aJQ(^ ziTKk1;kU39HR&aq5GWj=0pRoN`dQ-^J#+?&2dWe$=( zh-{=u;bojRTs&<#;dUNXr#~(jBfFrG$+45O zA+%YHKM9iU0OcvSr<{lb;qK8m!@Rk%1bl#rtFLzTqk0NgO>yi>D(^Y#Z2CFWBDu79 zBB9Kpg-syUx38?wn{2;ZkD43ug7&MA&VWDd+>0(@jWb?E5)B4n#o25T;Y1VKH&>UGwsC zUV#Y_78QWBjYb&-hjI&VW~AAMnT!H3xdkCXpbQvIW|O&E;#+Y^-K;i8ZPuCds55_A z9jVgRh*tiiUZv`)y5YGcfx|$?TP+RcZT4m9Ge=CiR@5U?Mh# zv-_BGLNVfjQ=w1@6bfZ!Fcb=cKuMttf_B&c<>_*@pHlM{#9zoq!B?G^M(*c5oo;B5 z07!tMva8ep2kMb>Y^grf1L}E_`g_2pJR0(``<3!3)udFoQa)wEl^Vnh!=z71)PAKf zaGK$zRL<+Kg4C~4MQx0Jc!-gr{5qm^N>CakD3hj|mSIv1oD&O>6bYw^`k^OC4-MR*e@KT+>rjO(q(jf41pu>h>-HJHJQAcs=4g2u zu|Csw!;lG?o)dQM*efvR1^dAOYX&?%ForpphrM8FKw_Xt#p zx_*Uuy7{W;m+JQ=yK|In&G{$(EX!M;*0R}EV`1=_N3ogMU&LY%u){G3p~BEt4F*WL zD;8ZEpoX+qbw4kShEQ0v>=6O7$Z|+jSj_Fy$k!=|a2m8lI4w-Zt)qUPaEgw7G2Q0s z$Fy~N@oU#W7wX4{ePLm3n$%T;Ue#Oq7kHBrR|Qk}sct_6SI#pzNTOFiCwh@Y+KW87 zG0XIX)}~|RcfSsFH+5!6J?wx*`VOyeb(ER`L>%48KolRUNzb_hq*gn;A|l!bjzh>2 zhVd;5m?z(>S8^0Y=KgGkr%e<#8USfxv_49W=IlS^(tmXQHSP>L2Ry-=$Y>12r$(ic}z2eEaG zaGH!_LyiZ#v2`acYKL2)oF8zqb%G(Z_Oarwa+>!_!F1I`Kcd8#-mE*kq*ga3+|!NN z{*T@2Uda*XIxKY0w{Gj4c!QI1hvqy^uOKtIug(lp5@2t@$tE-;tYn_XV^#5i4k-BQ z%f*&g9djgy6Ju^@IS5GWzdP^|j1u4CrzPS{a|K*h1X2 zu4bb*-k2y}?bQ({awmN`mu>ght?rc^Ft5WxrQ@x0l17GY!8=`GZEfh4B&nqjd1WW^ z*6HT$EV_?31-QzZ9lDa=16SxbVPhg%_7Z9uRsP%+bEv<+SG$@Yuk%t_H1Wfp!@Lyf z7s$_`Y&g;{&3h_z>vx*Gh2Jt1E3iYY=ATi5tFd#HnZ6pE*@r)0jVRC_gAVZRsnyZm z!DN?w-sh!G(i`@BWK!LnrougP;nq%#^{tq)r`jKrs1ddCkSGQ>P83X7&E$$Ifo`YS z#nlJ^gM^HNiUx;_1r0B!V@P;xu&J4xL0FO~IPHH;ZqhFLjeVdQ+G9*HTaerh8wVH% zDh>=B065TZ#=UkMTNYp`RY+OzWPy<+on#M^VyJDt*%JBo68Y}ucPT2>la_8(#ZWO+ z*2apVVyKv|?&A>(b$2w3HTAgpZr!sc8skjU)Xak2Og7?hJ>qhBe1XuO2(YTfP%%{2 zRIV^oOjp&6)lF2cFf_QPW)>_9mIcd##bKLq%s3n_ho{LG2t@$bHixUJCv#0IL15Z- zh;ZPcT|06E+7{$fnQKxB0@JQTgd{ugL@+$dD~_q_Pe;>cXTfs6hkqb(zhfj z7BVCaQ4Ga!(vUPH4UM`l6?s*eJyID%-0$KA*)xYH$&)l9$(Q75<(HH#3>FbA^tEU> zY(Y{))T+4kW}9Noi4nQDXxs9{i4jUlm=IM+iJC2D9c)gN5;aE^z0r{gBtRzgBL-q< zab;3~Tp}$9SwdP6LoSkM0%<|6B9~e27zR**NP)B<22*&4SjRRC)Q zX$F`A1b~Da4nYFfz>Syzb_gLL6q#15)D#c`PT()gF2Mz)8Q=yGT++3W6tW0Fa7*~ ze}1lv|BxQM`*H2Ud&w(LGRVCTj&x~NPsY}^+&o%IaU-3Ucp*1 zM6(N@#+@lf$P0pK1|>Yy|Le&vYTNUbs|`aRIh{P_72zmeEu$*z4cRO$ec#>DS**PX z?1_0%hdza?Sc#hTrH>VhJw~K{O{Ce1eX^HdrbS{$$mUOXRR`DXeVM5@6 zJj2&Oa}%r05R`w+$QQg6#Gxv|dt3u|+g4eOoLKj&@^v>M9_?RPt?Ipvj|#RawVqLm z7ew11QJ)DR(a!~12d1!eN~JSf8=GZc>5VD9YtlaKi4Z@)PR@a#yv-)6X{u1Cpmt6x z)8r3A+RE!HMk8OTwMu}|Oy;2P5kGlZ08dqrWvQgQaZHCfxRH46c@GL}!}j&yvVNSV zCmDI7r?_F^cno_GbTS5*v5}UfTMy60{>K%ME63Y|` zMt?}F(;KX;?Hry7`QE zC=_Lpiqrb;Af|y;b5d<&U@$_`|SfTv%)3~-fhz=v*zcg0;0)muk}Sl21WuC zZ)wqK5P%F~({}uaFb<%tFM7e}OP2-E$Ee}~25v3@_Ley^=-RL@TGVTJpiq6_mYXfQ zxYsrIcjXt&6E@@0zdfTK}9j>E?8h1iKGWm*fRAO0r+~_;v>L_ z4R>HBqJ?bhUuxBTvVctu>Co^21W!*{kFQa7>&@w`jx#o~$u3XE+ z)2UtSlquPN6CJyvwlRvrGmoP16xyan+LZ{};s$S?$~%?Qb10dhseB7)Dql&*%y`rl zZA*5pVBl2N0bytYix`?fS=XHP)D`thcCKXPQqcut=|W3bx==;WeG^Ak^fB3KGZVKe z1ji6r#xX>y`W~=pML(0{Q!(?X=|S;Ku@yX1tY+Y$siN3_O677jdSS*&{b@k@(a&BG zTK4tP?{w~f5o<_j0m1+hr7XINF9F$D9($t7b8j_hZT@$sCNN;w!iWR+(g0_|vE6>O zQ4lK#9sz)ig68&@{_mF+$i%`?^r295UIOAHi>MjRwaSJlPO;@jtV@l)oJd|x9TRR&!AyK zOS2ISvYS$CyyrNxI)mGm;Ff35u; z!hfOL4<($%CGl=k00~hv)>>!12j5*GS;L# z!W0lbVsTMQ>Hcd>*6$2x+6Wv#>p#E%q_nz{^Uz_{j^vI#O10rrNZO{N zDfTV)E>0`X*|cU`$Z&D?O>1p6{B4_Yf#PPxV~RK3{05=&TC?VSgbF`-kSl;e0UgUw z@}Gth3j=cgjmkBJ)t#xiI`B6aiC|Cik2Er$!5-UkiOuJ4c1IEnQVi|+{JIQYLwyy&m>Tr`B=R_y_rZF>?Y}j++vYYOE z>YXt&mTcH_;@TgBVI74WX1EbYp6JBJ7-Uev1ecJ6g_xKmgqoBfp&~?!lPE>%>1Lb< zK|)1{7B3)ezLptf(Bw)lTw!HZHKvAI>QQvD4Jy8b0wtGHTA>o&bZ(KPkD6H zP?s{AhZq>T7DuiHRv_|RlFi(dK8-`)$1p}f+305+eyXl*%l}$E~_m@?1ge173RdF!& zMie8YBDvD=vbw)%+3T@G9}CQ=AN6gB8YK|zkP*_*O_-FBK-4I~YQ{=}n-YMNv{2e) ztZOseFJ}Rhm3$`Ni066qjW}`QS#_%O$xdD^fWf1-z|>n3fHSm^x?5YiIGSGU4v5?$+#T|K~bra1j`UmYo7lhwLWMI0X?ta<_n?KKWCCL^zB{Q4<~2 zgJJx(OCcD$$%!~3h4iSCsnE8>vfg^7WI2zERHQ9Z@+j;#vDLEN;s1E4u`A8xbh_H^ z)P)$gSQs`Jgt?w}W?`J^UO{ptx2sCEvDD&VSfXb7S&WOx@nra zX`8OaXlOIV>pL0pAlZn^o-^)t97dWOK5c`SHUV0L{pLpCP$8bi1ZYE3Dn>1@Dd|aC zo{>T;_Ny@uVx$^bB>l1kDufV@179hb_^6nS6|MWdu=AT^=R>EyWcXgxglSr)IHlQb zt!}YPhEWI3cO%yfzdO#sjJI@c;X7bO#vAPG?>r$LXS`p1YT7?|0C7ER)4op-Fu*ii zM?Ri7dMe@qaonL_?TzT?i8MI9S1w?LOI)D zC$GouDgY1!hCox(_6hzni^CI$iDH>TJx?D_DsSb$U){ff7ZLw<0YC^wPz)zXsf-fS zlHmVgrmdqJ{DY>aZ{3E0T%ojSOGZ{gQc61hqj-90c?AF= zSZ|(hE`}2%MKdhN3!)?|s-_#JWjn6t2VoQ^+h7y^KUOMNsyGoz{cE};Uqcx4M$yw%Z8V0U*K_=nqm6&!Do7el&SFu|Edp`tg_c+uF8PnvAgtR#F+hDM+V)p&9z~lfBn#fI=dJ0lKJnF{bY_a9=JYyeBjFR z((p%CGIz~>P+`H6SeARMn+I94rglnU1?dBe#Te91|^iV z;`O|KQ7Ih?`iz*e*`jqAhQ#1Wlr{BDopA1@@Tl-M{}ay#^a}!KYhMElkdGnC2yKip z!GdsLJcIxx!bos3f`X)?XlOb{&@%L4>dVrPtv|;Au3Vmhe0c(cg#E!Hw`34Yq%yfe z`A}6xjMN&fPH!-p%odhb);6|w_5>CVesc7))Awz=`dDPgfK7z8Lzr5R4k3pGZ;!Hc zA>xt|9Wb^&6nGS5N1S5_MLrePiQpPTNkBt)CV8e%7Sb_YD84yVL=0?Kn!pmOVkWK| zU1$w82@BtSR3ckNt0x?rSM1(#_{8ZOmtWle@c{9H@j>aiHCByiP%Wmz^@M>mQYM<2 z{xet@z0>WLwNZJWeSO-geF#Oz=UQxh#nLo(fGI<33`|)%6X5Gm6eo9!2z)su2?}pi z0AHsbNlI^30$-P2Db3!g0w}Lq>Q*CDF@~uTVH&Q(v@Br||Fvdlm<|@ErwcRChZ#AB znHWM`-@x9bK?YmIkRc59u3==uX)$6@4J?gpO&rZ!BY8#%j26v}8Gr4e^4!xz!oh1w zUotW(IwlB=OG+V%nud;EoCJwXTs)=k6uXE?f2C)Cftg7tGX`jWnGhJ1hyX(+B%vPA zuBk9IH-HTTO^}3%CdxM1R5_+wq@E>K=wY?(`r7G;5soP|*;xER3Z%Yt71X3F}3;f|8<6MW(!H zspxGPd2L(U&W)P3gGRu1*fQRZxLP7kj^}*22m~Jl;#v@hn;;M`L9o=)dwlGxyw;5NDl-;tafCa* zWwJNQ^O&HAz$mhzYEeyb5$F1%6a#|0!nhXrHi~o`tr*2Bc5#YV{1PY%HY3rxTx~q4 z{g?;Xr=-W^38xmUv$Hu1PFCD(c*8C-lxWOB65F}hsnnvtfD38iVy3thz~xvIt{n2h zUA?>;^IrbpqDfrgVv?-FMYBx8?>RsI&y!pp?jv&MvoSFE$~#Fr2vX5Jdus5C}sqV#;;ogU?Vir**vmA)H19eGdYv?qL?vOsv&H z;c1vwXDoYI$j-f{dkBZqKL=$GJd#RJ1GzUrAe9<=Fko>Lh{_V;^rS@+dhZXE^gVvifI&X?7{AP^X06bO zZPxk44c4#ErHi=xF5mcbnh#Ce963K-orPpc6GpkiCN7m9sOU3XLWlJXfia4urj4?~ zR-~OZfQ1Ptn$RCQ0_MQOb(+-W(1AeyYEF@x)XPsY5KyFOE_O__*AA~sc3l_u@oM35 zT|^@Yjl0wo3?oi{UXiW%pZ(o*Y;v$<^C_lL8gc6L9DK;TUy{qWySmG};_9#DN@}~( ztEl~|uBE@?Ibuu#Y946j0VL&jRwtwSw>JGrqMO&f)PTRW4bVe z!(R2kR5oe)V_?z*YQD$pG{1DQ>#Ih$?Vig@(O+7}T)`X%=H{PrpLY{NG1oJOV2a$c3v9&+_-j0Zm1XeuNeR_-KW|FdSe2 zP(XZu223bM0I(1o)YalpkkUuv@L{4Fwzy0xZg%^!bnoIeBYXGOQBE|R$cKYKp3i-x z(ec-{?xqG)>+MqyV1^*r#kLA4_x494NERADb{SZKx*BL@j$a*AuFPZqd*Tb<4JH|h zq$Hm_1qwCgmTMlN@+>}b30Q(t@)o%5t2yd7pn?s-5hND9S4iBJku2K9wTK~tdV&}?WC^b-z*gJ2X)g6S{>b73K@gw=2?91mOI6u3V; z1Rf5LgD1mF;U0Juyc%8yZ-BSJ+u=R%e)u4Vz@czp4wob3$T?Y@KAh>Cxm+YSkc;8s zxg;)~3vs2~WNtCHLa;=zRj^aAUvOA(LU2Zi6V{3dqD*<*Z~q`aBT&su97a&SYd6`+ zC;F+L!;x`#_0#=KJ{zY&7xC`Zy}P<=z4jYC6+TWh9Yu>rILhHcc>U+4uzZ=C`EFZK zo3hfTBIJToMyb8Gi(TtUFM8i+!wx2E;~Pp|6@no?B!RS$0ZM{=P(3sPnhbUCl1pIZ z`9feUOof^7yJi8bfK{-bRh?X zxcq6i2zChe2^_e4@M)ng`Qc(5eaYr-QZX+d^gSxA@E!WNkNK#}5??(uqs-Qyq}B6g zbSxgU-31O);7UtE2Q!SA`(-2r|rf){h&>L~XE>DS1c&Vyfh z@M~X{qAN~A^wK~b)odmgd;`y1BkR1OJOO}I8|(`92Zu%xG+`Tb$>k}23CnWGb5qf# z14p=>_CCx7ShV|tW_#eCaIvS#Q{`)95_FPr+4!-^kzaMM(U0E*N9mYa0TS}tuM-R5 z!Edxt|F>X40YF<1T;jH;?rC~jpU#J`aNDt;?Z|GgT8e8v0%AB?=OB`yOjzK-SF#*i&CcCV^93=3*Y!|5Xn8; zfnNE^`8k+wGCVc5j)GY{|48*PRt)JpmBBOhe5IivXtSiyBxy7Xge?N2Su$vs96F|m z_Q|6|3TV?_^h<|cY0x`O`lLl(2IQvC*iJIM!;I_*BRa*n3>kkKC1}FaFflXo07F2$ zzwfI_nKLabW@gLW9L>s3i;@cbmY1J$_j}$}y`a?(N!Au>P3LXwqOD!Bxd@vIx2tG7 z16=C9LnS&E)!~vHiQ;HiT#4>x>2A1JjtAwrUv4Ce^HbDKncgs}WBiei<6U*S>rRyH zWY?UErf=HJ&fb;?b{9qkjfJhfm#44wR9w)f%;s6zg^jinOL(;iVlzojIhaY%>|T9# zIww76pekm;<`Wbr$(RRtg=rWFvLCId5uJ(TY-H!6I3Lx8Xf8%~DTd22U5VvtkZZAB z4|XGtn{nNW=e9fX6S$kuy+rOO_Miw4lX#TW<7A!`>1lG-pRQDtTIwE-DN*#lZS!`Z zMLW?yT?Vy}fx(!Z1yizQY6zxh&5UfAmy`LqCw7p1sinF(WT`SGy z9=KYn|6+Prz8s&Z<1;^aOD*rI?E~39lI0y$d9FGyso@nhy`~y3bWfEYsnIiaI;BLH zAaqTIZb9jsGGjWy=#I0na~6g5XJ~(i@lR*{o3Fn*V@Wv63b4FDD+;nSe`iWj*bQg9 z<$QNs=&p<1bFSNNm+4j+?v&+j*@^t-&j6195{TwYd_$H)3DrL>tFLTq`DJLYnSvt@ zO|_H0!}B;DFN?!tvblVUJ%lXM%T2%)J*p&5PpANx^?v|B`T)bncXB)?35$Ud{2!Q; zcmQ*e#lYNTFE9_T0p@K!0p_du@jGAv5(Ze1oB$TW`@q8Z9oiG%`9CLG|DTP_2)#pCurEFpK)os)I%60!)mn=AwFAx6Nx#0#jZR9;4*rpHd;3J*0p!H!@kDh&m@fJU^273>6>P#a#bGiXMmrC@u|ib7k#fuJ3mj)Hwb zC*isZ_5v$I1G%yZDheAU=&XM1t)>g#2Zs^3>b^w_=4lW1foqWI2Nox zf|UzS2CGoPq(3+Xl1X`2#MFXQ!89tHUT`{?L6TJqP6Mk^#p(rTfHg?AX2CgNCh7iA za6XttHER`I4Av&o?1Brx9I796$g*z1&%t{9WBmuX_SptDEVvSEL>(I!Tn9Fxp-l_! z1Dny&<^}hIE$C#+>yEfvL1$YRJOH+#i*1Ls9rUn$!INMI`q;7Haj+A;>|F2|*oB^U z9oB9z(C*hga`%8-dl!5G_F5>o1rB45!wbF*j$nZ!ho7Uk?udId{N|W~AA@80!*K;a0>|_FF@gThKZ9R@Kc2E2 zTr@u91+Cmz@DaF)DV{xpHNbNx{t7%Fjt4Ig>&1fW!Amsqa>3i+6~=kB;C=8K6TM#W z4tRs{-Yj?*{ErFVDtHgPO}?cC2Y_W*{aA1z_z6@s&V<7g5Ht3MSm1ex74sm;m%Z&r$5@|FMHR%%cqb7K6lV3C%z}47?4wneAzcnlnltt zqZB~?J4z1Z)=?@Tw~rEl+__2w^1!?v`lUzf&!<2g(Z=ZGym4p(V^XGM%*k03#iU?Q z$(f2ft3Y1S`S>St&pYvms)9H}4f9ju6_{eGUz(<4(=9N=ES;L8Tk~{pzMd7#OsmCe zTWYmdvj$yTtA}+q%5RfdHao0WM@(?kX(KyhN`8N68UG-h+G_-CQ96W7q8v;g$PRrYdL6`;8!?p!r^2h0G z+fNYguhZkU-@xqeMV*KC2NwS<>H@UCu)3(Ii_jKhb4gK`pe@DjnxZa4TZ_XDMO}fm z5vQAqx(aPGF1HkQ4cb=R?wI4+wi7(=De4Bay?8nFIeetsj)3ntPlOldsJC5&NUs!i z8`@Q(yf)`y+ja1Jqo}*kZW8UoqV7R^M2w|H-G^32tmSjYwmpV`&%dZr_X~*g^%Pf8 zC0W+qAmT@6Gl!WR&t^AsF`FV;ifLS2W=fZCE;qONGG$u8%j-uua{Ve_zTYjdz*Kmh zEV9Uq_tv`?iv9*w&;hE61W*H=pq5AhT`&Z?i5>L8I2b`ZU<{0cvBU)?!4#N$B?W|O zFf}<%gBdV=vfpaJ99W%XfSE84{y?gNS+D@snxwWiun1;P*c@O9tTV~mw!l8vj&udv z!vWZVbOSrWA=rs@2Rp+N*oE{3yTUQpjr0Ti!v#2i3Kz*BH4nG4Q?SK$0BKZ5WH{E7St{ze9Y|H28l2%5mf@DG$^kdRXK)i#0&a${xCN@ft?&)E zK{dD?zT*z40Ne>*z+KP}?j}ZX4-9~NNf@{f2EqNr1Rj7c@F3BFhoA>MOhUjT&;yf!)tA`6YIwMKx?@;j4EC*>~a0KnTt zrd`~8IHRe+2;(H1WU`u;T55$JJyu$2l~q<-ZH=|oS!;t0*4u204Yt{ClU;V%X16`I z*l)k>i-T0zAqFsMnku(p()3lU2a{&l#)e_ToJNdrEasuA4lrqvZSG)8TRCJ$yEx)9 zm$~b5m%Hx@S9s`3S1NXmYut0KYdvtC>pWUqPn8lFNtNp`GE`L^7@1<5Td2f1I0`(x zJra^XXlM|0bTSA;ASES9mW)%Z7^7T8A@*$vBLueCDzU>(z&`us4mqrJ!U>YN%=_L~ z4%iQ9c@O59vZf-h!8`|$cVOOW$XhV)7A=oqkrir1T0{6RFk6>HS}bCzQdVf%-755I zQ4VO0ae#yVqb2}@T>umEV2A_fe;+*lFPLcvVCvfdFaQWR2nf%kD-!1B0ptDXbpcf1znj0qI$M%wgr$fZ*I^Ya zC8OoXG)`fJl3g@L4ToZq+B%AvlF+YmCJ~C;C83C#4P(em-tc@|#y_cC}*3`S` z4i|GVbghYa9iyKVa3#wa=&~7|3BTjGwZu_K3Y*S0FqYjA9$+Jwliw%;DToCmUQjmayN)9ZCxy7Evw>kS5vqN^q)vrIWZ;PJ%m&Q5MG#)fW#D@Y++O|D(B77%|B#3dTEJeMRV9y3V9b zORnTJ`X%oo(AG zi_W9ioK!>RS%NPa>fOjAjp&{mMkhYa$hKsWh$X;YDq7bfJ0~4M-LZj*s>vBjnK6NZ z%5co2GlHxX;awK*1*<-^_p2|cGU?IibT9{|%=W~tAImbLj zewfKd@qOVmYt*#J;<{f(UzNCNX{D^iA*OwDnb45Ed}Hb^;Y2zcg`%VOSIloEosKnC z>YdDGDfb_KYrcg$``b&E@XkrejRhyfwD-+b!aB}Em6Lut5>vP0G+E#8Ht44_$x!T2 z{n$m4AetavPyutA?)PxN{P_H0dCWO2lZexrIpn<0^%wBWvb;#>WE%QmruXt(NQm0M z`5dGX)+(}3jVI@IZkWP^eAo=UjB{`FKxAt9B(g@2R7&!c%S)+=GD?>_%V87;B#8ee zGJTs7TikCicf>nv03ce0RS!cz4)BwZ`59t8S28bJY&=>}uMsyCAGy#%^NIY|rrl8cL1{_ux5h5weS*TH=r7{ys z$SB4SA?KFeLqN=NNa3_lYW1s$18Qj|ODR)M6H%4gVMo`h(~)@m(DnV9Y0}9;Esuzg zo7230B>G2Ux9~dJA1+x!15&dEQ=BzALX?3~deiSEmTXlV>PyA)(($8u_ zM(gTVx7~VvS5@c3Gm`_~`a;Z5^Su&EdI(!9Cxuh?RXq&u)6~q9KaxBgzBwxkU07Z0 zs2}K5>XW`#ZtirXBj@T@f6JHiJ+JEdm2US=3F~^*_rB*ciYSkF&zjP`k9QSfy}8`T zlUvgsgmxaFf?!BWb`#BDvyw%)ofOPL&3Vw$>=?P(|AWa~V93G;5y3Bs>ArY9jj#kVj9{Q54Q+#`eH)ws131dr-PQ zr0SQwitkOk{w9M?oABer<|S=b&IM@7jnW*)TF3UKf)x1qIC)vh!yeXPi-~b|?Db8* z1D}C+(1%I=ciFz4uT^>6zuctrm64Q2IQFnOQZU!jQXMC{%F+2B?ti}_?0csYMT;z zYt;|{PEp8CoJnp#0UeBJY7b07421|9a!{DZ1PsbRB%_C~9&z!K3aX&rE*ftqm%SU~ z*wSbK9t4oDVH-8cA)4%=sBC?mH{Uj(-MVxgAV};0^2o}lLbj4MdF=LASt_v}Bp@;z z03SAM={P3(MX~Ne8~jTq)iHILT?kb#l&2K zv_Psv6t<0!RyrlJ(juW$=oQQIA*qYmw}=H9nRm7SL;*04HZeT~C%97Cn-on2BWn%x z=ev&T{~HAuD%I4^q{dp@<{Ry;*l9~5NpRB)(A!#aay{mPcCFzGNo>Q@o2VwV5}2WM zw2^%DZuzEY4_+#Ut#`lOWQHCs{U?r0V#UGM!wRt%00D>1%ZS8uG31~YMVaM#!X6<7 z8?f1dwg2*Kjep~C5SM|5YEw?Fprn;+@+r6SWthY6yRp9`#6*RM9oNlQC|HnJ;olcw$ z*{YvW>hg9HHR95t0ND3mkWhky7#Un;V2@91YR_91K&VJULQXq9+mAQIOlinUb!jjt zruZO2fPe(Pawg@<7>HfhwmkVuVgTtQcY$7)dn@I_2$I%~nyiLzLYBk%6?|LmyiJlz zK+L)nmhv~9JxCZp?gzm4rVK+Aj+FTE;6@i^b2=|N10eUL-L)Z8At!)EUE3-MDQm|g z5ha5kDT{pI@$)-y>^YDt_p~lZt|#;r^1%jF(B6|Tk_iP%DW9iMl-(u>v84h6qO<48J?8Ej-!9(bCat_PDOKpsaB@_Y>s%X)?_ zzfrl0kDw(hlCjv%)IsH3)!TbM3w#-vvX3ZT)R$Whjp;n*y7?979xjZ z>$CQ`SB+t)-0r{{M$HGluNm0PBBs*nu8 zH*P@dAp2=rs!q#>;n&dxR`sM_W)hsyQpJ)YkF(e%t){HF2E^1Kqyw7pb^Sr4=U>*2 z2CR_@{iu0)c0w;qYg!UriHyE~yW$p%T^zC2aMgMhz*M=5?Z8sV`BBXF4deG`2+Z`i z6v#aqi`5(C6}CfFo{&o5{Ag9xsi*~%NuW&BwoGmnUe&`UEtgCjsiy5DaQS(a(4Y4N7aRaFn4okR;q}BpT+^fCC#LLQrtU8*fQMQnktg?8XwgV={uu7bgF#C*A z@m?E9IHUS@#I@>kDWnpZV2k@BFp%#0bq(sin%e2PSzA%)DhLWp)G!d_lGor(BC^oo z5-Ms0aygU-=(<T#WDo~XgaK31KG>Q8hN>t^A-I?|U1 zqmUjF5lH=~b4LR}?%;W9Jrxxt|9k9bBn1-g!PC8=YhnfV*A~3(pDJmFOyA6XqMQ%i)^CEn!F zfi&sVN6Jitqq5A1Bc{Y0Rbitj^rsx8lZB!@&ih6t`NLuU8Bdqd!(yc2LYLb2v`wQG z_-LX7p+1FFbknWaLzbYjFj>ON%G5GJ^{A4ZST-!QDVjJ~s=S-4v1<@FW2r?!!~&^R zTs|-rl0TL@x0{1qE5{TUn8KzBSjPyV;;K7M6|Q)NExZx>Br3$Yx1Hzv0%`TM?I4h5 zKr5~>)F}Cmp9I)3fV6osK<_~ByM3Mm=iq@B^}40{f)!62hV5`iWrP2dhyDwdmJ@`F zK^JFPA@z5xdBrbJ|CK0hPilH)X2U~1v(Iatb?Xtrb(#IW$=?FnmlBnD-fD-{Myf zdbS&og}MJsvU=ap6Rgm)pDMfBxh$YlA zx6khA^_A<6xS}!-4incJbn?ojc04BICktKVqQOk6xv!X2^iIsu&kK>V(7KBG894%> zU_5W_1II7#Y$#~zjGKgN;*+#oaIzMP2_Va3y@i09#qyN-F8}!Gp|^DMKx$%9IRz;( z+ZeH740dz+!5Zf?(LiZhlPY9^$CRAY$BPr(J`a7H*kQD8H5of`JO9I#`_ui@ecwD; z<-IZKK_7XE)_~-?i`)Cc@?dOo6F8HKOjSs)o}BXjJc()k!UA+!DoU<2mut_imaROe zaHqIM&T0mVdbyk)I?zogt6BL%x`XJe4xn7l0Cj@Iy=6>tPnkQ!Zsc-;^L;3u#qd5p z6gueP7K9IoO$6A&?1{-OiawgXOtMlUv;dmG)g#U}n13AIcqKz(P~w+Pa8inGTt*+- zc!cDvO7X#jr>$*#Sdm@?0y02cDS7H;%HRy_jt?fet79x)D zWOTk^+_=^vSbDtfdMSM7%sm9P1)HpTD$h!j!-IvYew=5A-K|zUynBwEA)%NA3j-`M zQ2fko((xN!+fQA(W8E{d+jOJDojS9V=07|Bvda@wXHoEdnH)Km;cPrex^U8;od2WF z#eWM)B0t@(?TNP?)tTfR6F5pk8Rw%7+tW}hD}oK2k0l3^?}~h4l8cZ+!@E=e4UTTb zqH8M!!KBL2WkJaJ1~Bq;HmDw3^)JCyTa1a)F8$D8o^RE$(QPPA<~)8T0L$%g=l*N}>C5-$G2!W#zd-tM&V}EsP~D=LI9pmeFr0G}Pou z%~g$jRVqt?yvEx8bB(4GXv!B+4BlU9SEq^YWAX-Fmc_3;c>L!AB;qW4@dM>?=U_8vsW3oZ2)2o--hdUFj5J6yPfj)a*wQ zcuq~4-?G`T@tDbfM@8>h?7DCLaiDux4D>^KPyLP_i;53OdC5~GykuwFdY`EK4@7w} z)pW;GM(*)S3tbe)d^r27V zFP2Iizfiast5L}AGz?62+Y(MBMcYqU{y<=u;uGF0x~FQUw--%wx+a@t>+9yXYqM4? zj8E5}D%r7?w5=N1r(@%aoOKV!AFSpDLyvT2s5tByj>JN}c5#O^lPYJ^nc7uH5G?08 z6thFGv#z8XpnyRT*z9EiF2Rmw5IY5MZkI3Verh$qfxvUv{Yb8-?J-6>?v;rOIHJ93 zk%~LygyQr6U;|Kt<@Y49z+vJIzSFMq}( zs)bk}eOXU(J)nf(Ue-W>y6K6Y=qdAyCE%gpQ9!}00Y63}LC5y7xh$Xm5`pL9Xn%Qd z8PlqFSJ3(?6Eqg}+V zRv;oFMuwNMd^q>sm3XC=Km#%nM`+8X{mw8fn7#+4nmMgi(Q_R`%@|81d`iz!`s0wg zYUVTkLOC{hN)7b9oS$@xUFX$UqGkvC8@ewfY9DO%iUb z_)`!zooyy791`Zeyb*hlIEt=e<`tcixZg5^Z__b5pMe$__#}u_$${tem3W(0KHoA! zh+Hc;%}((`5w(zQdemLEw8_>*4H3%d(W!B^e@wv8pZ^;fDUE8|0zkFP&e4bPZsQQ^ z_+`P3PixJ2GqTq+RRAX4K44_&yDYMnzy?*J6K?D1B{d^&XC;m~E!!_#pQ*1BOO@1| znyAEjMwKm+DGzSg`u3oZFtyo-cGCs*(Qf<+=t>uX!=F2|zRV#O_ z?3LP*_m>s<(nOnQo@kJ?wEIj{;wi>6>V56IUl*omdvW~?HhY_pOW=W5cXvNJ)hUf; zYSpanpEvBxfPGz6jWggk^!(>>devR(-+`J^v@}H1>}iCEtA(}gW-;SF(b$nIMxaFv zcpTV>&6!3zH+Ds7W#?Zi4eprCm;{~TS&lriacyK-IhFFcrOc#DQP6JCSnvI~Nbcuv zyUE#in3}y%HeyoeE+v`hNGO2hG~T ziB3vhY-Va82Yq`j8ZX0-eP~3R<;u!gdl-MnXEZ`;Ctsm5Q=Pvzhej^RrSt&^9Nl*~ zfIjsKY;#k)e+0yDI@9VwglofARfaTTM|1OzM^21nv{sF(!dA%5b+M_G^g+;vl2hJwY&OIsem_ll`fl0_%|TAnv5-!Qs0CHIC_ zFx}?qeeUQcWH9ma8aIIMeb1SXy0)2-c*CeI86_y`TD_?!9$t)_1qdy1$=qwGCR&O* zp#3}})nFlis`G~!EPD+zeu1h}%o~GqDnmsHOZ&kafdoY-l9G^>XjM2Y1NDbD0XQzU z!}=iS=uMc_mIaz*DzLgOpc+QQb+REKgH2g(^R9s7T84z>1$TD6sf?n=hN23XBdB5! zT3wDTA=e@uoZ{lR^I<_B*CJggU01o-N>^6PX=Ua8>3liH0z*D)a+q(_{e?X#2wOvQ z_n~tVD4(gfxUPR)$f9&I_c#?>d44z`-%RW-PpjO@hDUT6?)xk!O~81=0l%f>7Y-SqKfDQ3=$4h#5 z(d6(P7FU8*0F2d@`8~)$V|u4@2h^AWP+bxMNIFqFZfadA&y&&e20CR%9sQzJ-ifC@ z9P~z+V=22xNi+5m6PTC1lo+Em(-ulZC`84q8YHOOEtN@A^d!`h@7F z3tu248@B$ZvT|t?8^08jySB(Q_;A$8w9pGSAPAjz$cAR_Q#?o|36tiK+d5tTakZ zE0fQMwN>5Zq2UpzTSvz|UzFx*tM0J#^WrGkqAnxvpZrxtp7%Ksf;+WQCg&`crp6At z>vB#t8~y5u*bl{>iN;&Ll4=-gK;>v>pqJC z`nkrz@%Q!2Vb>KWv=2n5y3&pIRT=xY)GFrsUynjZG%C=N*KE3dMTc2)tP^8bHITt{ z*-?G{HgsL%4vSUTqVN^_(as)%OS{@7y00tqT_roB&~dFJn=e>YeCW-tZkv5)y=DRf zy}B&_D-||Hhi?{f@gZ4l)9v$z|9D|LWJGR5S8LG=-|qCh*(JI!6u)qn<%@Qs-EwH6 zJL+W&vbai%KX>X1|8uqf50QCH9i*n4MKt70PH5ht%GP)qQcsO5uE&9b84BB7qT43R zn&|Lw9n_|(YD9t$26OV9!TyblG{6(IPsi6JBbUaF?rFmy++)>ZZ;nqjpB^;KU#7$Q z9(Oc*!uXsKEw3@DDRG$L6K_e4>)pN%=l;-TsPM&U8!|77p}=5}By{F&^!1q_fv+7+ zx^{Fa`nqi$sS7YJhS$3}+P%oEnCDDWcY7fD-}Z}Qt@ar#+U&zd2e5yFQz*$zN4<$K zRqS1{{flk4+@HhTd42#HN6IdYsLwE|cK^DIXg9OlM@&OyVZAD^ZD6TtaN>EK^RgZG zmUOq@;oY* zFE?gpZA<+aJ96Q@twk=rX|Z@LG|9MNirFqEu3Wa}n=_t}?QdyPk>fwg?mOyKUCJWW z6tC#%+IC-Lpk73>x{khcL@cx#oiybwq16v+DXAC}ORMXb+Vvo-6GrG3bQ&fjsjW>* zNu_p=Xts6J-eb*>0%EGany0Hog+QwGHt`h;s{Gc9ccV*jp@6r8#S0i)rfPY5gm`N`GlOC5%`B-R*~@5E?ps(}5B1uOj(%Hr$cvYRu6EMj5olMVax3Fmk~16!wcoxNSSYtxy#e^T ze0P;n0Is90I?;~n+r1H?YojXROAuA3Es*PiQ7V8~nF{ndf3f65k7pa@15F8`xz(Z; z^1@mGKQuO5#$mdmH2s#t?46F+gZ?6=q!Z}XFNwP=-r?t_LdrMjh(qT|Y$+Gzdw5am zjcq1MPN<6E9~Tp9`f`F?N{90DPbQ~twV0(dwPF6@m*f250(jV=H@4SK#?Zi77RF7I zwL0mk?*_}6286oU%%Ek7QPntQ;$}AVMwv$qS$h(ewH$B~L9`3#h)HDGYAqCLIFW$} zCeKgzPBf1fBEaQ1aBjq2eUnS36gWe+tw3v;y?l;;Fw`#hWYjOq>FsfROwgw#nWV)> z)&s8#<41bl%@Ug{>L64^jV!J}hjgiR;+~B>v>Vbca49^bpNZ^rS~t`hx!GTrm;%bqOIFXJ(_%Nm$)Dmbv_8}kslaeV0Fy7>_ zeo&`bpU!wVSsO0}Szq!KuPQe!3oE77kibQNZd43I82o~(oS*m}A0;shrWlK|l)u1y zt1uHDsYS>sU+K+LD#r_xC3gi1!Nu_%JztJxA|G!kBjPv>NV-7A&3^fd`a{%{J)atP zsI`&B!z`@%nm0p_FO#||tC3RcN$L$`4P5;yPMu;^5_)323#(*X`L9teqqXhxY<6gb zZWYKCDimdDAgjuNrHI0>MjX_sbipOVfkLH@Te`1r3)d3SVOEAEqRjC*`KfEo9N0lY z{VJKUBb#EOm{gqy?85!j-$mw=1(uD*x_%2e%Vkq27sgw&dA(wkzpP-@`}iOGvnq>k zoD-5bOIcgN z1_#BY*gdMMOD)^KY0cB-u{3n4MEL$VGdu$cC+9^rQl5IB?#$(&Oh>&HdU|KZHmUeMK22Xk z%l2HQMK3jSO@m{hxIwSPGvg1HqLi)}4ZGmFOnOIvHd!!>hxZJsd;tcQzfWx^bLUq$ zILzjc&Q@n>^L{~vUdv`4Gjq) zg&8e_c=@0kQt`3yFvgIrvjFBmF)uHB!hV8T*yz%~SI89aS7Zh8g`rVj z=@zK4OZ*lzyEt%AO&6e8hkHfrK#s{ar5jKKiNM^={9u4Mk|_yWA$a zAoUk4-2ruLTB4F6E!RQ>{+{g2nU#Ta>_qyV0`Po9J$$opw-kr13X?oS3iSXhJgHFE zFW@TS8QTqrRLeJZO}HKOWs!phqQYqepIiDc$i#Icnm;}84M@C90?q)WBWs40PC;V2ou^4Nj zc98kdyc#S90Zaz%^b1DXa3J1x7B5_(Nw?U(O;Tvaca;i+|8b(PVn_8|Md+}k=8d?L ziY(Mlw(;o0MXN6i#A<9=ozo%Vhv&Q%oWhh*DgPBJ{C#f=&tpMxkUuM;0*VnFvvSGy z*b>qQ*Nxc&yxRHTQ7!CEPAu#KLcKZfW8}l>;$@}ob8=O7ED18YeDAH z0jSAa7ALSu7l~uYCj%7cs{gD`$+o>7k&(h&OPXwNHO43dXfbcPD#gz>S^S!NXXZ_< zx+grtj#hD#>5MGq2Vmxan6QA??Dh>ZhLh8ozzFjhdbMtA8L zFzP$ut6du>ugVmCS~ZOGQyG)rp){ufLWzC#4Y%pP@YQ-nhLr7EeGBd4sC%pi z>YD+=pw|ie-C!3XkQp=joaIgC?a87FT`+66m>N#fQdw`+k(>=s?VV`rgB1rmrddLm zoC~9(W1&#U21cv)LWMTaG#CW*ru-6YR|*K_@x{e>c+ znP|O3(Cvgwr_PUb5arkHdYc^YSzNW~c{8`(Jc$53y3Pwnau;C`N$Q#SCyj66tH}8rDf5es(3uodX!&;?BVSSg)C>dqbODuQ8()-kEu(82O6F7QuH^(x@NqUBj1D+1u)=dFe z7!7a_AzIX3HNX${I-?Bwx?q<%eh6R6F?Zw!g$dR?Mx1>Vir{YV*0;#Maf9o?%z0}z zzqP4)4L)hE%w})53N6yJNhr~b77%!#wX_3SZ~C?X1?+lp=2x?ZR|T!?=8BjD6}<{O zua00>RW*Xn;h^P9$0cWZSH-3J&@0_C3+c~C0-Qb zXz^mLc+K=zNZKm~L6v&Xhj=|aH1Qg+T1R=J06v038rZ}Pry8iD0h5UM9t|PDc8I6P zYi=_8G;DP@{pmxXC{h`~CZZr&LxWSCqvqXg6sKKHfO_~NmK9g8zS_}^j3t&<`D2t$?x;Wr`bv}X~q-x>0cDCBlekFr%)-C-$}3*NMqA_I!83XL6Fzl z;G~ADb&Rzwqti}RK0+f;LB@zW(F`5Hly>ZRA` z+>>tuC$t5*Yh3kTJXLl52pOH(&D%;2@Er3>U#Aj(XXzv$=v>8-KAd(W%bR&Ux@5s0Wi-->LMP1}^N3vl9{X?y32zM@ z%UfH|^41jaR#!+Muv;os5r9$&KsyAObX5>Z# zR(X^m)=`W*@mmrN=CCn3R4$f8UfcaU&?gVJD4Z;#@)5r{6{3!`{l^}?%SfkCj#L`e ztXq%h*RAqZD8D!*kdD(y0)$^e0@SZ8fVKJv=#VeaiRF+w-~a&B$0Jz4KkdIug^@BI zTu5RaLK%3Z_b<;&r`DjyRMN?ZAPzWA)%byzJNXcW;qhTD-zAxNXBnwEL*EgjA!)lY zBp!d1+FUwUpP^ZdIUv^vJvE+z%3emo*-*Z)a09F;Jv54G2jrIN*n(FWuvOSWV9k;f z=#a#mWb$Q0w6F&QI=vN^)c8^w+5E1A@K*>mFX)(V0w6kJNacecCld~$00F&X3S#!$ zjOFN~xeAjI%dWV#N z93_y_IDf;@uRcF4F@s!!P|NjSfX)=*Wk$8b67Sfnh_kr{mN<(m2qdkUFs*xwDCle5AmYYc6^7MhF~4hCdd5(md4UX5nDyPjA$TW81Cg|+E%t`N&kRvcyOG(A+u zyA9H85!muq4W-k8TIxWrJy+gpNAB=4kEsONaH*jyW*m0g{|WdYe2dc__Qw@7IQ!*d zp^uM=Wb*o%tv1i?vu{Ma^ zEDy!NzE^;G(OTMX*o!16bt{4hT?-c8gV-L(BxM^uNWcd@DN1*Azz+vPeaAm$<{Ubg zt%(OK$MWi50)jkg!*E+_jbuZQY%<_mw`mfzM_Shr3 zk~|ZfLvh%JZ|xqdpL-f!hkZ*@lT>Z{MAMtTt2tT$oV}`GBCc0o5PHTL69+X=gtX1< zBoyEALx=QslI9jpV<8wC-39`yCvwRe2r#sL%{pvMD`$m#LRjvJ2vh5VfcIQ3SbWbG zy<->Cg%!KR9G#(y)`>>%R_|S25e>hk!e2q-rPPZQ$mvGY$$m9^A1;^lt4(moA8Xg>U_=)jYbp3HI6vl*cK+}uzy^G20#f%L^!MaJrMK@79q!L=^104HDjFS^`Ap1u|f zrp+USi0KUz$~EEvLx~R%rjzI!@hP*k*@OrRz6BaT;~$yOIb$v`7@xuF+z+-oN9w=4 zwf)H0Nb-uS+9p-K)YE?RUCb4Vj->0b=oWi>G%I;lJ@prv47B011YML)M+6zA)H2Kj zSLJJ4v;hne%-e((FkcbC=;C!AG^@?>S|NFO(7HICAD>NYilF0HXzT!1jPT zur^=&rM8f;ZSmQu8(NO;*DZgCA5OMk{+4{oe#?#q=Mbu{EzE@ z!2kKLXNWp*XTBDr$s)#6-4`~;5_Q4aEJB6Wj?z74P0s{B$&!m)T}5*i61AkV2|jq6z>%jrnDJzj4Vp~Vg? zHJdUmMqPeEKgyJWJgilPU3oN3Tvd7J3sM+xjMTMY<2OyMVNzf+xK_ zqVa>rKg~;0`EX`^5)f`6&ZNT6cxqM}E5M>dKzgYZR_E2FmPngbXj@{Bl2*XwIhr4| znHb~Z@%!e3(;CN2anwA^@S(Lfo0BGfb4z5}*XeVGijxL#rVx5dn?iU#qvVa8QCcUI z!tGeF^CXu{l@?(c{XhjJMr(Jf2?@zMXjB1 zSRL*qwpV-qwqdbZ+i5Q#%I%WpX(Q4xXWq*br5`Q8{mB6=3X^4@fUS%+`5jilU&-ch zttKnrx!BDZ^h5}(W$ABE*bo^m#?$2wSrqK8wxxBe)Qfo>TGcM;wcWzi`)P2f+JOKm z_UV_h3r)We4<`MP(4`HUiDcY7Q?MEnbX?)}WcEJ|Z-g>KTPCY(1&nalREu?@HRYV% z*b>&I#E?V(i-vV3I^K*AU^ek%j?Q?8nYUvC`u;crg~ow#Y_R?lU?@Wli?-u}MO-+%YE|Wp4~ing$q|gJF>@>`r%#b5aPY08}`2T#$lx3zvGa;#i^uRh`kWK;|G!cB~>5QLFhhOZ*A&Y}3MBlXlBYIO3d|vibZ| zR@Y=}#5yx+i$F3-acDT8GATMdWK)3oL^-q)#06CmXx1(9QD=zW=t%0*M$Ke0W}Ycn zj1h#G4`LPnDg)Zd?0>ko_>qQWHmi++<3A_#Nd@WKx8;{uik5a(8&hKA@nmZCSz83( z{BPRyG<@3t5eTE`3X;-Zi3$p>djLZ*giNu`Ohh>1_7gs~sWoI5a(_*sw=_r<=~U~K zn;nBktCiqc?2gLeLt@n>s<&45ZUd!;)qTJkGI)mb<)&b54|*g z8m!o_u!Oc;J@Rskj3zsgJm8+x1hRKZ_esZXzrim`FSCiyLhcVN;-!S#y;LjW#OIe% zrZfpvQlXp>ITGMSKPQi+H@f|TX3r6Ro;-y)I3r{wxL{HJw{}o}np>m5#rr#qF1RGo z6Ha_j#bKI{i~{|GGw$yl^iMOuQQs58GnK_IuG^5?IlJGC*+=JQxtT{JJ=Iu0;(Ab$ z#V(^7f4%-1O8GE`enonnQR8)@`ZXc05w3$zhA93^XqH6qIF!JJMZif-QMBd$#(Te%6`i8 z&h^r*^2qH{v$sON75pA24E)DDoY!beHjLHntIL{bnBet>@T+NVL6cc7JS1G=d6RJ+{th*a~9cB7dNh^)WYjER8&*EDK({;A+du<)Em_ zh4#JtK`e^;*O#?IK3YeEq5{LADrnx+fFg$dNTBYEt9X!v&E6qO|Kr}aBGvtVT?>S= zWB!v}9IRhFR3EX8(~cbWWwBapxDvepup!ZCvm~=68qq1zY{@A*_a;x6mpRA#CvA9d zLP_{_1+t8Moh+O9bo6|sAZ1XFDTkt@I?&w`8}-*?KtsSTR0Y)=>lK{lMqheCQ9;*t zDT7^bZ6%RRW@w|j2V@6buF^ksrPS0h4!>?8m*lY}rY8kGe7(6f9kazT^n z-k0L2`_d|}uv6)&%+fxIq2Kx^msx-grytzFl}z3wbN4-!Wx`{M@1ZDDa%2p|>!XNX ztijL<(6FQZ0aJ#m5Cz>5g4@N6Y0 zyc&g~y-V+tCF}k~rf1Q&yRSm?I)v=wy{m1JOJzCa&ExpROvF(vs z+bHyXGSyB9%{;ez-D`{;n7n>h^^Ub$e_E)|dWc2~zUMtz23z-=X@P>&3@(G^s3fJF zM0H@bgOt0ml`r3r$&b{tS^uys0q>hhi+AnICZA9qT!`eF{*5ac#6SHRio$;HJQhTZ z&fLC-N{CE~Kod$tde04;1QG#jzOttkqT`0<+oKyt0B;B(_fA%mcSgN-GF^Cs>T5=O z1>VnXeBU-I2w&RFE!rno!}nS-+SBM$r~RDTug3awta-!Rsh)9zR(vRUV6*C(f$z>9 zZI+11rS)_@sL?VFEVe5cu{qs-KZoPw{Fs}uurPLQ5?k4T5iA;2?l5U{YnqL8xX{mo z)d8kk==T|Ox)VJ~95qg2FGwcl8TR2w&~qRP&>vqp7X`4wpEt!4b%0Bx)74i53~t{T zQKf}HezCF{a^&~N<3~r*&1;_Ykj&h(7Itiv9no1=5o11iW!=FnSnx<4Es_krxd zu_`L<;H*a0rH`7y+?sge(#sjIY9Pk_RJxXq9nu$}4u=~Pwt%x*&N!JRgzQ15Mes*b z6{h^U#m#kAD=}dcE!8)%^miaW3uP`^=ebN%mrflszN|cZnIuM|R=;zNzxKWu*2Hb> zhm>zF=iZ4IKt(w6)bb-qT``TvpR}%5+NRL1LI9{HnoZ zd>0ES2OwpGW{7>IO4KOo_@($Zv}4j}pNJE&ekGve7m^G;arq4ZvVHYn=T%`7~;#!j#KHJ zT?`olgN=(<{QR!g9HdF|+k9$e9OCj0F<9Fsy=~dojlgYX>r|(X%@M5-Z*}= zq9LJ&Oua7wG@>k%5Mjq6hsT}ExCl+Jn{tWSHy1p!?#j{-sAGa-Ce{`&WGJcZQ7+rjkkXjkj@R+ECTe)ls15I}`1 z=mTwe3QhD~lHcjtJT0&cjJI1GxBa@kw-R;dxJ!Q2rMCFSI(vk^iXUOr)|%2pHBP*Q z-5^Be*iA<1xf8M;wvySTI@%k7@%i7VK@Lo*w~tbXl9XR+A!j!8o{lExYsV0Z@AX1F zI$@QlQT$Ljq>Z1XpZt$T`2(j$d7+-(wSSDHgZvZlxdxLG5YW`1_fE7$-6LZLE9b@< z`X1BiSwnoh>XLU!k^flW&{9jlmb|fC_O8xY)&%l$xl3AV6v|4y1xXJeK2g>!qeyhi z8`ASlzYq^5ejnFmjL^iLqtzIuNLP&33VWr}ubssHoAb7UEHk7sSzT;?hr>e18r3bt zjJL+RGfa`HZ?eK|)4X*~5Lcf84tPfXMe|BlVeiigj&T+`SyOjt-l_*`K@geg*dp zV6*Y>UpQ`f8omv^+^KH4By;>TKlefQzp=&u%*7(i*fcci{%F#&q2FfrO2&=&_9_J7 z#db0s=ed>aKxQa{blxbYvA+K++n$IPXoSA1uz?UtM({7UHRLtUYeTu*3Mx7gu#ym%VpgUybDoH|)f)!;pfJzg-e zS{|^on*?R_ZgFAeBHD!TOp7%j=2dwofOp>rIHE+vR_(UB$ z_8AA#S&6udn`M!XiP_4$bl-&`S#UI)Iy>5#`KVe<_k5wfE#FFxpRuI*O`7&yr}Xtt zAu_(fx2vD56S4wqo|xUx!KMC?{vz) z9~^dDn_Af)%aZ(>*6p3)EDlaPruhneJ#F(ii$u9O1m*mnld?cJ6@QqKniO>t2uEw3 z+kS9bQnumsE;C**Y9W=H2>Eo?*LP7iO-{^s7f4agGJuO4C}K@N^tTcFXj~_3nxTwG zd{R>yif(621ZNyKszxB&T~te2~Rhplr%)V=PcNP3R@3L1^PLh8(bC zLpJCW`%M$}b)!Z%j{sOvAj9pvP_9Ei>!kNGcs_WJ{EetOkLz^2-}@V5N95))B|0od z^parV@Hh8Ui0bhb4#kB{WsN=I9WoUZbx92!$%Oaa)TWBv2F*Y!QrIo7%3 zqm}&byYS!#EDUFmp^aKfgD{VAt=159mVn)B^BHMpXSUWhkIm_^!_R1^*LsU?Pv=HC zc>L>rX;#FM2NG6^M??-<*`zk~%=(^{h;`e5fh!%|nD_)^c`&tb&PWiMBhA93HsCG| zs=(+`-cKEK4@bU^01p8YO^RKnO% zVte_%E?Z)$^u!`Xr=;mLuW>xceXs@WIpEg%nnVX9`7v@DqVZJj9Q)#C;ij>g&hBNt zF(ZRg7N?_o7_x0z+_%) zyZO{Qh}@mck_#H(R<6)tX6_qPXls!E7lOWq>w;~eD*-j!GG?;RcIEA}VU?@NhxHrlVUtzt9LcCuxue?ui?0>axooH?{ zGB3~R zx7*QUO>jIiL8>&_TGAW^CLy0mN47m8U5HPK^ks|iV)GcL4CuSqS`?fy!Wce;Qk?6E zb7=(yu?|aljSAGy<)QND4msag2!u&Xzi-j;B35HKOLC@Mr_x!IUhgT3l$JkhCswY5wJ;kEiIo&r&iI+muO3 zROF@Uz`AfzmPnW_5?h5Li)f9^pkUzZX$6!b4Yi0?h^u2L4CRf^-#KZzTw1OGYr{q5 zb``hfE$5;@@!Ow?|r54fPelgF$sy5jTmJt1eI?^v+!`Nh_= zPwPxhNO0PXb~dqD{XyfSiAkB0kntL;kDpJ+)@&eFdJ%K>)3a6@+~{q35jG4^ zSQU(0B6p>PZrsOJ15rTw>j_?n-C9{0;sCWjUzNTBqZU`~=qmaCbfol1Z0UwlkWrdY zb7di8{mLDSQ(KSJCZtgh$C1VXOD2Jk8P740v5mnZ@o%uW$d4%dD!P)%xPGPBTDQWeV8h<1^x z(AF}8*+fbzyy3e{5hSx=yMS^j|7PP19);fl>b;j|_OkDW#yy%u9+eTzW&g50LUu&O zZ}OY-A(O_q`8R71N$fB?8NHH+uE0wM!0ZkQZ$|s8B?ZjOGkq3f)m0p=@$Ak(bdb6~ z9nLeeb49Mygg({cp6!x^g0w#6Qx>7-GnUqH_EZ2WNY%lDQ_QSvq1%}d8EsP^?-9lq zxYN$IVt)J`MPMlffB#D}=FOcheW@~IgkzB`5TZAZ5Vp7C7xg|5ho#a-KlEZCEMB&I~aC=PJQ|LCu z@qVW5vj*jtB^M;uA_gK+E70Obp|D1EDEy-r$k|RjyctCrhBr#6A?6~nl9(|sgILLL zrG(f2I=zaQ@Y!xCvD<}GsZA)cN2w$>n?NeH3naG3i7~zcg-%zXi18&FV)6@=pbGg( zD*yP@U<;P?HOvD?V! zgc-pjvKo8ZJ^sl!!}KR`uxteks&C6>jPQrjqF3|mD0+Wk&i`+ehgSTx9TqFC_LOL0 zbyAKuI*Robxp8V_z<^pNeTBFpWq9}a4)0iFabML$XOUynC`+C@mHKu|302pyAkVX) zA~#`qQ^!B4wS8x2xu)dho4Ts);G*mVOwI1GO_W6i4fU9soZ={pGr&&RaJdaNXD;1P zm7y{@7;hBpo-4LWBJynZ2w$Ydo0P<7w@LEq?uQv#k?gUBeC9CWtraO=>(?e*fN>ey zg{4}9BUTAV=cZuUK(b7qm9blvB;^Yr|3Kvs(>4t2jDId=_c$$}SKO$Q$CouYe!O~czoN2{jrF^D{uw)wv>ckwl$Yr- z<+vm@!@og?wogv8_Y;j3^-W&Vj!xG3*XQfV9mqDTN7*+_bMzBV7LH1pzn%Ahor?cw zRSp|eTQRh`A15h%Ke8Ocd$tWk>s&cS#m+ok&>{5Xll;?s{&XWhfc<@m|7^qlk3DB1{Yb- z>Azkl@Y89uJ?BBcdr@(@Ne+j?-)BKP{1j$8jr#Ti?m)F#Q(y(ybI6u8M2ilU5%4te z9`l+!DX0waB}?Vv$ehNTUwyau6({U(Cq;R^}n|fS5a# zFB;u!oY-o!jGX8DTR>WG(TNlM(XQTS|9{D!$kz>MHWso9Scy%o05OEizsld1*qGG! zD1Qpyug}E|`+In|c-QPhUBkBUCi1>i7gcWd{ToaEf64idxhMGJ_(5e)j9tNd%4_PV zz5sN~po@iF*o3xG(P;-JI>j8#U)&Cl!i?x08 zEUng=nW+(_8bv~_ZVuQvN0uUxIy4%EBVDA7wrI4AIfOlOr7|dh8*7S<7qPmo6mc^^ zn<0KCn>OHZDGi?8@z7fnqf5)o)J8axL;`xz$NnP57}kn4HWt`*oD?s$Q~ikWBfKmn zKi8#EI9wvB$(|Y)ilv+qcm%9LpE8c50n8Gp<)uW}Q#g8_x`)Nsngd!$@LVrejk^$@ zEVDoJLBLTBosLweQNo*8R(RFX{F%6`S0{&K`_OF8BT_|~y(sfOJEB#B#mZnug2JM= zatv==^c6~DZA!S@5^G`7#_@QwDb#U1ZZ*IygIXGIFh;Rf99ke|MQUR=c%cnYP7m)l z1yUXrLV&Ogs=BtF-WjoiriHSHkY!|wgiH;kkkKGSB5du;-$@|!u7yB?9*`Py_BgFG zVkIR3Yo6QOFNI7Iw5L#f@XMg8NUl&pW8HJs0@jJ&oofDp+SBLk%GW|p)mPgfK#CAM zPH*#XdKqVvZcbsU;&r_?2U-i+mx!cf?EAlhI%tCsS`Fna5rmPj(A!gF2@@M)AelCH zgAH1r5+@Xi9d{~q_s?+_<~!Aq4yQ<=aEc;RqFsG_4i3z=S~y0S0~;+?47kk0%-^+t z5VL-0JX{Hlt-bD_Pu4uW1`dz!LKSYzX$Z6%;+ol*@w*TAqqAo-p6HyJ8M+9EStL>= z+r^}fInWO1^pqihxD0AZ&^u6I+FP+S;$a(Y5e?h6j<dPc65(^mX9W2v(v+=K0Vcru z^ylM0@nDXOZ(PM^w4q0z;rehm{JVn!+R*S>1T8c?(EbeI`&oNgyG-j6Htb-HWQ}g5 z$Olsxe>|~~)umgVuzCh-DJx6AGG@gnRy%8S1tl`$yz_iy4Go0sXKi6URlC%wBvup4 z>#FpP@j|;Gf0bLCE`WwZFWhyxT_9*bYd`C@Wn0qD8?521Q3E6BNgAV^UQ1426dpd7 zoqaEAq!eJ5(AFW!Np`${NhNJ1s3y2nfpy@NL?m%xn2ajiTn*PKNNpzE+TM7hn`Slk z(U1sB#YI*xZEyKW?m4me0+)M1EIx4Dn$C%-=9p&Q;9r`IyKK9RyYND^539}8c3{y$JXq@2*`-&Zp3o?W^}kpHPv3;jZN)AW zjJ+7YAYZe?MCIuml7pR?jNJF)*Rvs!)-mHWdK5FsU$&e#QNXDIm9rss=EzW|b#Ft? zQ%NW)@cDK;3JWIiok~L4qQ`-6{8B>-jdgKQShIxu^S2GF6zRp5kpG!F5MZm_{ABvM?&99p!1U>l2A*UmZ<79EI;!}R~g;-ezh3yKXG7p9O zG-Sgd^yA0(bHvBW#URj{RcbzPw7vIt;nXs^(SEiI-|b#4FyP6_V1gl-E1=&u*6U_ z8fVlysv?oz@n%P)*WY9kljsk394J&`6)EkNnJ4sTaCPX=+Tb(#W0f88oDLP#Jf-t_ zI^j1HbI=daPa^N=WhaxVa|t-;6mDiFLaMsT`fih5{)KtnvM4Hk(O?BBWSNkDXfGLM_d&P!#>I;E16-` z(ZLw>Ml!Fe84H`Z6oqNP)ZPRr1A0S<$%u7t`JSz}Z>-AOa@;`eM z?cSH#W+C4xl7V)73=f5?15r7-SnICu?FZPfK2uSz@=&62le)wAx}IA5B~|f@C=@@< z9o)cDJ&%s&`PQz%n6LKf3%2?Vnc(w!^k=MYq+N^yh3A`bOj5lU=Nt3@`hfnviiImL zE1P##h3&X*YtDyg_lwhS;;5s`%Y_$%x9VB@dG`ejlQI;EpZw6?5H`bQb6g zdgau$4G-w=A%qG}<1zhe+Oedu)oe_<$@41vPU^THtFitL!TSdH)fO*5tuO&Ns$AG} z$XF^Vvw2BdQfiyJ6?CGb7>!+%!VvMSR-3&8ZNN5r&!8~KrZmxON2~@se*uYlPnyRw zxy1?4GvT-Qb_uzw=i(K4rAn5@7h1izv`nqcSKPj>hQE#NH371*iU4M)Tznld`&g4<_`VsIDSnA2bm!s2FAy?8`Cws>a;OUZQ0BKe}use6P zWj;K@@8SQA0ZdKyDhT?A4bNeZf}12!owT^+3>dGImb8VZ=CAh1~e}> zVLaZ$uIhd$rU_<4DC1On&PGe?*PMgy$vbR#&ZcGkzZ^Iaj5uq;5_f8yLBPmMJ1k(Y z{(m19N8D*k4MG$L+9#n7}DAdU|DS7J<72fy=!JD^s-dbE`a=cjhPAt1P zq%cla=+WwJ6-oUIv$RoWZ$<8v$X-%bNtUAqDUccJI5t&cJo`$jL|r3P*b40@c} zPh+$+#dk-ey6s+}2rNT|oNm_Z)y)=i%TOS=WZl15tH1w!fyrQW=FrKGx-b4TPNX|* zGzj>6F@e^eU}$RU(?DVpqFsOQdK#1>pg#r44MQjEI{thK(d~A+9RdzDm`oAEGh7x5 zdQ3i5Ti7eqgXmg3`iLHr+m=sJ;;mReb6OvNQ%7oU{;U4 zVQ9Dhy}J7Hn!($bx2yz9aCe0GJ92?`LGS}tzz$Fuc@HPJhXFjz|3ECX!UeM5;#(kG zbKr&>xV%~NOXD5}#UYh|1H-XazB^5pAd$$N__8g_KtiT3AwRKov3PZt-Lu5OFWl4J z6?HN_P?(*&8O#WeN|i-v@-2>tP+s&xh24L!&a0MleK!d!#}jy0b|_E^b&0PLTzBpX zTM@PbMMNRT2@&HE6NErD5w8giC2+D}2Ap48Y+3`LN{uBxQOzdNC=_;dq9p;WuZ*@N zB&y*68YKw63tw&sCRD(=_<(bu8umW&FPlz~$#fZ!hE{&2fIPmB6(QMvg7h?sNh31p z5D*)BkOO%>b~0Bh_)DF#afCGp>1$8f}h^A`jq>uq9^ zJLJwdo^W73*mhALSaXyk51j|PjR@QTz|za%&+t-N+0}3kY&R=o^%f;;2cgY^G=VU& z#(2UU*ZMWm&j8)va&JKJiAi$e2=qez0%E^)5*T}Gu=V~ZVBMlnZ?KpzsFYV*RJH_7 zbdXZ1Y;jthJ~%MSBJ{e^7dM)qF+OtAt~3g9422PzyRn+0oOCmuL>WwkB7B2D=lPXK z>;J70&ZBShYOib$1TWQUE}hh+6`Jei`C%hTEUWeSxnTtwZ^~OpXjYl2wtx+%sEjV0 z6wn^2gkpukR)&c9Fd1T_2TS+EUe&8uhIV^K( z59=0Vv5qC@7?5o3_>d4rI7r4_^0Q}-Pv`)qw!Zp3%7KsF``Qw0p-*NnN!-s%LfTGc zDkWWj^fqq@2wm8)WLgN?{Lq@(!z_r-c=8y(c z4Aic0Y@cJHWx;@Ct48)>bRn9f;>n8OP($a|Ko>Q>p9KXvK*wySY#K6XkC-0!-+$8t z8MVD)jga0J@O+vm5rKK@w#;a&$f0e^Jj-lu4tkBFao60iNljhR!3_97Mdkv1Q?Ft-Me7am#aN#QEo9iD6h@p5aw!6*+dbVd} zqLCSGiqjd$bOxR_m!71m15(u z+Uip8v%Q0ABkA#~A?sZ{UyAqwpUn_S&pQArwB@prBrE%*2iDjgbrRRt|A=CMOx6J% z?(a+D0ytmOdv6Ovp1d*)w40)%K~va%fZ}G2#&&=-^MSGIp)vDWg>2e9@N4p9Br2(l zN|K+93^nzKnk)z7EU8e3Cll(hIOFtIC)APYfjX?Ipue=FIJO<@u(ke(j-m z-gMWFL!J}%PTqTZIB-y#s>=k;Xh`z}!5Fi(!0?nS&~=Ar>^FQ&5g}a`2rwIDCk} zu+VT$OVyquf(4rZj}Q6hY^}qKa$o{}bKIa+t>hZ8c3ez3I$+LY8bJgd#OMGs>|j!T z>R{!l0-tuk8}hB}YaNPjR>WGxy}I7%9T{HbG-}F8e3*xu|4=+s6nTXg4$1ypuuP2xEccom>FX#W`_|2OMCD{e%BEh z29Of~V`R-*b_26lArWBBtsW}oUSDKj;$7evt?n8F_OQ4vDtqQ}^h^-i% z0LsYnZ6hlilA4VjHe-`R%(Lwy(W^?xH(H!B0-^M=J@<$Nx3w2Sa`37_Tw8RW5v%j5 zEe?MYMoMX|Geq^~d-y_)6Zbd<_fgk@wF48S{%lC&DMgqWY^gixHFXx`Mxnj#0mf4& zSm1$;jKj1M?XhI-5k}R~D@~)t++X*rIDceyhPn)b+|MDc6zQdc+TD9w8*2@!ZK-=j zcHEtlSpXZhj%W>CX1gYx(dFFhtt|IYYp#9V@izs}p`Myz@FDnTnZ&VY$K{=^n)|n0|%y3XPz%vgp_-QJgyYb6~Oskj}rvpx3^6&9P2qE)_5v=VuS)3%`N+nHmt> zwRi1&Ol)ydBlTvxx{)7CfU4UlA0dBbRWg-#`)6ND1mp)Jy#Ln)d_?s}76}zgz1!ky zCGS143)nFq&td@t4$NMEW{>sy+OT6_=C(6COxIS0TsPN#9zYGZ-;9_MwLsrk`+7KZ zGIuk)x_)s097dDQ1@q&Qhnat&Be2VUE|&Ou3eKO{{;BC>-7en93= zk*(U^bY?{RHQ4!oK6|gXOW8e^@Bei-DKu_JeQ5LKHw7E1b>8Q_7uvy16k~S_I{os; zXeW2GYM89L{(a295Lo0qB8Pb^i(LOW9`D&#(oeCg{^=}?n2h^U`Z#+Zoh+?Z)f9jVf2vPCkhowpde~NAzg5LWkU4$^JM4+?D<=g+?54Qld1o zUEL&(H2?y-hK<(AWYRu0(c1S+UzNgRO&s%!9E6DFm~vk>B)_2lkF{=ixv}q-cNt#1gk2RG+D=@TP|C<4*3bS zW5fN`|5y36HuKP^PU3i0ygzj<)&eR1;23dwpUWDUk~H9=rNr$W9xel;)5<9Lj!_+2VUREp#;1hsCIoiAwEl>HM{Vv^5GB1V-B9} zwb0`MmkK}dz#V@d<*7YxQnbEj`e#sn3P!JX~f_M9yWNN;{Rk?MAaXuKw#!Hv}5azeH!$ zzO}wP$0&>pMvNQBT`_H|KrVeSeSH++t z;}wT=jW6N`OF+McDW&G;s$=hm!99pF_E}`?ISio=g{r)W28OSEj5aEdOs;_q5)9K@ zt0P=z#Uy(e=aKtYC!+#q2kN@?Z9Ah6O=oxqqDLMF{AWlS{I6PvKO;BSVF0fjwr01j zwa&s|TI=eqOonAjDj}>OUJutcGOIT3%_i$2_Zg#gb@xJ0t+#{WRjfpx$LF@X{n)CB zpU|cNe!rW#@(&seHLr>~Mz!j8wV>W-H%;+7sE4Tki|dQmD;iTfNezoufqjWNgWb^h z=-H3G_9CX@iENY>Xj3p1VBRXUgSLtu`0r8rgLj$xT=3t)OH(+P%s~hkE-(Zi!01%E z0ERWp!Vn_na4tFT9q+(@_fJ*%i}i;)2kF&MncAFzg;+o6$WtQ^PgfoJ>%(W_Rbkp_1g$&ip;$b8 z08a+aWDu=~C}g&$XQ@Q>1w8?q)9I0zmstA2Nj3OA?;=Q7flMfx|)&Bk0@)N_f9PO@v#w)sc@vsAyk>xq05!j^w&Ys{XrBXUnz3QM)x zDAqIyF@E@f)6zF@$}6Kz1OC0jlto~u*<5xE>{#3f*QepM;F5f;LF?yLP^ubXJea3D z(=5!{7MQb!R;P8KD@F^%yX<2ezjzm!prngqYHL(yoq=L|Zv&K!``~^TMyu6^F<1~| zt5SRkC845N7a9igID3^94MGC~FV4|uDdF-$6o?#|0FGk6J#p8w7U#gWCFXBhvG((d z^i^$Oq2jtqf@~}cPmA(~A%2fU>-1M;t&+N?wS!@m^$9_5z~}V((FFAPBK*ugJe_dR zBd@lTvtv3zG)1x|d zdRVl;H+{M7B*p+2!ZVX6l$mQ42=^Dm6bN{IHm?s`)9+`0Q>(TWgHTRQ&C8^YGm_B= zXnuRk3_nLXKSzQFzj+SkivBRw)GC+F!1}KwxJ~bvP-(~EWwNn|Oy4}tSaTtcjxI4Q zJ%@vBM>o!9j~?-NTk>>plTfJ-(N;YP+Nv(BR2agv)yyPqH74{{T9+?z5K+I$1zPZa zj84notX43rxv6Ny%(2(&SG^s-==vHS2{b7_pVM7cIDQH&z`P7~5-IyLvT@H+WaQfibwLLccsw0akq zAl-86n$D?r6OF_mf9aQ5H424nOXnYcSmPVhsXVCucl(R<1pUPZ#nQrqLOjhO!I1u( zw!YSh(HgW-Ob?a{6E70;hE=LWvykThdw?KYuXCbV?Jn%OU?*s=aG-S&)uIGCsNd^o zv3qdTCC3=C$;6$zSv2TZc(m~@eq$!SU8k$kjzOfVrJvu>)bJQvO||oz&O}wTK-zfb z8)vnoibHtl2%oc;l5RAu@KFQ(j!KUzSsD08FI06c9rG&tHEFjg@c0oXFc@ENZgqOJ zc0;~TXO)>RxS03@{J6WWZ?`BeyF->4l|w<9-jrR?l*LVaPE4>J-2VF682t8gwIVpk z4~1Rxh{Z-kyK_El=-B5^9+{m@9Nq8l=-3xX9^Je-d1QYeGvDf3hmDcI#+cUuhP;r| zq;*1VxW$8MBR%i(>jYn*O7}=AfBxOVDo<_&oHlE8A$fZy`r+V1u0W>AA9#=iWnWW|2YzO|)h>MnDHorX z9l(1YGFMT;A%2R`AAId0n?Nv6!h{tDerWohsUaFA%q4ugO2?CHJ20n-i>2$aJ2WxW z<3uB4x{G61W~e{PWWrT$6#SInmyv~}RV9EwCZ?(Oa&3oa$pVUq~cHfWuK{y>AO&*0Zo=1$$q~fyAwh&|U z^jG-h$_Bzs`lb=)Ry&yge+k=NxG0u9Hr1wH_O^{mcN*;5VI5yJqWY{Sr~29OUFBY7 zd!g#42PsJ%le+$x+C^x z;df3{0BbX;xuZo<*7g!N2Pu)`Bt->@^qd5Mm`EtyCG-L2Hu)js0c-uPa%6^UV+ zC@IPyGKuDs5P0gk$k}7aG}p$>APa;8V-G1lQaGv*F^-L!MrM#NS)gM>8;)5KFKOj= z+nwkZpd&mD>b5!r0t_N#*`~>1gIZ?jWKa0bo+~m2F>K*<|^o_y&jLSSM?4&+& zF6Y4eO;6O=2f%eqb8onzvG)#WO$b1pz$sRLheA)3nZtkL?|x6+It3O1+=Fc6*UYWgOziJ8p;+$b6$lX;9#Wk{e z6CnUu#g%f9t?c-DAk4WE24NlxhPG#A3G^Y#!CcH^avTSiMZv8dW1t&Y!^b2vnnDG$JRcz6Yh7*RFQj3lL zFhd5iRnAH!UFjxPf_51)^p?W^%BHlDdSPgiM2L+|MN<@14T_>SWy>W~5~SUwz?M(R z$nCO^eJy(hoSc4{*~|SDhYtVD~ z_<9Tp{GtD%0V0wkU*~VdYX5Az%?%*0mw%_&{WCJ#BD6~0*vDnm9fkwA|0OQSpr}y} zy}3dgh(fnY5!)s!>;xu;r7Bhj+N46as7dS_kQNY1GlBeQwvPRr39iv(X^|nQ*EV;y zY>#rd=~AG-*pJmQcuOePDBd&#elCFuPqC;^Ok=Xrg~Jn^$7s&4D_hIVjRvwzsBkrx7sILBj%Yg8=yZyHsbKWDduxQgw5bg|Bn?qzIP{|dg{8;gloBb zw<&@T*;Fkh-=$yHQ+ObQq(wrI{tv)9){C;ZQp&gXL|R&J%{Cn#@u^>=)O#e{LNX>e zs9!=B-)7fQFRIkPiC_|3s%5whc|-xI;Vr8x^K1K;SG7KJExJBdoBf0k>+m8nuOMw# z5U8-tYf|nRqO7Ra0R&CYcCzdRZOl!PC^YK2K&7xkvVpq+hQrtrQod6t6?%$|9Y3oF zmY~AK;(s+Ch{O}8UVo52ak7E0p?C+moK9F}a_-^|3?Fxhc`37vU4npWKl{?(I~nwU z`-`3QOoR`B>Qt;i8l*gL5mv?hv6<`T}{U+K@EBv8@daqsNZbeT#P9BJHbJ|>OZ|q&G)9Uo= z>jKkzo=d8&0UY94EAv1=e;pEi?1WkRS~HmI)Gm&b(f2A`2vq-9U$r?%L_SmMCP5^j zdCOFC=LjCCLpjWN_0}yXsyN>)A0%;YbPfs}m)~?3&bL`XezLzK`k_5RI|*^z3LQH! zQyzqb3n8Vo}|WrdEN{0KHxk482aPIo5z z*zrN_HD%@rKKz?r(4Z|)Rw?s75G$^N9kf?ul~szo22&TeEwMl1Qs_x_POn7 zb)^<}yAp8Glw=FN_q(j~Ss&;XH@9q}@&~^cy-zO(XFki!ap6t2xZw(zN20f9oZ4dD z_un%b0uw8)Yc@w?=A2X$Xf_%PerAFa7xI)?$mY9QE(8L9hq^;{fPN{<=$lGE3rS4U%fzF@OeWOVGO?9+}_x>!S zk+3nbiEty$G0>zmsm%72$u^>_K5>N9;lUj4>ZnpzPj$9g0-fOsJI|6FrMR!z0S9En{W^T&JuFio85?`Kl)L%%4v5l`r2I`$MaYsKNHVB)z*V}qC>2l zkw!oYAz_?W0rCFy4P@G$`dVHY9iUc zqbU8aW7$^;nB+k}PPb>t(>_m&Ua2Ff`vBCAQonUX@ej;`yH5%7U>qJzCmLBHfYgr1 ziSQ5~g5B>Vj&E?hlWRlTBZB^<*d#fst#d1*Pb}3+jXt8<7_~S1;!YXq`;+fZ(|a!H zcBs&sqyu?tubEN4N@?f;@c!>+C?mcPPU3;B;XtUfDL;UT3aKT9BX$irUOqvnt&Ym#cN5f|z{Cl+V4t2HIPS8%~MKF)e` zVB6PoPss0#>dD!fz51N^_?lhtsQH(ugomlKTg&@M64(ls{K*9yGsCX z+z;N!c#hqPs<|+NefovtbwF(<@=ptpg%uskC*|Z>4Vqgy3hQB2N-2*8$EyB#^>i*? zI$iNHp=CtP%@?zy)Noxp0l8%?V9n7cXt?o1888BK+WEB|9AoMov7AZVv-0#bX&%`- zeUW|k|Cl;m^_5S8NjG!+><#}GEo@G=V?6$AnwgEYT8BFC>-L$ZDsKt%$=9-a1q=T= zOvk;OV%Xb8UwjUw+Z+k=Nd%&Qm)VrLby?!8sP$cS2CAoYTgM3=NmsrnK~ACr*wkFW z;%%JwyeB<~N`j%3Id}ynA#}7>9>dK-rav>TCzTk@@m%hHgorDaJ@2=RzCCd1YC!ln zR-WN-)VdWI@Lqbk;%|opiYSBj>6y6}Q~z_Y)#J6j>QNNKe&t_y11Md9t#ENGxnYKz zB(Gz4r964b*U8wmmZfw1S{c%uLz!DeMlRYEI_BA*I+Akb#8gi$k^()kfT>^(&vr&B z7v%)!RS2pCr=ckINaL-iT*1rYwV-VXC`B4|Dlsi<okHvq94B_4xiUWPHz|}Dz*i2?G<<{wJICwBe)6n^ z@y*9ii7nqIR*u@sq8p&|L<<$oki**EqoRr|>{&m-9h*!Wy4QDjdZ{P(DN)2y^tA4z z2o6Yr2R*Pb`Dzprx-61QGAgvp+wBzDZo#KGVvU*+5*>@m&j@Se_!zyi3p_CfM^(K9 z9W(%+mCW^+$*C24ZQ~b(7ilikIBG{xj_m-}PV%Ly35BUtAHDTQD4%I=%21!_+W?z= z+X~j^669I#*apeF6k;qm?{S*sk%h^_q;S1$XK!(=qq6J~TG zWp0g->sY|FMmTkk00(8@ne+2nz5-s*Z5uVt>4x};xSzg>n2yu&e5nQjQ|PqXyse_( zuL3tb<%XOtT_GN(Q=!}A9RVIld#Y_1Xfn!yQUZi?K7@QS?lu@th1=mu-_5dnGIWyh7){lFT;VWSc0LgTWstL$Pn7 zpVhoSAV{8%otG19On_&G^z`_!r&8|gEG~^5ct9O|kzN|uq}ERzNZ%i!cHD*m1kRN6 zQ$G2Ka!Nniw!1XpPFnD8E*nIGD`DFwK!OlV^-&j)Kb(}3Osw#_(UJ%%Rb}7WN<W`RXEHSBwq1jR@w<#Ig}EQAcnG?^Uj?`iU~M;JR86AE9+%P4Cp$5>1g z{~z~eXi_^W+EmBUu!z3Ig-y(AmWZuc(d(wIKobzb^mO+^ElK4d*49-|mi zuQN{j#m2;If~4Bxl^ii3c*5uX!}#EMi7C2+z6nlD8 zIBT`dxIuZSANMjV41{ittQs7iDn*+F7GGAAZp%89yq)YZ>}&XS87tf)`!?13ze9i= zrtJ2d9Ok1WcrNG`|7V14S(&*!nA5G@pZwow+8q3+$eQ-o!Q4VG z5`G2I<2FA`vB#+f4?Ue))MYWGKbiXukmzqzQ*^DpMd$ zvmf4=ko)jN{{aindz{t#F9ykjhrRJKj0DKI+H*t{G88Odr4dF_$?@GdIHiiyj!5w! zFBZ(WwjO z(SXnf`1L-UJ1+@Q%|&8li#38%I<=@K)OY`t`XW9pi2iA&EhYb{v_^%wM>rV9jI*ir`UY#cfJqBtlbXizJ(1tqB-;QDK40?Gm^~(CaJx zQ9*qI@L9Xjjy4P@a+8>`979Q7)e*(KKKUjXHqKx+!03aVBQ*lS(#x^FkP#noB;S7UM(kq_;sA}%zD$~db064(wL7Qpa=mtnt_IpCDWfnW6g zGrl|=+dX&6FZ|iBrt3TTK!w&`hUf(SZF~3gD|r=c!8CGJxSiHF3AtkG$H+#m zIB!T4W0o^^?80Lf1{s=FTw`~1ov{~e9W7)z&MBs5yl(x<}NKd>^ z4m_O8fr`j0cr3ka&9H2HSqc}0#xs%#NMZi=%+Oe;2c!$Slcg{N4Wd6$J8%_2v8SSU ziQ}BXHBK)!=k()VZ#6JBRr4Lk+72w>1m&Ee3TubBk1}chwE{H{>`*{Re4}Xao594i zXd7G2{z>n3cPON@Yfruk_zDL`+x_$(y7MgCpHy}ChWP%Nm53B}`>^(iaz0k=xiZ*? zELw*qGfWYD4^7~=qUx^xej7}~s(i-5fMo}C$vcaDPvVQET-s*nxJwJsv_xgqAo3%B za|PI5JcooN#EV@1K9cI4_k z2@ROApvj(w?BYG?EY#&5&=HK6JBBuHBQrz41f(g?t99*mZ~_Oq zdFSCJ(zlUyC1su0>Ao^)sD7dXEnMV5RR1wWqzOm+#<%E+?A;XKf~$ zSzm=iWP5T`%{^!eZpj3jfH5F`Re9MxsdP5Kt!~4xv8nWx=%DKV%f6B{C1P{7ZbPV! z6|Gr?#dGfV1z)bI!S{2=&l#9?#@=n-rbPSF84Sye+4PqxcyI}q`EU`L`u)7|yDlPo zb2)s?5hBq~w%GqRH^;F9*aEwv3-9<63JSl?B&dpY?YruzFkN-%<=P}V6Zt$etfJIQ zOcyIX6j3%(n`%2+>q5bek&#ymgM+z%=`Fdzqy_$Rl-|du zbx3OIXPX|Z)D~7Osiu4yt`{)ydyVRVGaR1COI)stu&Rmf9X z{T{2-PV{A>?DvJs#j#}^d7Yj25C67>Un_{uYivvb_el&9Cnm06sLiTgw>LpM1~e8b ztzdqvB0P(a^3Pc^*x>-2@)?#Vz8|>$^XIWo=@3Ldb}jWj@sqK8g`qR>!-tJt)j$T! zBBQE63`LEx{ay_lUyFvov;Oj$F@<%1iOQ6rIE8`lG%GS{qe?J{7eMzxMvsH^s>*CT zm~%TB9m*C&K!ai^jTJ){F0vlziL^79kH?}kA(io{!OC!jo1z#Y4l!M@a+of_sOYtK zJRi^nypc*gjr9i5YPq0Q#Ah5a935B4X%+Qyb0Fc-D^HMQVVw~J43)&Cu|VSP2aIv0CXyI)y9;gtnH>%-4K4DRjY%?Va`m`_7>U)(A!Uyv!w|w;Ma1_KnLb^gI z2EGkfN4londb>dt)ZH#HNJ4rjR76(#q-AK7b93A9rC&djDJTvc1{#6e)~OY}+IHYn zE{Bp|yB*o21I$7;ci|=*`~n0aTgMZM(OBEmd7%dK-uk8OQfuNM&IA=X-1@BwV5ka_ zhd9X(wJS1X3t%Q@AlItwdKbKq^Ec(-Y9o{+sJNMPodDX?eQ$et2g4{#k#-&11|^iE zWSHI|#V&@yMS8j(}f{gqwkG4hX;75=PxCwszd~NR1NQ=BB>jY+v&DYl8NU0YZxy@~G)O zVOH&o9orZ>H*{p^E?P?2%x<)KG(z;t&8y>GFiC8pUbm!!+jMI2fu0ymd~MMlwzTB8 zqEj48s{Iy3b<17i*~1z#5Ud9f@$U{9coGL>rh<9JfjIs{En0LhC;z1141=Bdq0fAh zaj`UpSqr8M7+yCLEXsidX;P;NI2Y+#gfRy56`k=oG4T-wI=0Onk|!tO!=UU|`js)k z^w4@zmQEbEw#;M<5NvmBnV5WSQgF^`A;N6jFO?tY%KmcAQ`$|cRZ=Sz`0HvdjNbo# zuEx~tgFpVPr{b3{5fOfwMc=JO4rqCU1fQVd#*s;4==$cfw%@b9_2Kg({8UpIB6q78 z%hi$?P($1!sA4w*h!*GB6RK_}&v|r}^(}QugP~=e+R7_9+XeZa)pyX7!fK6OR8EZV zqudZGED(APT3v{}?!$9a?b65^jNoS8UW3ty(!%TP){QEX3s+Jx2G5C8G3E~~ha!(zTM+e)JdRAV!rd7|V`MUt^ItT(J$yoiTm&yoKWXi(+ zgswPfZvzk-LpaX^i}ulPdJNX199)zedn7DYn>2CE3qh^~hV&%H@Vgq{Ic%^aUO{|} z!dZH%c)&C~`O9=sG{dv@XDMhus?u0eAjWRz zs8(_e0aS>W0s?sRV)@0wJqHakS3hLz697MQe$s?Y#$zjO2&Y=d81aeI#p^VUHQ&Fm zUIvXD%#PQFF02Z)QMM)U2vvj6WLhx9d|cyg!8p-oMB43F;b8_^9UEUtx8c-1_>dJ~ z#=LvHVH$j7!C-4xe!M3 zX1r2K{s9u%0NYfYJPjczZftvXien6X@oj8vo-$A``&`}EC=|@yD5C3?ca>8${uN1$ zI@qLJ_Eep}bVe?D(T65QD+*TLYp*Bon(sy^0(-y%zytI%U=Knc8bbE2sY%NRB0%Ed z*1L6{H~dly17ca$YUZ{otRfRV2)TiTzgk1`ZIDk=G$~NR2j4;?zLmyI9zD8Ax)`bgYM^zga2s}NudxR zjh78ODHb6y=4n+zh(a1^Oj68^dG4C8i2Rd#9@kQ{OltloL{L_2HoiXgQRU>*ul!%r zYIIBAhk8u+b`37Cb)H*!w>r@(xV40^O$m{ayH-_fF&6TeWf`UdLwyT9gJqFwO84OR zq<{ywr^JSNmPv)>7>4$Q$Wd`rWx*CzF=k|0Ngs3ToeOc>R`N`;Gi!k+j@pb2E~T;R z?2ej;)bsP1UxlriipHSpSayVUZ38Vx?(bTV0 z!~SaB!Pk*AB_s8f0AFG&83Wn>Y`)NJlw3Pg{WWf%4?f~~%i2@yCoQXIhA^>zj$3sn zxRrpbP71lMK4%L?6@H#W=!##q+B8y)rD%h6oX1*DGN0b$p~C{J;3pt^QzQ#&`1@n~eemxn>Mxw$ z=g{e9GGIN07b;R~pf}=YAKr$80-hJ@jgTP}wJEPtT-TA&o?gOa3Kt+jk|ll93isiY{PmOeg^eF-0gc327;* z(gy0j20O$6MC1X8WQ1jeOJ~B)u?Q(Bpay~4YC1WmpW*H`4Iai&BRT5DEo`FndUn>Y zYR_o!RXX2Vnz(D&=|on(82+2%E6^n}hi>_sjQv0#@w8-Lf^XYplW+&r57pu=Sn;p( zEwKH>+GOC}6@L3gfSeu#jH7Li-;T;rnR`;jxN-j*Il^6chsTyU-^s*xMw|`oMtfq! z^>uT+=gt_HIK^CP2kZA;m!leepgzMF=h4L;6bNwbqJxqe5hyAwEiNxHbdzC|ilea? z*?%GuH9vqWf*Dv2T<2NuX<3K<4%9E;3fALge;{%@ENGx6w ze+{KTF{5J6IVUfvVjI4MhwuQ|b(K_NjxBzIswE_6Lhn47dfLh6N-HB1<00Kh%bI%j zgqY|NR`b6jD_S3;nuUoJAo8M+9v;$cbZ1N_CY)&U&%2dxHSHwK4LsBe+G>|$LIuN* z)kZf~#C7)zsBMf@9w^H+^4b(zmO|g}^c47J4~ClDAS0KT!__fe#kaX=y< zAITcEp~R#{B6l`c6_tXWuKgcZd3s51}o@PzpDHqC=5kfQw~+aPN8eFY{l2)*Rfdzs5q` zdogV{T}N`iggd5v07w4cPTJvu=HdBj76r1I=5lbNNMT}~#*{tLq@7%G_Fki>ufHME zXR{iGmFvU;pE%?dTq$lS5=+<>JTomkTnXmSw#-s@w`6Zmt^uZm45@Z)D;4#PAnHv5 z7nC^&g;Y+hQVr@Z;2!m5ev@3WBBV^s^AhefC1YeZNuzwE*1%SAe)@Ibjo{D^rA`^Sngjb0!}3Z4IjAX>XfM6m)?ci zE*V~dV~Q_(AWr2e(oPj=CdzrA5F0Q>R9&7GtbP3&w1fXNA56)vWn;GOcp+)O3UbL0 zotKhSK78!7m1sx`e2tdku`=rFP4Li4qVL{oC#xFWe=C|E;@0-|wdYk? zH1IKfv|oE`88u-&=C#mFMOH2_`7ofYhHuEOHEdHTW@z{`K^QS&du>lhusa`F;j1mD zLDFOI$(y0X&KQ0E=Wzd=BK&u2kHf1)EuHh3Ojs<}K-?npeslHzF$;CII>U97qIeMA z&^k?6aY!y2y1LplEIJ~X2CY~i1+b{a_L2srX<|unk{-cEF``DnaVh?I3w33Bb-kok zY9Q19?YN2`z^uMN8m z;$_>2-M0IJq?5+}IS{N+7e%G@rp)^+f3lG@>IALHa(W4Cy%o>z+yytX4_|&t)uk5F z|0(hAr;9dx;O_+z``bM@e>}&K1if{;z(Q{f9KrhyiE!dc6bkr?^#!04Q-8 z&Y^il%R~Xj*GfL)qHvr5HqmTy^sJv9dMFpHr89!&l)}x#cM@ zi@HJ#?`1|D&gJ5XFcIf|Lzp}di=sF-80oc7%+)jD61Qt|d$K9lmEOYBk~apvRnE&p zCrN?SbBTPPW?6e)Sl5u*P-1lHy|wWU&vqH(7S%Z*&Lp#?uu6@Wv08o8o~OL8a5?x3 zyHd9Ia>Xs=Q3#9G?Z z5$y+z%uE;Lss;>j3KLKH?-*F4DAmd7J$dhVo0xf-RFxkzF`}xwx~zCT z-Vb*qQ3b99rqC3vQ34^F|E74+&2>J1On^)0?AdexCmzkEW-@AdFr?iQZyYX~>vaH^ z;xr>3ut+Q2eUu|A#6@~gn3z|n%O}6F|EPI5VT|JzU=6%IJ>nZohpSW))Yjg%j5B-b zO^4ii!z6-nMt;AkP^$)QG))_Nc_L?}E+roXT3#b_sxC z8_P5g`ZBYBNl_N0mOV75=5oV<+?7$^b|+ZV_j^P~-X3%Nj}ghAdIF|0j+k_W=2_rM zzoI$PXxG86#@nKi7P+~{7uAOR<` z;{qMiAd>RH6pvuumK|e*nKH?!RDGh@$uK4%Qx3=U))U^uJ2A6D_yX3{YVk02AhuD zNi2MqxS3SS!45CGz*JABFbT*Wa~RT2@pN|fZZirR089Qivo{sMLesHpi`;M+kap!c zrL^k5h-}di_lfH0@?d>jom5jwfhAhbLsqR=!lZI4O!69^_AFFGbyyHTQEn=qyz;Fl zd0xJ)SgzNb_jXnkai?0ciKB3t)`CWow}-YA0)S=u_xob~`;q&ycjDWPvmfS1@7>Ne zvyS<*(Chd(xOd?80|4@i8Y&fC)d)z;)bdU`5u{sWd5vX4nJ{xIM=TEqe)ADP^ZbbV zO>2nGO5Xk58(U!w0)J~Z6@W`Yu5Lj)EagQleA{SF#@Qz|dz#Q7m|UF*jO0+7%m}fN z0URtdq-AJWWa@(vW52TegHcV%JZlv=ud zqMkg@t~#nGB7mE+y8#(ExI{3F)pSI*<}L2${d1^3~5?EmuU*$ zVUxWfYXT;?DK9t?#gx>MGOOw6L!v4uw5jU|*)PRqbM;|M3aBsg*2HN`#p&!4F*3jv zPP5X6iAZJF-Z@Be@ZYT}l58s?pX|4>wR$9m^X{E0{7VUpn1ivh2wgS3@K-{M*-7S` z@SNIbUgauKlA;i;+##AC7=kAI0J>13B^u=2qUulFHH>b`rXIWRgMm%&fT53Sd1_nC zsT6d#LlnxUN=$OfsKBZ)4KE!Foi7r2h7yNxKl3Q0DN@;Q#F0a|9Z%{lKILfhR-b&i zNv##lNwR&vF@{SX{RkjZyP|^>`!n;azX`}fUO!`grXc~tS}|h$jqZza=E3-@rV{>L zCr7CDPIK~vb?dwMQpR(4ebndGsDuBKQs(0EBz?1?mHC>Ft`UlGtsNd4>pGOkY@Qd~ z#_*mxk}F-OOt&h9G@0?J#-pvuYZ^wbew#~85lJm_!b1IO+>09DrS6n&2O&})x--pv z>@21$lSZw0n}nM4boLhVTS}+l`7Pu-c_?gt_qe6|kpM{bei6knHHGo#gYVSNtKped z%=HSLZ=plf0F?;|)IPj^9g}qM%Ol@8W6WJ0Z~Dbydd1~_r2O~s#3Dpeixxudj&ZrJ z{fYePupDPW8){DJ7gpg`lz#M)|4p-O-W41t@m{1=;Mk?T;CkHg!yU@@ZRTVhR$!aN zPB*A9aFgQGV`=+L1A@P-I=5 zF$o9vaH2#bmf@`C%ZC<>)u zZ&y9jiny_a4c00Qe`TCEEWE)|Q2W_b;+upC-7Ux3p;G%-)a`oTK zd=0A?;!od%^-up}v{3kK1g^5rQ+%5aJ07g`2J0*} zr{NJ22ZQr6SOJ;s>J17iQ5A0RAx&ulI)4K)|XwdKpP`jS~L zWKSI3nXGC2!$}FQ`hqrP;o;{scd7)#%Q^vOXyZOT1$l>J( z#QgRp{Mmff5b`@*BX2oF4q+1p_HK9h$xm+>xO`-9O zytOr%wgF-;Nn;BZHbtKM> zIGJ6BD3}FKdY?4F&!k67C!pIFl$qkO2Ee3@q;zib=hqq*B`EN03?bTjr z3)ne9w4>wqK_j@6oD4jbnR}(l-ha?W<{sZrl{hv4-{21P4ovj`00IW}(tMDeNk4Bt zzfd>^U>6SY{SX?U)%-sQnN@C40PG)#fwG)1PL z)Sri*b{NU!>G)u*?kU6hf+vJwi1mvK+`pLN^N&$&*jb<&XVN83d_XyU!+Lyz{-&eX z9Pk03`m?&?rica|4U9>I^Y>LP_4;1I|3dRySzoemaZ_pK#sb=rhWR)NId^9y)xcsS>7 zw9MCi-Ad0JH^Sn20jN-t!4Sq3ns(VFGr%^r5~Xyf$^7vS#9Rod@Dw?}YK7QD(4kQG zLm#ecQtYxj91d2Q$BhVb6?eOTu3xeBb@R!v@Ek!51iMlHQ-sv(ugt=s94Xz6)ID^v zzi5Ir3!(3{T4z3|K61~Qh)!}dH3VSrU(|+|tNX_|U*|-NL;^FzE|%fIJ8uYHMYp3= z;ZnPjgpjRX4aS;veClX%HIIHDlvg)3lmC_$BfWk~~oCLx3D-CWgQC8uG8@xohZ z>>bcYK{8fY&-MI#GH-;G2^YW&SBvMP>LoZ6Nk|yeKnyY^h7j|=cMuwerGKuuT7GhF zYJE*siLQp^UbevJL9Wd}KCH1QEJ&>7lI<))PA&W9@~fsZ7p9g`Q_FnSQ0Ck_@i-nX zX%}+=tf=tGYV*U>*!le^Zs^%huXRsYWc29(T|Pn3jPsQlNe)b9VoB;|<4JkZEe_My zvI21o>w*gNObfvJg6*sa_l;})t|htcJgem)NqlheF_+fEQ&!}1F(K{6c`6fV=a-m* zltes*WFrdHivtzxY%!&7sEnpiW5~&P3VB`}6bhA+O)yf)WVFhxr|2x#8YN#9i&TnL z(Mq|hd9;^t4D&7so|$#wD2~%Ib6K`C5?H#a&P zKeP>0njau2nu-HqYbyqqImGszk5|A>(=uo&X6V z2f|Hft6PmM-qlz4-%oYsxo^dmS9ixyTFn+DhP9M@%+jAVrZELNB0jhYOa z7gTS8S?GeK%VcHaMB>s6!`FMWj3(%AO7fPk$Z$k06+)iHLW%i6=tW1(-$$f0mdV=a z&Z>|K1pB-z>4T43z2-y20k%E&In53BpyEKN5~dCzNlj5zSzTdeX>Dy^02Re_E$4WP>H^_*3IE0l4swl!znN)K|Z6xTW@F=w3*Kzf<35Y$O4(oc9Y;rOye>?#Wfhal3+XZosXvj_k)(_qH5?bkoH3nhWB9n{ zH1arPLK`xcT(81!gqz}oD296^b-fgU(R$KH(7q{-6CL2a`x>l^Tx(D5CDC_fhx4{S z?Cx%U@uGW|OKuJ@r170Gr=EXNi_*q*cOTb`Y7GAPJ-u~brN%ThKM*HBPpULdD%}8{ zTaIV}&-F}>XLfIOTc+HS)zr0&EoZXU$ie`hKiX)oe4c(`ua`i+c>2=$K>&9e@qg>A zZ(^EHtO|`22RuW!U`(3v*3&6A&(}6X9QrSD7prDb4STU1%6Zj^Xo^y7W_{GOJX6@r zf9GstSl6`v<+!eC;{$k~Drq(F;j|FfT@8N{-r1Wj>3z`yQCebZa(aS_lA1z2a5F-5 zzSHadfAT!OKKwsLJjJEF6dNi(5u^x$A zM9ws1ebehY-F^RaO8(AG@6ohabLrD~Iof*l>0~^cjB(d`VxJItm%mG-{mL>Sn)+Y5e@C&LUbyE*N^r z?WE={m_(oeaye|(C71l|lpkFa2X0}PTEr%;u|cWkUR_c8C>F5c-v(yFs#3HtE-{T7 z{FNLL|8F*#g1DUvNK@N2I56YPt)LHSHq7uq1r)+%D9;BQl+OrOQS3QlRdU4o%wf>P`bG*4+U-MWl3o{dqg#lLO!Njmu!Z_#y{B>)+AF+el~q zZ^=astGh%qt6(>%(a#z_t=zVOb2aC1yYFA_%|YYIMx%I@ev|pHe$Rh?>8`*sYkl{f zZMVS~Y5xUl6n5%lz+;2??47n(a)98#;2P;(#ZR=4oa!No11Q;Fr%{|l zk`rQ~-Fq>Ych2J#@wLRB=cp1|b1JB`gL!){k?hU1+#wRT`Hb$k8*J9(pPHc6T1DC%ZOI8> z`$(^+FN1|N;*TIELWqTh0t8X`2lCyUr1ElF>k9S4yom}{*tJmP>u#_nq+ObIcCIo0 z7SwM$5vQD~-#HlR=s>jJ(Jrb7W*Y&Rl9gp%rs`y$|-sFPcvbo>=<$Xk}>W zK4Z=j`tiKnmmZxWmnoFHI*^)YKJG#EkxdsASKZMhi_w)=Hzn&@hNqRo!GVpmIBb z_We6%6J8jFkw_669vXq+ggB)_H>QmjGc{S@LVcqMG zXrZG9S0X$CJxF{88{F%iKRu=}-%4N45`lpjR+9vLgp2qgO4wgf; zOEqYYM?990L$BI9Db#r>l&r%h*m9Q9KMJ(OTkf=&ZLQsp?_$B z)-D^3rYu}(kTOZdqLPM{Ifn=~qco*j>XI>uTFHZp=K-y$FN+2rVyo0Q)2O{sPY7GW z61n5J^CJjoO9q4m`CulP1|Mtv|AF3*1|0JhEM1Fx&!#|ORHBHPW`r@llTjPeDk(9e z?G7QZF_OkwKD^{m<|+-jdeioF+gVX61ck$EHPT)8!=?;a2$6ydQ{hhGpGUf0#)~XL z2RED%lNxrTGuNU(WJ?3h8_EG~Ze`u8Ys9ZY<2F?)k?N(X@dUhl5^4S=GPEi;1AD}7 zun*4_MaK$K2B_5`*VnG|wK}gbL*n_1TqBooKG2&EHJQIn=YZ1Y{cGD%0wA{eTg~=+ zo`f@1Z#}0ZjV8KVtF~NehHW8n)pi5jS| z5mt`~&W=^9N$`K)L6~h1Ax}f}eJuw&*J|92@!uKo)#aJW>@w`SAt-30P%}r+F_TI~lt)I)9=&y6K6mZ0#QTvjNUx>VZr$igi|yvj zOFYj0_#5yullZjYaZMhl>72wYO7o?)#>s7XEd<#5;2`5glX(v0OAtLhq9;TnNYXTI zha%pBqFeUB?r=s3T#jD3vy!?6%!v)#|FP6A4Yu{(c!@%;t%B;@5s#b2DaN(->2(qJ1%mB7y?q!rXST~9^fhYx_#Hq~SB(aesqlwNM%Q?Fg zi~ZAbqg9Zbu;-4SQ()>+6biOyL<(Y2=G8+%3;ta~03A+r9lRkM;6qj<0Ey5lC8VWj z*kt**ozkHQ_0~+`H`Khwa>|L9orA`Qa)FbsBdHLB>Br<7DXxb7XQ!9-2jCidAn=N+ zfcE^42!A|WVR*kBYOy9A3Yl&ZHp^O3 zfUbyFv)H_fZ_7~^RM&Q3ae5Q-UQ)VIjw1f?KP#%_jkv(-;@Md(uCyiqq@r@VSD>7y z$OETl2_kvZjd|kmR7FU-z?I$pLm2paPM3mnML$S70guZXL(pC+48X7{#A7scoQKh;tzZtk=f=O8jtXzmHYa8cfN^|0GKnll^~rd00937Ad9AH literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2ae08a7bedfed08cdfea76039c1bb1fa1d6cdf67 GIT binary patch literal 59716 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 tC40Gi`Mi4m<9BpxR%m?w=so8}_Gqj!BM1dG + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/compiler-docs/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0263fc304226d90e224e53053855ad138303b70b GIT binary patch literal 76260 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 G0RRB5qhxRZ literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dd55f4e95ec9c29fb566d8617104afca31f0eeef GIT binary patch literal 80732 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 literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/favicon-044be391.svg b/compiler-docs/static.files/favicon-044be391.svg new file mode 100644 index 0000000000..8b34b51198 --- /dev/null +++ b/compiler-docs/static.files/favicon-044be391.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/compiler-docs/static.files/favicon-32x32-6580c154.png b/compiler-docs/static.files/favicon-32x32-6580c154.png new file mode 100644 index 0000000000000000000000000000000000000000..69b8613ce1506e1c92b864f91cc46df06348c62b GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SV3z!DH1*13q>1OJmp-&A)3@J_A;A0V7u0bkfJ)-`Krrb zGey1(YybBo_r#8#3kPrfo#tA4xb3R$F4j$a9H~9huUPE$JQDstTM~O>^@Ps(;>UH<3Fx0=LBZUre@8723HjVToWun1;~KVtGY7SF1E7liM5< zHa%KaZ1y+v;MF5PX0dXM#bh1)zI}?P`JCclPp)GktoyD%Uv%1HzQp-VwViVJr}FN4 zBVAi3pdsabJ2zzio=sD>mtWX++u%m3k>>5t|1&=?+*B*EnLW)#$^O=9J{D1Fvz#4w zCmkrSML-}_v8Imc2?OP1;|%KWmLM+u&^dKy+fI{C57UY0UhRg-3U_ zKl;3k)jRBCi*uZh#-8L8Gwj!FXV37syULEeYD%&1+S-jgUC&wB|>?y4oO5hW>!C8<`)MX5lF!N|bKNY}tn*U&h` z(Adh*+{(a0+rYrez#!Wq{4a`z-29Zxv`X9>q*C7l^C^QQ$cEtjw370~qEv?R@^Zb* zyzJuS#DY}4{G#;P?`))iio&ZxB1(c1%M}WW^3yVNQWZ)n3sMy_3rdn17%JvG{=~yk z7^b0d%K!8k&!<5Q%*xz)$=t%q!rqfbn1vNw8cYtSFe`5kQ8<0$%84Uqj>sHgKi%N5 cz)O$emAGKZCnwXXKr0wLUHx3vIVCg!0EmFw6951J literal 0 HcmV?d00001 diff --git a/compiler-docs/static.files/main-eebb9057.js b/compiler-docs/static.files/main-eebb9057.js new file mode 100644 index 0000000000..750010f4cc --- /dev/null +++ b/compiler-docs/static.files/main-eebb9057.js @@ -0,0 +1,11 @@ +"use strict";window.RUSTDOC_TOOLTIP_HOVER_MS=300;window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS=450;function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension;}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden");const toggle=document.getElementById("toggle-all-docs");if(toggle){toggle.setAttribute("disabled","disabled");}}function showMain(){const main=document.getElementById(MAIN_ID);if(!main){return;}removeClass(main,"hidden");const mainHeading=main.querySelector(".main-heading");if(mainHeading&&window.searchState.rustdocToolbar){if(window.searchState.rustdocToolbar.parentElement){window.searchState.rustdocToolbar.parentElement.removeChild(window.searchState.rustdocToolbar,);}mainHeading.appendChild(window.searchState.rustdocToolbar);}const toggle=document.getElementById("toggle-all-docs");if(toggle){toggle.removeAttribute("disabled");}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileTopbar=document.querySelector(".mobile-topbar");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileTopbar){const mobileTitle=document.createElement("h2");mobileTitle.className="location";if(hasClass(document.querySelector(".rustdoc"),"crate")){mobileTitle.innerHTML=`Crate ${window.currentCrate}`;}else if(locationTitle){mobileTitle.innerHTML=locationTitle.innerHTML;}mobileTopbar.appendChild(mobileTitle);}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key;}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape";}return String.fromCharCode(c);}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID);}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID);}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0];}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling);}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID));}return el;}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden");}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden");}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild);}if(elemToDisplay===null){addClass(el,"hidden");showMain();return;}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden");const mainHeading=elemToDisplay.querySelector(".main-heading");if(mainHeading&&window.searchState.rustdocToolbar){if(window.searchState.rustdocToolbar.parentElement){window.searchState.rustdocToolbar.parentElement.removeChild(window.searchState.rustdocToolbar,);}mainHeading.appendChild(window.searchState.rustdocToolbar);}}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function";}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link);}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url,errorCallback){const script=document.createElement("script");script.src=url;if(errorCallback!==undefined){script.onerror=errorCallback;}document.head.append(script);}const settingsButton=getSettingsButton();if(settingsButton){settingsButton.onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return;}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadScript(getVar("static-root-path")+getVar("settings-js"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css");}}},0);};}window.searchState={rustdocToolbar:document.querySelector("rustdoc-toolbar"),loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el);}return el;},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(window.searchState.timeout!==null){clearTimeout(window.searchState.timeout);window.searchState.timeout=null;}},isDisplayed:()=>{const outputElement=window.searchState.outputElement();return!!outputElement&&!!outputElement.parentElement&&outputElement.parentElement.id===ALTERNATIVE_DISPLAY_ID;},focus:()=>{window.searchState.input&&window.searchState.input.focus();},defocus:()=>{window.searchState.input&&window.searchState.input.blur();},showResults:search=>{if(search===null||typeof search==="undefined"){search=window.searchState.outputElement();}switchDisplayedElement(search);document.title=window.searchState.title;},removeQueryParameters:()=>{document.title=window.searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash);}},hideResults:()=>{switchDisplayedElement(null);window.searchState.removeQueryParameters();},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=").map(x=>x.replace(/\+/g," "));params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1]);});return params;},setup:()=>{const search_input=window.searchState.input;if(!search_input){return;}let searchLoaded=false;function sendSearchForm(){document.getElementsByClassName("search-form")[0].submit();}function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"),sendSearchForm);loadScript(resourcePath("search-index",".js"),sendSearchForm);}}search_input.addEventListener("focus",()=>{window.searchState.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch();});if(search_input.value!==""){loadSearch();}const params=window.searchState.getQueryStringParams();if(params.search!==undefined){window.searchState.setLoadingSearch();loadSearch();}},setLoadingSearch:()=>{const search=window.searchState.outputElement();if(!search){return;}search.innerHTML="

"+window.searchState.loadingText+"

";window.searchState.showResults(search);},descShards:new Map(),loadDesc:async function({descShard,descIndex}){if(descShard.promise===null){descShard.promise=new Promise((resolve,reject)=>{descShard.resolve=resolve;const ds=descShard;const fname=`${ds.crate}-desc-${ds.shard}-`;const url=resourcePath(`search.desc/${descShard.crate}/${fname}`,".js",);loadScript(url,reject);});}const list=await descShard.promise;return list[descIndex];},loadedDescShard:function(crate,shard,data){this.descShards.get(crate)[shard].resolve(data.split("\n"));},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&window.searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash);}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView();}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId);}}if(savedHash.startsWith("impl-")){const splitAt=savedHash.indexOf("/");if(splitAt!==-1){const implId=savedHash.slice(0,splitAt);const assocId=savedHash.slice(splitAt+1);const implElems=document.querySelectorAll(`details > summary > section[id^="${implId}"]`,);onEachLazy(implElems,implElem=>{const numbered=/^(.+?)-([0-9]+)$/.exec(implElem.id);if(implElem.id!==implId&&(!numbered||numbered[1]!==implId)){return false;}return onEachLazy(implElem.parentElement.parentElement.querySelectorAll(`[id^="${assocId}"]`),item=>{const numbered=/^(.+?)-([0-9]+)$/.exec(item.id);if(item.id===assocId||(numbered&&numbered[1]===assocId)){openParentDetails(item);item.scrollIntoView();setTimeout(()=>{window.location.replace("#"+item.id);},0);return true;}},);});}}}function onHashChange(ev){hideSidebar();handleHashes(ev);}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true;}elem=elem.parentElement;}}function expandSection(id){openParentDetails(document.getElementById(id));}function handleEscape(ev){window.searchState.clearInputTimeout();window.searchState.hideResults();ev.preventDefault();window.searchState.defocus();window.hideAllModals(true);}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return;}if(document.activeElement&&document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":case"/":ev.preventDefault();window.searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs(false);break;case"_":ev.preventDefault();collapseAllDocs(true);break;case"?":showHelp();break;default:break;}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return;}const sidebar=document.getElementById("rustdoc-modnav");function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return;}const modpath=hasClass(document.querySelector(".rustdoc"),"mod")?"../":"";const h3=document.createElement("h3");h3.innerHTML=`${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=`${modpath}${name}/index.html`;}else{path=`${modpath}${shortty}.${name}.html`;}let current_page=document.location.href.toString();if(current_page.endsWith("/")){current_page+="index.html";}const link=document.createElement("a");link.href=path;link.textContent=name;const li=document.createElement("li");if(link.href===current_page){li.classList.add("current");}li.appendChild(link);ul.appendChild(li);}sidebar.appendChild(h3);sidebar.appendChild(ul);}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Aliases");block("union","unions","Unions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("attr","attributes","Attribute Macros");block("derive","derives","Derive Macros");block("traitalias","trait-aliases","Trait Aliases");}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return;}aliases.split(",").forEach(alias=>{inlined_types.add(alias);});});}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=new Set((script?script.getAttribute("data-ignore-extern-crates"):"").split(","),);for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.has(lib)){continue;}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop;}inlined_types.add(struct_type);}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href);}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1;}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors);}window.register_type_impls=imp=>{if(!imp||!imp[window.currentCrate]){return;}window.pending_type_impls=undefined;const idMap=new Map();let implementations=document.getElementById("implementations-list");let trait_implementations=document.getElementById("trait-implementations-list");let trait_implementations_header=document.getElementById("trait-implementations");const script=document.querySelector("script[data-self-path]");const selfPath=script?script.getAttribute("data-self-path"):null;const mainContent=document.querySelector("#main-content");const sidebarSection=document.querySelector(".sidebar section");let methods=document.querySelector(".sidebar .block.method");let associatedTypes=document.querySelector(".sidebar .block.associatedtype");let associatedConstants=document.querySelector(".sidebar .block.associatedconstant");let sidebarTraitList=document.querySelector(".sidebar .block.trait-implementation");for(const impList of imp[window.currentCrate]){const types=impList.slice(2);const text=impList[0];const isTrait=impList[1]!==0;const traitName=impList[1];if(types.indexOf(selfPath)===-1){continue;}let outputList=isTrait?trait_implementations:implementations;if(outputList===null){const outputListName=isTrait?"Trait Implementations":"Implementations";const outputListId=isTrait?"trait-implementations-list":"implementations-list";const outputListHeaderId=isTrait?"trait-implementations":"implementations";const outputListHeader=document.createElement("h2");outputListHeader.id=outputListHeaderId;outputListHeader.innerText=outputListName;outputList=document.createElement("div");outputList.id=outputListId;if(isTrait){const link=document.createElement("a");link.href=`#${outputListHeaderId}`;link.innerText="Trait Implementations";const h=document.createElement("h3");h.appendChild(link);trait_implementations=outputList;trait_implementations_header=outputListHeader;sidebarSection.appendChild(h);sidebarTraitList=document.createElement("ul");sidebarTraitList.className="block trait-implementation";sidebarSection.appendChild(sidebarTraitList);mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList);}else{implementations=outputList;if(trait_implementations){mainContent.insertBefore(outputListHeader,trait_implementations_header);mainContent.insertBefore(outputList,trait_implementations_header);}else{const mainContent=document.querySelector("#main-content");mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList);}}}const template=document.createElement("template");template.innerHTML=text;onEachLazy(template.content.querySelectorAll("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href);}});onEachLazy(template.content.querySelectorAll("[id]"),el=>{let i=0;if(idMap.has(el.id)){i=idMap.get(el.id);}else if(document.getElementById(el.id)){i=1;while(document.getElementById(`${el.id}-${2 * i}`)){i=2*i;}while(document.getElementById(`${el.id}-${i}`)){i+=1;}}if(i!==0){const oldHref=`#${el.id}`;const newHref=`#${el.id}-${i}`;el.id=`${el.id}-${i}`;onEachLazy(template.content.querySelectorAll("a[href]"),link=>{if(link.getAttribute("href")===oldHref){link.href=newHref;}});}idMap.set(el.id,i+1);});const templateAssocItems=template.content.querySelectorAll("section.tymethod, "+"section.method, section.associatedtype, section.associatedconstant");if(isTrait){const li=document.createElement("li");const a=document.createElement("a");a.href=`#${template.content.querySelector(".impl").id}`;a.textContent=traitName;li.appendChild(a);sidebarTraitList.append(li);}else{onEachLazy(templateAssocItems,item=>{let block=hasClass(item,"associatedtype")?associatedTypes:(hasClass(item,"associatedconstant")?associatedConstants:(methods));if(!block){const blockTitle=hasClass(item,"associatedtype")?"Associated Types":(hasClass(item,"associatedconstant")?"Associated Constants":("Methods"));const blockClass=hasClass(item,"associatedtype")?"associatedtype":(hasClass(item,"associatedconstant")?"associatedconstant":("method"));const blockHeader=document.createElement("h3");const blockLink=document.createElement("a");blockLink.href="#implementations";blockLink.innerText=blockTitle;blockHeader.appendChild(blockLink);block=document.createElement("ul");block.className=`block ${blockClass}`;const insertionReference=methods||sidebarTraitList;if(insertionReference){const insertionReferenceH=insertionReference.previousElementSibling;sidebarSection.insertBefore(blockHeader,insertionReferenceH);sidebarSection.insertBefore(block,insertionReferenceH);}else{sidebarSection.appendChild(blockHeader);sidebarSection.appendChild(block);}if(hasClass(item,"associatedtype")){associatedTypes=block;}else if(hasClass(item,"associatedconstant")){associatedConstants=block;}else{methods=block;}}const li=document.createElement("li");const a=document.createElement("a");a.innerText=item.id.split("-")[0].split(".")[1];a.href=`#${item.id}`;li.appendChild(a);block.appendChild(li);});}outputList.appendChild(template.content);}for(const list of[methods,associatedTypes,associatedConstants,sidebarTraitList]){if(!list){continue;}const newChildren=Array.prototype.slice.call(list.children);newChildren.sort((a,b)=>{const aI=a.innerText;const bI=b.innerText;return aIbI?1:0;});list.replaceChildren(...newChildren);}};if(window.pending_type_impls){window.register_type_impls(window.pending_type_impls);}function addSidebarCrates(){if(!window.ALL_CRATES){return;}const sidebarElems=document.getElementById("rustdoc-modnav");if(!sidebarElems){return;}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";link.textContent=crate;const li=document.createElement("li");if(window.rootPath!=="./"&&crate===window.currentCrate){li.className="current";}li.appendChild(link);ul.appendChild(li);}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul);}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true;}});innerToggle.children[0].innerText="Summary";}function collapseAllDocs(collapseImpls){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if((collapseImpls||e.parentNode.id!=="implementations-list")||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false;}});innerToggle.children[0].innerText="Show all";}function toggleAllDocs(ev){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return;}if(hasClass(innerToggle,"will-expand")){expandAllDocs();}else{collapseAllDocs(ev!==undefined&&ev.shiftKey);}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs;}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open;});}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false);}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true;}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false;}});}());window.rustdoc_add_line_numbers_to_examples=()=>{function generateLine(nb){return`${nb}`;}onEachLazy(document.querySelectorAll(".rustdoc:not(.src) :not(.scraped-example) > .example-wrap > pre > code",),code=>{if(hasClass(code.parentElement.parentElement,"hide-lines")){removeClass(code.parentElement.parentElement,"hide-lines");return;}const lines=code.innerHTML.split("\n");const digits=(lines.length+"").length;code.innerHTML=lines.map((line,index)=>generateLine(index+1)+line).join("\n");addClass(code.parentElement.parentElement,`digits-${digits}`);});};window.rustdoc_remove_line_numbers_from_examples=()=>{onEachLazy(document.querySelectorAll(".rustdoc:not(.src) :not(.scraped-example) > .example-wrap"),x=>addClass(x,"hide-lines"),);};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples();}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown");}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown");}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true;}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar);}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar();});});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(!e.target.matches("summary, a, a *")){e.preventDefault();}});});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText);}else{throw new Error("showTooltip() called with notable without any notable traits!");}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);return;}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
";}else{const ttl=e.getAttribute("title");if(ttl!==null){e.setAttribute("data-title",ttl);e.removeAttribute("title");}const dttl=e.getAttribute("data-title");if(dttl!==null){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(dttl));wrapper.appendChild(titleContent);}}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";document.body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px";}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px",);}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);wrapper.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return;}clearTooltipHoverTimeout(e);};wrapper.onpointerleave=ev=>{if(ev.pointerType!=="mouse"||!(ev.relatedTarget instanceof HTMLElement)){return;}if(!e.TOOLTIP_FORCE_VISIBLE&&!e.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(wrapper,"fade-out");}};}function setTooltipHoverTimeout(element,show){clearTooltipHoverTimeout(element);if(!show&&!window.CURRENT_TOOLTIP_ELEMENT){return;}if(show&&window.CURRENT_TOOLTIP_ELEMENT){return;}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE!==element){return;}element.TOOLTIP_HOVER_TIMEOUT=setTimeout(()=>{if(show){showTooltip(element);}else if(!element.TOOLTIP_FORCE_VISIBLE){hideTooltip(false);}},show?window.RUSTDOC_TOOLTIP_HOVER_MS:window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS);}function clearTooltipHoverTimeout(element){if(element.TOOLTIP_HOVER_TIMEOUT!==undefined){removeClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");clearTimeout(element.TOOLTIP_HOVER_TIMEOUT);delete element.TOOLTIP_HOVER_TIMEOUT;}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.contains(event.relatedTarget)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(event.relatedTarget)){setTimeout(()=>hideTooltip(false),0);}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus();}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false;}document.body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null;}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=()=>{e.TOOLTIP_FORCE_VISIBLE=e.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!e.TOOLTIP_FORCE_VISIBLE){hideTooltip(true);}else{showTooltip(e);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler;}return false;};e.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return;}setTooltipHoverTimeout(e,true);};e.onpointermove=ev=>{if(ev.pointerType!=="mouse"){return;}setTooltipHoverTimeout(e,true);};e.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return;}if(!e.TOOLTIP_FORCE_VISIBLE&&window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");}};});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar();}else{hideSidebar();}});}function helpBlurHandler(event){if(!getHelpButton().contains(document.activeElement)&&!getHelpButton().contains(event.relatedTarget)&&!getSettingsButton().contains(document.activeElement)&&!getSettingsButton().contains(event.relatedTarget)){window.hidePopoverMenus();}}function buildHelpMenu(){const book_info=document.createElement("span");const drloChannel=`https://doc.rust-lang.org/${getVar("channel")}`;book_info.className="top";book_info.innerHTML=`You can find more information in \ +the rustdoc book.`;const shortcuts=[["?","Show this help dialog"],["S / /","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],["_","Collapse all sections, including impl blocks"],].map(x=>"
"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=[`For a full list of all search features, take a look \ + here.`,"Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + your request: \"string\"",`Look for functions that accept or return \ + slices and \ + arrays by writing square \ + brackets (e.g., -> [u8] or [] -> Option)`,"Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover";}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block";}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler;}return container;}window.hideAllModals=switchFocus=>{hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus);};window.hidePopoverMenus=()=>{onEachLazy(document.querySelectorAll("rustdoc-toolbar .popover"),elem=>{elem.style.display="none";});const button=getHelpButton();if(button){removeClass(button,"help-open");}};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu();}return menu;}function showHelp(){const button=getHelpButton();addClass(button,"help-open");button.querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display="";}}const helpLink=document.querySelector(`#${HELP_BUTTON_ID} > a`);if(isHelpPage){buildHelpMenu();}else if(helpLink){helpLink.addEventListener("click",event=>{if(!helpLink.contains(helpLink)||event.ctrlKey||event.altKey||event.metaKey){return;}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp();}else{window.hidePopoverMenus();}});}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);window.searchState.setup();}());(function(){const SIDEBAR_MIN=100;const SIDEBAR_MAX=500;const RUSTDOC_MOBILE_BREAKPOINT=700;const BODY_MIN=400;const SIDEBAR_VANISH_THRESHOLD=SIDEBAR_MIN/2;const sidebarButton=document.getElementById("sidebar-button");if(sidebarButton){sidebarButton.addEventListener("click",e=>{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");if(document.querySelector(".rustdoc.src")){window.rustdocToggleSrcSidebar();}e.preventDefault();});}let currentPointerId=null;let desiredSidebarSize=null;let pendingSidebarResizingFrame=false;const resizer=document.querySelector(".sidebar-resizer");const sidebar=document.querySelector(".sidebar");if(!resizer||!sidebar){return;}const isSrcPage=hasClass(document.body,"src");const hideSidebar=function(){if(isSrcPage){window.rustdocCloseSourceSidebar();updateLocalStorage("src-sidebar-width",null);document.documentElement.style.removeProperty("--src-sidebar-width");sidebar.style.removeProperty("--src-sidebar-width");resizer.style.removeProperty("--src-sidebar-width");}else{addClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","true");updateLocalStorage("desktop-sidebar-width",null);document.documentElement.style.removeProperty("--desktop-sidebar-width");sidebar.style.removeProperty("--desktop-sidebar-width");resizer.style.removeProperty("--desktop-sidebar-width");}};const showSidebar=function(){if(isSrcPage){window.rustdocShowSourceSidebar();}else{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");}};const changeSidebarSize=function(size){if(isSrcPage){updateLocalStorage("src-sidebar-width",size.toString());sidebar.style.setProperty("--src-sidebar-width",size+"px");resizer.style.setProperty("--src-sidebar-width",size+"px");}else{updateLocalStorage("desktop-sidebar-width",size.toString());sidebar.style.setProperty("--desktop-sidebar-width",size+"px");resizer.style.setProperty("--desktop-sidebar-width",size+"px");}};const isSidebarHidden=function(){return isSrcPage?!hasClass(document.documentElement,"src-sidebar-expanded"):hasClass(document.documentElement,"hide-sidebar");};const resize=function(e){if(currentPointerId===null||currentPointerId!==e.pointerId){return;}e.preventDefault();const pos=e.clientX-3;if(pos=SIDEBAR_MIN){if(isSidebarHidden()){showSidebar();}const constrainedPos=Math.min(pos,window.innerWidth-BODY_MIN,SIDEBAR_MAX);changeSidebarSize(constrainedPos);desiredSidebarSize=constrainedPos;if(pendingSidebarResizingFrame!==false){clearTimeout(pendingSidebarResizingFrame);}pendingSidebarResizingFrame=setTimeout(()=>{if(currentPointerId===null||pendingSidebarResizingFrame===false){return;}pendingSidebarResizingFrame=false;document.documentElement.style.setProperty("--resizing-sidebar-width",desiredSidebarSize+"px",);},100);}};window.addEventListener("resize",()=>{if(window.innerWidth=(window.innerWidth-BODY_MIN)){changeSidebarSize(window.innerWidth-BODY_MIN);}else if(desiredSidebarSize!==null&&desiredSidebarSize>SIDEBAR_MIN){changeSidebarSize(desiredSidebarSize);}});const stopResize=function(e){if(currentPointerId===null){return;}if(e){e.preventDefault();}desiredSidebarSize=sidebar.getBoundingClientRect().width;removeClass(resizer,"active");window.removeEventListener("pointermove",resize,false);window.removeEventListener("pointerup",stopResize,false);removeClass(document.documentElement,"sidebar-resizing");document.documentElement.style.removeProperty("--resizing-sidebar-width");if(resizer.releasePointerCapture){resizer.releasePointerCapture(currentPointerId);currentPointerId=null;}};const initResize=function(e){if(currentPointerId!==null||e.altKey||e.ctrlKey||e.metaKey||e.button!==0){return;}if(resizer.setPointerCapture){resizer.setPointerCapture(e.pointerId);if(!resizer.hasPointerCapture(e.pointerId)){resizer.releasePointerCapture(e.pointerId);return;}currentPointerId=e.pointerId;}window.hideAllModals(false);e.preventDefault();window.addEventListener("pointermove",resize,false);window.addEventListener("pointercancel",stopResize,false);window.addEventListener("pointerup",stopResize,false);addClass(resizer,"active");addClass(document.documentElement,"sidebar-resizing");const pos=e.clientX-sidebar.offsetLeft-3;document.documentElement.style.setProperty("--resizing-sidebar-width",pos+"px");desiredSidebarSize=null;};resizer.addEventListener("pointerdown",initResize,false);}());(function(){function copyContentToClipboard(content){if(content===null){return;}const el=document.createElement("textarea");el.value=content;el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);}function copyButtonAnimation(button){button.classList.add("clicked");if(button.reset_button_timeout!==undefined){clearTimeout(button.reset_button_timeout);}button.reset_button_timeout=setTimeout(()=>{button.reset_button_timeout=undefined;button.classList.remove("clicked");},1000);}const but=document.getElementById("copy-path");if(!but){return;}but.onclick=()=>{const titleElement=document.querySelector("title");const title=titleElement&&titleElement.textContent?titleElement.textContent.replace(" - Rust",""):"";const[item,module]=title.split(" in ");const path=[item];if(module!==undefined){path.unshift(module);}copyContentToClipboard(path.join("::"));copyButtonAnimation(but);};function copyCode(codeElem){if(!codeElem){return;}copyContentToClipboard(codeElem.textContent);}function getExampleWrap(event){const target=event.target;if(target instanceof HTMLElement){let elem=target;while(elem!==null&&!hasClass(elem,"example-wrap")){if(elem===document.body||elem.tagName==="A"||elem.tagName==="BUTTON"||hasClass(elem,"docblock")){return null;}elem=elem.parentElement;}return elem;}else{return null;}}function addCopyButton(event){const elem=getExampleWrap(event);if(elem===null){return;}elem.removeEventListener("mouseover",addCopyButton);const parent=document.createElement("div");parent.className="button-holder";const runButton=elem.querySelector(".test-arrow");if(runButton!==null){parent.appendChild(runButton);}elem.appendChild(parent);const copyButton=document.createElement("button");copyButton.className="copy-button";copyButton.title="Copy code to clipboard";copyButton.addEventListener("click",()=>{copyCode(elem.querySelector("pre > code"));copyButtonAnimation(copyButton);});parent.appendChild(copyButton);if(!elem.parentElement||!elem.parentElement.classList.contains("scraped-example")||!window.updateScrapedExample){return;}const scrapedWrapped=elem.parentElement;window.updateScrapedExample(scrapedWrapped,parent);}function showHideCodeExampleButtons(event){const elem=getExampleWrap(event);if(elem===null){return;}let buttons=elem.querySelector(".button-holder");if(buttons===null){addCopyButton(event);buttons=elem.querySelector(".button-holder");if(buttons===null){return;}}buttons.classList.toggle("keep-visible");}onEachLazy(document.querySelectorAll(".docblock .example-wrap"),elem=>{elem.addEventListener("mouseover",addCopyButton);elem.addEventListener("click",showHideCodeExampleButtons);});}());(function(){document.body.addEventListener("copy",event=>{let target=nonnull(event.target);let isInsideCode=false;while(target&&target!==document.body){if(target.tagName==="CODE"){isInsideCode=true;break;}target=target.parentElement;}if(!isInsideCode){return;}const selection=document.getSelection();nonnull(event.clipboardData).setData("text/plain",selection.toString());event.preventDefault();});}()); \ No newline at end of file diff --git a/compiler-docs/static.files/normalize-9960930a.css b/compiler-docs/static.files/normalize-9960930a.css new file mode 100644 index 0000000000..469959f137 --- /dev/null +++ b/compiler-docs/static.files/normalize-9960930a.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/compiler-docs/static.files/noscript-32bb7600.css b/compiler-docs/static.files/noscript-32bb7600.css new file mode 100644 index 0000000000..c228ec49bd --- /dev/null +++ b/compiler-docs/static.files/noscript-32bb7600.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path,#sidebar-button,.sidebar-resizer{display:none !important;}nav.sub{display:none;}.src .sidebar{display:none;}.notable-traits{display:none;}:root,:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--sidebar-border-color:#ddd;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#595959;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}@media (prefers-color-scheme:dark){:root,:root:not([data-theme]){--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--sidebar-border-color:#2A2A2A;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#a5a5a5;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(65%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}} \ No newline at end of file diff --git a/compiler-docs/static.files/rust-logo-9a9549ea.svg b/compiler-docs/static.files/rust-logo-9a9549ea.svg new file mode 100644 index 0000000000..62424d8ffd --- /dev/null +++ b/compiler-docs/static.files/rust-logo-9a9549ea.svg @@ -0,0 +1,61 @@ + + + diff --git a/compiler-docs/static.files/rustdoc-aa0817cf.css b/compiler-docs/static.files/rustdoc-aa0817cf.css new file mode 100644 index 0000000000..5fa709d10c --- /dev/null +++ b/compiler-docs/static.files/rustdoc-aa0817cf.css @@ -0,0 +1,59 @@ + :root{--nav-sub-mobile-padding:8px;--search-typename-width:6.75rem;--desktop-sidebar-width:200px;--src-sidebar-width:300px;--desktop-sidebar-z-index:100;--sidebar-elems-left-padding:24px;--clipboard-image:url('data:image/svg+xml,\ +\ +\ +');--copy-path-height:34px;--copy-path-width:33px;--checkmark-image:url('data:image/svg+xml,\ +\ +');--button-left-margin:4px;--button-border-radius:2px;--toolbar-button-border-radius:6px;--code-block-border-radius:6px;--impl-items-indent:0.3em;--docblock-indent:24px;--font-family:"Source Serif 4",NanumBarunGothic,serif;--font-family-code:"Source Code Pro",monospace;--line-number-padding:4px;--line-number-right-margin:20px;--prev-arrow-image:url('data:image/svg+xml,');--next-arrow-image:url('data:image/svg+xml,');--expand-arrow-image:url('data:image/svg+xml,');--collapse-arrow-image:url('data:image/svg+xml,');--hamburger-image:url('data:image/svg+xml,\ + ');}:root.sans-serif{--font-family:"Fira Sans",sans-serif;--font-family-code:"Fira Mono",monospace;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-0fe48ade.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:italic;font-weight:400;src:local('Fira Sans Italic'),url("FiraSans-Italic-81dc35de.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-e1aa3f0a.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:italic;font-weight:500;src:local('Fira Sans Medium Italic'),url("FiraSans-MediumItalic-ccf7e434.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Mono';font-style:normal;font-weight:400;src:local('Fira Mono'),url("FiraMono-Regular-87c26294.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Mono';font-style:normal;font-weight:500;src:local('Fira Mono Medium'),url("FiraMono-Medium-86f75c8c.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-6b053e98.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-ca3b17ed.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:500;src:local('Source Serif 4 Semibold'),url("SourceSerif4-Semibold-457a13ac.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-6d4fd4c0.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-8badfe75.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-fc8b9304.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-aa29a496.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-13b3dcba.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 var(--font-family);margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;grid-area:main-heading-h1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{position:relative;display:grid;grid-template-areas:"main-heading-breadcrumbs main-heading-breadcrumbs" "main-heading-h1 main-heading-toolbar" "main-heading-sub-heading main-heading-toolbar";grid-template-columns:minmax(105px,1fr) minmax(0,max-content);grid-template-rows:minmax(25px,min-content) min-content min-content;padding-bottom:6px;margin-bottom:15px;}.rustdoc-breadcrumbs{grid-area:main-heading-breadcrumbs;line-height:1.25;padding-top:5px;position:relative;z-index:1;}.rustdoc-breadcrumbs a{padding:5px 0 7px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}.structfield,.sub-variant-field{margin:0.6em 0;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,.mobile-topbar,.search-input,.search-results .result-name,.item-table dt>a,.out-of-band,.sub-heading,span.since,a.src,rustdoc-toolbar,summary.hideme,.scraped-example-list,.rustdoc-breadcrumbs,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.section-header a,#src-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,.mobile-topbar h2 a,h1 a,.search-results a,.search-results li,.stab,.result-name i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p,.docblock>.warning{margin:0 0 .75em 0;}p:last-child,.docblock>.warning:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.src main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,.code-header,.type-signature{font-family:var(--font-family-code);}.docblock code,.item-table dd code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.item-table dd pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.src .content pre{padding:20px;padding-left:16px;}img{max-width:100%;}.logo-container{line-height:0;display:block;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 var(--desktop-sidebar-width);width:var(--desktop-sidebar-width);overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;z-index:var(--desktop-sidebar-z-index);border-right:solid 1px var(--sidebar-border-color);}.rustdoc.src .sidebar{flex-basis:50px;width:50px;overflow-x:hidden;overflow-y:hidden;}.hide-sidebar .sidebar,.hide-sidebar .sidebar-resizer{display:none;}.sidebar-resizer{touch-action:none;width:9px;cursor:ew-resize;z-index:calc(var(--desktop-sidebar-z-index) + 1);position:fixed;height:100%;left:var(--desktop-sidebar-width);display:flex;align-items:center;justify-content:flex-start;color:var(--right-side-color);}.sidebar-resizer::before{content:"";border-right:dotted 2px currentColor;width:2px;height:12px;}.sidebar-resizer::after{content:"";border-right:dotted 2px currentColor;width:2px;height:16px;}.rustdoc.src .sidebar-resizer{left:49px;}.src-sidebar-expanded .src .sidebar-resizer{left:var(--src-sidebar-width);}.sidebar-resizing{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.sidebar-resizing *{cursor:ew-resize !important;}.sidebar-resizing .sidebar{position:fixed;border-right:solid 2px var(--sidebar-resizer-active);}.sidebar-resizing>body{padding-left:var(--resizing-sidebar-width);}.sidebar-resizer:hover,.sidebar-resizer:active,.sidebar-resizer:focus,.sidebar-resizer.active{width:10px;margin:0;left:calc(var(--desktop-sidebar-width) - 1px);border-left:solid 1px var(--sidebar-resizer-hover);color:var(--sidebar-resizer-hover);}.src-sidebar-expanded .rustdoc.src .sidebar-resizer:hover,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:active,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:focus,.src-sidebar-expanded .rustdoc.src .sidebar-resizer.active{left:calc(var(--src-sidebar-width) - 1px);}@media (pointer:coarse){.sidebar-resizer{display:none !important;}.sidebar{border-right:none;}}.sidebar-resizer.active{padding:0 140px;width:calc(140px + 140px + 9px + 2px);margin-left:-140px;border-left:none;color:var(--sidebar-resizer-active);}.sidebar,.mobile-topbar,.sidebar-menu-toggle,#src-sidebar{background-color:var(--sidebar-background-color);}.src .sidebar>*{visibility:hidden;}.src-sidebar-expanded .src .sidebar{overflow-y:auto;flex-basis:var(--src-sidebar-width);width:var(--src-sidebar-width);}.src-sidebar-expanded .src .sidebar>*{visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.logo-container>img{height:48px;width:48px;}ul.block,.block li,.block ul{padding:0;margin:0;list-style:none;}.block ul a{padding-left:1rem;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-right:0.25rem;border-left:solid var(--sidebar-elems-left-padding) transparent;margin-left:calc(-0.25rem - var(--sidebar-elems-left-padding));background-clip:border-box;}.hide-toc #rustdoc-toc,.hide-toc .in-crate{display:none;}.hide-modnav #rustdoc-modnav{display:none;}.sidebar h2{text-wrap:balance;overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{text-wrap:balance;overflow-wrap:anywhere;font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>.version,.sidebar>h2{padding-left:var(--sidebar-elems-left-padding);}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar .current a,.sidebar-crate a.logo-container:hover+h2 a,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.sidebar-crate{display:flex;align-items:center;justify-content:center;margin:14px 32px 1rem;row-gap:10px;column-gap:32px;flex-wrap:wrap;}.sidebar-crate h2{flex-grow:1;margin:0 -8px;align-self:start;}.sidebar-crate .logo-container{margin:0 calc(-16px - var(--sidebar-elems-left-padding));padding:0 var(--sidebar-elems-left-padding);text-align:center;}.sidebar-crate .logo-container img{margin-top:-16px;border-top:solid 16px transparent;box-sizing:content-box;position:relative;background-clip:border-box;z-index:1;}.sidebar-crate h2 a{display:block;border-left:solid var(--sidebar-elems-left-padding) transparent;background-clip:border-box;margin:0 calc(-24px + 0.25rem) 0 calc(-0.2rem - var(--sidebar-elems-left-padding));padding:calc((16px - 0.57rem ) / 2 ) 0.25rem;padding-left:0.2rem;}.sidebar-crate h2 .version{display:block;font-weight:normal;font-size:1rem;overflow-wrap:break-word;}.sidebar-crate+.version{margin-top:-1rem;margin-bottom:1rem;}.mobile-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap>pre,.rustdoc .scraped-example .src-line-numbers,.rustdoc .scraped-example .src-line-numbers>pre{border-radius:6px;}.rustdoc .scraped-example{position:relative;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.scraped-example:not(.expanded) .example-wrap{max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .example-wrap{max-height:calc(1.5em * 10 + 10px);}.rustdoc:not(.src) .scraped-example:not(.expanded) .src-line-numbers,.rustdoc:not(.src) .scraped-example:not(.expanded) .src-line-numbers>pre,.rustdoc:not(.src) .scraped-example:not(.expanded) pre.rust{padding-bottom:0;overflow:auto hidden;}.rustdoc:not(.src) .scraped-example .src-line-numbers{padding-top:0;}.rustdoc:not(.src) .scraped-example.expanded .src-line-numbers{padding-bottom:0;}.rustdoc:not(.src) .example-wrap pre{overflow:auto;}.example-wrap code{position:relative;}.example-wrap pre code span{display:inline;}.example-wrap.digits-1{--example-wrap-digits-count:1ch;}.example-wrap.digits-2{--example-wrap-digits-count:2ch;}.example-wrap.digits-3{--example-wrap-digits-count:3ch;}.example-wrap.digits-4{--example-wrap-digits-count:4ch;}.example-wrap.digits-5{--example-wrap-digits-count:5ch;}.example-wrap.digits-6{--example-wrap-digits-count:6ch;}.example-wrap.digits-7{--example-wrap-digits-count:7ch;}.example-wrap.digits-8{--example-wrap-digits-count:8ch;}.example-wrap.digits-9{--example-wrap-digits-count:9ch;}.example-wrap [data-nosnippet]{width:calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2);}.example-wrap pre>code{padding-left:calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2 + var(--line-number-right-margin));}.example-wrap [data-nosnippet]{color:var(--src-line-numbers-span-color);text-align:right;display:inline-block;margin-right:var(--line-number-right-margin);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;padding:0 var(--line-number-padding);position:absolute;left:0;}.example-wrap .line-highlighted[data-nosnippet]{background-color:var(--src-line-number-highlighted-background-color);}.example-wrap pre>code{position:relative;display:block;}:root.word-wrap-source-code .example-wrap pre>code{word-break:break-all;white-space:pre-wrap;}:root.word-wrap-source-code .example-wrap pre>code *{word-break:break-all;}.example-wrap [data-nosnippet]:target{border-right:none;}.example-wrap.hide-lines [data-nosnippet]{display:none;}.search-loading{text-align:center;}.item-table dd{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.item-table dd code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:var(--docblock-indent);position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.sub-heading{font-size:1rem;flex-grow:0;grid-area:main-heading-sub-heading;line-height:1.25;padding-bottom:4px;}.main-heading rustdoc-toolbar,.main-heading .out-of-band{grid-area:main-heading-toolbar;}rustdoc-toolbar{display:flex;flex-direction:row;flex-wrap:nowrap;min-height:60px;}.docblock code,.item-table dd code,pre,.rustdoc.src .example-wrap,.example-wrap .src-line-numbers{background-color:var(--code-block-background-color);border-radius:var(--code-block-border-radius);text-decoration:inherit;}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}.docblock .stab,.item-table dd .stab,.docblock p code{display:inline-block;}.docblock li{margin-bottom:.4em;}.docblock li p:not(:last-child){margin-bottom:.3em;}div.where{white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:var(--docblock-indent);}.impl-items>.item-info{margin-left:calc(var(--docblock-indent) + var(--impl-items-indent));}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;margin:4px 0 0 0;display:flex;align-items:center;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;margin-bottom:4px;}.src nav.sub{margin:0 0 -10px 0;}.section-header{display:block;position:relative;}.section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.section-header>.anchor{left:-15px;padding-right:8px;}h2.section-header>.anchor{padding-right:6px;}a.doc-anchor{color:var(--main-color);display:none;position:absolute;left:-17px;padding-right:10px;padding-left:3px;}*:hover>.doc-anchor{display:block;}.top-doc>.docblock>*:first-child>.doc-anchor{display:none !important;}.main-heading a:hover,.example-wrap .rust a:hover:not([data-nosnippet]),.all-items a:hover,.docblock a:not(.scrape-help):not(.tooltip):hover:not(.doc-anchor),.item-table dd a:not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block li.current a{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{padding:0;margin:0;width:100%;}.item-table>dt{padding-right:1.25rem;}.item-table>dd{margin-inline-start:0;margin-left:0;}.search-results-title{margin-top:0;white-space:nowrap;display:flex;align-items:baseline;}.search-results-title+.sub-heading{color:var(--main-color);display:flex;align-items:baseline;white-space:nowrap;}#crate-search-div{position:relative;min-width:0;}#crate-search{padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;margin:0;padding:0;}.search-results>a{display:grid;grid-template-areas:"search-result-name search-result-desc" "search-result-type-signature search-result-type-signature";grid-template-columns:.6fr .4fr;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);column-gap:1em;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;grid-area:search-result-desc;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name{display:flex;align-items:center;justify-content:start;grid-area:search-result-name;}.search-results .result-name .alias{color:var(--search-results-alias-color);}.search-results .result-name .grey{color:var(--search-results-grey-color);}.search-results .result-name .typename{color:var(--search-results-grey-color);font-size:0.875rem;width:var(--search-typename-width);}.search-results .result-name .path{word-break:break-all;max-width:calc(100% - var(--search-typename-width));display:inline-block;}.search-results .result-name .path>*{display:inline;}.search-results .type-signature{grid-area:search-result-type-signature;white-space:pre-wrap;}.popover{position:absolute;top:100%;right:0;z-index:calc(var(--desktop-sidebar-z-index) + 1);margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-check input{flex-shrink:0;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,\ + \ + ');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;}#settings.popover{--popover-arrow-offset:202px;top:calc(100% - 16px);}#help.popover{max-width:600px;--popover-arrow-offset:118px;top:calc(100% - 16px);}#help dt{float:left;clear:left;margin-right:0.5rem;}#help dd{margin-bottom:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;padding:0 0.5rem;text-wrap-style:balance;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side{display:flex;margin-bottom:20px;}.side-by-side>div{width:50%;padding:0 20px 0 17px;}.item-info .stab{display:block;padding:3px;margin-bottom:5px;}.item-table dt .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;white-space:pre-wrap;border-radius:3px;display:inline;vertical-align:baseline;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji,.item-info .stab::before{font-size:1.25rem;}.stab .emoji{margin-right:0.3rem;}.item-info .stab::before{content:"\0";width:0;display:inline-block;color:transparent;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band,.sub-heading,rustdoc-toolbar{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.src .example-wrap pre.rust a:not([data-nosnippet]){background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}.content .docblock .warning{border-left:2px solid var(--warning-border-color);padding:14px;position:relative;overflow-x:visible !important;}.content .docblock .warning::before{color:var(--warning-border-color);content:"ⓘ";position:absolute;left:-25px;top:5px;font-weight:bold;font-size:1.25rem;}.top-doc>.docblock>.warning:first-child::before{top:20px;}.example-wrap>a.test-arrow,.example-wrap .button-holder{visibility:hidden;position:absolute;top:4px;right:4px;z-index:1;}a.test-arrow{height:var(--copy-path-height);padding:6px 4px 0 11px;}a.test-arrow::before{content:url('data:image/svg+xml,');}.example-wrap .button-holder{display:flex;}@media not (pointer:coarse){.example-wrap:hover>a.test-arrow,.example-wrap:hover>.button-holder{visibility:visible;}}.example-wrap .button-holder.keep-visible{visibility:visible;}.example-wrap .button-holder>*{background:var(--main-background-color);cursor:pointer;border-radius:var(--button-border-radius);height:var(--copy-path-height);width:var(--copy-path-width);border:0;color:var(--code-example-button-color);}.example-wrap .button-holder>*:hover{color:var(--code-example-button-hover-color);}.example-wrap .button-holder>*:not(:first-child){margin-left:var(--button-left-margin);}.example-wrap .button-holder .copy-button{padding:2px 0 0 4px;}.example-wrap .button-holder .copy-button::before,.example-wrap .test-arrow::before,.example-wrap .button-holder .prev::before,.example-wrap .button-holder .next::before,.example-wrap .button-holder .expand::before{filter:var(--copy-path-img-filter);}.example-wrap .button-holder .copy-button::before{content:var(--clipboard-image);}.example-wrap .button-holder .copy-button:hover::before,.example-wrap .test-arrow:hover::before{filter:var(--copy-path-img-hover-filter);}.example-wrap .button-holder .copy-button.clicked::before{content:var(--checkmark-image);padding-right:5px;}.example-wrap .button-holder .prev,.example-wrap .button-holder .next,.example-wrap .button-holder .expand{line-height:0px;}.example-wrap .button-holder .prev::before{content:var(--prev-arrow-image);}.example-wrap .button-holder .next::before{content:var(--next-arrow-image);}.example-wrap .button-holder .expand::before{content:var(--expand-arrow-image);}.example-wrap .button-holder .expand.collapse::before{content:var(--collapse-arrow-image);}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.main-heading span.since::before{content:"Since ";}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}@keyframes targetfadein{from{background-color:var(--main-background-color);}10%{background-color:var(--target-border-color);}to{background-color:var(--target-background-color);}}:target:not([data-nosnippet]){background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}@media not (prefers-reduced-motion){:target{animation:0.65s cubic-bezier(0,0,0.1,1.0) 0.1s targetfadein;}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{margin-top:0.25rem;display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}.src-sidebar-title{position:sticky;top:0;display:flex;padding:8px 8px 0 48px;margin-bottom:7px;background:var(--sidebar-background-color);border-bottom:1px solid var(--border-color);}#settings-menu,#help-button,button#toggle-all-docs{margin-left:var(--button-left-margin);display:flex;line-height:1.25;min-width:14px;}#sidebar-button{display:none;line-height:0;}.hide-sidebar #sidebar-button,.src #sidebar-button{display:flex;margin-right:4px;position:fixed;height:34px;width:34px;}.hide-sidebar #sidebar-button{left:6px;background-color:var(--main-background-color);z-index:1;}.src #sidebar-button{left:8px;z-index:calc(var(--desktop-sidebar-z-index) + 1);}.hide-sidebar .src #sidebar-button{position:static;}#settings-menu>a,#help-button>a,#sidebar-button>a,button#toggle-all-docs{display:flex;align-items:center;justify-content:center;flex-direction:column;}#settings-menu>a,#help-button>a,button#toggle-all-docs{border:1px solid transparent;border-radius:var(--button-border-radius);color:var(--main-color);}#settings-menu>a,#help-button>a,button#toggle-all-docs{width:80px;border-radius:var(--toolbar-button-border-radius);}#settings-menu>a,#help-button>a{min-width:0;}#sidebar-button>a{background-color:var(--sidebar-background-color);width:33px;}#sidebar-button>a:hover,#sidebar-button>a:focus-visible{background-color:var(--main-background-color);}#settings-menu>a:hover,#settings-menu>a:focus-visible,#help-button>a:hover,#help-button>a:focus-visible,button#toggle-all-docs:hover,button#toggle-all-docs:focus-visible{border-color:var(--settings-button-border-focus);text-decoration:none;}#settings-menu>a::before{content:url('data:image/svg+xml,\ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs::before{content:url('data:image/svg+xml,\ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs.will-expand::before{content:url('data:image/svg+xml,\ + ');}#help-button>a::before{content:url('data:image/svg+xml,\ + \ + ?');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs::before,#help-button>a::before,#settings-menu>a::before{filter:var(--settings-menu-filter);margin:8px;}@media not (pointer:coarse){button#toggle-all-docs:hover::before,#help-button>a:hover::before,#settings-menu>a:hover::before{filter:var(--settings-menu-hover-filter);}}button[disabled]#toggle-all-docs{opacity:0.25;border:solid 1px var(--main-background-color);background-size:cover;}button[disabled]#toggle-all-docs:hover{border:solid 1px var(--main-background-color);cursor:not-allowed;}rustdoc-toolbar span.label{font-size:1rem;flex-grow:1;padding-bottom:4px;}#sidebar-button>a::before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:var(--copy-path-height);width:var(--copy-path-width);margin-left:10px;padding:0;padding-left:2px;border:0;font-size:0;}#copy-path::before{filter:var(--copy-path-img-filter);content:var(--clipboard-image);}#copy-path:hover::before{filter:var(--copy-path-img-hover-filter);}#copy-path.clicked::before{content:var(--checkmark-image);}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}#settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.big-toggle{contain:inline-size;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,\ + ');content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>.methods>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}.impl-items>*:not(.item-info),.implementors-toggle>.docblock,#main-content>.methods>:not(.item-info),.impl>.item-info,.impl>.docblock,.impl+.docblock{margin-left:var(--impl-items-indent);}details.big-toggle>summary:not(.hideme)::before{left:-34px;top:9px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,\ + ');}details.toggle[open] >summary::after{content:"Collapse";}details.toggle:not([open])>summary .docblock{max-height:calc(1.5em + 0.75em);overflow-y:hidden;}details.toggle:not([open])>summary .docblock>:first-child{max-width:100%;overflow:hidden;width:fit-content;white-space:nowrap;position:relative;padding-right:1em;}details.toggle:not([open])>summary .docblock>:first-child::after{content:"…";position:absolute;right:0;top:0;bottom:0;z-index:1;background-color:var(--main-background-color);font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;padding-left:0.2em;}details.toggle:not([open])>summary .docblock>div:first-child::after{padding-top:calc(1.5em + 0.75em - 1.2rem);}details.toggle>summary .docblock{margin-top:0.75em;}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}.src #sidebar-button>a::before,.sidebar-menu-toggle::before{content:var(--hamburger-image);opacity:0.75;filter:var(--mobile-sidebar-menu-filter);}.sidebar-menu-toggle:hover::before,.sidebar-menu-toggle:active::before,.sidebar-menu-toggle:focus::before{opacity:1;}@media (max-width:850px){#search-tabs .count{display:block;}.side-by-side{flex-direction:column-reverse;}.side-by-side>div{width:auto;}}@media (max-width:700px){:root{--impl-items-indent:0.7em;}*[id]{scroll-margin-top:45px;}#copy-path{width:0;visibility:hidden;}rustdoc-toolbar span.label{display:none;}#settings-menu>a,#help-button>a,button#toggle-all-docs{width:33px;}#settings.popover{--popover-arrow-offset:86px;}#help.popover{--popover-arrow-offset:48px;}.rustdoc{display:block;}main{padding-left:15px;padding-top:0px;}.sidebar .logo-container,.sidebar .location,.sidebar-resizer{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);border-right:none;width:100%;}.sidebar-elems .block li a{white-space:wrap;}.src main,.rustdoc.src .sidebar{top:0;padding:0;height:100vh;border:0;}.src .search-form{margin-left:40px;}.src .main-heading{margin-left:8px;}.hide-sidebar .search-form{margin-left:32px;}.hide-sidebar .src .search-form{margin-left:0;}.sidebar.shown,.src-sidebar-expanded .src .sidebar,.rustdoc:not(.src) .sidebar:focus-within{left:0;}.mobile-topbar h2{padding-bottom:0;margin:auto 0.5em auto auto;overflow:hidden;font-size:24px;white-space:nowrap;text-overflow:ellipsis;}.mobile-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}.mobile-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;font-size:2rem;height:45px;width:100%;left:0;top:0;}.hide-sidebar .mobile-topbar{display:none;}.sidebar-menu-toggle{width:45px;border:none;line-height:0;}.hide-sidebar .sidebar-menu-toggle{display:none;}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#sidebar-button>a::before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}.sidebar-menu-toggle:hover{background:var(--main-background-color);}.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table dd{padding-left:2em;}.search-results .result-name{display:block;}.search-results .result-name .typename{width:initial;margin-right:0;}.search-results .result-name .typename,.search-results .result-name .path{display:inline;}.src-sidebar-expanded .src .sidebar{position:fixed;max-width:100vw;width:100vw;}.src .src-sidebar-title{padding-top:0;}details.implementors-toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>.methods>details.toggle>summary:not(.hideme)::before{left:-20px;}summary>.item-info{margin-left:10px;}.impl-items>.item-info{margin-left:calc(var(--impl-items-indent) + 10px);}.src nav.sub{margin:0 0 -25px 0;padding:var(--nav-sub-mobile-padding);}html:not(.src-sidebar-expanded) .src #sidebar-button>a{background-color:var(--main-background-color);}html:not(.src-sidebar-expanded) .src #sidebar-button>a:hover,html:not(.src-sidebar-expanded) .src #sidebar-button>a:focus-visible{background-color:var(--sidebar-background-color);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}.item-table:not(.reexports){display:grid;grid-template-columns:33% 67%;}.item-table>dt,.item-table>dd{overflow-wrap:anywhere;}.item-table>dt{grid-column-start:1;}.item-table>dd{grid-column-start:2;}}@media print{:root{--docblock-indent:0;}nav.sidebar,nav.sub,.out-of-band,a.src,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}main{padding:10px;}}@media (max-width:464px){:root{--docblock-indent:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example:not(.expanded) .example-wrap::before,.scraped-example:not(.expanded) .example-wrap::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .example-wrap::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .example-wrap::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded){width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded){overflow-x:hidden;}.scraped-example .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;}:root[data-theme="light"],:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--sidebar-border-color:#ddd;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#595959;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="dark"]{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--sidebar-border-color:#999;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#a5a5a5;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(65%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="ayu"]{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--sidebar-border-color:#5c6773;--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--code-example-button-color:#b2b2b2;--code-example-button-hover-color:#fff;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--settings-menu-filter:invert(70%);--settings-menu-hover-filter:invert(100%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--src-sidebar-background-selected:#14191f;--src-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);--sidebar-resizer-hover:hsl(34,50%,33%);--sidebar-resizer-active:hsl(34,100%,66%);}:root[data-theme="ayu"] h1,:root[data-theme="ayu"] h2,:root[data-theme="ayu"] h3,:root[data-theme="ayu"] h4,:where(:root[data-theme="ayu"]) h1 a,:root[data-theme="ayu"] .sidebar h2 a,:root[data-theme="ayu"] .sidebar h3 a{color:#fff;}:root[data-theme="ayu"] .docblock code{color:#ffb454;}:root[data-theme="ayu"] .docblock a>code{color:#39AFD7 !important;}:root[data-theme="ayu"] .code-header,:root[data-theme="ayu"] .docblock pre>code,:root[data-theme="ayu"] pre,:root[data-theme="ayu"] pre>code,:root[data-theme="ayu"] .item-info code,:root[data-theme="ayu"] .rustdoc.source .example-wrap{color:#e6e1cf;}:root[data-theme="ayu"] .sidebar .current,:root[data-theme="ayu"] .sidebar .current a,:root[data-theme="ayu"] .sidebar a:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:hover,:root[data-theme="ayu"] details.dir-entry summary:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:focus,:root[data-theme="ayu"] details.dir-entry summary:focus,:root[data-theme="ayu"] #src-sidebar div.files>a.selected{color:#ffb44c;}:root[data-theme="ayu"] .sidebar-elems .location{color:#ff7733;}:root[data-theme="ayu"] a[data-nosnippet].line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}:root[data-theme="ayu"] .search-results a:hover,:root[data-theme="ayu"] .search-results a:focus{color:#fff !important;background-color:#3c3c3c;}:root[data-theme="ayu"] .search-results a{color:#0096cf;}:root[data-theme="ayu"] .search-results a div.desc{color:#c5c5c5;}:root[data-theme="ayu"] .result-name .primitive>i,:root[data-theme="ayu"] .result-name .keyword>i{color:#788797;}:root[data-theme="ayu"] #search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}:root[data-theme="ayu"] #search-tabs>button:not(.selected){border:none;background-color:transparent !important;}:root[data-theme="ayu"] #search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}:root[data-theme="ayu"] #settings-menu>a img,:root[data-theme="ayu"] #sidebar-button>a::before{filter:invert(100);} \ No newline at end of file diff --git a/compiler-docs/static.files/scrape-examples-5e967b76.js b/compiler-docs/static.files/scrape-examples-5e967b76.js new file mode 100644 index 0000000000..40dfe842fd --- /dev/null +++ b/compiler-docs/static.files/scrape-examples-5e967b76.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelectorAll("[data-nosnippet]");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines[line].offsetTop;}else{const halfHeight=elt.offsetHeight/2;const offsetTop=lines[loc[0]].offsetTop;const lastLine=lines[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight;}lines[0].parentElement.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset);}function createScrapeButton(parent,className,content){const button=document.createElement("button");button.className=className;button.title=content;parent.insertBefore(button,parent.firstChild);return button;}window.updateScrapedExample=(example,buttonHolder)=>{let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");let expandButton=null;if(!example.classList.contains("expanded")){expandButton=createScrapeButton(buttonHolder,"expand","Show all");}const isHidden=example.parentElement.classList.contains("more-scraped-examples");const locs=example.locs;if(locs.length>1){const next=createScrapeButton(buttonHolder,"next","Next usage");const prev=createScrapeButton(buttonHolder,"prev","Previous usage");const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title;};prev.addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length;});});next.addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length;});});}if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");removeClass(expandButton,"collapse");expandButton.title="Show all";scrollToLoc(example,locs[0][0],isHidden);}else{addClass(example,"expanded");addClass(expandButton,"collapse");expandButton.title="Show single example";}});}};function setupLoc(example,isHidden){example.locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);scrollToLoc(example,example.locs[0][0],isHidden);}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>setupLoc(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false;});});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>setupLoc(el,true));});},{once:true});});})(); \ No newline at end of file diff --git a/compiler-docs/static.files/search-fa3e91e5.js b/compiler-docs/static.files/search-fa3e91e5.js new file mode 100644 index 0000000000..d4818b4fe6 --- /dev/null +++ b/compiler-docs/static.files/search-fa3e91e5.js @@ -0,0 +1,6 @@ +"use strict";if(!Array.prototype.toSpliced){Array.prototype.toSpliced=function(){const me=this.slice();Array.prototype.splice.apply(me,arguments);return me;};}function onEachBtwn(arr,func,funcBtwn){let skipped=true;for(const value of arr){if(!skipped){funcBtwn(value);}skipped=func(value);}}function undef2null(x){if(x!==undefined){return x;}return null;}const itemTypes=["keyword","primitive","mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","associatedtype","constant","associatedconstant","union","foreigntype","existential","attr","derive","traitalias","generic",];const TY_PRIMITIVE=itemTypes.indexOf("primitive");const TY_GENERIC=itemTypes.indexOf("generic");const TY_IMPORT=itemTypes.indexOf("import");const TY_TRAIT=itemTypes.indexOf("trait");const TY_FN=itemTypes.indexOf("fn");const TY_METHOD=itemTypes.indexOf("method");const TY_TYMETHOD=itemTypes.indexOf("tymethod");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";const UNBOXING_LIMIT=5;const REGEX_IDENT=/\p{ID_Start}\p{ID_Continue}*|_\p{ID_Continue}+/uy;const REGEX_INVALID_TYPE_FILTER=/[^a-z]/ui;const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1;}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1);}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1);}if(b.length===0){return minDist;}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE;}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost,);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1,);}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp;}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1);},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit);}function isEndCharacter(c){return"=,>-])".indexOf(c)!==-1;}function isFnLikeTy(ty){return ty===TY_FN||ty===TY_METHOD||ty===TY_TYMETHOD;}function isSeparatorCharacter(c){return c===","||c==="=";}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->";}function skipWhitespace(parserState){while(parserState.pos0){const c=parserState.userQuery[pos-1];if(c===lookingFor){return true;}else if(c!==" "){break;}pos-=1;}return false;}function isLastElemGeneric(elems,parserState){return(elems.length>0&&elems[elems.length-1].generics.length>0)||prevIs(parserState,">");}function getFilteredNextElem(query,parserState,elems,isInGenerics){const start=parserState.pos;if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){throw["Expected type filter before ",":"];}getNextElem(query,parserState,elems,isInGenerics);if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",];}if(elems.length===0){throw["Expected type filter before ",":"];}else if(query.literalSearch){throw["Cannot use quotes on type filter"];}const typeFilterElem=elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.normalizedPathLast;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;getNextElem(query,parserState,elems,isInGenerics);}}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let foundSeparator=false;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let hofParameters=null;let extra="";if(endChar===">"){extra="<";}else if(endChar==="]"){extra="[";}else if(endChar===")"){extra="(";}else if(endChar===""){extra="->";}else{extra=endChar;}while(parserState.pos"," after ","="];}hofParameters=[...elems];elems.length=0;parserState.pos+=2;foundStopChar=true;foundSeparator=false;continue;}else if(c===" "){parserState.pos+=1;continue;}else if(isSeparatorCharacter(c)){parserState.pos+=1;foundStopChar=true;foundSeparator=true;continue;}else if(c===":"&&isPathStart(parserState)){throw["Unexpected ","::",": paths cannot start with ","::"];}else if(isEndCharacter(c)){throw["Unexpected ",c," after ",extra];}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"];}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"];}if(endChar!==""){throw["Expected ",",",", ","=",", or ",endChar,...extra,", found ",c,];}throw["Expected ",","," or ","=",...extra,", found ",c,];}const posBefore=parserState.pos;getFilteredNextElem(query,parserState,elems,endChar!=="");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ",extra];}if(posBefore===parserState.pos){parserState.pos+=1;}foundStopChar=false;}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ",extra];}parserState.pos+=1;if(hofParameters){foundSeparator=false;if([...elems,...hofParameters].some(x=>x.bindingName)||parserState.isInBinding){throw["Unexpected ","="," within ","->"];}const hofElem=makePrimitiveElement("->",{generics:hofParameters,bindings:new Map([["output",[...elems]]]),typeFilter:null,});elems.length=0;elems[0]=hofElem;}parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding;return{foundSeparator};}function getNextElem(query,parserState,elems,isInGenerics){const generics=[];skipWhitespace(parserState);let start=parserState.pos;let end;if("[(".indexOf(parserState.userQuery[parserState.pos])!==-1){let endChar=")";let name="()";let friendlyName="tuple";if(parserState.userQuery[parserState.pos]==="["){endChar="]";name="[]";friendlyName="slice";}parserState.pos+=1;const{foundSeparator}=getItemsBefore(query,parserState,generics,endChar);const typeFilter=parserState.typeFilter;const bindingName=parserState.isInBinding;parserState.typeFilter=null;parserState.isInBinding=null;for(const gen of generics){if(gen.bindingName!==null){throw["Type parameter ","=",` cannot be within ${friendlyName} `,name];}}if(name==="()"&&!foundSeparator&&generics.length===1&&typeFilter===null){elems.push(generics[0]);}else if(name==="()"&&generics.length===1&&generics[0].name==="->"){generics[0].typeFilter=typeFilter;elems.push(generics[0]);}else{if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive ",name," and ",typeFilter," both specified",];}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1;}elems.push(makePrimitiveElement(name,{bindingName,generics}));}}else if(parserState.userQuery[parserState.pos]==="&"){if(parserState.typeFilter!==null&&parserState.typeFilter!=="primitive"){throw["Invalid search type: primitive ","&"," and ",parserState.typeFilter," both specified",];}parserState.typeFilter=null;parserState.pos+=1;let c=parserState.userQuery[parserState.pos];while(c===" "&&parserState.pos=end){throw["Found generics without a path"];}parserState.pos+=1;getItemsBefore(query,parserState,generics,">");}else if(parserState.pos=end){throw["Found generics without a path"];}if(parserState.isInBinding){throw["Unexpected ","("," after ","="];}parserState.pos+=1;const typeFilter=parserState.typeFilter;parserState.typeFilter=null;getItemsBefore(query,parserState,generics,")");skipWhitespace(parserState);if(isReturnArrow(parserState)){parserState.pos+=2;skipWhitespace(parserState);getFilteredNextElem(query,parserState,generics,isInGenerics);generics[generics.length-1].bindingName=makePrimitiveElement("output");}else{generics.push(makePrimitiveElement(null,{bindingName:makePrimitiveElement("output"),typeFilter:null,}));}parserState.typeFilter=typeFilter;}if(isStringElem){skipWhitespace(parserState);}if(start>=end&&generics.length===0){return;}if(parserState.userQuery[parserState.pos]==="="){if(parserState.isInBinding){throw["Cannot write ","="," twice in a binding"];}if(!isInGenerics){throw["Type parameter ","="," must be within generics list"];}const name=parserState.userQuery.slice(start,end).trim();if(name==="!"){throw["Type parameter ","="," key cannot be ","!"," never type"];}if(name.includes("!")){throw["Type parameter ","="," key cannot be ","!"," macro"];}if(name.includes("::")){throw["Type parameter ","="," key cannot contain ","::"," path"];}if(name.includes(":")){throw["Type parameter ","="," key cannot contain ",":"," type"];}parserState.isInBinding={name,generics};}else{elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics,),);}}}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();const match=query.match(REGEX_INVALID_TYPE_FILTER);if(match){throw["Unexpected ",match[0]," in type filter (before ",":",")",];}}function createQueryElement(query,parserState,name,generics,isInGenerics){const path=name.trim();if(path.length===0&&generics.length===0){throw["Unexpected ",parserState.userQuery[parserState.pos]];}if(query.literalSearch&&parserState.totalElems-parserState.genericsElems>0){throw["Cannot have more than one element if you use quotes"];}const typeFilter=parserState.typeFilter;parserState.typeFilter=null;if(name.trim()==="!"){if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive never type ","!"," and ",typeFilter," both specified",];}if(generics.length!==0){throw["Never type ","!"," does not accept generic parameters",];}const bindingName=parserState.isInBinding;parserState.isInBinding=null;return makePrimitiveElement("never",{bindingName});}const quadcolon=/::\s*::/.exec(path);if(path.startsWith("::")){throw["Paths cannot start with ","::"];}else if(quadcolon!==null){throw["Unexpected ",quadcolon[0]];}const pathSegments=path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/).map(x=>x.toLowerCase());if(pathSegments.length===0||(pathSegments.length===1&&pathSegments[0]==="")){if(generics.length>0||prevIs(parserState,">")){throw["Found generics without a path"];}else{throw["Unexpected ",parserState.userQuery[parserState.pos]];}}for(const[i,pathSegment]of pathSegments.entries()){if(pathSegment==="!"){if(i!==0){throw["Never type ","!"," is not associated item"];}pathSegments[i]="never";}}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1;}const bindingName=parserState.isInBinding;parserState.isInBinding=null;const bindings=new Map();const pathLast=pathSegments[pathSegments.length-1];return{name:name.trim(),id:null,fullPath:pathSegments,pathWithoutLast:pathSegments.slice(0,pathSegments.length-1),pathLast,normalizedPathLast:pathLast.replace(/_/g,""),generics:generics.filter(gen=>{if(gen.bindingName!==null&&gen.bindingName.name!==null){if(gen.name!==null){gen.bindingName.generics.unshift(gen);}bindings.set(gen.bindingName.name.toLowerCase().replace(/_/g,""),gen.bindingName.generics,);return false;}return true;}),bindings,typeFilter,bindingName,};}function makePrimitiveElement(name,extra){return Object.assign({name,id:null,fullPath:[name],pathWithoutLast:[],pathLast:name,normalizedPathLast:name,generics:[],bindings:new Map(),typeFilter:"primitive",bindingName:null,},extra);}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"];}else if(query.literalSearch){throw["Cannot have more than one literal search element"];}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"];}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""];}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"];}else if(start===end){throw["Cannot have empty string element"];}parserState.pos+=1;query.literalSearch=true;}function getIdentEndPosition(parserState){let afterIdent=consumeIdent(parserState);let end=parserState.pos;let macroExclamation=-1;while(parserState.pos0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]," (not a valid identifier)"];}else{throw["Unexpected ",c," (not a valid identifier)"];}parserState.pos+=1;afterIdent=consumeIdent(parserState);end=parserState.pos;}if(macroExclamation!==-1){if(parserState.typeFilter===null){parserState.typeFilter="macro";}else if(parserState.typeFilter!=="macro"){throw["Invalid search type: macro ","!"," and ",parserState.typeFilter," both specified",];}end=macroExclamation;}return end;}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1;}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::";}function consumeIdent(parserState){REGEX_IDENT.lastIndex=parserState.pos;const match=parserState.userQuery.match(REGEX_IDENT);if(match){parserState.pos+=match[0].length;return true;}return false;}function isPathSeparator(c){return c===":"||c===" ";}class VlqHexDecoder{constructor(string,cons){this.string=string;this.cons=cons;this.offset=0;this.backrefQueue=[];}decodeList(){let c=this.string.charCodeAt(this.offset);const ret=[];while(c!==125){ret.push(this.decode());c=this.string.charCodeAt(this.offset);}this.offset+=1;return ret;}decode(){let n=0;let c=this.string.charCodeAt(this.offset);if(c===123){this.offset+=1;return this.decodeList();}while(c<96){n=(n<<4)|(c&0xF);this.offset+=1;c=this.string.charCodeAt(this.offset);}n=(n<<4)|(c&0xF);const[sign,value]=[n&1,n>>1];this.offset+=1;return sign?-value:value;}next(){const c=this.string.charCodeAt(this.offset);if(c>=48&&c<64){this.offset+=1;return this.backrefQueue[c-48];}if(c===96){this.offset+=1;return this.cons(0);}const result=this.cons(this.decode());this.backrefQueue.unshift(result);if(this.backrefQueue.length>16){this.backrefQueue.pop();}return result;}}class RoaringBitmap{constructor(str){const strdecoded=atob(str);const u8array=new Uint8Array(strdecoded.length);for(let j=0;j=4){offsets=[];for(let j=0;j>3]&(1<<(j&0x7))){const runcount=(u8array[i]|(u8array[i+1]<<8));i+=2;this.containers.push(new RoaringBitmapRun(runcount,u8array.slice(i,i+(runcount*4)),));i+=runcount*4;}else if(this.cardinalities[j]>=4096){this.containers.push(new RoaringBitmapBits(u8array.slice(i,i+8192)));i+=8192;}else{const end=this.cardinalities[j]*2;this.containers.push(new RoaringBitmapArray(this.cardinalities[j],u8array.slice(i,i+end),));i+=end;}}}contains(keyvalue){const key=keyvalue>>16;const value=keyvalue&0xFFFF;let left=0;let right=this.keys.length-1;while(left<=right){const mid=Math.floor((left+right)/2);const x=this.keys[mid];if(xkey){right=mid-1;}else{return this.containers[mid].contains(value);}}return false;}}class RoaringBitmapRun{constructor(runcount,array){this.runcount=runcount;this.array=array;}contains(value){let left=0;let right=this.runcount-1;while(left<=right){const mid=Math.floor((left+right)/2);const i=mid*4;const start=this.array[i]|(this.array[i+1]<<8);const lenm1=this.array[i+2]|(this.array[i+3]<<8);if((start+lenm1)value){right=mid-1;}else{return true;}}return false;}}class RoaringBitmapArray{constructor(cardinality,array){this.cardinality=cardinality;this.array=array;}contains(value){let left=0;let right=this.cardinality-1;while(left<=right){const mid=Math.floor((left+right)/2);const i=mid*2;const x=this.array[i]|(this.array[i+1]<<8);if(xvalue){right=mid-1;}else{return true;}}return false;}}class RoaringBitmapBits{constructor(array){this.array=array;}contains(value){return!!(this.array[value>>3]&(1<<(value&7)));}}class NameTrie{constructor(){this.children=[];this.matches=[];}insert(name,id,tailTable){this.insertSubstring(name,0,id,tailTable);}insertSubstring(name,substart,id,tailTable){const l=name.length;if(substart===l){this.matches.push(id);}else{const sb=name.charCodeAt(substart);let child;if(this.children[sb]!==undefined){child=this.children[sb];}else{child=new NameTrie();this.children[sb]=child;let sste;if(substart>=2){const tail=name.substring(substart-2,substart+1);const entry=tailTable.get(tail);if(entry!==undefined){sste=entry;}else{sste=[];tailTable.set(tail,sste);}sste.push(child);}}child.insertSubstring(name,substart+1,id,tailTable);}}search(name,tailTable){const results=new Set();this.searchSubstringPrefix(name,0,results);if(results.size=3){const levParams=name.length>=6?new Lev2TParametricDescription(name.length):new Lev1TParametricDescription(name.length);this.searchLev(name,0,levParams,results);const tail=name.substring(0,3);const list=tailTable.get(tail);if(list!==undefined){for(const entry of list){entry.searchSubstringPrefix(name,3,results);}}}return[...results];}searchSubstringPrefix(name,substart,results){const l=name.length;if(substart===l){for(const match of this.matches){results.add(match);}let unprocessedChildren=[];for(const child of this.children){if(child){unprocessedChildren.push(child);}}let nextSet=[];while(unprocessedChildren.length!==0){const next=unprocessedChildren.pop();for(const child of next.children){if(child){nextSet.push(child);}}for(const match of next.matches){results.add(match);}if(unprocessedChildren.length===0){const tmp=unprocessedChildren;unprocessedChildren=nextSet;nextSet=tmp;}}}else{const sb=name.charCodeAt(substart);if(this.children[sb]!==undefined){this.children[sb].searchSubstringPrefix(name,substart+1,results);}}}searchLev(name,substart,levParams,results){const stack=[[this,0]];const n=levParams.n;while(stack.length!==0){const[trie,levState]=stack.pop();for(const[charCode,child]of trie.children.entries()){if(!child){continue;}const levPos=levParams.getPosition(levState);const vector=levParams.getVector(name,charCode,levPos,Math.min(name.length,levPos+(2*n)+1),);const newLevState=levParams.transition(levState,levPos,vector,);if(newLevState>=0){stack.push([child,newLevState]);if(levParams.isAccept(newLevState)){for(const match of child.matches){results.add(match);}}}}}}}class DocSearch{constructor(rawSearchIndex,rootPath,searchState){this.searchIndexDeprecated=new Map();this.searchIndexEmptyDesc=new Map();this.functionTypeFingerprint=new Uint32Array(0);this.typeNameIdMap=new Map();this.assocTypeIdNameMap=new Map();this.ALIASES=new Map();this.FOUND_ALIASES=new Set();this.rootPath=rootPath;this.searchState=searchState;this.typeNameIdOfArray=this.buildTypeMapIndex("array");this.typeNameIdOfSlice=this.buildTypeMapIndex("slice");this.typeNameIdOfArrayOrSlice=this.buildTypeMapIndex("[]");this.typeNameIdOfTuple=this.buildTypeMapIndex("tuple");this.typeNameIdOfUnit=this.buildTypeMapIndex("unit");this.typeNameIdOfTupleOrUnit=this.buildTypeMapIndex("()");this.typeNameIdOfFn=this.buildTypeMapIndex("fn");this.typeNameIdOfFnMut=this.buildTypeMapIndex("fnmut");this.typeNameIdOfFnOnce=this.buildTypeMapIndex("fnonce");this.typeNameIdOfHof=this.buildTypeMapIndex("->");this.typeNameIdOfOutput=this.buildTypeMapIndex("output",true);this.typeNameIdOfReference=this.buildTypeMapIndex("reference");this.EMPTY_BINDINGS_MAP=new Map();this.EMPTY_GENERICS_ARRAY=[];this.TYPES_POOL=new Map();this.nameTrie=new NameTrie();this.tailTable=new Map();this.searchIndex=this.buildIndex(rawSearchIndex);}buildTypeMapIndex(name,isAssocType){if(name===""||name===null){return null;}const obj=this.typeNameIdMap.get(name);if(obj!==undefined){obj.assocOnly=!!(isAssocType&&obj.assocOnly);return obj.id;}else{const id=this.typeNameIdMap.size;this.typeNameIdMap.set(name,{id,assocOnly:!!isAssocType});return id;}}buildItemSearchTypeAll(types,paths,lowercasePaths){return types&&types.length>0?types.map(type=>this.buildItemSearchType(type,paths,lowercasePaths)):this.EMPTY_GENERICS_ARRAY;}buildItemSearchType(type,paths,lowercasePaths,isAssocType){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;const BINDINGS_DATA=2;let pathIndex,generics,bindings;if(typeof type==="number"){pathIndex=type;generics=this.EMPTY_GENERICS_ARRAY;bindings=this.EMPTY_BINDINGS_MAP;}else{pathIndex=type[PATH_INDEX_DATA];generics=this.buildItemSearchTypeAll(type[GENERICS_DATA],paths,lowercasePaths,);if(type.length>BINDINGS_DATA&&type[BINDINGS_DATA].length>0){bindings=new Map(type[BINDINGS_DATA].map(binding=>{const[assocType,constraints]=binding;return[this.buildItemSearchType(assocType,paths,lowercasePaths,true).id,this.buildItemSearchTypeAll(constraints,paths,lowercasePaths),];}));}else{bindings=this.EMPTY_BINDINGS_MAP;}}let result;if(pathIndex<0){result={id:pathIndex,name:"",ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}else if(pathIndex===0){result={id:null,name:"",ty:null,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}else{const item=lowercasePaths[pathIndex-1];const id=this.buildTypeMapIndex(item.name,isAssocType);if(isAssocType&&id!==null){this.assocTypeIdNameMap.set(id,paths[pathIndex-1].name);}result={id,name:paths[pathIndex-1].name,ty:item.ty,path:item.path,exactPath:item.exactPath,generics,bindings,unboxFlag:item.unboxFlag,};}const cr=this.TYPES_POOL.get(result.id);if(cr){if(cr.generics.length===result.generics.length&&cr.generics!==result.generics&&cr.generics.every((x,i)=>result.generics[i]===x)){result.generics=cr.generics;}if(cr.bindings.size===result.bindings.size&&cr.bindings!==result.bindings){let ok=true;for(const[k,v]of cr.bindings.entries()){const v2=result.bindings.get(v);if(!v2){ok=false;break;}if(v!==v2&&v.length===v2.length&&v.every((x,i)=>v2[i]===x)){result.bindings.set(k,v);}else if(v!==v2){ok=false;break;}}if(ok){result.bindings=cr.bindings;}}if(cr.ty===result.ty&&cr.path===result.path&&cr.bindings===result.bindings&&cr.generics===result.generics&&cr.ty===result.ty&&cr.name===result.name&&cr.unboxFlag===result.unboxFlag){return cr;}}this.TYPES_POOL.set(result.id,result);return result;}buildFunctionTypeFingerprint(type,output){let input=type.id;if(input===this.typeNameIdOfArray||input===this.typeNameIdOfSlice){input=this.typeNameIdOfArrayOrSlice;}if(input===this.typeNameIdOfTuple||input===this.typeNameIdOfUnit){input=this.typeNameIdOfTupleOrUnit;}if(input===this.typeNameIdOfFn||input===this.typeNameIdOfFnMut||input===this.typeNameIdOfFnOnce){input=this.typeNameIdOfHof;}const hashint1=k=>{k=(~~k+0x7ed55d16)+(k<<12);k=(k ^ 0xc761c23c)^(k>>>19);k=(~~k+0x165667b1)+(k<<5);k=(~~k+0xd3a2646c)^(k<<9);k=(~~k+0xfd7046c5)+(k<<3);return(k ^ 0xb55a4f09)^(k>>>16);};const hashint2=k=>{k=~k+(k<<15);k ^=k>>>12;k+=k<<2;k ^=k>>>4;k=Math.imul(k,2057);return k ^(k>>16);};if(input!==null){const h0a=hashint1(input);const h0b=hashint2(input);const h1a=~~(h0a+Math.imul(h0b,2));const h1b=~~(h0a+Math.imul(h0b,3));const h2a=~~(h0a+Math.imul(h0b,4));const h2b=~~(h0a+Math.imul(h0b,5));output[0]|=(1<<(h0a%32))|(1<<(h1b%32));output[1]|=(1<<(h1a%32))|(1<<(h2b%32));output[2]|=(1<<(h2a%32))|(1<<(h0b%32));output[3]+=1;}for(const g of type.generics){this.buildFunctionTypeFingerprint(g,output);}const fb={id:null,ty:0,generics:this.EMPTY_GENERICS_ARRAY,bindings:this.EMPTY_BINDINGS_MAP,};for(const[k,v]of type.bindings.entries()){fb.id=k;fb.generics=v;this.buildFunctionTypeFingerprint(fb,output);}}buildIndex(rawSearchIndex){const buildFunctionSearchTypeCallback=(paths,lowercasePaths)=>{const cb=functionSearchType=>{if(functionSearchType===0){return null;}const INPUTS_DATA=0;const OUTPUT_DATA=1;let inputs;let output;if(typeof functionSearchType[INPUTS_DATA]==="number"){inputs=[this.buildItemSearchType(functionSearchType[INPUTS_DATA],paths,lowercasePaths,),];}else{inputs=this.buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],paths,lowercasePaths,);}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){output=[this.buildItemSearchType(functionSearchType[OUTPUT_DATA],paths,lowercasePaths,),];}else{output=this.buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],paths,lowercasePaths,);}}else{output=[];}const where_clause=[];const l=functionSearchType.length;for(let i=2;i{const n=noop;return n;});let descShard={crate,shard:0,start:0,len:itemDescShardDecoder.next(),promise:null,resolve:null,};const descShardList=[descShard];this.searchIndexDeprecated.set(crate,new RoaringBitmap(crateCorpus.c));this.searchIndexEmptyDesc.set(crate,new RoaringBitmap(crateCorpus.e));let descIndex=0;let lastParamNames=[];let normalizedName=crate.indexOf("_")===-1?crate:crate.replace(/_/g,"");const crateRow={crate,ty:3,name:crate,path:"",descShard,descIndex,exactPath:"",desc:crateCorpus.doc,parent:undefined,type:null,paramNames:lastParamNames,id,word:crate,normalizedName,bitIndex:0,implDisambiguator:null,};this.nameTrie.insert(normalizedName,id,this.tailTable);id+=1;searchIndex.push(crateRow);currentIndex+=1;if(!this.searchIndexEmptyDesc.get(crate).contains(0)){descIndex+=1;}const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemReexports=new Map(crateCorpus.r);const itemParentIdxDecoder=new VlqHexDecoder(crateCorpus.i,noop=>noop);const implDisambiguator=new Map(crateCorpus.b);const rawPaths=crateCorpus.p;const aliases=crateCorpus.a;const itemParamNames=new Map(crateCorpus.P);const lowercasePaths=[];const paths=[];const itemFunctionDecoder=new VlqHexDecoder(crateCorpus.f,buildFunctionSearchTypeCallback(paths,lowercasePaths),);let len=rawPaths.length;let lastPath=undef2null(itemPaths.get(0));for(let i=0;i{if(elem.length>idx&&elem[idx]!==undefined){const p=itemPaths.get(elem[idx]);if(p!==undefined){return p;}return if_not_found;}return if_null;};const path=elemPath(2,lastPath,null);const exactPath=elemPath(3,path,path);const unboxFlag=elem.length>4&&!!elem[4];lowercasePaths.push({ty,name:name.toLowerCase(),path,exactPath,unboxFlag});paths[i]={ty,name,path,exactPath,unboxFlag};}lastPath="";len=itemTypes.length;let lastName="";let lastWord="";for(let i=0;i=descShard.len&&!this.searchIndexEmptyDesc.get(crate).contains(bitIndex)){descShard={crate,shard:descShard.shard+1,start:descShard.start+descShard.len,len:itemDescShardDecoder.next(),promise:null,resolve:null,};descIndex=0;descShardList.push(descShard);}const name=itemNames[i]===""?lastName:itemNames[i];const word=itemNames[i]===""?lastWord:itemNames[i].toLowerCase();const pathU=itemPaths.get(i);const path=pathU!==undefined?pathU:lastPath;const paramNameString=itemParamNames.get(i);const paramNames=paramNameString!==undefined?paramNameString.split(","):lastParamNames;const type=itemFunctionDecoder.next();if(type!==null){if(type){const fp=this.functionTypeFingerprint.subarray(id*4,(id+1)*4);for(const t of type.inputs){this.buildFunctionTypeFingerprint(t,fp);}for(const t of type.output){this.buildFunctionTypeFingerprint(t,fp);}for(const w of type.where_clause){for(const t of w){this.buildFunctionTypeFingerprint(t,fp);}}}}const itemParentIdx=itemParentIdxDecoder.next();normalizedName=word.indexOf("_")===-1?word:word.replace(/_/g,"");const row={crate,ty:itemTypes.charCodeAt(i)-65,name,path,descShard,descIndex,exactPath:itemReexports.has(i)?itemPaths.get(itemReexports.get(i)):path,parent:itemParentIdx>0?paths[itemParentIdx-1]:undefined,type,paramNames,id,word,normalizedName,bitIndex,implDisambiguator:undef2null(implDisambiguator.get(i)),};this.nameTrie.insert(normalizedName,id,this.tailTable);id+=1;searchIndex.push(row);lastPath=row.path;lastParamNames=row.paramNames;if(!this.searchIndexEmptyDesc.get(crate).contains(bitIndex)){descIndex+=1;}lastName=name;lastWord=word;}if(aliases){allAliases.push([crate,aliases,currentIndex]);}currentIndex+=itemTypes.length;this.searchState.descShards.set(crate,descShardList);}for(const[crate,aliases,index]of allAliases){for(const[alias_name,alias_refs]of Object.entries(aliases)){if(!this.ALIASES.has(crate)){this.ALIASES.set(crate,new Map());}const word=alias_name.toLowerCase();const crate_alias_map=this.ALIASES.get(crate);if(!crate_alias_map.has(word)){crate_alias_map.set(word,[]);}const aliases_map=crate_alias_map.get(word);const normalizedName=word.indexOf("_")===-1?word:word.replace(/_/g,"");for(const alias of alias_refs){const originalIndex=alias+index;const original=searchIndex[originalIndex];const row={crate,name:alias_name,normalizedName,is_alias:true,ty:original.ty,type:original.type,paramNames:[],word,id,parent:undefined,original,path:"",implDisambiguator:original.implDisambiguator,descShard:original.descShard,descIndex:original.descIndex,bitIndex:original.bitIndex,};aliases_map.push(row);this.nameTrie.insert(normalizedName,id,this.tailTable);id+=1;searchIndex.push(row);}}}this.TYPES_POOL=new Map();return searchIndex;}static parseQuery(userQuery){function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename];}return index;}function convertTypeFilterOnElem(elem){if(typeof elem.typeFilter==="string"){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant";}elem.typeFilter=itemTypeFromName(typeFilter);}else{elem.typeFilter=NO_TYPE_FILTER;}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2);}for(const constraints of elem.bindings.values()){for(const constraint of constraints){convertTypeFilterOnElem(constraint);}}}function newParsedQuery(userQuery){return{userQuery,elems:[],returned:[],foundElems:0,totalElems:0,literalSearch:false,hasReturnArrow:false,error:null,correction:null,proposeCorrectionFrom:null,proposeCorrectionTo:null,typeFingerprint:new Uint32Array(4),};}function parseInput(query,parserState){let foundStopChar=true;while(parserState.pos"){if(isReturnArrow(parserState)){query.hasReturnArrow=true;break;}throw["Unexpected ",c," (did you mean ","->","?)"];}else if(parserState.pos>0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]];}throw["Unexpected ",c];}else if(c===" "){skipWhitespace(parserState);continue;}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"];}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"];}if(parserState.typeFilter!==null){throw["Expected ",","," or ","->",...extra,", found ",c,];}throw["Expected ",",",", ",":"," or ","->",...extra,", found ",c,];}const before=query.elems.length;getFilteredNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1;}foundStopChar=false;}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",];}while(parserState.postypeof elem==="string")){query.error=err;}else{throw err;}return query;}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1;}query.foundElems=query.elems.length+query.returned.length;query.totalElems=parserState.totalElems;return query;}async execQuery(origParsedQuery,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();const parsedQuery=origParsedQuery;const queryLen=parsedQuery.elems.reduce((acc,next)=>acc+next.pathLast.length,0)+parsedQuery.returned.reduce((acc,next)=>acc+next.pathLast.length,0);const maxEditDistance=Math.floor(queryLen/3);this.FOUND_ALIASES.clear();const genericSymbols=new Map();const convertNameToId=(elem,isAssocType)=>{const loweredName=elem.pathLast.toLowerCase();if(this.typeNameIdMap.has(loweredName)&&(isAssocType||!this.typeNameIdMap.get(loweredName).assocOnly)){elem.id=this.typeNameIdMap.get(loweredName).id;}else if(!parsedQuery.literalSearch){let match=null;let matchDist=maxEditDistance+1;let matchName="";for(const[name,{id,assocOnly}]of this.typeNameIdMap){const dist=Math.min(editDistance(name,loweredName,maxEditDistance),editDistance(name,elem.normalizedPathLast,maxEditDistance),);if(dist<=matchDist&&dist<=maxEditDistance&&(isAssocType||!assocOnly)){if(dist===matchDist&&matchName>name){continue;}match=id;matchDist=dist;matchName=name;}}if(match!==null){parsedQuery.correction=matchName;}elem.id=match;}if((elem.id===null&&parsedQuery.totalElems>1&&elem.typeFilter===-1&&elem.generics.length===0&&elem.bindings.size===0)||elem.typeFilter===TY_GENERIC){const id=genericSymbols.get(elem.normalizedPathLast);if(id!==undefined){elem.id=id;}else{elem.id=-(genericSymbols.size+1);genericSymbols.set(elem.normalizedPathLast,elem.id);}if(elem.typeFilter===-1&&elem.normalizedPathLast.length>=3){const maxPartDistance=Math.floor(elem.normalizedPathLast.length/3);let matchDist=maxPartDistance+1;let matchName="";for(const name of this.typeNameIdMap.keys()){const dist=editDistance(name,elem.normalizedPathLast,maxPartDistance,);if(dist<=matchDist&&dist<=maxPartDistance){if(dist===matchDist&&matchName>name){continue;}matchDist=dist;matchName=name;}}if(matchName!==""){parsedQuery.proposeCorrectionFrom=elem.name;parsedQuery.proposeCorrectionTo=matchName;}}elem.typeFilter=TY_GENERIC;}if(elem.generics.length>0&&elem.typeFilter===TY_GENERIC){parsedQuery.error=["Generic type parameter ",elem.name," does not accept generic parameters",];}for(const elem2 of elem.generics){convertNameToId(elem2);}elem.bindings=new Map(Array.from(elem.bindings.entries()).map(entry=>{const[name,constraints]=entry;if(!this.typeNameIdMap.has(name)){parsedQuery.error=["Type parameter ",name," does not exist",];return[0,[]];}for(const elem2 of constraints){convertNameToId(elem2,false);}return[this.typeNameIdMap.get(name).id,constraints];}),);};for(const elem of parsedQuery.elems){convertNameToId(elem,false);this.buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint);}for(const elem of parsedQuery.returned){convertNameToId(elem,false);this.buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint);}function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,};}const buildHrefAndPath=item=>{let displayPath;let href;if(item.is_alias){this.FOUND_ALIASES.add(item.word);item=item.original;}const type=itemTypes[item.ty];const name=item.name;let path=item.path;let exactPath=item.exactPath;if(type==="mod"){displayPath=path+"::";href=this.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html";}else if(type==="import"){displayPath=item.path+"::";href=this.rootPath+item.path.replace(/::/g,"/")+"/index.html#reexport."+name;}else if(type==="primitive"||type==="keyword"){displayPath="";exactPath="";href=this.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html";}else if(type==="externcrate"){displayPath="";href=this.rootPath+name+"/index.html";}else if(item.parent!==undefined){const myparent=item.parent;let anchor=type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;exactPath=`${myparent.exactPath}::${myparent.name}`;if(parentType==="primitive"){displayPath=myparent.name+"::";exactPath=myparent.name;}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName;}else{displayPath=path+"::"+myparent.name+"::";}if(item.implDisambiguator!==null){anchor=item.implDisambiguator+"/"+anchor;}href=this.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html#"+anchor;}else{displayPath=item.path+"::";href=this.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html";}return[displayPath,href,`${exactPath}::${name}`];};function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6);}return tmp;}const transformResults=(results,typeInfo)=>{const duplicates=new Set();const out=[];for(const result of results){if(result.id!==-1){const res=buildHrefAndPath(this.searchIndex[result.id]);const obj=Object.assign({parent:result.parent,type:result.type,dist:result.dist,path_dist:result.path_dist,index:result.index,desc:result.desc,item:result.item,displayPath:pathSplitter(res[0]),fullPath:"",href:"",displayTypeSignature:null,},this.searchIndex[result.id]);obj.fullPath=res[2]+"|"+obj.ty;if(duplicates.has(obj.fullPath)){continue;}if(obj.ty===TY_IMPORT&&duplicates.has(res[2])){continue;}if(duplicates.has(res[2]+"|"+TY_IMPORT)){continue;}duplicates.add(obj.fullPath);duplicates.add(res[2]);if(typeInfo!==null){obj.displayTypeSignature=this.formatDisplayTypeSignature(obj,typeInfo);}obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break;}}}return out;};this.formatDisplayTypeSignature=async(obj,typeInfo)=>{const objType=obj.type;if(!objType){return{type:[],mappedNames:new Map(),whereClause:new Map()};}let fnInputs=null;let fnOutput=null;let mgens=null;if(typeInfo!=="elems"&&typeInfo!=="returned"){fnInputs=unifyFunctionTypes(objType.inputs,parsedQuery.elems,objType.where_clause,null,mgensScratch=>{fnOutput=unifyFunctionTypes(objType.output,parsedQuery.returned,objType.where_clause,mgensScratch,mgensOut=>{mgens=mgensOut;return true;},0,);return!!fnOutput;},0,);}else{const arr=typeInfo==="elems"?objType.inputs:objType.output;const highlighted=unifyFunctionTypes(arr,parsedQuery.elems,objType.where_clause,null,mgensOut=>{mgens=mgensOut;return true;},0,);if(typeInfo==="elems"){fnInputs=highlighted;}else{fnOutput=highlighted;}}if(!fnInputs){fnInputs=objType.inputs;}if(!fnOutput){fnOutput=objType.output;}const mappedNames=new Map();const whereClause=new Map();const fnParamNames=obj.paramNames||[];const queryParamNames=[];const remapQuery=queryElem=>{if(queryElem.id!==null&&queryElem.id<0){queryParamNames[-1-queryElem.id]=queryElem.name;}if(queryElem.generics.length>0){queryElem.generics.forEach(remapQuery);}if(queryElem.bindings.size>0){[...queryElem.bindings.values()].flat().forEach(remapQuery);}};parsedQuery.elems.forEach(remapQuery);parsedQuery.returned.forEach(remapQuery);const pushText=(fnType,result)=>{if(!!(result.length%2)===!!fnType.highlighted){result.push("");}else if(result.length===0&&!!fnType.highlighted){result.push("");result.push("");}result[result.length-1]+=fnType.name;};const writeHof=(fnType,result)=>{const hofOutput=fnType.bindings.get(this.typeNameIdOfOutput)||[];const hofInputs=fnType.generics;pushText(fnType,result);pushText({name:" (",highlighted:false},result);let needsComma=false;for(const fnType of hofInputs){if(needsComma){pushText({name:", ",highlighted:false},result);}needsComma=true;writeFn(fnType,result);}pushText({name:hofOutput.length===0?")":") -> ",highlighted:false,},result);if(hofOutput.length>1){pushText({name:"(",highlighted:false},result);}needsComma=false;for(const fnType of hofOutput){if(needsComma){pushText({name:", ",highlighted:false},result);}needsComma=true;writeFn(fnType,result);}if(hofOutput.length>1){pushText({name:")",highlighted:false},result);}};const writeSpecialPrimitive=(fnType,result)=>{if(fnType.id===this.typeNameIdOfArray||fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit){const[ob,sb]=fnType.id===this.typeNameIdOfArray||fnType.id===this.typeNameIdOfSlice?["[","]"]:["(",")"];pushText({name:ob,highlighted:fnType.highlighted},result);onEachBtwn(fnType.generics,nested=>writeFn(nested,result),()=>pushText({name:", ",highlighted:false},result),);pushText({name:sb,highlighted:fnType.highlighted},result);return true;}else if(fnType.id===this.typeNameIdOfReference){pushText({name:"&",highlighted:fnType.highlighted},result);let prevHighlighted=false;onEachBtwn(fnType.generics,value=>{prevHighlighted=!!value.highlighted;writeFn(value,result);},value=>pushText({name:" ",highlighted:prevHighlighted&&value.highlighted,},result),);return true;}else if(fnType.id===this.typeNameIdOfFn){writeHof(fnType,result);return true;}return false;};const writeFn=(fnType,result)=>{if(fnType.id!==null&&fnType.id<0){if(fnParamNames[-1-fnType.id]===""){const generics=fnType.generics.length>0?fnType.generics:objType.where_clause[-1-fnType.id];for(const nested of generics){writeFn(nested,result);}return;}else if(mgens){for(const[queryId,fnId]of mgens){if(fnId===fnType.id){mappedNames.set(queryParamNames[-1-queryId],fnParamNames[-1-fnType.id],);}}}pushText({name:fnParamNames[-1-fnType.id],highlighted:!!fnType.highlighted,},result);const where=[];onEachBtwn(fnType.generics,nested=>writeFn(nested,where),()=>pushText({name:" + ",highlighted:false},where),);if(where.length>0){whereClause.set(fnParamNames[-1-fnType.id],where);}}else{if(fnType.ty===TY_PRIMITIVE){if(writeSpecialPrimitive(fnType,result)){return;}}else if(fnType.ty===TY_TRAIT&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce)){writeHof(fnType,result);return;}pushText(fnType,result);let hasBindings=false;if(fnType.bindings.size>0){onEachBtwn(fnType.bindings,([key,values])=>{const name=this.assocTypeIdNameMap.get(key);if(values.length===1&&values[0].id<0&&`${fnType.name}::${name}`===fnParamNames[-1-values[0].id]){for(const value of values){writeFn(value,[]);}return true;}if(!hasBindings){hasBindings=true;pushText({name:"<",highlighted:false},result);}pushText({name,highlighted:false},result);pushText({name:values.length!==1?"=(":"=",highlighted:false,},result);onEachBtwn(values||[],value=>writeFn(value,result),()=>pushText({name:" + ",highlighted:false},result),);if(values.length!==1){pushText({name:")",highlighted:false},result);}},()=>pushText({name:", ",highlighted:false},result),);}if(fnType.generics.length>0){pushText({name:hasBindings?", ":"<",highlighted:false},result);}onEachBtwn(fnType.generics,value=>writeFn(value,result),()=>pushText({name:", ",highlighted:false},result),);if(hasBindings||fnType.generics.length>0){pushText({name:">",highlighted:false},result);}}};const type=[];onEachBtwn(fnInputs,fnType=>writeFn(fnType,type),()=>pushText({name:", ",highlighted:false},type),);pushText({name:" -> ",highlighted:false},type);onEachBtwn(fnOutput,fnType=>writeFn(fnType,type),()=>pushText({name:", ",highlighted:false},type),);return{type,mappedNames,whereClause};};const sortResults=async(results,typeInfo,preferredCrate)=>{const userQuery=parsedQuery.userQuery;const normalizedUserQuery=parsedQuery.userQuery.toLowerCase();const isMixedCase=normalizedUserQuery!==userQuery;const result_list=[];const isReturnTypeQuery=parsedQuery.elems.length===0||typeInfo==="returned";for(const result of results.values()){result.item=this.searchIndex[result.id];result.word=this.searchIndex[result.id].word;if(isReturnTypeQuery){const resultItemType=result.item&&result.item.type;if(!resultItemType){continue;}const inputs=resultItemType.inputs;const where_clause=resultItemType.where_clause;if(containsTypeFromQuery(inputs,where_clause)){result.path_dist*=100;result.dist*=100;}}result_list.push(result);}result_list.sort((aaa,bbb)=>{let a;let b;if(isMixedCase){a=Number(aaa.item.name!==userQuery);b=Number(bbb.item.name!==userQuery);if(a!==b){return a-b;}}a=Number(aaa.word!==normalizedUserQuery);b=Number(bbb.word!==normalizedUserQuery);if(a!==b){return a-b;}a=Number(aaa.index<0);b=Number(bbb.index<0);if(a!==b){return a-b;}if(parsedQuery.hasReturnArrow){a=Number(!isFnLikeTy(aaa.item.ty));b=Number(!isFnLikeTy(bbb.item.ty));if(a!==b){return a-b;}}a=Number(aaa.path_dist);b=Number(bbb.path_dist);if(a!==b){return a-b;}a=Number(aaa.index);b=Number(bbb.index);if(a!==b){return a-b;}a=Number(aaa.dist);b=Number(bbb.dist);if(a!==b){return a-b;}a=Number(this.searchIndexDeprecated.get(aaa.item.crate).contains(aaa.item.bitIndex),);b=Number(this.searchIndexDeprecated.get(bbb.item.crate).contains(bbb.item.bitIndex),);if(a!==b){return a-b;}a=Number(aaa.item.crate!==preferredCrate);b=Number(bbb.item.crate!==preferredCrate);if(a!==b){return a-b;}a=Number(aaa.word.length);b=Number(bbb.word.length);if(a!==b){return a-b;}let aw=aaa.word;let bw=bbb.word;if(aw!==bw){return(aw>bw?+1:-1);}a=Number(this.searchIndexEmptyDesc.get(aaa.item.crate).contains(aaa.item.bitIndex),);b=Number(this.searchIndexEmptyDesc.get(bbb.item.crate).contains(bbb.item.bitIndex),);if(a!==b){return a-b;}a=Number(aaa.item.ty);b=Number(bbb.item.ty);if(a!==b){return a-b;}aw=aaa.item.path;bw=bbb.item.path;if(aw!==bw){return(aw>bw?+1:-1);}return 0;});return transformResults(result_list,typeInfo);};function unifyFunctionTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return null;}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return solutionCb(mgens)?fnTypesIn:null;}if(!fnTypesIn||fnTypesIn.length===0){return null;}const ql=queryElems.length;const fl=fnTypesIn.length;if(ql===1&&queryElems[0].generics.length===0&&queryElems[0].bindings.size===0){const queryElem=queryElems[0];for(const[i,fnType]of fnTypesIn.entries()){if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue;}if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(mgens&&mgens.has(queryElem.id)&&mgens.get(queryElem.id)!==fnType.id){continue;}const mgensScratch=new Map(mgens);mgensScratch.set(queryElem.id,fnType.id);if(!solutionCb||solutionCb(mgensScratch)){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:whereClause[-1-fnType.id],});return highlighted;}}else if(solutionCb(mgens?new Map(mgens):null)){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:unifyGenericTypes(fnType.generics,queryElem.generics,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth,)||fnType.generics,});return highlighted;}}for(const[i,fnType]of fnTypesIn.entries()){if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue;}if(fnType.id<0){const highlightedGenerics=unifyFunctionTypes(whereClause[(-fnType.id)-1],queryElems,whereClause,mgens,solutionCb,unboxingDepth+1,);if(highlightedGenerics){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:highlightedGenerics,});return highlighted;}}else{const highlightedGenerics=unifyFunctionTypes([...Array.from(fnType.bindings.values()).flat(),...fnType.generics],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth+1,);if(highlightedGenerics){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),});return highlighted;}}}return null;}const fnTypes=fnTypesIn.slice();const flast=fl-1;const qlast=ql-1;const queryElem=queryElems[qlast];let queryElemsTmp=null;for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue;}let mgensScratch;if(fnType.id!==null&&queryElem.id!==null&&fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(queryElem.id)&&mgensScratch.get(queryElem.id)!==fnType.id){continue;}mgensScratch.set(queryElem.id,fnType.id);}else{mgensScratch=mgens;}fnTypes[i]=fnTypes[flast];fnTypes.length=flast;if(!queryElemsTmp){queryElemsTmp=queryElems.slice(0,qlast);}let unifiedGenerics=[];let unifiedGenericsMgens=null;const passesUnification=unifyFunctionTypes(fnTypes,queryElemsTmp,whereClause,mgensScratch,mgensScratch=>{if(fnType.generics.length===0&&queryElem.generics.length===0&&fnType.bindings.size===0&&queryElem.bindings.size===0){return solutionCb(mgensScratch);}const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false;}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){unifiedGenerics=unifyGenericTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(unifiedGenerics!==null){unifiedGenericsMgens=simplifiedMgens;return true;}}return false;},unboxingDepth,);if(passesUnification){passesUnification.length=fl;passesUnification[flast]=passesUnification[i];passesUnification[i]=Object.assign({},fnType,{highlighted:true,generics:unifiedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,queryElem.bindings.has(k)?unifyFunctionTypes(v,queryElem.bindings.get(k),whereClause,unifiedGenericsMgens,solutionCb,unboxingDepth,):unifiedGenerics.splice(0,v.length)];})),});return passesUnification;}fnTypes[flast]=fnTypes[i];fnTypes[i]=fnType;fnTypes.length=fl;}for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue;}const generics=fnType.id!==null&&fnType.id<0?whereClause[(-fnType.id)-1]:fnType.generics;const bindings=fnType.bindings?Array.from(fnType.bindings.values()).flat():[];const passesUnification=unifyFunctionTypes(fnTypes.toSpliced(i,1,...bindings,...generics),queryElems,whereClause,mgens,solutionCb,unboxingDepth+1,);if(passesUnification){const highlightedGenerics=passesUnification.slice(i,i+generics.length+bindings.length,);const highlightedFnType=Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),});return passesUnification.toSpliced(i,generics.length+bindings.length,highlightedFnType,);}}return null;}function unifyGenericTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return null;}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return solutionCb(mgens)?fnTypesIn:null;}if(!fnTypesIn||fnTypesIn.length===0){return null;}const fnType=fnTypesIn[0];const queryElem=queryElems[0];if(unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(!mgens||!mgens.has(queryElem.id)||mgens.get(queryElem.id)===fnType.id){const mgensScratch=new Map(mgens);mgensScratch.set(queryElem.id,fnType.id);const fnTypesRemaining=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(fnTypesRemaining){const highlighted=[fnType,...fnTypesRemaining];highlighted[0]=Object.assign({highlighted:true,},fnType,{generics:whereClause[-1-fnType.id],});return highlighted;}}}else{let unifiedGenerics;const fnTypesRemaining=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgens,mgensScratch=>{const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false;}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){unifiedGenerics=unifyGenericTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(unifiedGenerics!==null){return true;}}},unboxingDepth,);if(fnTypesRemaining){const highlighted=[fnType,...fnTypesRemaining];highlighted[0]=Object.assign({highlighted:true,},fnType,{generics:unifiedGenerics||fnType.generics,});return highlighted;}}}if(unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){let highlightedRemaining;if(fnType.id!==null&&fnType.id<0){const highlightedGenerics=unifyFunctionTypes(whereClause[(-fnType.id)-1],[queryElem],whereClause,mgens,mgensScratch=>{const hl=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(hl){highlightedRemaining=hl;}return hl;},unboxingDepth+1,);if(highlightedGenerics){return[Object.assign({highlighted:true,},fnType,{generics:highlightedGenerics,}),...highlightedRemaining];}}else{const highlightedGenerics=unifyGenericTypes([...Array.from(fnType.bindings.values()).flat(),...fnType.generics,],[queryElem],whereClause,mgens,mgensScratch=>{const hl=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(hl){highlightedRemaining=hl;}return hl;},unboxingDepth+1,);if(highlightedGenerics){return[Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),}),...highlightedRemaining];}}}return null;}const unifyFunctionTypeIsMatchCandidate=(fnType,queryElem,mgensIn)=>{if(!typePassesFilter(queryElem.typeFilter,fnType.ty)){return false;}if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(mgensIn&&mgensIn.has(queryElem.id)&&mgensIn.get(queryElem.id)!==fnType.id){return false;}return true;}else{if(queryElem.id===this.typeNameIdOfArrayOrSlice&&(fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfArray)){}else if(queryElem.id===this.typeNameIdOfTupleOrUnit&&(fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit)){}else if(queryElem.id===this.typeNameIdOfHof&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce)){}else if(fnType.id!==queryElem.id||queryElem.id===null){return false;}if((fnType.generics.length+fnType.bindings.size)===0&&queryElem.generics.length!==0){return false;}if(fnType.bindings.size0){const fnTypePath=fnType.path!==undefined&&fnType.path!==null?fnType.path.split("::"):[];if(queryElemPathLength>fnTypePath.length){return false;}let i=0;for(const path of fnTypePath){if(path===queryElem.pathWithoutLast[i]){i+=1;if(i>=queryElemPathLength){break;}}}if(i0){let mgensSolutionSet=[mgensIn];for(const[name,constraints]of queryElem.bindings.entries()){if(mgensSolutionSet.length===0){return false;}if(!fnType.bindings.has(name)){return false;}const fnTypeBindings=fnType.bindings.get(name);mgensSolutionSet=mgensSolutionSet.flatMap(mgens=>{const newSolutions=[];unifyFunctionTypes(fnTypeBindings,constraints,whereClause,mgens,newMgens=>{newSolutions.push(newMgens);return false;},unboxingDepth,);return newSolutions;});}if(mgensSolutionSet.length===0){return false;}const binds=Array.from(fnType.bindings.entries()).flatMap(entry=>{const[name,constraints]=entry;if(queryElem.bindings.has(name)){return[];}else{return constraints;}});if(simplifiedGenerics.length>0){simplifiedGenerics=[...binds,...simplifiedGenerics];}else{simplifiedGenerics=binds;}return{simplifiedGenerics,mgens:mgensSolutionSet};}return{simplifiedGenerics,mgens:[mgensIn]};}function unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false;}if(fnType.id!==null&&fnType.id<0){if(!whereClause){return false;}return checkIfInList(whereClause[(-fnType.id)-1],queryElem,whereClause,mgens,unboxingDepth,);}else if(fnType.unboxFlag&&(fnType.generics.length>0||fnType.bindings.size>0)){const simplifiedGenerics=[...fnType.generics,...Array.from(fnType.bindings.values()).flat(),];return checkIfInList(simplifiedGenerics,queryElem,whereClause,mgens,unboxingDepth,);}return false;}function containsTypeFromQuery(list,where_clause){if(!list)return false;for(const ty of parsedQuery.returned){if(ty.id!==null&&ty.id<0){continue;}if(checkIfInList(list,ty,where_clause,null,0)){return true;}}for(const ty of parsedQuery.elems){if(ty.id!==null&&ty.id<0){continue;}if(checkIfInList(list,ty,where_clause,null,0)){return true;}}return false;}function checkIfInList(list,elem,whereClause,mgens,unboxingDepth){for(const entry of list){if(checkType(entry,elem,whereClause,mgens,unboxingDepth)){return true;}}return false;}const checkType=(row,elem,whereClause,mgens,unboxingDepth)=>{if(unboxingDepth>=UNBOXING_LIMIT){return false;}if(row.id!==null&&elem.id!==null&&row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&row.generics.length===0&&elem.generics.length===0&&row.bindings.size===0&&elem.bindings.size===0&&elem.id!==this.typeNameIdOfArrayOrSlice&&elem.id!==this.typeNameIdOfHof&&elem.id!==this.typeNameIdOfTupleOrUnit){return row.id===elem.id&&typePassesFilter(elem.typeFilter,row.ty);}else{return unifyFunctionTypes([row],[elem],whereClause,mgens,()=>true,unboxingDepth,);}};const checkTypeMgensForConflict=mgens=>{if(!mgens){return true;}const fnTypes=new Set();for(const[_qid,fid]of mgens){if(fnTypes.has(fid)){return false;}fnTypes.add(fid);}return true;};function checkPath(contains,ty){if(contains.length===0){return 0;}const maxPathEditDistance=Math.floor(contains.reduce((acc,next)=>acc+next.length,0)/3,);let ret_dist=maxPathEditDistance+1;const path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase());}const length=path.length;const clength=contains.length;pathiter:for(let i=length-clength;i>=0;i-=1){let dist_total=0;for(let x=0;xmaxPathEditDistance){continue pathiter;}dist_total+=dist;}}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength));}return ret_dist>maxPathEditDistance?null:ret_dist;}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias";}return false;}const handleAliases=async(ret,query,filterCrates,currentCrate)=>{const lowerQuery=query.toLowerCase();if(this.FOUND_ALIASES.has(lowerQuery)){return;}this.FOUND_ALIASES.add(lowerQuery);const aliases=[];const crateAliases=[];if(filterCrates!==null){if(this.ALIASES.has(filterCrates)&&this.ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=this.ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(alias);}}}else{for(const[crate,crateAliasesIndex]of this.ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(alias);}}}}const sortFunc=(aaa,bbb)=>{if(aaa.original.path{alias={...alias};const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop();}};aliases.forEach(pushFunc);crateAliases.forEach(pushFunc);};function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){if(dist<=maxEditDistance||index!==-1){if(results.has(fullId)){const result=results.get(fullId);if(result===undefined||result.dontValidate||result.dist<=dist){return;}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,});}}function handleArgs(row,pos,results){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return;}const rowType=row.type;if(!rowType){return;}const tfpDist=compareTypeFingerprints(row.id,parsedQuery.typeFingerprint,);if(tfpDist===null){return;}if(results.size>=MAX_RESULTS&&tfpDist>results.max_dist){return;}if(!unifyFunctionTypes(rowType.inputs,parsedQuery.elems,rowType.where_clause,null,mgens=>{return unifyFunctionTypes(rowType.output,parsedQuery.returned,rowType.where_clause,mgens,checkTypeMgensForConflict,0,);},0,)){return;}results.max_dist=Math.max(results.max_dist||0,tfpDist);addIntoResults(results,row.id,pos,0,tfpDist,0,Number.MAX_VALUE);}const compareTypeFingerprints=(fullId,queryFingerprint)=>{const fh0=this.functionTypeFingerprint[fullId*4];const fh1=this.functionTypeFingerprint[(fullId*4)+1];const fh2=this.functionTypeFingerprint[(fullId*4)+2];const[qh0,qh1,qh2]=queryFingerprint;const[in0,in1,in2]=[fh0&qh0,fh1&qh1,fh2&qh2];if((in0 ^ qh0)||(in1 ^ qh1)||(in2 ^ qh2)){return null;}return this.functionTypeFingerprint[(fullId*4)+3];};const innerRunQuery=()=>{if(parsedQuery.foundElems===1&&!parsedQuery.hasReturnArrow){const elem=parsedQuery.elems[0];const handleNameSearch=id=>{const row=this.searchIndex[id];if(!typePassesFilter(elem.typeFilter,row.ty)||(filterCrates!==null&&row.crate!==filterCrates)){return;}let pathDist=0;if(elem.fullPath.length>1){const maybePathDist=checkPath(elem.pathWithoutLast,row);if(maybePathDist===null){return;}pathDist=maybePathDist;}if(parsedQuery.literalSearch){if(row.word===elem.pathLast){addIntoResults(results_others,row.id,id,0,0,pathDist,0);}}else{addIntoResults(results_others,row.id,id,row.normalizedName.indexOf(elem.normalizedPathLast),editDistance(row.normalizedName,elem.normalizedPathLast,maxEditDistance,),pathDist,maxEditDistance,);}};if(elem.normalizedPathLast!==""){const last=elem.normalizedPathLast;for(const id of this.nameTrie.search(last,this.tailTable)){handleNameSearch(id);}}const length=this.searchIndex.length;for(let i=0,nSearchIndex=length;i0){const sortQ=(a,b)=>{const ag=a.generics.length===0&&a.bindings.size===0;const bg=b.generics.length===0&&b.bindings.size===0;if(ag!==bg){return+ag-+bg;}const ai=a.id!==null&&a.id>0;const bi=b.id!==null&&b.id>0;return+ai-+bi;};parsedQuery.elems.sort(sortQ);parsedQuery.returned.sort(sortQ);for(let i=0,nSearchIndex=this.searchIndex.length;i{const descs=await Promise.all(list.map(result=>{return this.searchIndexEmptyDesc.get(result.crate).contains(result.bitIndex)?"":this.searchState.loadDesc(result);}));for(const[i,result]of list.entries()){result.desc=descs[i];}}));if(parsedQuery.error!==null&&ret.others.length!==0){ret.query.error=null;}return ret;}}let rawSearchIndex;let docSearch;const longItemTypes=["keyword","primitive type","module","extern crate","re-export","struct","enum","function","type alias","static","trait","","trait method","method","struct field","enum variant","macro","assoc type","constant","assoc const","union","foreign type","existential type","attribute macro","derive macro","trait alias",];let currentResults;function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true;}else{removeClass(elem,"selected");}iter+=1;});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true;}else{removeClass(elem,"active");}iter+=1;});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden");}else{addClass(correctionsElem[0],"hidden");}}else if(nb!==0){printTab(0);}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates);}return getNakedUrl()+extra+window.location.hash;}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&window.searchIndex.has(elem.value)){return elem.value;}return null;}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult();}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus();}}async function addTab(array,query,display){const extraClass=display?" active":"";const output=document.createElement(array.length===0&&query.error===null?"div":"ul",);if(array.length>0){output.className="search-results "+extraClass;const lis=Promise.all(array.map(async item=>{const name=item.is_alias?item.original.name:item.name;const type=itemTypes[item.ty];const longType=longItemTypes[item.ty];const typeName=longType.length!==0?`${longType}`:"?";const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("span");resultName.className="result-name";resultName.insertAdjacentHTML("beforeend",`${typeName}`);link.appendChild(resultName);let alias=" ";if(item.is_alias){alias=`
\ +${item.name} - see \ +
`;}resultName.insertAdjacentHTML("beforeend",`
${alias}\ +${item.displayPath}${name}\ +
`);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);if(item.displayTypeSignature){const{type,mappedNames,whereClause}=await item.displayTypeSignature;const displayType=document.createElement("div");type.forEach((value,index)=>{if(index%2!==0){const highlight=document.createElement("strong");highlight.appendChild(document.createTextNode(value));displayType.appendChild(highlight);}else{displayType.appendChild(document.createTextNode(value));}});if(mappedNames.size>0||whereClause.size>0){let addWhereLineFn=()=>{const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode("where"));displayType.appendChild(line);addWhereLineFn=()=>{};};for(const[qname,name]of mappedNames){if(name===qname){continue;}addWhereLineFn();const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode(` ${qname} matches `));const lineStrong=document.createElement("strong");lineStrong.appendChild(document.createTextNode(name));line.appendChild(lineStrong);displayType.appendChild(line);}for(const[name,innerType]of whereClause){if(innerType.length<=1){continue;}addWhereLineFn();const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode(` ${name}: `));innerType.forEach((value,index)=>{if(index%2!==0){const highlight=document.createElement("strong");highlight.appendChild(document.createTextNode(value));line.appendChild(highlight);}else{line.appendChild(document.createTextNode(value));}});displayType.appendChild(line);}}displayType.className="type-signature";link.appendChild(displayType);}link.appendChild(description);return link;}));lis.then(lis=>{for(const li of lis){output.appendChild(li);}});}else if(query.error===null){const dlroChannel=`https://doc.rust-lang.org/${getVar("channel")}`;output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:";}return output;}function makeTabHeader(tabNb,text,nbElems){const fmtNbElems=nbElems<10?`\u{2007}(${nbElems})\u{2007}\u{2007}`:nbElems<100?`\u{2007}(${nbElems})\u{2007}`:`\u{2007}(${nbElems})`;if(searchState.currentTab===tabNb){return"";}return"";}async function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){window.onunload=()=>{};searchState.removeQueryParameters();const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return;}if(results.query===undefined){results.query=DocSearch.parseQuery(searchState.input.value);}currentResults=results.query.userQuery;let currentTab=searchState.currentTab;if((currentTab===0&&results.others.length===0)||(currentTab===1&&results.in_args.length===0)||(currentTab===2&&results.returned.length===0)){if(results.others.length!==0){currentTab=0;}else if(results.in_args.length){currentTab=1;}else if(results.returned.length){currentTab=2;}}let crates="";if(rawSearchIndex.size>1){crates="
in 
"+"
";}let output=`
\ +

Results

${crates}
`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value.replaceAll(" ", " ")}`;}else{error[index]=value;}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",results.others.length)+"
";currentTab=0;}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",results.others.length)+makeTabHeader(1,"In Parameters",results.in_args.length)+makeTabHeader(2,"In Return Types",results.returned.length)+"
";}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,results.others.length)+"
";currentTab=0;}if(results.query.correction!==null){const orig=results.query.returned.length>0?results.query.returned[0].name:results.query.elems[0].name;output+="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${results.query.correction}" instead.

`;}if(results.query.proposeCorrectionFrom!==null){const orig=results.query.proposeCorrectionFrom;const targ=results.query.proposeCorrectionTo;output+="

"+`Type "${orig}" not found and used as generic parameter. `+`Consider searching for "${targ}" instead.

`;}const[ret_others,ret_in_args,ret_returned]=await Promise.all([addTab(results.others,results.query,currentTab===0),addTab(results.in_args,results.query,currentTab===1),addTab(results.returned,results.query,currentTab===2),]);const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others);resultsElem.appendChild(ret_in_args);resultsElem.appendChild(ret_returned);search.innerHTML=output;if(searchState.rustdocToolbar){search.querySelector(".main-heading").appendChild(searchState.rustdocToolbar);}const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate);}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1;}printTab(currentTab);}function updateSearchHistory(url){if(!browserSupportsHistoryApi()){return;}const params=searchState.getQueryStringParams();if(!history.state&&!params.search){history.pushState(null,"",url);}else{history.replaceState(null,"",url);}}async function search(forced){const query=DocSearch.parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch();}return;}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"];}searchState.title="\""+query.userQuery+"\" Search - Rust";updateSearchHistory(buildUrl(query.userQuery,filterCrates));await showResults(await docSearch.execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates);}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search();}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return;}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()));}document.title=searchState.title;}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||"";}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){searchState.hideResults();}else{searchState.timeout=setTimeout(search,500);}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return;}searchState.clearInputTimeout();setTimeout(search,0);};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return;}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus();}else{searchState.focus();}e.preventDefault();}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus();}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault();}});searchState.input.addEventListener("focus",()=>{putBackSearch();});searchState.input.addEventListener("blur",()=>{if(window.searchState.input){window.searchState.input.placeholder=window.searchState.origPlaceholder;}});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;e.preventDefault();search();}else{searchState.input.value="";searchState.hideResults();}});}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch;}search();};}function updateCrate(ev){if(ev.target.value==="all crates"){const query=searchState.input.value.trim();updateSearchHistory(buildUrl(query,null));}currentResults=null;search(true);}class ParametricDescription{constructor(w,n,minErrors){this.w=w;this.n=n;this.minErrors=minErrors;}isAccept(absState){const state=Math.floor(absState/(this.w+1));const offset=absState%(this.w+1);return this.w-offset+this.minErrors[state]<=this.n;}getPosition(absState){return absState%(this.w+1);}getVector(name,charCode,pos,end){let vector=0;for(let i=pos;i>5;const bitStart=bitLoc&31;if(bitStart+bitsPerValue<=32){return((data[dataLoc]>>bitStart)&this.MASKS[bitsPerValue-1]);}else{const part=32-bitStart;return ~~(((data[dataLoc]>>bitStart)&this.MASKS[part-1])+((data[1+dataLoc]&this.MASKS[bitsPerValue-part-1])<{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true";}toggle.onchange=()=>{changeSetting(toggle.id,toggle.checked);};});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference";}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value;}elem.addEventListener("change",()=>{changeSetting(elem.name,elem.value);});},);}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `;});output+=`\ +
+
`;}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`;}}return output;}function buildSettingsPage(){const theme_list=getVar("themes");const theme_names=(theme_list===null?"":theme_list).split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Hide persistent navigation bar","js_name":"hide-sidebar","default":false,},{"name":"Hide table of contents","js_name":"hide-toc","default":false,},{"name":"Hide module navigation","js_name":"hide-modnav","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},{"name":"Use sans serif fonts","js_name":"sans-serif-fonts","default":false,},{"name":"Word wrap source code","js_name":"word-wrap-source-code","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover";}el.innerHTML=innerHTML;if(isSettingsPage){const mainElem=document.getElementById(MAIN_ID);if(mainElem!==null){mainElem.appendChild(el);}}else{el.setAttribute("tabindex","-1");const settingsBtn=getSettingsButton();if(settingsBtn!==null){settingsBtn.appendChild(el);}}return el;}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display="";onEachLazy(settingsMenu.querySelectorAll("input[type='checkbox']"),el=>{const val=getSettingValue(el.id);const checked=val==="true";if(checked!==el.checked&&val!==null){el.checked=checked;}});}function settingsBlurHandler(event){const helpBtn=getHelpButton();const settingsBtn=getSettingsButton();const helpUnfocused=helpBtn===null||(!helpBtn.contains(document.activeElement)&&!elemContainsTarget(helpBtn,event.relatedTarget));const settingsUnfocused=settingsBtn===null||(!settingsBtn.contains(document.activeElement)&&!elemContainsTarget(settingsBtn,event.relatedTarget));if(helpUnfocused&&settingsUnfocused){window.hidePopoverMenus();}}if(!isSettingsPage){const settingsButton=nonnull(getSettingsButton());const settingsMenu=nonnull(document.getElementById("settings"));settingsButton.onclick=event=>{if(elemContainsTarget(settingsMenu,event.target)){return;}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals(false);if(shouldDisplaySettings){displaySettings();}};settingsButton.onblur=settingsBlurHandler;nonnull(settingsButton.querySelector("a")).onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler;});settingsMenu.onblur=settingsBlurHandler;}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings();}removeClass(getSettingsButton(),"rotate");},0);})(); \ No newline at end of file diff --git a/compiler-docs/static.files/src-script-813739b1.js b/compiler-docs/static.files/src-script-813739b1.js new file mode 100644 index 0000000000..bf546257ca --- /dev/null +++ b/compiler-docs/static.files/src-script-813739b1.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=getVar("root-path");const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth{removeClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","false");};window.rustdocShowSourceSidebar=()=>{addClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","true");};window.rustdocToggleSrcSidebar=()=>{if(document.documentElement.classList.contains("src-sidebar-expanded")){window.rustdocCloseSourceSidebar();}else{window.rustdocShowSourceSidebar();}};function createSrcSidebar(srcIndexStr){const container=nonnull(document.querySelector("nav.sidebar"));const sidebar=document.createElement("div");sidebar.id="src-sidebar";const srcIndex=new Map(JSON.parse(srcIndexStr));let hasFoundFile=false;for(const[key,source]of srcIndex){source[NAME_OFFSET]=key;hasFoundFile=createDirEntry(source,sidebar,"",hasFoundFile);}container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus();}}function highlightSrcLines(){const match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(!match){return;}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10);}if(to{removeClass(e,"line-highlighted");});for(let i=from;i<=to;++i){elem=document.getElementById(""+i);if(!elem){break;}addClass(elem,"line-highlighted");}}const handleSrcHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,"","#"+name);highlightSrcLines();}else{location.replace("#"+name);}window.scrollTo(x,y);};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return;}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp;}set_fragment(prev_line_id+"-"+cur_line_id);}else{prev_line_id=cur_line_id;set_fragment(""+cur_line_id);}};}());window.addEventListener("hashchange",highlightSrcLines);onEachLazy(document.querySelectorAll("a[data-nosnippet]"),el=>{el.addEventListener("click",handleSrcHighlight);});highlightSrcLines();window.createSrcSidebar=createSrcSidebar;})(); \ No newline at end of file diff --git a/compiler-docs/static.files/storage-68b7e25d.js b/compiler-docs/static.files/storage-68b7e25d.js new file mode 100644 index 0000000000..5b18baa723 --- /dev/null +++ b/compiler-docs/static.files/storage-68b7e25d.js @@ -0,0 +1,25 @@ +"use strict";const builtinThemes=["light","dark","ayu"];const darkThemes=["dark","ayu"];window.currentTheme=(function(){const currentTheme=document.getElementById("themeStyle");return currentTheme instanceof HTMLLinkElement?currentTheme:null;})();const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null;})();function nonnull(x,msg){if(x===null){throw(msg||"unexpected null value!");}else{return x;}}function nonundef(x,msg){if(x===undefined){throw(msg||"unexpected null value!");}else{return x;}}function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def;}}return current;}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return!!elem&&!!elem.classList&&elem.classList.contains(className);}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className);}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className);}}function onEach(arr,func){for(const elem of arr){if(func(elem)){return true;}}return false;}function onEachLazy(lazyArray,func){return onEach(Array.prototype.slice.call(lazyArray),func);}function updateLocalStorage(name,value){try{if(value===null){window.localStorage.removeItem("rustdoc-"+name);}else{window.localStorage.setItem("rustdoc-"+name,value);}}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name);}catch(e){return null;}}function getVar(name){const el=document.querySelector("head > meta[name='rustdoc-vars']");return el?el.getAttribute("data-"+name):null;}function switchTheme(newThemeName,saveTheme){const themeNames=(getVar("themes")||"").split(",").filter(t=>t);themeNames.push(...builtinThemes);if(newThemeName===null||themeNames.indexOf(newThemeName)===-1){return;}if(saveTheme){updateLocalStorage("theme",newThemeName);}document.documentElement.setAttribute("data-theme",newThemeName);if(builtinThemes.indexOf(newThemeName)!==-1){if(window.currentTheme&&window.currentTheme.parentNode){window.currentTheme.parentNode.removeChild(window.currentTheme);window.currentTheme=null;}}else{const newHref=getVar("root-path")+encodeURIComponent(newThemeName)+getVar("resource-suffix")+".css";if(!window.currentTheme){if(document.readyState==="loading"){document.write(``);window.currentTheme=(function(){const currentTheme=document.getElementById("themeStyle");return currentTheme instanceof HTMLLinkElement?currentTheme:null;})();}else{window.currentTheme=document.createElement("link");window.currentTheme.rel="stylesheet";window.currentTheme.id="themeStyle";window.currentTheme.href=newHref;document.documentElement.appendChild(window.currentTheme);}}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref;}}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true);}else{switchTheme(getSettingValue("theme"),false);}}mql.addEventListener("change",updateTheme);return updateTheme;})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&localStoredTheme!==null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme);}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"src-sidebar-expanded");}if(getSettingValue("hide-sidebar")==="true"){addClass(document.documentElement,"hide-sidebar");}if(getSettingValue("hide-toc")==="true"){addClass(document.documentElement,"hide-toc");}if(getSettingValue("hide-modnav")==="true"){addClass(document.documentElement,"hide-modnav");}if(getSettingValue("sans-serif-fonts")==="true"){addClass(document.documentElement,"sans-serif");}if(getSettingValue("word-wrap-source-code")==="true"){addClass(document.documentElement,"word-wrap-source-code");}function updateSidebarWidth(){const desktopSidebarWidth=getSettingValue("desktop-sidebar-width");if(desktopSidebarWidth&&desktopSidebarWidth!=="null"){document.documentElement.style.setProperty("--desktop-sidebar-width",desktopSidebarWidth+"px",);}const srcSidebarWidth=getSettingValue("src-sidebar-width");if(srcSidebarWidth&&srcSidebarWidth!=="null"){document.documentElement.style.setProperty("--src-sidebar-width",srcSidebarWidth+"px",);}}updateSidebarWidth();window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0);setTimeout(updateSidebarWidth,0);}});class RustdocSearchElement extends HTMLElement{constructor(){super();}connectedCallback(){const rootPath=getVar("root-path");const currentCrate=getVar("current-crate");this.innerHTML=``;}}window.customElements.define("rustdoc-search",RustdocSearchElement);class RustdocToolbarElement extends HTMLElement{constructor(){super();}connectedCallback(){if(this.firstElementChild){return;}const rootPath=getVar("root-path");this.innerHTML=` +
+ Settings +
+
+ Help +
+ `;}}window.customElements.define("rustdoc-toolbar",RustdocToolbarElement); \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.Args.js b/compiler-docs/trait.impl/clap/derive/trait.Args.js new file mode 100644 index 0000000000..02c122eeea --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.Args.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Args for FelangCli"],["impl Args for BuildArgs"],["impl Args for CheckArgs"],["impl Args for NewProjectArgs"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[559]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js b/compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js new file mode 100644 index 0000000000..a6dabb2006 --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl CommandFactory for FelangCli"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[135]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js b/compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js new file mode 100644 index 0000000000..936c94ec85 --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl FromArgMatches for Commands"],["impl FromArgMatches for FelangCli"],["impl FromArgMatches for BuildArgs"],["impl FromArgMatches for CheckArgs"],["impl FromArgMatches for NewProjectArgs"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[728]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.Parser.js b/compiler-docs/trait.impl/clap/derive/trait.Parser.js new file mode 100644 index 0000000000..5a4c6e3934 --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.Parser.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Parser for FelangCli"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[127]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.Subcommand.js b/compiler-docs/trait.impl/clap/derive/trait.Subcommand.js new file mode 100644 index 0000000000..be8da5416f --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.Subcommand.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Subcommand for Commands"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[133]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js b/compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js new file mode 100644 index 0000000000..f8a31218fa --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl ValueEnum for Emit"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[133]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/clone/trait.Clone.js b/compiler-docs/trait.impl/core/clone/trait.Clone.js new file mode 100644 index 0000000000..0c7f8553d5 --- /dev/null +++ b/compiler-docs/trait.impl/core/clone/trait.Clone.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Clone for Emit"]]],["fe_abi",[["impl Clone for AbiFunctionType"],["impl Clone for StateMutability"],["impl Clone for AbiType"],["impl Clone for AbiContract"],["impl Clone for AbiEvent"],["impl Clone for AbiEventField"],["impl Clone for AbiFunction"],["impl Clone for AbiTupleField"]]],["fe_analyzer",[["impl Clone for ContractTypeMethod"],["impl Clone for GlobalFunction"],["impl Clone for Intrinsic"],["impl Clone for ValueMethod"],["impl Clone for AdjustmentKind"],["impl Clone for CallType"],["impl Clone for Constant"],["impl Clone for NamedThing"],["impl Clone for DepLocality"],["impl Clone for EnumVariantKind"],["impl Clone for IngotMode"],["impl Clone for Item"],["impl Clone for ModuleSource"],["impl Clone for TypeDef"],["impl Clone for BlockScopeType"],["impl Clone for Base"],["impl Clone for GenericArg"],["impl Clone for GenericParamKind"],["impl Clone for GenericType"],["impl Clone for Integer"],["impl Clone for TraitOrType"],["impl Clone for Type"],["impl Clone for ConstructorKind"],["impl Clone for LiteralConstructor"],["impl Clone for SimplifiedPatternKind"],["impl Clone for GlobalFunctionIter"],["impl Clone for IntrinsicIter"],["impl Clone for Adjustment"],["impl Clone for DiagnosticVoucher"],["impl Clone for ExpressionAttributes"],["impl Clone for FunctionBody"],["impl Clone for ConstEvalError"],["impl Clone for TypeError"],["impl Clone for Attribute"],["impl Clone for AttributeId"],["impl Clone for Contract"],["impl Clone for ContractField"],["impl Clone for ContractFieldId"],["impl Clone for ContractId"],["impl Clone for DepGraphWrapper"],["impl Clone for Enum"],["impl Clone for EnumId"],["impl Clone for EnumVariant"],["impl Clone for EnumVariantId"],["impl Clone for Function"],["impl Clone for FunctionId"],["impl Clone for FunctionSig"],["impl Clone for FunctionSigId"],["impl Clone for Impl"],["impl Clone for ImplId"],["impl Clone for Ingot"],["impl Clone for IngotId"],["impl Clone for Module"],["impl Clone for ModuleConstant"],["impl Clone for ModuleConstantId"],["impl Clone for ModuleId"],["impl Clone for Struct"],["impl Clone for StructField"],["impl Clone for StructFieldId"],["impl Clone for StructId"],["impl Clone for Trait"],["impl Clone for TraitId"],["impl Clone for TypeAlias"],["impl Clone for TypeAliasId"],["impl Clone for Array"],["impl Clone for CtxDecl"],["impl Clone for FeString"],["impl Clone for FunctionParam"],["impl Clone for FunctionSignature"],["impl Clone for Generic"],["impl Clone for GenericTypeIter"],["impl Clone for IntegerIter"],["impl Clone for Map"],["impl Clone for SelfDecl"],["impl Clone for Tuple"],["impl Clone for TypeId"],["impl Clone for PatternMatrix"],["impl Clone for PatternRowVec"],["impl Clone for SigmaSet"],["impl Clone for SimplifiedPattern"],["impl<T: Clone> Clone for Analysis<T>"]]],["fe_codegen",[["impl Clone for AbiSrcLocation"]]],["fe_common",[["impl Clone for LabelStyle"],["impl Clone for FileKind"],["impl Clone for Radix"],["impl Clone for DependencyKind"],["impl Clone for ProjectMode"],["impl Clone for Diagnostic"],["impl Clone for Label"],["impl Clone for File"],["impl Clone for SourceFileId"],["impl Clone for Span"],["impl Clone for Dependency"],["impl Clone for GitDependency"],["impl Clone for LocalDependency"],["impl<'a> Clone for Literal<'a>"]]],["fe_mir",[["impl Clone for PostIDom"],["impl Clone for CursorLocation"],["impl Clone for ConstantValue"],["impl Clone for Linkage"],["impl Clone for BinOp"],["impl Clone for CallType"],["impl Clone for CastKind"],["impl Clone for InstKind"],["impl Clone for UnOp"],["impl Clone for YulIntrinsicOp"],["impl Clone for TypeKind"],["impl Clone for AssignableValue"],["impl Clone for Value"],["impl Clone for ControlFlowGraph"],["impl Clone for DomTree"],["impl Clone for Loop"],["impl Clone for LoopTree"],["impl Clone for BasicBlock"],["impl Clone for BodyOrder"],["impl Clone for Constant"],["impl Clone for ConstantId"],["impl Clone for BodyDataStore"],["impl Clone for FunctionBody"],["impl Clone for FunctionId"],["impl Clone for FunctionParam"],["impl Clone for FunctionSignature"],["impl Clone for Inst"],["impl Clone for SwitchTable"],["impl Clone for SourceInfo"],["impl Clone for ArrayDef"],["impl Clone for EnumDef"],["impl Clone for EnumVariant"],["impl Clone for EventDef"],["impl Clone for MapDef"],["impl Clone for StructDef"],["impl Clone for TupleDef"],["impl Clone for Type"],["impl Clone for TypeId"],["impl Clone for Local"]]],["fe_parser",[["impl Clone for BinOperator"],["impl Clone for BoolOperator"],["impl Clone for CompOperator"],["impl Clone for ContractStmt"],["impl Clone for Expr"],["impl Clone for FuncStmt"],["impl Clone for FunctionArg"],["impl Clone for GenericArg"],["impl Clone for GenericParameter"],["impl Clone for LiteralPattern"],["impl Clone for ModuleStmt"],["impl Clone for Pattern"],["impl Clone for TypeDesc"],["impl Clone for UnaryOperator"],["impl Clone for UseTree"],["impl Clone for VarDeclTarget"],["impl Clone for VariantKind"],["impl Clone for TokenKind"],["impl Clone for CallArg"],["impl Clone for ConstantDecl"],["impl Clone for Contract"],["impl Clone for Enum"],["impl Clone for Field"],["impl Clone for Function"],["impl Clone for FunctionSignature"],["impl Clone for Impl"],["impl Clone for MatchArm"],["impl Clone for Module"],["impl Clone for Path"],["impl Clone for Pragma"],["impl Clone for Struct"],["impl Clone for Trait"],["impl Clone for TypeAlias"],["impl Clone for Use"],["impl Clone for Variant"],["impl Clone for NodeId"],["impl Clone for ParseFailed"],["impl<'a> Clone for Lexer<'a>"],["impl<'a> Clone for Token<'a>"],["impl<T: Clone> Clone for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[257,2218,24253,314,3930,10770,10802]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.Eq.js b/compiler-docs/trait.impl/core/cmp/trait.Eq.js new file mode 100644 index 0000000000..741f02b189 --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.Eq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Eq for Emit"]]],["fe_abi",[["impl Eq for AbiFunctionType"],["impl Eq for StateMutability"],["impl Eq for AbiType"],["impl Eq for AbiContract"],["impl Eq for AbiEvent"],["impl Eq for AbiEventField"],["impl Eq for AbiFunction"],["impl Eq for AbiTupleField"]]],["fe_analyzer",[["impl Eq for ContractTypeMethod"],["impl Eq for GlobalFunction"],["impl Eq for Intrinsic"],["impl Eq for ValueMethod"],["impl Eq for AdjustmentKind"],["impl Eq for CallType"],["impl Eq for Constant"],["impl Eq for NamedThing"],["impl Eq for BinaryOperationError"],["impl Eq for IndexingError"],["impl Eq for TypeCoercionError"],["impl Eq for DepLocality"],["impl Eq for EnumVariantKind"],["impl Eq for IngotMode"],["impl Eq for Item"],["impl Eq for ModuleSource"],["impl Eq for TypeDef"],["impl Eq for BlockScopeType"],["impl Eq for Base"],["impl Eq for GenericArg"],["impl Eq for GenericParamKind"],["impl Eq for GenericType"],["impl Eq for Integer"],["impl Eq for TraitOrType"],["impl Eq for Type"],["impl Eq for ConstructorKind"],["impl Eq for LiteralConstructor"],["impl Eq for SimplifiedPatternKind"],["impl Eq for Adjustment"],["impl Eq for DiagnosticVoucher"],["impl Eq for ExpressionAttributes"],["impl Eq for FunctionBody"],["impl Eq for ConstEvalError"],["impl Eq for TypeError"],["impl Eq for Attribute"],["impl Eq for AttributeId"],["impl Eq for Contract"],["impl Eq for ContractField"],["impl Eq for ContractFieldId"],["impl Eq for ContractId"],["impl Eq for DepGraphWrapper"],["impl Eq for Enum"],["impl Eq for EnumId"],["impl Eq for EnumVariant"],["impl Eq for EnumVariantId"],["impl Eq for Function"],["impl Eq for FunctionId"],["impl Eq for FunctionSig"],["impl Eq for FunctionSigId"],["impl Eq for Impl"],["impl Eq for ImplId"],["impl Eq for Ingot"],["impl Eq for IngotId"],["impl Eq for Module"],["impl Eq for ModuleConstant"],["impl Eq for ModuleConstantId"],["impl Eq for ModuleId"],["impl Eq for Struct"],["impl Eq for StructField"],["impl Eq for StructFieldId"],["impl Eq for StructId"],["impl Eq for Trait"],["impl Eq for TraitId"],["impl Eq for TypeAlias"],["impl Eq for TypeAliasId"],["impl Eq for Array"],["impl Eq for CtxDecl"],["impl Eq for FeString"],["impl Eq for FunctionParam"],["impl Eq for FunctionSignature"],["impl Eq for Generic"],["impl Eq for Map"],["impl Eq for SelfDecl"],["impl Eq for Tuple"],["impl Eq for TypeId"],["impl Eq for PatternMatrix"],["impl Eq for PatternRowVec"],["impl Eq for SigmaSet"],["impl Eq for SimplifiedPattern"],["impl<T: Eq> Eq for Analysis<T>"]]],["fe_common",[["impl Eq for LabelStyle"],["impl Eq for FileKind"],["impl Eq for Radix"],["impl Eq for ProjectMode"],["impl Eq for Diagnostic"],["impl Eq for Label"],["impl Eq for File"],["impl Eq for SourceFileId"],["impl Eq for Span"]]],["fe_mir",[["impl Eq for PostIDom"],["impl Eq for CursorLocation"],["impl Eq for ConstantValue"],["impl Eq for Linkage"],["impl Eq for BinOp"],["impl Eq for CallType"],["impl Eq for CastKind"],["impl Eq for InstKind"],["impl Eq for UnOp"],["impl Eq for YulIntrinsicOp"],["impl Eq for TypeKind"],["impl Eq for AssignableValue"],["impl Eq for Value"],["impl Eq for ControlFlowGraph"],["impl Eq for Loop"],["impl Eq for BasicBlock"],["impl Eq for BodyOrder"],["impl Eq for Constant"],["impl Eq for ConstantId"],["impl Eq for BodyDataStore"],["impl Eq for FunctionBody"],["impl Eq for FunctionId"],["impl Eq for FunctionParam"],["impl Eq for FunctionSignature"],["impl Eq for Inst"],["impl Eq for SwitchTable"],["impl Eq for SourceInfo"],["impl Eq for ArrayDef"],["impl Eq for EnumDef"],["impl Eq for EnumVariant"],["impl Eq for EventDef"],["impl Eq for MapDef"],["impl Eq for StructDef"],["impl Eq for TupleDef"],["impl Eq for Type"],["impl Eq for TypeId"],["impl Eq for Local"]]],["fe_parser",[["impl Eq for BinOperator"],["impl Eq for BoolOperator"],["impl Eq for CompOperator"],["impl Eq for ContractStmt"],["impl Eq for Expr"],["impl Eq for FuncStmt"],["impl Eq for FunctionArg"],["impl Eq for GenericArg"],["impl Eq for GenericParameter"],["impl Eq for LiteralPattern"],["impl Eq for ModuleStmt"],["impl Eq for Pattern"],["impl Eq for TypeDesc"],["impl Eq for UnaryOperator"],["impl Eq for UseTree"],["impl Eq for VarDeclTarget"],["impl Eq for VariantKind"],["impl Eq for TokenKind"],["impl Eq for CallArg"],["impl Eq for ConstantDecl"],["impl Eq for Contract"],["impl Eq for Enum"],["impl Eq for Field"],["impl Eq for Function"],["impl Eq for FunctionSignature"],["impl Eq for Impl"],["impl Eq for MatchArm"],["impl Eq for Module"],["impl Eq for Path"],["impl Eq for Pragma"],["impl Eq for Struct"],["impl Eq for Trait"],["impl Eq for TypeAlias"],["impl Eq for Use"],["impl Eq for Variant"],["impl Eq for NodeId"],["impl Eq for ParseFailed"],["impl<'a> Eq for Token<'a>"],["impl<T: Eq> Eq for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[244,2114,22863,2336,9714,10001]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.Ord.js b/compiler-docs/trait.impl/core/cmp/trait.Ord.js new file mode 100644 index 0000000000..0dbbfdf42a --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.Ord.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Ord for Emit"]]],["fe_analyzer",[["impl Ord for GlobalFunction"],["impl Ord for Intrinsic"],["impl Ord for Item"],["impl Ord for TypeDef"],["impl Ord for Base"],["impl Ord for GenericType"],["impl Ord for Integer"],["impl Ord for AttributeId"],["impl Ord for ContractFieldId"],["impl Ord for ContractId"],["impl Ord for EnumId"],["impl Ord for EnumVariantId"],["impl Ord for FunctionId"],["impl Ord for FunctionSigId"],["impl Ord for ImplId"],["impl Ord for IngotId"],["impl Ord for ModuleConstantId"],["impl Ord for ModuleId"],["impl Ord for StructFieldId"],["impl Ord for StructId"],["impl Ord for TraitId"],["impl Ord for TypeAliasId"],["impl Ord for FeString"],["impl Ord for Generic"],["impl Ord for TypeId"]]],["fe_mir",[["impl Ord for FunctionId"]]],["fe_parser",[["impl Ord for NodeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[247,7164,286,268]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.PartialEq.js b/compiler-docs/trait.impl/core/cmp/trait.PartialEq.js new file mode 100644 index 0000000000..93d2099a6b --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.PartialEq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl PartialEq for Emit"]]],["fe_abi",[["impl PartialEq for AbiFunctionType"],["impl PartialEq for StateMutability"],["impl PartialEq for AbiType"],["impl PartialEq for AbiContract"],["impl PartialEq for AbiEvent"],["impl PartialEq for AbiEventField"],["impl PartialEq for AbiFunction"],["impl PartialEq for AbiTupleField"]]],["fe_analyzer",[["impl PartialEq for ContractTypeMethod"],["impl PartialEq for GlobalFunction"],["impl PartialEq for Intrinsic"],["impl PartialEq for ValueMethod"],["impl PartialEq for AdjustmentKind"],["impl PartialEq for CallType"],["impl PartialEq for Constant"],["impl PartialEq for NamedThing"],["impl PartialEq for BinaryOperationError"],["impl PartialEq for IndexingError"],["impl PartialEq for TypeCoercionError"],["impl PartialEq for DepLocality"],["impl PartialEq for EnumVariantKind"],["impl PartialEq for IngotMode"],["impl PartialEq for Item"],["impl PartialEq for ModuleSource"],["impl PartialEq for TypeDef"],["impl PartialEq for BlockScopeType"],["impl PartialEq for Base"],["impl PartialEq for GenericArg"],["impl PartialEq for GenericParamKind"],["impl PartialEq for GenericType"],["impl PartialEq for Integer"],["impl PartialEq for TraitOrType"],["impl PartialEq for Type"],["impl PartialEq for ConstructorKind"],["impl PartialEq for LiteralConstructor"],["impl PartialEq for SimplifiedPatternKind"],["impl PartialEq for Adjustment"],["impl PartialEq for DiagnosticVoucher"],["impl PartialEq for ExpressionAttributes"],["impl PartialEq for FunctionBody"],["impl PartialEq for ConstEvalError"],["impl PartialEq for TypeError"],["impl PartialEq for Attribute"],["impl PartialEq for AttributeId"],["impl PartialEq for Contract"],["impl PartialEq for ContractField"],["impl PartialEq for ContractFieldId"],["impl PartialEq for ContractId"],["impl PartialEq for DepGraphWrapper"],["impl PartialEq for Enum"],["impl PartialEq for EnumId"],["impl PartialEq for EnumVariant"],["impl PartialEq for EnumVariantId"],["impl PartialEq for Function"],["impl PartialEq for FunctionId"],["impl PartialEq for FunctionSig"],["impl PartialEq for FunctionSigId"],["impl PartialEq for Impl"],["impl PartialEq for ImplId"],["impl PartialEq for Ingot"],["impl PartialEq for IngotId"],["impl PartialEq for Module"],["impl PartialEq for ModuleConstant"],["impl PartialEq for ModuleConstantId"],["impl PartialEq for ModuleId"],["impl PartialEq for Struct"],["impl PartialEq for StructField"],["impl PartialEq for StructFieldId"],["impl PartialEq for StructId"],["impl PartialEq for Trait"],["impl PartialEq for TraitId"],["impl PartialEq for TypeAlias"],["impl PartialEq for TypeAliasId"],["impl PartialEq for Array"],["impl PartialEq for CtxDecl"],["impl PartialEq for FeString"],["impl PartialEq for FunctionParam"],["impl PartialEq for FunctionSignature"],["impl PartialEq for Generic"],["impl PartialEq for Map"],["impl PartialEq for SelfDecl"],["impl PartialEq for Tuple"],["impl PartialEq for TypeId"],["impl PartialEq for PatternMatrix"],["impl PartialEq for PatternRowVec"],["impl PartialEq for SigmaSet"],["impl PartialEq for SimplifiedPattern"],["impl<T: PartialEq> PartialEq for Analysis<T>"]]],["fe_common",[["impl PartialEq for LabelStyle"],["impl PartialEq for FileKind"],["impl PartialEq for Radix"],["impl PartialEq for ProjectMode"],["impl PartialEq for Diagnostic"],["impl PartialEq for Label"],["impl PartialEq for File"],["impl PartialEq for SourceFileId"],["impl PartialEq for Span"]]],["fe_mir",[["impl PartialEq for PostIDom"],["impl PartialEq for CursorLocation"],["impl PartialEq for ConstantValue"],["impl PartialEq for Linkage"],["impl PartialEq for BinOp"],["impl PartialEq for CallType"],["impl PartialEq for CastKind"],["impl PartialEq for InstKind"],["impl PartialEq for UnOp"],["impl PartialEq for YulIntrinsicOp"],["impl PartialEq for TypeKind"],["impl PartialEq for AssignableValue"],["impl PartialEq for Value"],["impl PartialEq for ControlFlowGraph"],["impl PartialEq for Loop"],["impl PartialEq for BasicBlock"],["impl PartialEq for BodyOrder"],["impl PartialEq for Constant"],["impl PartialEq for ConstantId"],["impl PartialEq for BodyDataStore"],["impl PartialEq for FunctionBody"],["impl PartialEq for FunctionId"],["impl PartialEq for FunctionParam"],["impl PartialEq for FunctionSignature"],["impl PartialEq for Inst"],["impl PartialEq for SwitchTable"],["impl PartialEq for SourceInfo"],["impl PartialEq for ArrayDef"],["impl PartialEq for EnumDef"],["impl PartialEq for EnumVariant"],["impl PartialEq for EventDef"],["impl PartialEq for MapDef"],["impl PartialEq for StructDef"],["impl PartialEq for TupleDef"],["impl PartialEq for Type"],["impl PartialEq for TypeId"],["impl PartialEq for Local"]]],["fe_parser",[["impl PartialEq for BinOperator"],["impl PartialEq for BoolOperator"],["impl PartialEq for CompOperator"],["impl PartialEq for ContractStmt"],["impl PartialEq for Expr"],["impl PartialEq for FuncStmt"],["impl PartialEq for FunctionArg"],["impl PartialEq for GenericArg"],["impl PartialEq for GenericParameter"],["impl PartialEq for LiteralPattern"],["impl PartialEq for ModuleStmt"],["impl PartialEq for Pattern"],["impl PartialEq for TypeDesc"],["impl PartialEq for UnaryOperator"],["impl PartialEq for UseTree"],["impl PartialEq for VarDeclTarget"],["impl PartialEq for VariantKind"],["impl PartialEq for TokenKind"],["impl PartialEq for CallArg"],["impl PartialEq for ConstantDecl"],["impl PartialEq for Contract"],["impl PartialEq for Enum"],["impl PartialEq for Field"],["impl PartialEq for Function"],["impl PartialEq for FunctionSignature"],["impl PartialEq for Impl"],["impl PartialEq for MatchArm"],["impl PartialEq for Module"],["impl PartialEq for Path"],["impl PartialEq for Pragma"],["impl PartialEq for Struct"],["impl PartialEq for Trait"],["impl PartialEq for TypeAlias"],["impl PartialEq for Use"],["impl PartialEq for Variant"],["impl PartialEq for NodeId"],["impl PartialEq for ParseFailed"],["impl<'a> PartialEq for Token<'a>"],["impl<T: PartialEq> PartialEq for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[265,2282,24564,2525,10491,10841]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js b/compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js new file mode 100644 index 0000000000..3fa21c2b52 --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl PartialOrd for Emit"]]],["fe_analyzer",[["impl PartialOrd for GlobalFunction"],["impl PartialOrd for Intrinsic"],["impl PartialOrd for Item"],["impl PartialOrd for TypeDef"],["impl PartialOrd for Base"],["impl PartialOrd for GenericType"],["impl PartialOrd for Integer"],["impl PartialOrd for AttributeId"],["impl PartialOrd for ContractFieldId"],["impl PartialOrd for ContractId"],["impl PartialOrd for EnumId"],["impl PartialOrd for EnumVariantId"],["impl PartialOrd for FunctionId"],["impl PartialOrd for FunctionSigId"],["impl PartialOrd for ImplId"],["impl PartialOrd for IngotId"],["impl PartialOrd for ModuleConstantId"],["impl PartialOrd for ModuleId"],["impl PartialOrd for StructFieldId"],["impl PartialOrd for StructId"],["impl PartialOrd for TraitId"],["impl PartialOrd for TypeAliasId"],["impl PartialOrd for FeString"],["impl PartialOrd for Generic"],["impl PartialOrd for TypeId"]]],["fe_mir",[["impl PartialOrd for FunctionId"]]],["fe_parser",[["impl PartialOrd for NodeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[268,7689,307,289]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/convert/trait.AsRef.js b/compiler-docs/trait.impl/core/convert/trait.AsRef.js new file mode 100644 index 0000000000..ffe77d3cda --- /dev/null +++ b/compiler-docs/trait.impl/core/convert/trait.AsRef.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl AsRef<str> for ContractTypeMethod"],["impl AsRef<str> for GlobalFunction"],["impl AsRef<str> for Intrinsic"],["impl AsRef<str> for ValueMethod"],["impl AsRef<str> for GenericType"],["impl AsRef<str> for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2399]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/convert/trait.From.js b/compiler-docs/trait.impl/core/convert/trait.From.js new file mode 100644 index 0000000000..0fccd7528d --- /dev/null +++ b/compiler-docs/trait.impl/core/convert/trait.From.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl From<Base> for Type"],["impl From<AlreadyDefined> for FatalError"],["impl From<ConstEvalError> for FatalError"],["impl From<ConstEvalError> for TypeError"],["impl From<FatalError> for ConstEvalError"],["impl From<FatalError> for TypeError"],["impl From<IncompleteItem> for ConstEvalError"],["impl From<IncompleteItem> for FatalError"],["impl From<IncompleteItem> for TypeError"],["impl From<TypeError> for ConstEvalError"],["impl From<TypeError> for FatalError"]]],["fe_common",[["impl From<LabelStyle> for LabelStyle"],["impl From<Span> for Range<usize>"]]],["fe_mir",[["impl From<Constant> for ConstantValue"],["impl From<Id<Value>> for AssignableValue"],["impl From<Intrinsic> for YulIntrinsicOp"],["impl<T> From<&Node<T>> for SourceInfo"]]],["fe_parser",[["impl<'a> From<Token<'a>> for Node<SmolStr>"],["impl<T> From<&Node<T>> for NodeId"],["impl<T> From<&Node<T>> for Span"],["impl<T> From<&Box<Node<T>>> for NodeId"],["impl<T> From<&Box<Node<T>>> for Span"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[4775,954,1328,2413]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/convert/trait.TryFrom.js b/compiler-docs/trait.impl/core/convert/trait.TryFrom.js new file mode 100644 index 0000000000..01653698b6 --- /dev/null +++ b/compiler-docs/trait.impl/core/convert/trait.TryFrom.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl TryFrom<&str> for ContractTypeMethod"],["impl TryFrom<&str> for GlobalFunction"],["impl TryFrom<&str> for Intrinsic"],["impl TryFrom<&str> for ValueMethod"],["impl TryFrom<&str> for GenericType"],["impl TryFrom<&str> for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2465]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/default/trait.Default.js b/compiler-docs/trait.impl/core/default/trait.Default.js new file mode 100644 index 0000000000..0ea01ffc27 --- /dev/null +++ b/compiler-docs/trait.impl/core/default/trait.Default.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Default for FunctionBody"],["impl Default for TempContext"],["impl Default for AllImplsQuery"],["impl Default for ContractAllFieldsQuery"],["impl Default for ContractAllFunctionsQuery"],["impl Default for ContractCallFunctionQuery"],["impl Default for ContractDependencyGraphQuery"],["impl Default for ContractFieldMapQuery"],["impl Default for ContractFieldTypeQuery"],["impl Default for ContractFunctionMapQuery"],["impl Default for ContractInitFunctionQuery"],["impl Default for ContractPublicFunctionMapQuery"],["impl Default for ContractRuntimeDependencyGraphQuery"],["impl Default for EnumAllFunctionsQuery"],["impl Default for EnumAllVariantsQuery"],["impl Default for EnumDependencyGraphQuery"],["impl Default for EnumFunctionMapQuery"],["impl Default for EnumVariantKindQuery"],["impl Default for EnumVariantMapQuery"],["impl Default for FunctionBodyQuery"],["impl Default for FunctionDependencyGraphQuery"],["impl Default for FunctionSignatureQuery"],["impl Default for FunctionSigsQuery"],["impl Default for ImplAllFunctionsQuery"],["impl Default for ImplForQuery"],["impl Default for ImplFunctionMapQuery"],["impl Default for IngotExternalIngotsQuery"],["impl Default for IngotFilesQuery"],["impl Default for IngotModulesQuery"],["impl Default for IngotRootModuleQuery"],["impl Default for InternAttributeLookupQuery"],["impl Default for InternAttributeQuery"],["impl Default for InternContractFieldLookupQuery"],["impl Default for InternContractFieldQuery"],["impl Default for InternContractLookupQuery"],["impl Default for InternContractQuery"],["impl Default for InternEnumLookupQuery"],["impl Default for InternEnumQuery"],["impl Default for InternEnumVariantLookupQuery"],["impl Default for InternEnumVariantQuery"],["impl Default for InternFunctionLookupQuery"],["impl Default for InternFunctionQuery"],["impl Default for InternFunctionSigLookupQuery"],["impl Default for InternFunctionSigQuery"],["impl Default for InternImplLookupQuery"],["impl Default for InternImplQuery"],["impl Default for InternIngotLookupQuery"],["impl Default for InternIngotQuery"],["impl Default for InternModuleConstLookupQuery"],["impl Default for InternModuleConstQuery"],["impl Default for InternModuleLookupQuery"],["impl Default for InternModuleQuery"],["impl Default for InternStructFieldLookupQuery"],["impl Default for InternStructFieldQuery"],["impl Default for InternStructLookupQuery"],["impl Default for InternStructQuery"],["impl Default for InternTraitLookupQuery"],["impl Default for InternTraitQuery"],["impl Default for InternTypeAliasLookupQuery"],["impl Default for InternTypeAliasQuery"],["impl Default for InternTypeLookupQuery"],["impl Default for InternTypeQuery"],["impl Default for ModuleAllImplsQuery"],["impl Default for ModuleAllItemsQuery"],["impl Default for ModuleConstantTypeQuery"],["impl Default for ModuleConstantValueQuery"],["impl Default for ModuleConstantsQuery"],["impl Default for ModuleContractsQuery"],["impl Default for ModuleFilePathQuery"],["impl Default for ModuleImplMapQuery"],["impl Default for ModuleIsIncompleteQuery"],["impl Default for ModuleItemMapQuery"],["impl Default for ModuleParentModuleQuery"],["impl Default for ModuleParseQuery"],["impl Default for ModuleStructsQuery"],["impl Default for ModuleSubmodulesQuery"],["impl Default for ModuleTestsQuery"],["impl Default for ModuleUsedItemMapQuery"],["impl Default for RootIngotQuery"],["impl Default for StructAllFieldsQuery"],["impl Default for StructAllFunctionsQuery"],["impl Default for StructDependencyGraphQuery"],["impl Default for StructFieldMapQuery"],["impl Default for StructFieldTypeQuery"],["impl Default for StructFunctionMapQuery"],["impl Default for TestDb"],["impl Default for TraitAllFunctionsQuery"],["impl Default for TraitFunctionMapQuery"],["impl Default for TraitIsImplementedForQuery"],["impl Default for TypeAliasTypeQuery"],["impl Default for AttributeId"],["impl Default for EnumId"],["impl Default for ImplId"],["impl Default for StructId"],["impl Default for TraitId"],["impl Default for TypeId"]]],["fe_codegen",[["impl Default for CodegenAbiContractQuery"],["impl Default for CodegenAbiEventQuery"],["impl Default for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl Default for CodegenAbiFunctionQuery"],["impl Default for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl Default for CodegenAbiModuleEventsQuery"],["impl Default for CodegenAbiTypeMaximumSizeQuery"],["impl Default for CodegenAbiTypeMinimumSizeQuery"],["impl Default for CodegenAbiTypeQuery"],["impl Default for CodegenConstantStringSymbolNameQuery"],["impl Default for CodegenContractDeployerSymbolNameQuery"],["impl Default for CodegenContractSymbolNameQuery"],["impl Default for CodegenFunctionSymbolNameQuery"],["impl Default for CodegenLegalizedBodyQuery"],["impl Default for CodegenLegalizedSignatureQuery"],["impl Default for CodegenLegalizedTypeQuery"],["impl Default for Db"],["impl Default for Context"],["impl Default for DefaultRuntimeProvider"]]],["fe_common",[["impl Default for FileContentQuery"],["impl Default for FileLineStartsQuery"],["impl Default for FileNameQuery"],["impl Default for InternFileLookupQuery"],["impl Default for InternFileQuery"],["impl Default for TestDb"]]],["fe_compiler_test_utils",[["impl Default for GasReporter"],["impl Default for Runtime"]]],["fe_mir",[["impl Default for DFSet"],["impl Default for LoopTree"],["impl Default for MirInternConstLookupQuery"],["impl Default for MirInternConstQuery"],["impl Default for MirInternFunctionLookupQuery"],["impl Default for MirInternFunctionQuery"],["impl Default for MirInternTypeLookupQuery"],["impl Default for MirInternTypeQuery"],["impl Default for MirLowerContractAllFunctionsQuery"],["impl Default for MirLowerEnumAllFunctionsQuery"],["impl Default for MirLowerModuleAllFunctionsQuery"],["impl Default for MirLowerStructAllFunctionsQuery"],["impl Default for MirLoweredConstantQuery"],["impl Default for MirLoweredFuncBodyQuery"],["impl Default for MirLoweredFuncSignatureQuery"],["impl Default for MirLoweredMonomorphizedFuncSignatureQuery"],["impl Default for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl Default for MirLoweredTypeQuery"],["impl Default for NewDb"],["impl Default for BodyDataStore"],["impl Default for SwitchTable"]]],["fe_parser",[["impl Default for NodeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[30367,6351,1786,621,6678,288]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/error/trait.Error.js b/compiler-docs/trait.impl/core/error/trait.Error.js new file mode 100644 index 0000000000..e03787f01d --- /dev/null +++ b/compiler-docs/trait.impl/core/error/trait.Error.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_compiler_test_utils",[["impl Error for SolidityCompileError"]]],["fe_parser",[["impl Error for ParseFailed"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[347,282]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/fmt/trait.Debug.js b/compiler-docs/trait.impl/core/fmt/trait.Debug.js new file mode 100644 index 0000000000..89a68b5186 --- /dev/null +++ b/compiler-docs/trait.impl/core/fmt/trait.Debug.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Debug for Emit"]]],["fe_abi",[["impl Debug for AbiFunctionType"],["impl Debug for StateMutability"],["impl Debug for AbiType"],["impl Debug for AbiContract"],["impl Debug for AbiEvent"],["impl Debug for AbiEventField"],["impl Debug for AbiFunction"],["impl Debug for AbiTupleField"]]],["fe_analyzer",[["impl Debug for ContractTypeMethod"],["impl Debug for GlobalFunction"],["impl Debug for Intrinsic"],["impl Debug for ValueMethod"],["impl Debug for AdjustmentKind"],["impl Debug for CallType"],["impl Debug for Constant"],["impl Debug for NamedThing"],["impl Debug for BinaryOperationError"],["impl Debug for IndexingError"],["impl Debug for TypeCoercionError"],["impl Debug for DepLocality"],["impl Debug for EnumVariantKind"],["impl Debug for IngotMode"],["impl Debug for Item"],["impl Debug for ModuleSource"],["impl Debug for TypeDef"],["impl Debug for BlockScopeType"],["impl Debug for Base"],["impl Debug for GenericArg"],["impl Debug for GenericParamKind"],["impl Debug for GenericType"],["impl Debug for Integer"],["impl Debug for TraitOrType"],["impl Debug for Type"],["impl Debug for ConstructorKind"],["impl Debug for LiteralConstructor"],["impl Debug for SimplifiedPatternKind"],["impl Debug for Adjustment"],["impl Debug for DiagnosticVoucher"],["impl Debug for ExpressionAttributes"],["impl Debug for FunctionBody"],["impl Debug for AllImplsQuery"],["impl Debug for ContractAllFieldsQuery"],["impl Debug for ContractAllFunctionsQuery"],["impl Debug for ContractCallFunctionQuery"],["impl Debug for ContractDependencyGraphQuery"],["impl Debug for ContractFieldMapQuery"],["impl Debug for ContractFieldTypeQuery"],["impl Debug for ContractFunctionMapQuery"],["impl Debug for ContractInitFunctionQuery"],["impl Debug for ContractPublicFunctionMapQuery"],["impl Debug for ContractRuntimeDependencyGraphQuery"],["impl Debug for EnumAllFunctionsQuery"],["impl Debug for EnumAllVariantsQuery"],["impl Debug for EnumDependencyGraphQuery"],["impl Debug for EnumFunctionMapQuery"],["impl Debug for EnumVariantKindQuery"],["impl Debug for EnumVariantMapQuery"],["impl Debug for FunctionBodyQuery"],["impl Debug for FunctionDependencyGraphQuery"],["impl Debug for FunctionSignatureQuery"],["impl Debug for FunctionSigsQuery"],["impl Debug for ImplAllFunctionsQuery"],["impl Debug for ImplForQuery"],["impl Debug for ImplFunctionMapQuery"],["impl Debug for IngotExternalIngotsQuery"],["impl Debug for IngotFilesQuery"],["impl Debug for IngotModulesQuery"],["impl Debug for IngotRootModuleQuery"],["impl Debug for InternAttributeLookupQuery"],["impl Debug for InternAttributeQuery"],["impl Debug for InternContractFieldLookupQuery"],["impl Debug for InternContractFieldQuery"],["impl Debug for InternContractLookupQuery"],["impl Debug for InternContractQuery"],["impl Debug for InternEnumLookupQuery"],["impl Debug for InternEnumQuery"],["impl Debug for InternEnumVariantLookupQuery"],["impl Debug for InternEnumVariantQuery"],["impl Debug for InternFunctionLookupQuery"],["impl Debug for InternFunctionQuery"],["impl Debug for InternFunctionSigLookupQuery"],["impl Debug for InternFunctionSigQuery"],["impl Debug for InternImplLookupQuery"],["impl Debug for InternImplQuery"],["impl Debug for InternIngotLookupQuery"],["impl Debug for InternIngotQuery"],["impl Debug for InternModuleConstLookupQuery"],["impl Debug for InternModuleConstQuery"],["impl Debug for InternModuleLookupQuery"],["impl Debug for InternModuleQuery"],["impl Debug for InternStructFieldLookupQuery"],["impl Debug for InternStructFieldQuery"],["impl Debug for InternStructLookupQuery"],["impl Debug for InternStructQuery"],["impl Debug for InternTraitLookupQuery"],["impl Debug for InternTraitQuery"],["impl Debug for InternTypeAliasLookupQuery"],["impl Debug for InternTypeAliasQuery"],["impl Debug for InternTypeLookupQuery"],["impl Debug for InternTypeQuery"],["impl Debug for ModuleAllImplsQuery"],["impl Debug for ModuleAllItemsQuery"],["impl Debug for ModuleConstantTypeQuery"],["impl Debug for ModuleConstantValueQuery"],["impl Debug for ModuleConstantsQuery"],["impl Debug for ModuleContractsQuery"],["impl Debug for ModuleFilePathQuery"],["impl Debug for ModuleImplMapQuery"],["impl Debug for ModuleIsIncompleteQuery"],["impl Debug for ModuleItemMapQuery"],["impl Debug for ModuleParentModuleQuery"],["impl Debug for ModuleParseQuery"],["impl Debug for ModuleStructsQuery"],["impl Debug for ModuleSubmodulesQuery"],["impl Debug for ModuleTestsQuery"],["impl Debug for ModuleUsedItemMapQuery"],["impl Debug for RootIngotQuery"],["impl Debug for StructAllFieldsQuery"],["impl Debug for StructAllFunctionsQuery"],["impl Debug for StructDependencyGraphQuery"],["impl Debug for StructFieldMapQuery"],["impl Debug for StructFieldTypeQuery"],["impl Debug for StructFunctionMapQuery"],["impl Debug for TraitAllFunctionsQuery"],["impl Debug for TraitFunctionMapQuery"],["impl Debug for TraitIsImplementedForQuery"],["impl Debug for TypeAliasTypeQuery"],["impl Debug for AlreadyDefined"],["impl Debug for ConstEvalError"],["impl Debug for FatalError"],["impl Debug for IncompleteItem"],["impl Debug for TypeError"],["impl Debug for Attribute"],["impl Debug for AttributeId"],["impl Debug for Contract"],["impl Debug for ContractField"],["impl Debug for ContractFieldId"],["impl Debug for ContractId"],["impl Debug for DepGraphWrapper"],["impl Debug for Enum"],["impl Debug for EnumId"],["impl Debug for EnumVariant"],["impl Debug for EnumVariantId"],["impl Debug for Function"],["impl Debug for FunctionId"],["impl Debug for FunctionSig"],["impl Debug for FunctionSigId"],["impl Debug for Impl"],["impl Debug for ImplId"],["impl Debug for Ingot"],["impl Debug for IngotId"],["impl Debug for Module"],["impl Debug for ModuleConstant"],["impl Debug for ModuleConstantId"],["impl Debug for ModuleId"],["impl Debug for Struct"],["impl Debug for StructField"],["impl Debug for StructFieldId"],["impl Debug for StructId"],["impl Debug for Trait"],["impl Debug for TraitId"],["impl Debug for TypeAlias"],["impl Debug for TypeAliasId"],["impl Debug for Array"],["impl Debug for CtxDecl"],["impl Debug for FeString"],["impl Debug for FunctionParam"],["impl Debug for FunctionSignature"],["impl Debug for Generic"],["impl Debug for Map"],["impl Debug for SelfDecl"],["impl Debug for Tuple"],["impl Debug for TypeId"],["impl Debug for PatternMatrix"],["impl Debug for PatternRowVec"],["impl Debug for SigmaSet"],["impl Debug for SimplifiedPattern"],["impl<T: Debug> Debug for Analysis<T>"]]],["fe_codegen",[["impl Debug for AbiSrcLocation"],["impl Debug for CodegenAbiContractQuery"],["impl Debug for CodegenAbiEventQuery"],["impl Debug for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl Debug for CodegenAbiFunctionQuery"],["impl Debug for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl Debug for CodegenAbiModuleEventsQuery"],["impl Debug for CodegenAbiTypeMaximumSizeQuery"],["impl Debug for CodegenAbiTypeMinimumSizeQuery"],["impl Debug for CodegenAbiTypeQuery"],["impl Debug for CodegenConstantStringSymbolNameQuery"],["impl Debug for CodegenContractDeployerSymbolNameQuery"],["impl Debug for CodegenContractSymbolNameQuery"],["impl Debug for CodegenFunctionSymbolNameQuery"],["impl Debug for CodegenLegalizedBodyQuery"],["impl Debug for CodegenLegalizedSignatureQuery"],["impl Debug for CodegenLegalizedTypeQuery"],["impl Debug for DefaultRuntimeProvider"]]],["fe_common",[["impl Debug for LabelStyle"],["impl Debug for FileKind"],["impl Debug for Radix"],["impl Debug for FileContentQuery"],["impl Debug for FileLineStartsQuery"],["impl Debug for FileNameQuery"],["impl Debug for InternFileLookupQuery"],["impl Debug for InternFileQuery"],["impl Debug for Diagnostic"],["impl Debug for Label"],["impl Debug for File"],["impl Debug for SourceFileId"],["impl Debug for Span"],["impl<'a> Debug for Literal<'a>"]]],["fe_compiler_test_utils",[["impl Debug for GasRecord"],["impl Debug for GasReporter"],["impl Debug for SolidityCompileError"]]],["fe_driver",[["impl Debug for CompileError"]]],["fe_mir",[["impl Debug for PostIDom"],["impl Debug for CursorLocation"],["impl Debug for ConstantValue"],["impl Debug for Linkage"],["impl Debug for BinOp"],["impl Debug for CallType"],["impl Debug for CastKind"],["impl Debug for InstKind"],["impl Debug for UnOp"],["impl Debug for YulIntrinsicOp"],["impl Debug for TypeKind"],["impl Debug for AssignableValue"],["impl Debug for Value"],["impl Debug for ControlFlowGraph"],["impl Debug for DFSet"],["impl Debug for DomTree"],["impl Debug for Loop"],["impl Debug for LoopTree"],["impl Debug for PostDomTree"],["impl Debug for MirInternConstLookupQuery"],["impl Debug for MirInternConstQuery"],["impl Debug for MirInternFunctionLookupQuery"],["impl Debug for MirInternFunctionQuery"],["impl Debug for MirInternTypeLookupQuery"],["impl Debug for MirInternTypeQuery"],["impl Debug for MirLowerContractAllFunctionsQuery"],["impl Debug for MirLowerEnumAllFunctionsQuery"],["impl Debug for MirLowerModuleAllFunctionsQuery"],["impl Debug for MirLowerStructAllFunctionsQuery"],["impl Debug for MirLoweredConstantQuery"],["impl Debug for MirLoweredFuncBodyQuery"],["impl Debug for MirLoweredFuncSignatureQuery"],["impl Debug for MirLoweredMonomorphizedFuncSignatureQuery"],["impl Debug for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl Debug for MirLoweredTypeQuery"],["impl Debug for BasicBlock"],["impl Debug for BodyBuilder"],["impl Debug for BodyOrder"],["impl Debug for Constant"],["impl Debug for ConstantId"],["impl Debug for BodyDataStore"],["impl Debug for FunctionBody"],["impl Debug for FunctionId"],["impl Debug for FunctionParam"],["impl Debug for FunctionSignature"],["impl Debug for Inst"],["impl Debug for SwitchTable"],["impl Debug for SourceInfo"],["impl Debug for ArrayDef"],["impl Debug for EnumDef"],["impl Debug for EnumVariant"],["impl Debug for EventDef"],["impl Debug for MapDef"],["impl Debug for StructDef"],["impl Debug for TupleDef"],["impl Debug for Type"],["impl Debug for TypeId"],["impl Debug for Local"]]],["fe_parser",[["impl Debug for BinOperator"],["impl Debug for BoolOperator"],["impl Debug for CompOperator"],["impl Debug for ContractStmt"],["impl Debug for Expr"],["impl Debug for FuncStmt"],["impl Debug for FunctionArg"],["impl Debug for GenericArg"],["impl Debug for GenericParameter"],["impl Debug for LiteralPattern"],["impl Debug for ModuleStmt"],["impl Debug for Pattern"],["impl Debug for TypeDesc"],["impl Debug for UnaryOperator"],["impl Debug for UseTree"],["impl Debug for VarDeclTarget"],["impl Debug for VariantKind"],["impl Debug for TokenKind"],["impl Debug for CallArg"],["impl Debug for ConstantDecl"],["impl Debug for Contract"],["impl Debug for Enum"],["impl Debug for Field"],["impl Debug for Function"],["impl Debug for FunctionSignature"],["impl Debug for Impl"],["impl Debug for MatchArm"],["impl Debug for Module"],["impl Debug for Path"],["impl Debug for Pragma"],["impl Debug for Struct"],["impl Debug for Trait"],["impl Debug for TypeAlias"],["impl Debug for Use"],["impl Debug for Variant"],["impl Debug for NodeId"],["impl Debug for ParseFailed"],["impl<'a> Debug for Token<'a>"],["impl<T: Debug> Debug for Node<T>"]]],["fe_test_runner",[["impl Debug for TestSink"]]],["fe_yulc",[["impl Debug for YulcError"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[253,2186,50895,5845,3854,914,281,16483,10361,284,266]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/fmt/trait.Display.js b/compiler-docs/trait.impl/core/fmt/trait.Display.js new file mode 100644 index 0000000000..0b5a12a90a --- /dev/null +++ b/compiler-docs/trait.impl/core/fmt/trait.Display.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Display for CallType"],["impl Display for Base"],["impl Display for Integer"],["impl Display for FeString"],["impl Display for Generic"],["impl<T: DisplayWithDb> Display for DisplayableWrapper<'_, T>"]]],["fe_common",[["impl Display for Diff"]]],["fe_compiler_test_utils",[["impl Display for GasReporter"],["impl Display for SolidityCompileError"]]],["fe_mir",[["impl Display for BinOp"],["impl Display for CallType"],["impl Display for UnOp"],["impl Display for YulIntrinsicOp"]]],["fe_parser",[["impl Display for BinOperator"],["impl Display for BoolOperator"],["impl Display for CompOperator"],["impl Display for ContractStmt"],["impl Display for Expr"],["impl Display for FuncStmt"],["impl Display for FunctionArg"],["impl Display for GenericArg"],["impl Display for GenericParameter"],["impl Display for LiteralPattern"],["impl Display for ModuleStmt"],["impl Display for Pattern"],["impl Display for TypeDesc"],["impl Display for UnaryOperator"],["impl Display for UseTree"],["impl Display for VarDeclTarget"],["impl Display for CallArg"],["impl Display for ConstantDecl"],["impl Display for Contract"],["impl Display for Enum"],["impl Display for Field"],["impl Display for Function"],["impl Display for Impl"],["impl Display for MatchArm"],["impl Display for Module"],["impl Display for Path"],["impl Display for Pragma"],["impl Display for Struct"],["impl Display for Trait"],["impl Display for TypeAlias"],["impl Display for Use"],["impl Display for Variant"],["impl Display for Node<Function>"],["impl Display for ParseFailed"]]],["fe_test_runner",[["impl Display for TestSink"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1925,285,644,1070,9190,290]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/hash/trait.Hash.js b/compiler-docs/trait.impl/core/hash/trait.Hash.js new file mode 100644 index 0000000000..412556a2df --- /dev/null +++ b/compiler-docs/trait.impl/core/hash/trait.Hash.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Hash for GlobalFunction"],["impl Hash for Intrinsic"],["impl Hash for ValueMethod"],["impl Hash for EnumVariantKind"],["impl Hash for IngotMode"],["impl Hash for Item"],["impl Hash for ModuleSource"],["impl Hash for TypeDef"],["impl Hash for Base"],["impl Hash for GenericArg"],["impl Hash for GenericParamKind"],["impl Hash for GenericType"],["impl Hash for Integer"],["impl Hash for TraitOrType"],["impl Hash for Type"],["impl Hash for ConstructorKind"],["impl Hash for LiteralConstructor"],["impl Hash for DiagnosticVoucher"],["impl Hash for ConstEvalError"],["impl Hash for TypeError"],["impl Hash for Attribute"],["impl Hash for AttributeId"],["impl Hash for Contract"],["impl Hash for ContractField"],["impl Hash for ContractFieldId"],["impl Hash for ContractId"],["impl Hash for Enum"],["impl Hash for EnumId"],["impl Hash for EnumVariant"],["impl Hash for EnumVariantId"],["impl Hash for Function"],["impl Hash for FunctionId"],["impl Hash for FunctionSig"],["impl Hash for FunctionSigId"],["impl Hash for Impl"],["impl Hash for ImplId"],["impl Hash for Ingot"],["impl Hash for IngotId"],["impl Hash for Module"],["impl Hash for ModuleConstant"],["impl Hash for ModuleConstantId"],["impl Hash for ModuleId"],["impl Hash for Struct"],["impl Hash for StructField"],["impl Hash for StructFieldId"],["impl Hash for StructId"],["impl Hash for Trait"],["impl Hash for TraitId"],["impl Hash for TypeAlias"],["impl Hash for TypeAliasId"],["impl Hash for Array"],["impl Hash for CtxDecl"],["impl Hash for FeString"],["impl Hash for FunctionParam"],["impl Hash for FunctionSignature"],["impl Hash for Generic"],["impl Hash for Map"],["impl Hash for SelfDecl"],["impl Hash for Tuple"],["impl Hash for TypeId"],["impl<T: Hash> Hash for Analysis<T>"]]],["fe_common",[["impl Hash for LabelStyle"],["impl Hash for FileKind"],["impl Hash for Diagnostic"],["impl Hash for Label"],["impl Hash for File"],["impl Hash for SourceFileId"],["impl Hash for Span"]]],["fe_mir",[["impl Hash for ConstantValue"],["impl Hash for Linkage"],["impl Hash for BinOp"],["impl Hash for CallType"],["impl Hash for CastKind"],["impl Hash for InstKind"],["impl Hash for UnOp"],["impl Hash for YulIntrinsicOp"],["impl Hash for TypeKind"],["impl Hash for AssignableValue"],["impl Hash for Value"],["impl Hash for BasicBlock"],["impl Hash for Constant"],["impl Hash for ConstantId"],["impl Hash for FunctionId"],["impl Hash for FunctionParam"],["impl Hash for FunctionSignature"],["impl Hash for Inst"],["impl Hash for SwitchTable"],["impl Hash for SourceInfo"],["impl Hash for ArrayDef"],["impl Hash for EnumDef"],["impl Hash for EnumVariant"],["impl Hash for EventDef"],["impl Hash for MapDef"],["impl Hash for StructDef"],["impl Hash for TupleDef"],["impl Hash for Type"],["impl Hash for TypeId"],["impl Hash for Local"]]],["fe_parser",[["impl Hash for BinOperator"],["impl Hash for BoolOperator"],["impl Hash for CompOperator"],["impl Hash for ContractStmt"],["impl Hash for Expr"],["impl Hash for FuncStmt"],["impl Hash for FunctionArg"],["impl Hash for GenericArg"],["impl Hash for GenericParameter"],["impl Hash for LiteralPattern"],["impl Hash for ModuleStmt"],["impl Hash for Pattern"],["impl Hash for TypeDesc"],["impl Hash for UnaryOperator"],["impl Hash for UseTree"],["impl Hash for VarDeclTarget"],["impl Hash for VariantKind"],["impl Hash for CallArg"],["impl Hash for ConstantDecl"],["impl Hash for Contract"],["impl Hash for Enum"],["impl Hash for Field"],["impl Hash for Function"],["impl Hash for FunctionSignature"],["impl Hash for Impl"],["impl Hash for MatchArm"],["impl Hash for Module"],["impl Hash for Path"],["impl Hash for Pragma"],["impl Hash for Struct"],["impl Hash for Trait"],["impl Hash for TypeAlias"],["impl Hash for Use"],["impl Hash for Variant"],["impl Hash for NodeId"],["impl Hash for ParseFailed"],["impl<T: Hash> Hash for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17920,1873,8012,9783]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js b/compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js new file mode 100644 index 0000000000..3d20b8b3e4 --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl IntoIterator for SigmaSet"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[364]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js b/compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js new file mode 100644 index 0000000000..0dbc47682d --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl DoubleEndedIterator for GlobalFunctionIter"],["impl DoubleEndedIterator for IntrinsicIter"],["impl DoubleEndedIterator for GenericTypeIter"],["impl DoubleEndedIterator for IntegerIter"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1570]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js b/compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js new file mode 100644 index 0000000000..b803a61272 --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl ExactSizeIterator for GlobalFunctionIter"],["impl ExactSizeIterator for IntrinsicIter"],["impl ExactSizeIterator for GenericTypeIter"],["impl ExactSizeIterator for IntegerIter"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1530]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js b/compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js new file mode 100644 index 0000000000..05081a2b2c --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Iterator for GlobalFunctionIter"],["impl Iterator for IntrinsicIter"],["impl Iterator for GenericTypeIter"],["impl Iterator for IntegerIter"]]],["fe_mir",[["impl<'a> Iterator for CfgPostOrder<'a>"],["impl<'a, 'b> Iterator for BlocksInLoopPostOrder<'a, 'b>"],["impl<'a, T> Iterator for IterBase<'a, T>
where\n T: Copy,
"],["impl<'a, T> Iterator for IterMutBase<'a, T>"]]],["fe_parser",[["impl<'a> Iterator for Lexer<'a>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1406,1607,338]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Copy.js b/compiler-docs/trait.impl/core/marker/trait.Copy.js new file mode 100644 index 0000000000..ca4d19edf1 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Copy.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Copy for Emit"]]],["fe_abi",[["impl Copy for AbiFunctionType"]]],["fe_analyzer",[["impl Copy for ContractTypeMethod"],["impl Copy for GlobalFunction"],["impl Copy for Intrinsic"],["impl Copy for ValueMethod"],["impl Copy for AdjustmentKind"],["impl Copy for DepLocality"],["impl Copy for IngotMode"],["impl Copy for Item"],["impl Copy for TypeDef"],["impl Copy for Base"],["impl Copy for GenericParamKind"],["impl Copy for GenericType"],["impl Copy for Integer"],["impl Copy for ConstructorKind"],["impl Copy for LiteralConstructor"],["impl Copy for Adjustment"],["impl Copy for AttributeId"],["impl Copy for ContractFieldId"],["impl Copy for ContractId"],["impl Copy for EnumId"],["impl Copy for EnumVariantId"],["impl Copy for FunctionId"],["impl Copy for FunctionSigId"],["impl Copy for ImplId"],["impl Copy for IngotId"],["impl Copy for ModuleConstantId"],["impl Copy for ModuleId"],["impl Copy for StructFieldId"],["impl Copy for StructId"],["impl Copy for TraitId"],["impl Copy for TypeAliasId"],["impl Copy for Array"],["impl Copy for CtxDecl"],["impl Copy for FeString"],["impl Copy for SelfDecl"],["impl Copy for TypeId"]]],["fe_codegen",[["impl Copy for AbiSrcLocation"]]],["fe_common",[["impl Copy for LabelStyle"],["impl Copy for FileKind"],["impl Copy for Radix"],["impl Copy for ProjectMode"],["impl Copy for SourceFileId"],["impl Copy for Span"]]],["fe_mir",[["impl Copy for PostIDom"],["impl Copy for CursorLocation"],["impl Copy for Linkage"],["impl Copy for BinOp"],["impl Copy for CallType"],["impl Copy for UnOp"],["impl Copy for YulIntrinsicOp"],["impl Copy for BasicBlock"],["impl Copy for ConstantId"],["impl Copy for FunctionId"],["impl Copy for MapDef"],["impl Copy for TypeId"]]],["fe_parser",[["impl Copy for BinOperator"],["impl Copy for BoolOperator"],["impl Copy for CompOperator"],["impl Copy for LiteralPattern"],["impl Copy for UnaryOperator"],["impl Copy for TokenKind"],["impl Copy for NodeId"],["impl Copy for ParseFailed"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[256,297,10654,313,1628,3289,2169]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Freeze.js b/compiler-docs/trait.impl/core/marker/trait.Freeze.js new file mode 100644 index 0000000000..33f2a6af3a --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Freeze.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Freeze for Emit",1,["fe::task::build::Emit"]],["impl Freeze for Commands",1,["fe::task::Commands"]],["impl Freeze for FelangCli",1,["fe::FelangCli"]],["impl Freeze for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Freeze for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Freeze for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Freeze for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Freeze for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Freeze for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Freeze for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Freeze for AbiType",1,["fe_abi::types::AbiType"]],["impl Freeze for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Freeze for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Freeze for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Freeze for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Freeze for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Freeze for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Freeze for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !Freeze for TempContext",1,["fe_analyzer::context::TempContext"]],["impl !Freeze for TestDb",1,["fe_analyzer::db::TestDb"]],["impl Freeze for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Freeze for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Freeze for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Freeze for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Freeze for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Freeze for CallType",1,["fe_analyzer::context::CallType"]],["impl Freeze for Constant",1,["fe_analyzer::context::Constant"]],["impl Freeze for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Freeze for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Freeze for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Freeze for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Freeze for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Freeze for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Freeze for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Freeze for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Freeze for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Freeze for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Freeze for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Freeze for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Freeze for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Freeze for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Freeze for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Freeze for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Freeze for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Freeze for Type",1,["fe_analyzer::namespace::types::Type"]],["impl Freeze for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Freeze for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Freeze for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Freeze for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Freeze for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Freeze for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Freeze for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Freeze for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Freeze for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl Freeze for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Freeze for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl Freeze for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Freeze for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Freeze for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Freeze for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Freeze for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Freeze for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Freeze for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Freeze for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Freeze for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Freeze for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Freeze for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Freeze for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Freeze for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Freeze for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Freeze for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Freeze for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Freeze for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Freeze for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Freeze for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Freeze for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Freeze for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Freeze for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Freeze for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Freeze for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Freeze for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Freeze for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Freeze for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Freeze for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Freeze for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Freeze for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Freeze for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Freeze for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Freeze for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Freeze for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Freeze for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Freeze for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Freeze for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Freeze for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Freeze for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Freeze for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Freeze for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Freeze for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Freeze for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Freeze for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Freeze for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Freeze for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Freeze for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Freeze for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Freeze for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Freeze for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Freeze for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Freeze for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Freeze for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Freeze for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Freeze for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Freeze for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Freeze for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Freeze for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Freeze for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Freeze for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Freeze for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Freeze for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Freeze for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Freeze for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Freeze for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Freeze for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Freeze for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Freeze for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Freeze for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Freeze for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Freeze for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Freeze for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Freeze for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Freeze for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Freeze for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Freeze for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Freeze for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Freeze for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Freeze for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Freeze for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Freeze for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Freeze for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Freeze for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Freeze for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Freeze for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Freeze for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Freeze for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Freeze for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Freeze for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Freeze for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Freeze for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Freeze for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Freeze for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Freeze for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Freeze for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Freeze for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Freeze for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Freeze for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Freeze for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl Freeze for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Freeze for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Freeze for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Freeze for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Freeze for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Freeze for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Freeze for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Freeze for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Freeze for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Freeze for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Freeze for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Freeze for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Freeze for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Freeze for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Freeze for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Freeze for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Freeze for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Freeze for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Freeze for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Freeze for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Freeze for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Freeze for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Freeze for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Freeze for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Freeze for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Freeze for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Freeze for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Freeze for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Freeze for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Freeze for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl Freeze for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Freeze for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Freeze for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Freeze for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Freeze for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Freeze for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Freeze for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Freeze for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Freeze for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Freeze for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Freeze for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !Freeze for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !Freeze for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !Freeze for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> Freeze for DisplayableWrapper<'a, T>
where\n T: Freeze,
",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> Freeze for Analysis<T>
where\n T: Freeze,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !Freeze for Db",1,["fe_codegen::db::Db"]],["impl Freeze for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Freeze for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Freeze for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Freeze for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Freeze for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Freeze for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Freeze for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Freeze for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Freeze for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Freeze for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Freeze for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Freeze for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Freeze for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Freeze for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl Freeze for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Freeze for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Freeze for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Freeze for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Freeze for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Freeze for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Freeze for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl !Freeze for TestDb",1,["fe_common::db::TestDb"]],["impl Freeze for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Freeze for FileKind",1,["fe_common::files::FileKind"]],["impl Freeze for Radix",1,["fe_common::numeric::Radix"]],["impl Freeze for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Freeze for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Freeze for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Freeze for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Freeze for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Freeze for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Freeze for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Freeze for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Freeze for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl Freeze for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Freeze for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Freeze for Label",1,["fe_common::diagnostics::Label"]],["impl Freeze for File",1,["fe_common::files::File"]],["impl Freeze for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Freeze for Span",1,["fe_common::span::Span"]],["impl Freeze for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Freeze for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Freeze for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Freeze for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Freeze for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Freeze for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Freeze for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl !Freeze for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl !Freeze for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Freeze for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Freeze for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Freeze for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Freeze for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Freeze for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Freeze for CompileError",1,["fe_driver::CompileError"]],["impl Freeze for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Freeze for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl !Freeze for NewDb",1,["fe_mir::db::NewDb"]],["impl Freeze for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Freeze for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Freeze for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Freeze for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Freeze for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Freeze for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Freeze for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Freeze for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Freeze for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Freeze for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Freeze for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Freeze for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Freeze for Value",1,["fe_mir::ir::value::Value"]],["impl Freeze for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Freeze for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Freeze for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Freeze for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Freeze for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Freeze for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Freeze for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl Freeze for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Freeze for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Freeze for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Freeze for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Freeze for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Freeze for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Freeze for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Freeze for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Freeze for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Freeze for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Freeze for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Freeze for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Freeze for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Freeze for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Freeze for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Freeze for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Freeze for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Freeze for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Freeze for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Freeze for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Freeze for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Freeze for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Freeze for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Freeze for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Freeze for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Freeze for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Freeze for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Freeze for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Freeze for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Freeze for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Freeze for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Freeze for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Freeze for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Freeze for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Freeze for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Freeze for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Freeze for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Freeze for Type",1,["fe_mir::ir::types::Type"]],["impl Freeze for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Freeze for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Freeze for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Freeze for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Freeze for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Freeze for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Freeze for IterBase<'a, T>
where\n T: Freeze,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Freeze for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Freeze for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Freeze for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Freeze for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Freeze for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Freeze for Expr",1,["fe_parser::ast::Expr"]],["impl Freeze for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Freeze for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Freeze for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Freeze for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Freeze for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Freeze for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Freeze for Pattern",1,["fe_parser::ast::Pattern"]],["impl Freeze for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Freeze for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Freeze for UseTree",1,["fe_parser::ast::UseTree"]],["impl Freeze for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Freeze for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Freeze for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Freeze for CallArg",1,["fe_parser::ast::CallArg"]],["impl Freeze for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Freeze for Contract",1,["fe_parser::ast::Contract"]],["impl Freeze for Enum",1,["fe_parser::ast::Enum"]],["impl Freeze for Field",1,["fe_parser::ast::Field"]],["impl Freeze for Function",1,["fe_parser::ast::Function"]],["impl Freeze for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Freeze for Impl",1,["fe_parser::ast::Impl"]],["impl Freeze for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Freeze for Module",1,["fe_parser::ast::Module"]],["impl Freeze for Path",1,["fe_parser::ast::Path"]],["impl Freeze for Pragma",1,["fe_parser::ast::Pragma"]],["impl Freeze for Struct",1,["fe_parser::ast::Struct"]],["impl Freeze for Trait",1,["fe_parser::ast::Trait"]],["impl Freeze for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Freeze for Use",1,["fe_parser::ast::Use"]],["impl Freeze for Variant",1,["fe_parser::ast::Variant"]],["impl Freeze for NodeId",1,["fe_parser::node::NodeId"]],["impl Freeze for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Freeze for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Freeze for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Freeze for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Freeze for Node<T>
where\n T: Freeze,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Freeze for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Freeze for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Freeze for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1777,3834,65195,8264,8495,2488,952,22550,12638,324,614]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Send.js b/compiler-docs/trait.impl/core/marker/trait.Send.js new file mode 100644 index 0000000000..348822d448 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Send.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Send for Emit",1,["fe::task::build::Emit"]],["impl Send for Commands",1,["fe::task::Commands"]],["impl Send for FelangCli",1,["fe::FelangCli"]],["impl Send for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Send for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Send for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Send for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Send for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Send for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Send for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Send for AbiType",1,["fe_abi::types::AbiType"]],["impl Send for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Send for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Send for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Send for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Send for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Send for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Send for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !Send for CallType",1,["fe_analyzer::context::CallType"]],["impl !Send for Type",1,["fe_analyzer::namespace::types::Type"]],["impl !Send for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl !Send for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl !Send for TestDb",1,["fe_analyzer::db::TestDb"]],["impl !Send for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl !Send for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl !Send for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Send for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Send for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Send for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Send for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Send for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Send for Constant",1,["fe_analyzer::context::Constant"]],["impl Send for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Send for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Send for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Send for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Send for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Send for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Send for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Send for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Send for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Send for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Send for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Send for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Send for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Send for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Send for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Send for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Send for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Send for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Send for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Send for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Send for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Send for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Send for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Send for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Send for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Send for TempContext",1,["fe_analyzer::context::TempContext"]],["impl Send for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Send for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Send for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Send for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Send for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Send for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Send for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Send for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Send for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Send for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Send for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Send for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Send for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Send for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Send for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Send for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Send for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Send for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Send for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Send for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Send for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Send for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Send for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Send for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Send for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Send for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Send for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Send for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Send for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Send for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Send for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Send for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Send for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Send for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Send for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Send for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Send for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Send for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Send for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Send for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Send for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Send for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Send for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Send for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Send for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Send for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Send for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Send for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Send for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Send for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Send for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Send for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Send for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Send for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Send for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Send for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Send for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Send for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Send for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Send for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Send for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Send for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Send for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Send for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Send for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Send for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Send for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Send for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Send for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Send for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Send for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Send for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Send for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Send for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Send for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Send for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Send for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Send for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Send for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Send for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Send for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Send for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Send for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Send for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Send for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Send for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Send for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Send for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Send for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Send for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Send for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Send for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Send for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Send for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Send for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Send for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Send for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Send for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Send for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Send for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Send for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Send for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Send for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Send for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Send for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Send for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Send for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Send for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Send for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Send for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Send for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Send for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Send for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Send for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Send for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Send for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Send for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Send for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Send for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Send for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Send for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Send for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Send for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Send for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Send for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Send for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Send for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Send for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Send for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Send for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Send for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Send for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Send for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Send for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Send for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Send for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Send for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Send for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !Send for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !Send for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !Send for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !Send for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> !Send for Analysis<T>",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !Send for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl !Send for Db",1,["fe_codegen::db::Db"]],["impl !Send for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Send for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Send for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Send for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Send for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Send for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Send for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Send for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Send for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Send for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Send for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Send for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Send for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Send for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Send for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Send for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Send for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Send for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Send for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Send for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl !Send for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl !Send for TestDb",1,["fe_common::db::TestDb"]],["impl !Send for File",1,["fe_common::files::File"]],["impl Send for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Send for FileKind",1,["fe_common::files::FileKind"]],["impl Send for Radix",1,["fe_common::numeric::Radix"]],["impl Send for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Send for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Send for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Send for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Send for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Send for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Send for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Send for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Send for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Send for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Send for Label",1,["fe_common::diagnostics::Label"]],["impl Send for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Send for Span",1,["fe_common::span::Span"]],["impl Send for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Send for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Send for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Send for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Send for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Send for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Send for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl Send for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl Send for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Send for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Send for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Send for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Send for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Send for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Send for CompileError",1,["fe_driver::CompileError"]],["impl Send for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Send for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl !Send for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl !Send for NewDb",1,["fe_mir::db::NewDb"]],["impl Send for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Send for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Send for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Send for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Send for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Send for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Send for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Send for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Send for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Send for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Send for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Send for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Send for Value",1,["fe_mir::ir::value::Value"]],["impl Send for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Send for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Send for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Send for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Send for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Send for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Send for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Send for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Send for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Send for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Send for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Send for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Send for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Send for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Send for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Send for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Send for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Send for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Send for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Send for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Send for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Send for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Send for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Send for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Send for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Send for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Send for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Send for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Send for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Send for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Send for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Send for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Send for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Send for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Send for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Send for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Send for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Send for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Send for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Send for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Send for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Send for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Send for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Send for Type",1,["fe_mir::ir::types::Type"]],["impl Send for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Send for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Send for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Send for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Send for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Send for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Send for IterBase<'a, T>
where\n T: Send + Sync,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Send for IterMutBase<'a, T>
where\n T: Send,
",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Send for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Send for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Send for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Send for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Send for Expr",1,["fe_parser::ast::Expr"]],["impl Send for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Send for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Send for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Send for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Send for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Send for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Send for Pattern",1,["fe_parser::ast::Pattern"]],["impl Send for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Send for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Send for UseTree",1,["fe_parser::ast::UseTree"]],["impl Send for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Send for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Send for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Send for CallArg",1,["fe_parser::ast::CallArg"]],["impl Send for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Send for Contract",1,["fe_parser::ast::Contract"]],["impl Send for Enum",1,["fe_parser::ast::Enum"]],["impl Send for Field",1,["fe_parser::ast::Field"]],["impl Send for Function",1,["fe_parser::ast::Function"]],["impl Send for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Send for Impl",1,["fe_parser::ast::Impl"]],["impl Send for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Send for Module",1,["fe_parser::ast::Module"]],["impl Send for Path",1,["fe_parser::ast::Path"]],["impl Send for Pragma",1,["fe_parser::ast::Pragma"]],["impl Send for Struct",1,["fe_parser::ast::Struct"]],["impl Send for Trait",1,["fe_parser::ast::Trait"]],["impl Send for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Send for Use",1,["fe_parser::ast::Use"]],["impl Send for Variant",1,["fe_parser::ast::Variant"]],["impl Send for NodeId",1,["fe_parser::node::NodeId"]],["impl Send for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Send for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Send for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Send for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Send for Node<T>
where\n T: Send,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Send for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Send for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Send for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1741,3762,63745,8134,8341,2444,934,22452,12386,318,602]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js b/compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 0000000000..a89dde6e05 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl StructuralPartialEq for Emit"]]],["fe_abi",[["impl StructuralPartialEq for AbiFunctionType"],["impl StructuralPartialEq for StateMutability"],["impl StructuralPartialEq for AbiType"],["impl StructuralPartialEq for AbiContract"],["impl StructuralPartialEq for AbiEvent"],["impl StructuralPartialEq for AbiEventField"],["impl StructuralPartialEq for AbiFunction"],["impl StructuralPartialEq for AbiTupleField"]]],["fe_analyzer",[["impl StructuralPartialEq for ContractTypeMethod"],["impl StructuralPartialEq for GlobalFunction"],["impl StructuralPartialEq for Intrinsic"],["impl StructuralPartialEq for ValueMethod"],["impl StructuralPartialEq for AdjustmentKind"],["impl StructuralPartialEq for CallType"],["impl StructuralPartialEq for Constant"],["impl StructuralPartialEq for NamedThing"],["impl StructuralPartialEq for BinaryOperationError"],["impl StructuralPartialEq for IndexingError"],["impl StructuralPartialEq for TypeCoercionError"],["impl StructuralPartialEq for DepLocality"],["impl StructuralPartialEq for EnumVariantKind"],["impl StructuralPartialEq for IngotMode"],["impl StructuralPartialEq for Item"],["impl StructuralPartialEq for ModuleSource"],["impl StructuralPartialEq for TypeDef"],["impl StructuralPartialEq for BlockScopeType"],["impl StructuralPartialEq for Base"],["impl StructuralPartialEq for GenericArg"],["impl StructuralPartialEq for GenericParamKind"],["impl StructuralPartialEq for GenericType"],["impl StructuralPartialEq for Integer"],["impl StructuralPartialEq for TraitOrType"],["impl StructuralPartialEq for Type"],["impl StructuralPartialEq for ConstructorKind"],["impl StructuralPartialEq for LiteralConstructor"],["impl StructuralPartialEq for SimplifiedPatternKind"],["impl StructuralPartialEq for Adjustment"],["impl StructuralPartialEq for DiagnosticVoucher"],["impl StructuralPartialEq for ExpressionAttributes"],["impl StructuralPartialEq for FunctionBody"],["impl StructuralPartialEq for ConstEvalError"],["impl StructuralPartialEq for TypeError"],["impl StructuralPartialEq for Attribute"],["impl StructuralPartialEq for AttributeId"],["impl StructuralPartialEq for Contract"],["impl StructuralPartialEq for ContractField"],["impl StructuralPartialEq for ContractFieldId"],["impl StructuralPartialEq for ContractId"],["impl StructuralPartialEq for Enum"],["impl StructuralPartialEq for EnumId"],["impl StructuralPartialEq for EnumVariant"],["impl StructuralPartialEq for EnumVariantId"],["impl StructuralPartialEq for Function"],["impl StructuralPartialEq for FunctionId"],["impl StructuralPartialEq for FunctionSig"],["impl StructuralPartialEq for FunctionSigId"],["impl StructuralPartialEq for Impl"],["impl StructuralPartialEq for ImplId"],["impl StructuralPartialEq for Ingot"],["impl StructuralPartialEq for IngotId"],["impl StructuralPartialEq for Module"],["impl StructuralPartialEq for ModuleConstant"],["impl StructuralPartialEq for ModuleConstantId"],["impl StructuralPartialEq for ModuleId"],["impl StructuralPartialEq for Struct"],["impl StructuralPartialEq for StructField"],["impl StructuralPartialEq for StructFieldId"],["impl StructuralPartialEq for StructId"],["impl StructuralPartialEq for Trait"],["impl StructuralPartialEq for TraitId"],["impl StructuralPartialEq for TypeAlias"],["impl StructuralPartialEq for TypeAliasId"],["impl StructuralPartialEq for Array"],["impl StructuralPartialEq for CtxDecl"],["impl StructuralPartialEq for FeString"],["impl StructuralPartialEq for FunctionParam"],["impl StructuralPartialEq for FunctionSignature"],["impl StructuralPartialEq for Generic"],["impl StructuralPartialEq for Map"],["impl StructuralPartialEq for SelfDecl"],["impl StructuralPartialEq for Tuple"],["impl StructuralPartialEq for TypeId"],["impl StructuralPartialEq for PatternMatrix"],["impl StructuralPartialEq for PatternRowVec"],["impl StructuralPartialEq for SigmaSet"],["impl StructuralPartialEq for SimplifiedPattern"],["impl<T> StructuralPartialEq for Analysis<T>"]]],["fe_common",[["impl StructuralPartialEq for LabelStyle"],["impl StructuralPartialEq for FileKind"],["impl StructuralPartialEq for Radix"],["impl StructuralPartialEq for ProjectMode"],["impl StructuralPartialEq for Diagnostic"],["impl StructuralPartialEq for Label"],["impl StructuralPartialEq for File"],["impl StructuralPartialEq for SourceFileId"],["impl StructuralPartialEq for Span"]]],["fe_mir",[["impl StructuralPartialEq for PostIDom"],["impl StructuralPartialEq for CursorLocation"],["impl StructuralPartialEq for ConstantValue"],["impl StructuralPartialEq for Linkage"],["impl StructuralPartialEq for BinOp"],["impl StructuralPartialEq for CallType"],["impl StructuralPartialEq for CastKind"],["impl StructuralPartialEq for InstKind"],["impl StructuralPartialEq for UnOp"],["impl StructuralPartialEq for YulIntrinsicOp"],["impl StructuralPartialEq for TypeKind"],["impl StructuralPartialEq for AssignableValue"],["impl StructuralPartialEq for Value"],["impl StructuralPartialEq for ControlFlowGraph"],["impl StructuralPartialEq for Loop"],["impl StructuralPartialEq for BasicBlock"],["impl StructuralPartialEq for BodyOrder"],["impl StructuralPartialEq for Constant"],["impl StructuralPartialEq for ConstantId"],["impl StructuralPartialEq for BodyDataStore"],["impl StructuralPartialEq for FunctionBody"],["impl StructuralPartialEq for FunctionId"],["impl StructuralPartialEq for FunctionParam"],["impl StructuralPartialEq for FunctionSignature"],["impl StructuralPartialEq for Inst"],["impl StructuralPartialEq for SwitchTable"],["impl StructuralPartialEq for SourceInfo"],["impl StructuralPartialEq for ArrayDef"],["impl StructuralPartialEq for EnumDef"],["impl StructuralPartialEq for EnumVariant"],["impl StructuralPartialEq for EventDef"],["impl StructuralPartialEq for MapDef"],["impl StructuralPartialEq for StructDef"],["impl StructuralPartialEq for TupleDef"],["impl StructuralPartialEq for Type"],["impl StructuralPartialEq for TypeId"],["impl StructuralPartialEq for Local"]]],["fe_parser",[["impl StructuralPartialEq for BinOperator"],["impl StructuralPartialEq for BoolOperator"],["impl StructuralPartialEq for CompOperator"],["impl StructuralPartialEq for ContractStmt"],["impl StructuralPartialEq for Expr"],["impl StructuralPartialEq for FuncStmt"],["impl StructuralPartialEq for FunctionArg"],["impl StructuralPartialEq for GenericArg"],["impl StructuralPartialEq for GenericParameter"],["impl StructuralPartialEq for LiteralPattern"],["impl StructuralPartialEq for ModuleStmt"],["impl StructuralPartialEq for Pattern"],["impl StructuralPartialEq for TypeDesc"],["impl StructuralPartialEq for UnaryOperator"],["impl StructuralPartialEq for UseTree"],["impl StructuralPartialEq for VarDeclTarget"],["impl StructuralPartialEq for VariantKind"],["impl StructuralPartialEq for TokenKind"],["impl StructuralPartialEq for CallArg"],["impl StructuralPartialEq for ConstantDecl"],["impl StructuralPartialEq for Contract"],["impl StructuralPartialEq for Enum"],["impl StructuralPartialEq for Field"],["impl StructuralPartialEq for Function"],["impl StructuralPartialEq for FunctionSignature"],["impl StructuralPartialEq for Impl"],["impl StructuralPartialEq for MatchArm"],["impl StructuralPartialEq for Module"],["impl StructuralPartialEq for Path"],["impl StructuralPartialEq for Pragma"],["impl StructuralPartialEq for Struct"],["impl StructuralPartialEq for Trait"],["impl StructuralPartialEq for TypeAlias"],["impl StructuralPartialEq for Use"],["impl StructuralPartialEq for Variant"],["impl StructuralPartialEq for NodeId"],["impl StructuralPartialEq for ParseFailed"],["impl<'a> StructuralPartialEq for Token<'a>"],["impl<T> StructuralPartialEq for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[301,2570,26941,2849,11823,12102]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Sync.js b/compiler-docs/trait.impl/core/marker/trait.Sync.js new file mode 100644 index 0000000000..19e3e22095 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Sync.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Sync for Emit",1,["fe::task::build::Emit"]],["impl Sync for Commands",1,["fe::task::Commands"]],["impl Sync for FelangCli",1,["fe::FelangCli"]],["impl Sync for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Sync for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Sync for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Sync for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Sync for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Sync for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Sync for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Sync for AbiType",1,["fe_abi::types::AbiType"]],["impl Sync for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Sync for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Sync for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Sync for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Sync for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Sync for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Sync for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !Sync for CallType",1,["fe_analyzer::context::CallType"]],["impl !Sync for Type",1,["fe_analyzer::namespace::types::Type"]],["impl !Sync for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl !Sync for TempContext",1,["fe_analyzer::context::TempContext"]],["impl !Sync for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl !Sync for TestDb",1,["fe_analyzer::db::TestDb"]],["impl !Sync for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl !Sync for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl !Sync for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Sync for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Sync for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Sync for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Sync for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Sync for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Sync for Constant",1,["fe_analyzer::context::Constant"]],["impl Sync for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Sync for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Sync for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Sync for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Sync for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Sync for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Sync for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Sync for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Sync for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Sync for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Sync for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Sync for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Sync for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Sync for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Sync for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Sync for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Sync for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Sync for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Sync for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Sync for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Sync for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Sync for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Sync for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Sync for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Sync for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Sync for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Sync for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Sync for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Sync for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Sync for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Sync for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Sync for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Sync for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Sync for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Sync for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Sync for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Sync for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Sync for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Sync for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Sync for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Sync for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Sync for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Sync for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Sync for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Sync for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Sync for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Sync for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Sync for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Sync for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Sync for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Sync for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Sync for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Sync for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Sync for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Sync for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Sync for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Sync for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Sync for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Sync for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Sync for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Sync for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Sync for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Sync for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Sync for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Sync for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Sync for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Sync for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Sync for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Sync for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Sync for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Sync for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Sync for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Sync for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Sync for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Sync for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Sync for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Sync for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Sync for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Sync for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Sync for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Sync for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Sync for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Sync for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Sync for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Sync for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Sync for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Sync for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Sync for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Sync for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Sync for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Sync for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Sync for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Sync for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Sync for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Sync for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Sync for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Sync for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Sync for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Sync for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Sync for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Sync for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Sync for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Sync for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Sync for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Sync for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Sync for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Sync for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Sync for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Sync for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Sync for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Sync for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Sync for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Sync for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Sync for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Sync for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Sync for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Sync for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Sync for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Sync for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Sync for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Sync for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Sync for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Sync for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Sync for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Sync for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Sync for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Sync for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Sync for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Sync for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Sync for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Sync for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Sync for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Sync for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Sync for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Sync for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Sync for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Sync for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Sync for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Sync for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Sync for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Sync for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Sync for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Sync for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Sync for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Sync for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Sync for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Sync for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Sync for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Sync for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Sync for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Sync for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Sync for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Sync for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Sync for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Sync for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Sync for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Sync for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Sync for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Sync for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Sync for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Sync for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Sync for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Sync for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !Sync for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !Sync for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !Sync for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !Sync for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> !Sync for Analysis<T>",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !Sync for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl !Sync for Db",1,["fe_codegen::db::Db"]],["impl !Sync for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Sync for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Sync for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Sync for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Sync for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Sync for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Sync for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Sync for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Sync for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Sync for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Sync for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Sync for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Sync for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Sync for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Sync for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Sync for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Sync for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Sync for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Sync for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Sync for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl !Sync for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl !Sync for TestDb",1,["fe_common::db::TestDb"]],["impl !Sync for File",1,["fe_common::files::File"]],["impl Sync for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Sync for FileKind",1,["fe_common::files::FileKind"]],["impl Sync for Radix",1,["fe_common::numeric::Radix"]],["impl Sync for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Sync for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Sync for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Sync for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Sync for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Sync for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Sync for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Sync for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Sync for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Sync for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Sync for Label",1,["fe_common::diagnostics::Label"]],["impl Sync for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Sync for Span",1,["fe_common::span::Span"]],["impl Sync for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Sync for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Sync for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Sync for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Sync for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Sync for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Sync for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl !Sync for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl !Sync for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Sync for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Sync for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Sync for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Sync for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Sync for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Sync for CompileError",1,["fe_driver::CompileError"]],["impl Sync for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Sync for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl !Sync for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl !Sync for NewDb",1,["fe_mir::db::NewDb"]],["impl Sync for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Sync for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Sync for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Sync for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Sync for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Sync for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Sync for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Sync for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Sync for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Sync for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Sync for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Sync for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Sync for Value",1,["fe_mir::ir::value::Value"]],["impl Sync for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Sync for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Sync for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Sync for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Sync for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Sync for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Sync for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Sync for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Sync for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Sync for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Sync for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Sync for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Sync for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Sync for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Sync for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Sync for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Sync for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Sync for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Sync for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Sync for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Sync for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Sync for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Sync for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Sync for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Sync for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Sync for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Sync for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Sync for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Sync for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Sync for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Sync for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Sync for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Sync for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Sync for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Sync for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Sync for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Sync for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Sync for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Sync for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Sync for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Sync for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Sync for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Sync for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Sync for Type",1,["fe_mir::ir::types::Type"]],["impl Sync for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Sync for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Sync for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Sync for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Sync for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Sync for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Sync for IterBase<'a, T>
where\n T: Sync,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Sync for IterMutBase<'a, T>
where\n T: Sync,
",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Sync for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Sync for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Sync for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Sync for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Sync for Expr",1,["fe_parser::ast::Expr"]],["impl Sync for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Sync for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Sync for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Sync for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Sync for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Sync for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Sync for Pattern",1,["fe_parser::ast::Pattern"]],["impl Sync for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Sync for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Sync for UseTree",1,["fe_parser::ast::UseTree"]],["impl Sync for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Sync for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Sync for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Sync for CallArg",1,["fe_parser::ast::CallArg"]],["impl Sync for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Sync for Contract",1,["fe_parser::ast::Contract"]],["impl Sync for Enum",1,["fe_parser::ast::Enum"]],["impl Sync for Field",1,["fe_parser::ast::Field"]],["impl Sync for Function",1,["fe_parser::ast::Function"]],["impl Sync for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Sync for Impl",1,["fe_parser::ast::Impl"]],["impl Sync for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Sync for Module",1,["fe_parser::ast::Module"]],["impl Sync for Path",1,["fe_parser::ast::Path"]],["impl Sync for Pragma",1,["fe_parser::ast::Pragma"]],["impl Sync for Struct",1,["fe_parser::ast::Struct"]],["impl Sync for Trait",1,["fe_parser::ast::Trait"]],["impl Sync for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Sync for Use",1,["fe_parser::ast::Use"]],["impl Sync for Variant",1,["fe_parser::ast::Variant"]],["impl Sync for NodeId",1,["fe_parser::node::NodeId"]],["impl Sync for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Sync for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Sync for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Sync for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Sync for Node<T>
where\n T: Sync,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Sync for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Sync for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Sync for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1741,3762,63746,8134,8341,2446,934,22317,12386,318,602]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Unpin.js b/compiler-docs/trait.impl/core/marker/trait.Unpin.js new file mode 100644 index 0000000000..515df376c5 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Unpin.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Unpin for Emit",1,["fe::task::build::Emit"]],["impl Unpin for Commands",1,["fe::task::Commands"]],["impl Unpin for FelangCli",1,["fe::FelangCli"]],["impl Unpin for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Unpin for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Unpin for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Unpin for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Unpin for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Unpin for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Unpin for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Unpin for AbiType",1,["fe_abi::types::AbiType"]],["impl Unpin for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Unpin for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Unpin for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Unpin for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Unpin for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Unpin for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Unpin for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl Unpin for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Unpin for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Unpin for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Unpin for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Unpin for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Unpin for CallType",1,["fe_analyzer::context::CallType"]],["impl Unpin for Constant",1,["fe_analyzer::context::Constant"]],["impl Unpin for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Unpin for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Unpin for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Unpin for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Unpin for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Unpin for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Unpin for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Unpin for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Unpin for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Unpin for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Unpin for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Unpin for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Unpin for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Unpin for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Unpin for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Unpin for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Unpin for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Unpin for Type",1,["fe_analyzer::namespace::types::Type"]],["impl Unpin for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Unpin for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Unpin for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Unpin for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Unpin for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Unpin for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Unpin for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Unpin for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Unpin for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl Unpin for TempContext",1,["fe_analyzer::context::TempContext"]],["impl Unpin for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Unpin for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl Unpin for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Unpin for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Unpin for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Unpin for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Unpin for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Unpin for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Unpin for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Unpin for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Unpin for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Unpin for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Unpin for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Unpin for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Unpin for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Unpin for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Unpin for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Unpin for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Unpin for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Unpin for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Unpin for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Unpin for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Unpin for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Unpin for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Unpin for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Unpin for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Unpin for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Unpin for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Unpin for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Unpin for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Unpin for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Unpin for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Unpin for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Unpin for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Unpin for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Unpin for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Unpin for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Unpin for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Unpin for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Unpin for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Unpin for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Unpin for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Unpin for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Unpin for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Unpin for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Unpin for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Unpin for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Unpin for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Unpin for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Unpin for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Unpin for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Unpin for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Unpin for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Unpin for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Unpin for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Unpin for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Unpin for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Unpin for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Unpin for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Unpin for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Unpin for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Unpin for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Unpin for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Unpin for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Unpin for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Unpin for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Unpin for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Unpin for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Unpin for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Unpin for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Unpin for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Unpin for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Unpin for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Unpin for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Unpin for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Unpin for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Unpin for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Unpin for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Unpin for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Unpin for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Unpin for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Unpin for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Unpin for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Unpin for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Unpin for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Unpin for TestDb",1,["fe_analyzer::db::TestDb"]],["impl Unpin for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Unpin for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Unpin for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Unpin for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Unpin for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Unpin for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Unpin for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Unpin for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Unpin for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Unpin for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Unpin for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Unpin for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Unpin for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Unpin for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Unpin for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Unpin for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl Unpin for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Unpin for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Unpin for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Unpin for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Unpin for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Unpin for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Unpin for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Unpin for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Unpin for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Unpin for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Unpin for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Unpin for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Unpin for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Unpin for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Unpin for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Unpin for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Unpin for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Unpin for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Unpin for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Unpin for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Unpin for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Unpin for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Unpin for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Unpin for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Unpin for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Unpin for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Unpin for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Unpin for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Unpin for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Unpin for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl Unpin for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Unpin for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Unpin for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Unpin for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Unpin for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Unpin for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Unpin for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Unpin for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Unpin for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Unpin for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Unpin for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> Unpin for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> Unpin for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> Unpin for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> Unpin for DisplayableWrapper<'a, T>
where\n T: Unpin,
",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> Unpin for Analysis<T>
where\n T: Unpin,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl Unpin for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Unpin for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Unpin for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Unpin for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Unpin for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Unpin for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Unpin for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Unpin for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Unpin for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Unpin for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Unpin for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Unpin for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Unpin for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Unpin for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl Unpin for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Unpin for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Unpin for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Unpin for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Unpin for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Unpin for Db",1,["fe_codegen::db::Db"]],["impl Unpin for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Unpin for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl Unpin for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Unpin for FileKind",1,["fe_common::files::FileKind"]],["impl Unpin for Radix",1,["fe_common::numeric::Radix"]],["impl Unpin for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Unpin for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Unpin for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Unpin for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Unpin for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Unpin for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Unpin for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Unpin for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Unpin for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl Unpin for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Unpin for TestDb",1,["fe_common::db::TestDb"]],["impl Unpin for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Unpin for Label",1,["fe_common::diagnostics::Label"]],["impl Unpin for File",1,["fe_common::files::File"]],["impl Unpin for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Unpin for Span",1,["fe_common::span::Span"]],["impl Unpin for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Unpin for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Unpin for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Unpin for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Unpin for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Unpin for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Unpin for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl Unpin for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl Unpin for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Unpin for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Unpin for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Unpin for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Unpin for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Unpin for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Unpin for CompileError",1,["fe_driver::CompileError"]],["impl Unpin for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Unpin for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl Unpin for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Unpin for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Unpin for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Unpin for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Unpin for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Unpin for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Unpin for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Unpin for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Unpin for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Unpin for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Unpin for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Unpin for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Unpin for Value",1,["fe_mir::ir::value::Value"]],["impl Unpin for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Unpin for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Unpin for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Unpin for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Unpin for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Unpin for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Unpin for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl Unpin for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Unpin for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Unpin for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Unpin for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Unpin for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Unpin for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Unpin for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Unpin for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Unpin for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Unpin for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Unpin for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Unpin for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Unpin for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Unpin for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Unpin for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Unpin for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Unpin for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Unpin for NewDb",1,["fe_mir::db::NewDb"]],["impl Unpin for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Unpin for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Unpin for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Unpin for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Unpin for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Unpin for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Unpin for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Unpin for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Unpin for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Unpin for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Unpin for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Unpin for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Unpin for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Unpin for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Unpin for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Unpin for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Unpin for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Unpin for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Unpin for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Unpin for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Unpin for Type",1,["fe_mir::ir::types::Type"]],["impl Unpin for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Unpin for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Unpin for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Unpin for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Unpin for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Unpin for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Unpin for IterBase<'a, T>
where\n T: Unpin,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Unpin for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Unpin for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Unpin for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Unpin for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Unpin for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Unpin for Expr",1,["fe_parser::ast::Expr"]],["impl Unpin for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Unpin for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Unpin for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Unpin for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Unpin for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Unpin for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Unpin for Pattern",1,["fe_parser::ast::Pattern"]],["impl Unpin for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Unpin for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Unpin for UseTree",1,["fe_parser::ast::UseTree"]],["impl Unpin for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Unpin for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Unpin for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Unpin for CallArg",1,["fe_parser::ast::CallArg"]],["impl Unpin for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Unpin for Contract",1,["fe_parser::ast::Contract"]],["impl Unpin for Enum",1,["fe_parser::ast::Enum"]],["impl Unpin for Field",1,["fe_parser::ast::Field"]],["impl Unpin for Function",1,["fe_parser::ast::Function"]],["impl Unpin for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Unpin for Impl",1,["fe_parser::ast::Impl"]],["impl Unpin for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Unpin for Module",1,["fe_parser::ast::Module"]],["impl Unpin for Path",1,["fe_parser::ast::Path"]],["impl Unpin for Pragma",1,["fe_parser::ast::Pragma"]],["impl Unpin for Struct",1,["fe_parser::ast::Struct"]],["impl Unpin for Trait",1,["fe_parser::ast::Trait"]],["impl Unpin for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Unpin for Use",1,["fe_parser::ast::Use"]],["impl Unpin for Variant",1,["fe_parser::ast::Variant"]],["impl Unpin for NodeId",1,["fe_parser::node::NodeId"]],["impl Unpin for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Unpin for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Unpin for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Unpin for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Unpin for Node<T>
where\n T: Unpin,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Unpin for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Unpin for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Unpin for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1759,3798,64635,8197,8416,2465,943,22345,12512,321,608]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js b/compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js new file mode 100644 index 0000000000..797395f188 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl UnsafeUnpin for Emit",1,["fe::task::build::Emit"]],["impl UnsafeUnpin for Commands",1,["fe::task::Commands"]],["impl UnsafeUnpin for FelangCli",1,["fe::FelangCli"]],["impl UnsafeUnpin for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl UnsafeUnpin for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl UnsafeUnpin for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl UnsafeUnpin for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl UnsafeUnpin for CtxParam",1,["fe_abi::function::CtxParam"]],["impl UnsafeUnpin for SelfParam",1,["fe_abi::function::SelfParam"]],["impl UnsafeUnpin for StateMutability",1,["fe_abi::function::StateMutability"]],["impl UnsafeUnpin for AbiType",1,["fe_abi::types::AbiType"]],["impl UnsafeUnpin for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl UnsafeUnpin for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl UnsafeUnpin for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl UnsafeUnpin for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl UnsafeUnpin for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl UnsafeUnpin for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl UnsafeUnpin for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl UnsafeUnpin for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl UnsafeUnpin for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl UnsafeUnpin for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl UnsafeUnpin for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl UnsafeUnpin for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl UnsafeUnpin for CallType",1,["fe_analyzer::context::CallType"]],["impl UnsafeUnpin for Constant",1,["fe_analyzer::context::Constant"]],["impl UnsafeUnpin for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl UnsafeUnpin for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl UnsafeUnpin for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl UnsafeUnpin for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl UnsafeUnpin for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl UnsafeUnpin for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl UnsafeUnpin for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl UnsafeUnpin for Item",1,["fe_analyzer::namespace::items::Item"]],["impl UnsafeUnpin for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl UnsafeUnpin for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl UnsafeUnpin for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl UnsafeUnpin for Base",1,["fe_analyzer::namespace::types::Base"]],["impl UnsafeUnpin for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl UnsafeUnpin for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl UnsafeUnpin for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl UnsafeUnpin for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl UnsafeUnpin for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl UnsafeUnpin for Type",1,["fe_analyzer::namespace::types::Type"]],["impl UnsafeUnpin for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl UnsafeUnpin for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl UnsafeUnpin for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl UnsafeUnpin for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl UnsafeUnpin for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl UnsafeUnpin for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl UnsafeUnpin for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl UnsafeUnpin for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl UnsafeUnpin for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl UnsafeUnpin for TempContext",1,["fe_analyzer::context::TempContext"]],["impl UnsafeUnpin for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl UnsafeUnpin for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl UnsafeUnpin for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl UnsafeUnpin for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl UnsafeUnpin for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl UnsafeUnpin for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl UnsafeUnpin for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl UnsafeUnpin for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl UnsafeUnpin for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl UnsafeUnpin for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl UnsafeUnpin for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl UnsafeUnpin for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl UnsafeUnpin for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl UnsafeUnpin for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl UnsafeUnpin for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl UnsafeUnpin for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl UnsafeUnpin for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl UnsafeUnpin for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl UnsafeUnpin for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl UnsafeUnpin for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl UnsafeUnpin for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl UnsafeUnpin for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl UnsafeUnpin for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl UnsafeUnpin for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl UnsafeUnpin for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl UnsafeUnpin for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl UnsafeUnpin for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl UnsafeUnpin for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl UnsafeUnpin for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl UnsafeUnpin for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl UnsafeUnpin for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl UnsafeUnpin for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl UnsafeUnpin for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl UnsafeUnpin for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl UnsafeUnpin for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl UnsafeUnpin for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl UnsafeUnpin for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl UnsafeUnpin for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl UnsafeUnpin for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl UnsafeUnpin for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl UnsafeUnpin for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl UnsafeUnpin for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl UnsafeUnpin for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl UnsafeUnpin for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl UnsafeUnpin for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl UnsafeUnpin for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl UnsafeUnpin for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl UnsafeUnpin for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl UnsafeUnpin for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl UnsafeUnpin for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl UnsafeUnpin for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl UnsafeUnpin for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl UnsafeUnpin for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl UnsafeUnpin for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl UnsafeUnpin for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl UnsafeUnpin for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl UnsafeUnpin for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl UnsafeUnpin for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl UnsafeUnpin for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl UnsafeUnpin for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl UnsafeUnpin for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl UnsafeUnpin for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl UnsafeUnpin for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl UnsafeUnpin for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl UnsafeUnpin for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl UnsafeUnpin for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl UnsafeUnpin for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl UnsafeUnpin for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl UnsafeUnpin for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl UnsafeUnpin for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl UnsafeUnpin for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl UnsafeUnpin for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl UnsafeUnpin for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl UnsafeUnpin for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl UnsafeUnpin for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl UnsafeUnpin for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl UnsafeUnpin for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl UnsafeUnpin for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl UnsafeUnpin for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl UnsafeUnpin for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl UnsafeUnpin for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl UnsafeUnpin for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl UnsafeUnpin for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl UnsafeUnpin for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl UnsafeUnpin for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl UnsafeUnpin for TestDb",1,["fe_analyzer::db::TestDb"]],["impl UnsafeUnpin for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl UnsafeUnpin for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl UnsafeUnpin for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl UnsafeUnpin for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl UnsafeUnpin for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl UnsafeUnpin for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl UnsafeUnpin for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl UnsafeUnpin for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl UnsafeUnpin for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl UnsafeUnpin for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl UnsafeUnpin for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl UnsafeUnpin for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl UnsafeUnpin for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl UnsafeUnpin for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl UnsafeUnpin for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl UnsafeUnpin for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl UnsafeUnpin for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl UnsafeUnpin for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl UnsafeUnpin for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl UnsafeUnpin for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl UnsafeUnpin for Function",1,["fe_analyzer::namespace::items::Function"]],["impl UnsafeUnpin for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl UnsafeUnpin for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl UnsafeUnpin for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl UnsafeUnpin for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl UnsafeUnpin for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl UnsafeUnpin for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl UnsafeUnpin for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl UnsafeUnpin for Module",1,["fe_analyzer::namespace::items::Module"]],["impl UnsafeUnpin for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl UnsafeUnpin for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl UnsafeUnpin for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl UnsafeUnpin for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl UnsafeUnpin for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl UnsafeUnpin for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl UnsafeUnpin for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl UnsafeUnpin for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl UnsafeUnpin for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl UnsafeUnpin for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl UnsafeUnpin for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl UnsafeUnpin for Array",1,["fe_analyzer::namespace::types::Array"]],["impl UnsafeUnpin for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl UnsafeUnpin for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl UnsafeUnpin for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl UnsafeUnpin for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl UnsafeUnpin for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl UnsafeUnpin for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl UnsafeUnpin for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl UnsafeUnpin for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl UnsafeUnpin for Map",1,["fe_analyzer::namespace::types::Map"]],["impl UnsafeUnpin for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl UnsafeUnpin for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl UnsafeUnpin for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl UnsafeUnpin for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl UnsafeUnpin for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl UnsafeUnpin for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl UnsafeUnpin for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> UnsafeUnpin for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> UnsafeUnpin for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> UnsafeUnpin for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> UnsafeUnpin for DisplayableWrapper<'a, T>
where\n T: UnsafeUnpin,
",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> UnsafeUnpin for Analysis<T>
where\n T: UnsafeUnpin,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl UnsafeUnpin for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl UnsafeUnpin for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl UnsafeUnpin for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl UnsafeUnpin for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl UnsafeUnpin for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl UnsafeUnpin for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl UnsafeUnpin for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl UnsafeUnpin for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl UnsafeUnpin for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl UnsafeUnpin for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl UnsafeUnpin for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl UnsafeUnpin for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl UnsafeUnpin for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl UnsafeUnpin for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl UnsafeUnpin for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl UnsafeUnpin for Db",1,["fe_codegen::db::Db"]],["impl UnsafeUnpin for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl UnsafeUnpin for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl UnsafeUnpin for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl UnsafeUnpin for FileKind",1,["fe_common::files::FileKind"]],["impl UnsafeUnpin for Radix",1,["fe_common::numeric::Radix"]],["impl UnsafeUnpin for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl UnsafeUnpin for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl UnsafeUnpin for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl UnsafeUnpin for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl UnsafeUnpin for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl UnsafeUnpin for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl UnsafeUnpin for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl UnsafeUnpin for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl UnsafeUnpin for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl UnsafeUnpin for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl UnsafeUnpin for TestDb",1,["fe_common::db::TestDb"]],["impl UnsafeUnpin for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl UnsafeUnpin for Label",1,["fe_common::diagnostics::Label"]],["impl UnsafeUnpin for File",1,["fe_common::files::File"]],["impl UnsafeUnpin for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl UnsafeUnpin for Span",1,["fe_common::span::Span"]],["impl UnsafeUnpin for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl UnsafeUnpin for Dependency",1,["fe_common::utils::files::Dependency"]],["impl UnsafeUnpin for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl UnsafeUnpin for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl UnsafeUnpin for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl UnsafeUnpin for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> UnsafeUnpin for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl UnsafeUnpin for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl UnsafeUnpin for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl UnsafeUnpin for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl UnsafeUnpin for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl UnsafeUnpin for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl UnsafeUnpin for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl UnsafeUnpin for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl UnsafeUnpin for CompileError",1,["fe_driver::CompileError"]],["impl UnsafeUnpin for CompiledContract",1,["fe_driver::CompiledContract"]],["impl UnsafeUnpin for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl UnsafeUnpin for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl UnsafeUnpin for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl UnsafeUnpin for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl UnsafeUnpin for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl UnsafeUnpin for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl UnsafeUnpin for CallType",1,["fe_mir::ir::inst::CallType"]],["impl UnsafeUnpin for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl UnsafeUnpin for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl UnsafeUnpin for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl UnsafeUnpin for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl UnsafeUnpin for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl UnsafeUnpin for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl UnsafeUnpin for Value",1,["fe_mir::ir::value::Value"]],["impl UnsafeUnpin for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl UnsafeUnpin for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl UnsafeUnpin for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl UnsafeUnpin for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl UnsafeUnpin for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl UnsafeUnpin for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl UnsafeUnpin for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl UnsafeUnpin for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl UnsafeUnpin for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl UnsafeUnpin for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl UnsafeUnpin for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl UnsafeUnpin for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl UnsafeUnpin for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl UnsafeUnpin for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl UnsafeUnpin for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl UnsafeUnpin for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl UnsafeUnpin for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl UnsafeUnpin for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl UnsafeUnpin for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl UnsafeUnpin for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl UnsafeUnpin for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl UnsafeUnpin for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl UnsafeUnpin for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl UnsafeUnpin for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl UnsafeUnpin for NewDb",1,["fe_mir::db::NewDb"]],["impl UnsafeUnpin for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl UnsafeUnpin for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl UnsafeUnpin for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl UnsafeUnpin for Constant",1,["fe_mir::ir::constant::Constant"]],["impl UnsafeUnpin for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl UnsafeUnpin for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl UnsafeUnpin for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl UnsafeUnpin for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl UnsafeUnpin for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl UnsafeUnpin for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl UnsafeUnpin for Inst",1,["fe_mir::ir::inst::Inst"]],["impl UnsafeUnpin for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl UnsafeUnpin for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl UnsafeUnpin for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl UnsafeUnpin for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl UnsafeUnpin for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl UnsafeUnpin for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl UnsafeUnpin for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl UnsafeUnpin for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl UnsafeUnpin for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl UnsafeUnpin for Type",1,["fe_mir::ir::types::Type"]],["impl UnsafeUnpin for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl UnsafeUnpin for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> UnsafeUnpin for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> UnsafeUnpin for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> UnsafeUnpin for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> UnsafeUnpin for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> UnsafeUnpin for IterBase<'a, T>
where\n T: UnsafeUnpin,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> UnsafeUnpin for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl UnsafeUnpin for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl UnsafeUnpin for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl UnsafeUnpin for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl UnsafeUnpin for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl UnsafeUnpin for Expr",1,["fe_parser::ast::Expr"]],["impl UnsafeUnpin for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl UnsafeUnpin for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl UnsafeUnpin for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl UnsafeUnpin for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl UnsafeUnpin for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl UnsafeUnpin for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl UnsafeUnpin for Pattern",1,["fe_parser::ast::Pattern"]],["impl UnsafeUnpin for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl UnsafeUnpin for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl UnsafeUnpin for UseTree",1,["fe_parser::ast::UseTree"]],["impl UnsafeUnpin for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl UnsafeUnpin for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl UnsafeUnpin for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl UnsafeUnpin for CallArg",1,["fe_parser::ast::CallArg"]],["impl UnsafeUnpin for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl UnsafeUnpin for Contract",1,["fe_parser::ast::Contract"]],["impl UnsafeUnpin for Enum",1,["fe_parser::ast::Enum"]],["impl UnsafeUnpin for Field",1,["fe_parser::ast::Field"]],["impl UnsafeUnpin for Function",1,["fe_parser::ast::Function"]],["impl UnsafeUnpin for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl UnsafeUnpin for Impl",1,["fe_parser::ast::Impl"]],["impl UnsafeUnpin for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl UnsafeUnpin for Module",1,["fe_parser::ast::Module"]],["impl UnsafeUnpin for Path",1,["fe_parser::ast::Path"]],["impl UnsafeUnpin for Pragma",1,["fe_parser::ast::Pragma"]],["impl UnsafeUnpin for Struct",1,["fe_parser::ast::Struct"]],["impl UnsafeUnpin for Trait",1,["fe_parser::ast::Trait"]],["impl UnsafeUnpin for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl UnsafeUnpin for Use",1,["fe_parser::ast::Use"]],["impl UnsafeUnpin for Variant",1,["fe_parser::ast::Variant"]],["impl UnsafeUnpin for NodeId",1,["fe_parser::node::NodeId"]],["impl UnsafeUnpin for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> UnsafeUnpin for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> UnsafeUnpin for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> UnsafeUnpin for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> UnsafeUnpin for Node<T>
where\n T: UnsafeUnpin,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl UnsafeUnpin for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl UnsafeUnpin for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl UnsafeUnpin for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1867,2310,41695,5469,5192,1597,571,13913,7304,197,360]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/ops/arith/trait.Add.js b/compiler-docs/trait.impl/core/ops/arith/trait.Add.js new file mode 100644 index 0000000000..ee6b14cfac --- /dev/null +++ b/compiler-docs/trait.impl/core/ops/arith/trait.Add.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[["impl Add for Span"],["impl Add<Option<Span>> for Span"],["impl<'a, T> Add<Option<&'a T>> for Span
where\n Span: Add<&'a T, Output = Self>,
"],["impl<'a, T> Add<&'a T> for Span
where\n T: Spanned,
"]]],["fe_parser",[["impl<'a> Add<&Token<'a>> for Span"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2203,421]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js b/compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js new file mode 100644 index 0000000000..ab0821f016 --- /dev/null +++ b/compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[["impl<T> AddAssign<T> for Span
where\n Span: Add<T, Output = Self>,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[597]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 0000000000..1a374bc61f --- /dev/null +++ b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl RefUnwindSafe for Emit",1,["fe::task::build::Emit"]],["impl RefUnwindSafe for Commands",1,["fe::task::Commands"]],["impl RefUnwindSafe for FelangCli",1,["fe::FelangCli"]],["impl RefUnwindSafe for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl RefUnwindSafe for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl RefUnwindSafe for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl RefUnwindSafe for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl RefUnwindSafe for CtxParam",1,["fe_abi::function::CtxParam"]],["impl RefUnwindSafe for SelfParam",1,["fe_abi::function::SelfParam"]],["impl RefUnwindSafe for StateMutability",1,["fe_abi::function::StateMutability"]],["impl RefUnwindSafe for AbiType",1,["fe_abi::types::AbiType"]],["impl RefUnwindSafe for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl RefUnwindSafe for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl RefUnwindSafe for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl RefUnwindSafe for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl RefUnwindSafe for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl RefUnwindSafe for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl RefUnwindSafe for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !RefUnwindSafe for TempContext",1,["fe_analyzer::context::TempContext"]],["impl RefUnwindSafe for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl RefUnwindSafe for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl RefUnwindSafe for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl RefUnwindSafe for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl RefUnwindSafe for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl RefUnwindSafe for CallType",1,["fe_analyzer::context::CallType"]],["impl RefUnwindSafe for Constant",1,["fe_analyzer::context::Constant"]],["impl RefUnwindSafe for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl RefUnwindSafe for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl RefUnwindSafe for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl RefUnwindSafe for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl RefUnwindSafe for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl RefUnwindSafe for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl RefUnwindSafe for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl RefUnwindSafe for Item",1,["fe_analyzer::namespace::items::Item"]],["impl RefUnwindSafe for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl RefUnwindSafe for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl RefUnwindSafe for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl RefUnwindSafe for Base",1,["fe_analyzer::namespace::types::Base"]],["impl RefUnwindSafe for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl RefUnwindSafe for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl RefUnwindSafe for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl RefUnwindSafe for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl RefUnwindSafe for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl RefUnwindSafe for Type",1,["fe_analyzer::namespace::types::Type"]],["impl RefUnwindSafe for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl RefUnwindSafe for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl RefUnwindSafe for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl RefUnwindSafe for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl RefUnwindSafe for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl RefUnwindSafe for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl RefUnwindSafe for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl RefUnwindSafe for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl RefUnwindSafe for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl RefUnwindSafe for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl RefUnwindSafe for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl RefUnwindSafe for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl RefUnwindSafe for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl RefUnwindSafe for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl RefUnwindSafe for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl RefUnwindSafe for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl RefUnwindSafe for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl RefUnwindSafe for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl RefUnwindSafe for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl RefUnwindSafe for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl RefUnwindSafe for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl RefUnwindSafe for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl RefUnwindSafe for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl RefUnwindSafe for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl RefUnwindSafe for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl RefUnwindSafe for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl RefUnwindSafe for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl RefUnwindSafe for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl RefUnwindSafe for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl RefUnwindSafe for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl RefUnwindSafe for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl RefUnwindSafe for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl RefUnwindSafe for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl RefUnwindSafe for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl RefUnwindSafe for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl RefUnwindSafe for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl RefUnwindSafe for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl RefUnwindSafe for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl RefUnwindSafe for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl RefUnwindSafe for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl RefUnwindSafe for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl RefUnwindSafe for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl RefUnwindSafe for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl RefUnwindSafe for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl RefUnwindSafe for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl RefUnwindSafe for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl RefUnwindSafe for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl RefUnwindSafe for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl RefUnwindSafe for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl RefUnwindSafe for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl RefUnwindSafe for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl RefUnwindSafe for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl RefUnwindSafe for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl RefUnwindSafe for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl RefUnwindSafe for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl RefUnwindSafe for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl RefUnwindSafe for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl RefUnwindSafe for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl RefUnwindSafe for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl RefUnwindSafe for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl RefUnwindSafe for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl RefUnwindSafe for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl RefUnwindSafe for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl RefUnwindSafe for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl RefUnwindSafe for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl RefUnwindSafe for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl RefUnwindSafe for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl RefUnwindSafe for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl RefUnwindSafe for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl RefUnwindSafe for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl RefUnwindSafe for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl RefUnwindSafe for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl RefUnwindSafe for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl RefUnwindSafe for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl RefUnwindSafe for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl RefUnwindSafe for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl RefUnwindSafe for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl RefUnwindSafe for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl RefUnwindSafe for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl RefUnwindSafe for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl RefUnwindSafe for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl RefUnwindSafe for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl RefUnwindSafe for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl RefUnwindSafe for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl RefUnwindSafe for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl RefUnwindSafe for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl RefUnwindSafe for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl RefUnwindSafe for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl RefUnwindSafe for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl RefUnwindSafe for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl RefUnwindSafe for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl RefUnwindSafe for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl RefUnwindSafe for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl RefUnwindSafe for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl RefUnwindSafe for TestDb",1,["fe_analyzer::db::TestDb"]],["impl RefUnwindSafe for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl RefUnwindSafe for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl RefUnwindSafe for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl RefUnwindSafe for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl RefUnwindSafe for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl RefUnwindSafe for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl RefUnwindSafe for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl RefUnwindSafe for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl RefUnwindSafe for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl RefUnwindSafe for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl RefUnwindSafe for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl RefUnwindSafe for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl RefUnwindSafe for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl RefUnwindSafe for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl RefUnwindSafe for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl RefUnwindSafe for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl RefUnwindSafe for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl RefUnwindSafe for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl RefUnwindSafe for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl RefUnwindSafe for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl RefUnwindSafe for Function",1,["fe_analyzer::namespace::items::Function"]],["impl RefUnwindSafe for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl RefUnwindSafe for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl RefUnwindSafe for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl RefUnwindSafe for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl RefUnwindSafe for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl RefUnwindSafe for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl RefUnwindSafe for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl RefUnwindSafe for Module",1,["fe_analyzer::namespace::items::Module"]],["impl RefUnwindSafe for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl RefUnwindSafe for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl RefUnwindSafe for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl RefUnwindSafe for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl RefUnwindSafe for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl RefUnwindSafe for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl RefUnwindSafe for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl RefUnwindSafe for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl RefUnwindSafe for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl RefUnwindSafe for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl RefUnwindSafe for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl RefUnwindSafe for Array",1,["fe_analyzer::namespace::types::Array"]],["impl RefUnwindSafe for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl RefUnwindSafe for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl RefUnwindSafe for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl RefUnwindSafe for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl RefUnwindSafe for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl RefUnwindSafe for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl RefUnwindSafe for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl RefUnwindSafe for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl RefUnwindSafe for Map",1,["fe_analyzer::namespace::types::Map"]],["impl RefUnwindSafe for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl RefUnwindSafe for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl RefUnwindSafe for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl RefUnwindSafe for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl RefUnwindSafe for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl RefUnwindSafe for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl RefUnwindSafe for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !RefUnwindSafe for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !RefUnwindSafe for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !RefUnwindSafe for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !RefUnwindSafe for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> RefUnwindSafe for Analysis<T>
where\n T: RefUnwindSafe,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !RefUnwindSafe for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl RefUnwindSafe for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl RefUnwindSafe for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl RefUnwindSafe for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl RefUnwindSafe for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl RefUnwindSafe for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl RefUnwindSafe for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl RefUnwindSafe for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl RefUnwindSafe for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl RefUnwindSafe for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl RefUnwindSafe for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl RefUnwindSafe for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl RefUnwindSafe for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl RefUnwindSafe for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl RefUnwindSafe for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl RefUnwindSafe for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl RefUnwindSafe for Db",1,["fe_codegen::db::Db"]],["impl RefUnwindSafe for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl RefUnwindSafe for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl RefUnwindSafe for FileKind",1,["fe_common::files::FileKind"]],["impl RefUnwindSafe for Radix",1,["fe_common::numeric::Radix"]],["impl RefUnwindSafe for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl RefUnwindSafe for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl RefUnwindSafe for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl RefUnwindSafe for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl RefUnwindSafe for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl RefUnwindSafe for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl RefUnwindSafe for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl RefUnwindSafe for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl RefUnwindSafe for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl RefUnwindSafe for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl RefUnwindSafe for TestDb",1,["fe_common::db::TestDb"]],["impl RefUnwindSafe for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl RefUnwindSafe for Label",1,["fe_common::diagnostics::Label"]],["impl RefUnwindSafe for File",1,["fe_common::files::File"]],["impl RefUnwindSafe for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl RefUnwindSafe for Span",1,["fe_common::span::Span"]],["impl RefUnwindSafe for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl RefUnwindSafe for Dependency",1,["fe_common::utils::files::Dependency"]],["impl RefUnwindSafe for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl RefUnwindSafe for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl RefUnwindSafe for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl RefUnwindSafe for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> RefUnwindSafe for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl !RefUnwindSafe for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl !RefUnwindSafe for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl RefUnwindSafe for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl RefUnwindSafe for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl RefUnwindSafe for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl RefUnwindSafe for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl RefUnwindSafe for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl RefUnwindSafe for CompileError",1,["fe_driver::CompileError"]],["impl RefUnwindSafe for CompiledContract",1,["fe_driver::CompiledContract"]],["impl RefUnwindSafe for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl RefUnwindSafe for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl RefUnwindSafe for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl RefUnwindSafe for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl RefUnwindSafe for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl RefUnwindSafe for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl RefUnwindSafe for CallType",1,["fe_mir::ir::inst::CallType"]],["impl RefUnwindSafe for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl RefUnwindSafe for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl RefUnwindSafe for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl RefUnwindSafe for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl RefUnwindSafe for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl RefUnwindSafe for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl RefUnwindSafe for Value",1,["fe_mir::ir::value::Value"]],["impl RefUnwindSafe for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl RefUnwindSafe for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl RefUnwindSafe for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl RefUnwindSafe for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl RefUnwindSafe for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl RefUnwindSafe for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl RefUnwindSafe for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl RefUnwindSafe for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl RefUnwindSafe for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl RefUnwindSafe for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl RefUnwindSafe for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl RefUnwindSafe for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl RefUnwindSafe for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl RefUnwindSafe for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl RefUnwindSafe for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl RefUnwindSafe for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl RefUnwindSafe for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl RefUnwindSafe for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl RefUnwindSafe for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl RefUnwindSafe for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl RefUnwindSafe for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl RefUnwindSafe for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl RefUnwindSafe for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl RefUnwindSafe for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl RefUnwindSafe for NewDb",1,["fe_mir::db::NewDb"]],["impl RefUnwindSafe for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl RefUnwindSafe for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl RefUnwindSafe for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl RefUnwindSafe for Constant",1,["fe_mir::ir::constant::Constant"]],["impl RefUnwindSafe for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl RefUnwindSafe for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl RefUnwindSafe for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl RefUnwindSafe for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl RefUnwindSafe for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl RefUnwindSafe for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl RefUnwindSafe for Inst",1,["fe_mir::ir::inst::Inst"]],["impl RefUnwindSafe for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl RefUnwindSafe for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl RefUnwindSafe for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl RefUnwindSafe for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl RefUnwindSafe for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl RefUnwindSafe for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl RefUnwindSafe for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl RefUnwindSafe for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl RefUnwindSafe for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl RefUnwindSafe for Type",1,["fe_mir::ir::types::Type"]],["impl RefUnwindSafe for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl RefUnwindSafe for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> RefUnwindSafe for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> RefUnwindSafe for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> RefUnwindSafe for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> RefUnwindSafe for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> RefUnwindSafe for IterBase<'a, T>
where\n T: RefUnwindSafe,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> RefUnwindSafe for IterMutBase<'a, T>
where\n T: RefUnwindSafe,
",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl RefUnwindSafe for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl RefUnwindSafe for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl RefUnwindSafe for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl RefUnwindSafe for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl RefUnwindSafe for Expr",1,["fe_parser::ast::Expr"]],["impl RefUnwindSafe for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl RefUnwindSafe for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl RefUnwindSafe for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl RefUnwindSafe for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl RefUnwindSafe for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl RefUnwindSafe for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl RefUnwindSafe for Pattern",1,["fe_parser::ast::Pattern"]],["impl RefUnwindSafe for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl RefUnwindSafe for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl RefUnwindSafe for UseTree",1,["fe_parser::ast::UseTree"]],["impl RefUnwindSafe for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl RefUnwindSafe for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl RefUnwindSafe for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl RefUnwindSafe for CallArg",1,["fe_parser::ast::CallArg"]],["impl RefUnwindSafe for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl RefUnwindSafe for Contract",1,["fe_parser::ast::Contract"]],["impl RefUnwindSafe for Enum",1,["fe_parser::ast::Enum"]],["impl RefUnwindSafe for Field",1,["fe_parser::ast::Field"]],["impl RefUnwindSafe for Function",1,["fe_parser::ast::Function"]],["impl RefUnwindSafe for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl RefUnwindSafe for Impl",1,["fe_parser::ast::Impl"]],["impl RefUnwindSafe for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl RefUnwindSafe for Module",1,["fe_parser::ast::Module"]],["impl RefUnwindSafe for Path",1,["fe_parser::ast::Path"]],["impl RefUnwindSafe for Pragma",1,["fe_parser::ast::Pragma"]],["impl RefUnwindSafe for Struct",1,["fe_parser::ast::Struct"]],["impl RefUnwindSafe for Trait",1,["fe_parser::ast::Trait"]],["impl RefUnwindSafe for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl RefUnwindSafe for Use",1,["fe_parser::ast::Use"]],["impl RefUnwindSafe for Variant",1,["fe_parser::ast::Variant"]],["impl RefUnwindSafe for NodeId",1,["fe_parser::node::NodeId"]],["impl RefUnwindSafe for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> RefUnwindSafe for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> RefUnwindSafe for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> RefUnwindSafe for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> RefUnwindSafe for Node<T>
where\n T: RefUnwindSafe,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl RefUnwindSafe for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl RefUnwindSafe for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl RefUnwindSafe for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2041,4362,73111,9232,9638,2796,1084,25765,14486,368,702]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 0000000000..f1ab27f973 --- /dev/null +++ b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl UnwindSafe for Emit",1,["fe::task::build::Emit"]],["impl UnwindSafe for Commands",1,["fe::task::Commands"]],["impl UnwindSafe for FelangCli",1,["fe::FelangCli"]],["impl UnwindSafe for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl UnwindSafe for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl UnwindSafe for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl UnwindSafe for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl UnwindSafe for CtxParam",1,["fe_abi::function::CtxParam"]],["impl UnwindSafe for SelfParam",1,["fe_abi::function::SelfParam"]],["impl UnwindSafe for StateMutability",1,["fe_abi::function::StateMutability"]],["impl UnwindSafe for AbiType",1,["fe_abi::types::AbiType"]],["impl UnwindSafe for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl UnwindSafe for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl UnwindSafe for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl UnwindSafe for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl UnwindSafe for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl UnwindSafe for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl UnwindSafe for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl UnwindSafe for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl UnwindSafe for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl UnwindSafe for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl UnwindSafe for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl UnwindSafe for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl UnwindSafe for CallType",1,["fe_analyzer::context::CallType"]],["impl UnwindSafe for Constant",1,["fe_analyzer::context::Constant"]],["impl UnwindSafe for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl UnwindSafe for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl UnwindSafe for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl UnwindSafe for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl UnwindSafe for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl UnwindSafe for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl UnwindSafe for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl UnwindSafe for Item",1,["fe_analyzer::namespace::items::Item"]],["impl UnwindSafe for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl UnwindSafe for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl UnwindSafe for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl UnwindSafe for Base",1,["fe_analyzer::namespace::types::Base"]],["impl UnwindSafe for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl UnwindSafe for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl UnwindSafe for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl UnwindSafe for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl UnwindSafe for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl UnwindSafe for Type",1,["fe_analyzer::namespace::types::Type"]],["impl UnwindSafe for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl UnwindSafe for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl UnwindSafe for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl UnwindSafe for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl UnwindSafe for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl UnwindSafe for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl UnwindSafe for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl UnwindSafe for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl UnwindSafe for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl UnwindSafe for TempContext",1,["fe_analyzer::context::TempContext"]],["impl UnwindSafe for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl UnwindSafe for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl UnwindSafe for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl UnwindSafe for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl UnwindSafe for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl UnwindSafe for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl UnwindSafe for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl UnwindSafe for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl UnwindSafe for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl UnwindSafe for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl UnwindSafe for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl UnwindSafe for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl UnwindSafe for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl UnwindSafe for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl UnwindSafe for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl UnwindSafe for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl UnwindSafe for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl UnwindSafe for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl UnwindSafe for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl UnwindSafe for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl UnwindSafe for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl UnwindSafe for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl UnwindSafe for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl UnwindSafe for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl UnwindSafe for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl UnwindSafe for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl UnwindSafe for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl UnwindSafe for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl UnwindSafe for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl UnwindSafe for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl UnwindSafe for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl UnwindSafe for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl UnwindSafe for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl UnwindSafe for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl UnwindSafe for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl UnwindSafe for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl UnwindSafe for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl UnwindSafe for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl UnwindSafe for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl UnwindSafe for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl UnwindSafe for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl UnwindSafe for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl UnwindSafe for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl UnwindSafe for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl UnwindSafe for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl UnwindSafe for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl UnwindSafe for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl UnwindSafe for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl UnwindSafe for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl UnwindSafe for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl UnwindSafe for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl UnwindSafe for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl UnwindSafe for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl UnwindSafe for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl UnwindSafe for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl UnwindSafe for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl UnwindSafe for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl UnwindSafe for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl UnwindSafe for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl UnwindSafe for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl UnwindSafe for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl UnwindSafe for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl UnwindSafe for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl UnwindSafe for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl UnwindSafe for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl UnwindSafe for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl UnwindSafe for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl UnwindSafe for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl UnwindSafe for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl UnwindSafe for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl UnwindSafe for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl UnwindSafe for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl UnwindSafe for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl UnwindSafe for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl UnwindSafe for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl UnwindSafe for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl UnwindSafe for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl UnwindSafe for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl UnwindSafe for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl UnwindSafe for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl UnwindSafe for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl UnwindSafe for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl UnwindSafe for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl UnwindSafe for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl UnwindSafe for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl UnwindSafe for TestDb",1,["fe_analyzer::db::TestDb"]],["impl UnwindSafe for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl UnwindSafe for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl UnwindSafe for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl UnwindSafe for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl UnwindSafe for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl UnwindSafe for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl UnwindSafe for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl UnwindSafe for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl UnwindSafe for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl UnwindSafe for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl UnwindSafe for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl UnwindSafe for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl UnwindSafe for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl UnwindSafe for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl UnwindSafe for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl UnwindSafe for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl UnwindSafe for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl UnwindSafe for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl UnwindSafe for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl UnwindSafe for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl UnwindSafe for Function",1,["fe_analyzer::namespace::items::Function"]],["impl UnwindSafe for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl UnwindSafe for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl UnwindSafe for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl UnwindSafe for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl UnwindSafe for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl UnwindSafe for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl UnwindSafe for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl UnwindSafe for Module",1,["fe_analyzer::namespace::items::Module"]],["impl UnwindSafe for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl UnwindSafe for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl UnwindSafe for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl UnwindSafe for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl UnwindSafe for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl UnwindSafe for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl UnwindSafe for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl UnwindSafe for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl UnwindSafe for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl UnwindSafe for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl UnwindSafe for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl UnwindSafe for Array",1,["fe_analyzer::namespace::types::Array"]],["impl UnwindSafe for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl UnwindSafe for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl UnwindSafe for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl UnwindSafe for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl UnwindSafe for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl UnwindSafe for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl UnwindSafe for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl UnwindSafe for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl UnwindSafe for Map",1,["fe_analyzer::namespace::types::Map"]],["impl UnwindSafe for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl UnwindSafe for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl UnwindSafe for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl UnwindSafe for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl UnwindSafe for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl UnwindSafe for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl UnwindSafe for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !UnwindSafe for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !UnwindSafe for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !UnwindSafe for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !UnwindSafe for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> UnwindSafe for Analysis<T>
where\n T: UnwindSafe,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !UnwindSafe for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl UnwindSafe for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl UnwindSafe for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl UnwindSafe for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl UnwindSafe for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl UnwindSafe for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl UnwindSafe for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl UnwindSafe for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl UnwindSafe for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl UnwindSafe for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl UnwindSafe for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl UnwindSafe for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl UnwindSafe for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl UnwindSafe for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl UnwindSafe for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl UnwindSafe for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl UnwindSafe for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl UnwindSafe for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl UnwindSafe for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl UnwindSafe for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl UnwindSafe for Db",1,["fe_codegen::db::Db"]],["impl UnwindSafe for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl UnwindSafe for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl UnwindSafe for FileKind",1,["fe_common::files::FileKind"]],["impl UnwindSafe for Radix",1,["fe_common::numeric::Radix"]],["impl UnwindSafe for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl UnwindSafe for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl UnwindSafe for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl UnwindSafe for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl UnwindSafe for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl UnwindSafe for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl UnwindSafe for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl UnwindSafe for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl UnwindSafe for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl UnwindSafe for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl UnwindSafe for TestDb",1,["fe_common::db::TestDb"]],["impl UnwindSafe for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl UnwindSafe for Label",1,["fe_common::diagnostics::Label"]],["impl UnwindSafe for File",1,["fe_common::files::File"]],["impl UnwindSafe for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl UnwindSafe for Span",1,["fe_common::span::Span"]],["impl UnwindSafe for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl UnwindSafe for Dependency",1,["fe_common::utils::files::Dependency"]],["impl UnwindSafe for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl UnwindSafe for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl UnwindSafe for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl UnwindSafe for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> UnwindSafe for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl UnwindSafe for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl UnwindSafe for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl UnwindSafe for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl UnwindSafe for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl UnwindSafe for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl UnwindSafe for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl UnwindSafe for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl UnwindSafe for CompileError",1,["fe_driver::CompileError"]],["impl UnwindSafe for CompiledContract",1,["fe_driver::CompiledContract"]],["impl UnwindSafe for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl UnwindSafe for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl UnwindSafe for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl UnwindSafe for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl UnwindSafe for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl UnwindSafe for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl UnwindSafe for CallType",1,["fe_mir::ir::inst::CallType"]],["impl UnwindSafe for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl UnwindSafe for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl UnwindSafe for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl UnwindSafe for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl UnwindSafe for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl UnwindSafe for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl UnwindSafe for Value",1,["fe_mir::ir::value::Value"]],["impl UnwindSafe for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl UnwindSafe for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl UnwindSafe for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl UnwindSafe for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl UnwindSafe for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl UnwindSafe for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl UnwindSafe for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl UnwindSafe for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl UnwindSafe for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl UnwindSafe for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl UnwindSafe for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl UnwindSafe for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl UnwindSafe for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl UnwindSafe for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl UnwindSafe for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl UnwindSafe for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl UnwindSafe for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl UnwindSafe for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl UnwindSafe for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl UnwindSafe for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl UnwindSafe for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl UnwindSafe for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl UnwindSafe for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl UnwindSafe for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl UnwindSafe for NewDb",1,["fe_mir::db::NewDb"]],["impl UnwindSafe for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl UnwindSafe for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl UnwindSafe for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl UnwindSafe for Constant",1,["fe_mir::ir::constant::Constant"]],["impl UnwindSafe for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl UnwindSafe for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl UnwindSafe for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl UnwindSafe for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl UnwindSafe for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl UnwindSafe for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl UnwindSafe for Inst",1,["fe_mir::ir::inst::Inst"]],["impl UnwindSafe for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl UnwindSafe for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl UnwindSafe for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl UnwindSafe for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl UnwindSafe for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl UnwindSafe for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl UnwindSafe for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl UnwindSafe for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl UnwindSafe for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl UnwindSafe for Type",1,["fe_mir::ir::types::Type"]],["impl UnwindSafe for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl UnwindSafe for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> !UnwindSafe for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a> UnwindSafe for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> UnwindSafe for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a, 'b> UnwindSafe for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> !UnwindSafe for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]],["impl<'a, T> UnwindSafe for IterBase<'a, T>",1,["fe_mir::ir::inst::IterBase"]]]],["fe_parser",[["impl UnwindSafe for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl UnwindSafe for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl UnwindSafe for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl UnwindSafe for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl UnwindSafe for Expr",1,["fe_parser::ast::Expr"]],["impl UnwindSafe for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl UnwindSafe for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl UnwindSafe for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl UnwindSafe for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl UnwindSafe for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl UnwindSafe for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl UnwindSafe for Pattern",1,["fe_parser::ast::Pattern"]],["impl UnwindSafe for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl UnwindSafe for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl UnwindSafe for UseTree",1,["fe_parser::ast::UseTree"]],["impl UnwindSafe for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl UnwindSafe for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl UnwindSafe for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl UnwindSafe for CallArg",1,["fe_parser::ast::CallArg"]],["impl UnwindSafe for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl UnwindSafe for Contract",1,["fe_parser::ast::Contract"]],["impl UnwindSafe for Enum",1,["fe_parser::ast::Enum"]],["impl UnwindSafe for Field",1,["fe_parser::ast::Field"]],["impl UnwindSafe for Function",1,["fe_parser::ast::Function"]],["impl UnwindSafe for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl UnwindSafe for Impl",1,["fe_parser::ast::Impl"]],["impl UnwindSafe for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl UnwindSafe for Module",1,["fe_parser::ast::Module"]],["impl UnwindSafe for Path",1,["fe_parser::ast::Path"]],["impl UnwindSafe for Pragma",1,["fe_parser::ast::Pragma"]],["impl UnwindSafe for Struct",1,["fe_parser::ast::Struct"]],["impl UnwindSafe for Trait",1,["fe_parser::ast::Trait"]],["impl UnwindSafe for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl UnwindSafe for Use",1,["fe_parser::ast::Use"]],["impl UnwindSafe for Variant",1,["fe_parser::ast::Variant"]],["impl UnwindSafe for NodeId",1,["fe_parser::node::NodeId"]],["impl UnwindSafe for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> UnwindSafe for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> UnwindSafe for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> UnwindSafe for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> UnwindSafe for Node<T>
where\n T: UnwindSafe,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl UnwindSafe for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl UnwindSafe for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl UnwindSafe for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1987,4254,71454,9034,9404,2731,1057,25116,14108,359,684]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/str/traits/trait.FromStr.js b/compiler-docs/trait.impl/core/str/traits/trait.FromStr.js new file mode 100644 index 0000000000..98b38c489e --- /dev/null +++ b/compiler-docs/trait.impl/core/str/traits/trait.FromStr.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl FromStr for ContractTypeMethod"],["impl FromStr for GlobalFunction"],["impl FromStr for Intrinsic"],["impl FromStr for ValueMethod"],["impl FromStr for Base"],["impl FromStr for GenericType"],["impl FromStr for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2153]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js b/compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js b/compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js b/compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js b/compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js b/compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js b/compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js b/compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js new file mode 100644 index 0000000000..897df81853 --- /dev/null +++ b/compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_codegen",[]],["fe_driver",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17,17]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js b/compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js new file mode 100644 index 0000000000..cb3e71a2f3 --- /dev/null +++ b/compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_codegen",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js b/compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js new file mode 100644 index 0000000000..187398caea --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[16]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/db/trait.Upcast.js b/compiler-docs/trait.impl/fe_common/db/trait.Upcast.js new file mode 100644 index 0000000000..7712c94f41 --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/db/trait.Upcast.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Upcast<dyn SourceDb> for TestDb"]]],["fe_codegen",[["impl Upcast<dyn SourceDb> for Db"],["impl Upcast<dyn MirDb> for Db"],["impl Upcast<dyn AnalyzerDb> for Db"]]],["fe_mir",[["impl Upcast<dyn AnalyzerDb> for NewDb"],["impl Upcast<dyn SourceDb> for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[378,940,299]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js b/compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js new file mode 100644 index 0000000000..461c741975 --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl UpcastMut<dyn SourceDb> for TestDb"]]],["fe_codegen",[["impl UpcastMut<dyn SourceDb> for Db"],["impl UpcastMut<dyn MirDb> for Db"],["impl UpcastMut<dyn AnalyzerDb> for Db"]]],["fe_mir",[["impl UpcastMut<dyn AnalyzerDb> for NewDb"],["impl UpcastMut<dyn SourceDb> for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[387,967,305]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/span/trait.Spanned.js b/compiler-docs/trait.impl/fe_common/span/trait.Spanned.js new file mode 100644 index 0000000000..06c1666b74 --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/span/trait.Spanned.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_parser",[["impl Spanned for ContractStmt"],["impl Spanned for GenericArg"],["impl Spanned for GenericParameter"],["impl Spanned for ModuleStmt"],["impl<T> Spanned for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1282]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js b/compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js new file mode 100644 index 0000000000..187398caea --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[16]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js b/compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js new file mode 100644 index 0000000000..187398caea --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[16]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js b/compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js new file mode 100644 index 0000000000..f82a3c94fe --- /dev/null +++ b/compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_compiler_test_utils",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[29]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js b/compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js new file mode 100644 index 0000000000..9b3bc41fa5 --- /dev/null +++ b/compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_mir",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[13]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js b/compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js new file mode 100644 index 0000000000..9b3bc41fa5 --- /dev/null +++ b/compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_mir",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[13]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/logos/trait.Logos.js b/compiler-docs/trait.impl/logos/trait.Logos.js new file mode 100644 index 0000000000..1d8bba7869 --- /dev/null +++ b/compiler-docs/trait.impl/logos/trait.Logos.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_parser",[["impl<'s> Logos<'s> for TokenKind"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[174]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/interned/trait.InternKey.js b/compiler-docs/trait.impl/salsa/interned/trait.InternKey.js new file mode 100644 index 0000000000..916d5613ec --- /dev/null +++ b/compiler-docs/trait.impl/salsa/interned/trait.InternKey.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl InternKey for AttributeId"],["impl InternKey for ContractFieldId"],["impl InternKey for ContractId"],["impl InternKey for EnumId"],["impl InternKey for EnumVariantId"],["impl InternKey for FunctionId"],["impl InternKey for FunctionSigId"],["impl InternKey for ImplId"],["impl InternKey for IngotId"],["impl InternKey for ModuleConstantId"],["impl InternKey for ModuleId"],["impl InternKey for StructFieldId"],["impl InternKey for StructId"],["impl InternKey for TraitId"],["impl InternKey for TypeAliasId"],["impl InternKey for TypeId"]]],["fe_common",[["impl InternKey for SourceFileId"]]],["fe_mir",[["impl InternKey for ConstantId"],["impl InternKey for FunctionId"],["impl InternKey for TypeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2849,174,472]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js new file mode 100644 index 0000000000..8986c29d92 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl DatabaseOps for TestDb"]]],["fe_codegen",[["impl DatabaseOps for Db"]]],["fe_common",[["impl DatabaseOps for TestDb"]]],["fe_mir",[["impl DatabaseOps for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[157,143,152,140]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js new file mode 100644 index 0000000000..48982de73b --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl DatabaseStorageTypes for TestDb"]]],["fe_codegen",[["impl DatabaseStorageTypes for Db"]]],["fe_common",[["impl DatabaseStorageTypes for TestDb"]]],["fe_mir",[["impl DatabaseStorageTypes for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[166,152,161,149]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js b/compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js new file mode 100644 index 0000000000..49efd8078d --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl HasQueryGroup<AnalyzerDbStorage> for TestDb"],["impl HasQueryGroup<SourceDbStorage> for TestDb"]]],["fe_codegen",[["impl HasQueryGroup<CodegenDbStorage> for Db"],["impl HasQueryGroup<SourceDbStorage> for Db"],["impl HasQueryGroup<MirDbStorage> for Db"],["impl HasQueryGroup<AnalyzerDbStorage> for Db"]]],["fe_common",[["impl HasQueryGroup<SourceDbStorage> for TestDb"]]],["fe_mir",[["impl HasQueryGroup<MirDbStorage> for NewDb"],["impl HasQueryGroup<AnalyzerDbStorage> for NewDb"],["impl HasQueryGroup<SourceDbStorage> for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[601,979,299,578]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js new file mode 100644 index 0000000000..0383a25e51 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl QueryFunction for AllImplsQuery"],["impl QueryFunction for ContractAllFieldsQuery"],["impl QueryFunction for ContractAllFunctionsQuery"],["impl QueryFunction for ContractCallFunctionQuery"],["impl QueryFunction for ContractDependencyGraphQuery"],["impl QueryFunction for ContractFieldMapQuery"],["impl QueryFunction for ContractFieldTypeQuery"],["impl QueryFunction for ContractFunctionMapQuery"],["impl QueryFunction for ContractInitFunctionQuery"],["impl QueryFunction for ContractPublicFunctionMapQuery"],["impl QueryFunction for ContractRuntimeDependencyGraphQuery"],["impl QueryFunction for EnumAllFunctionsQuery"],["impl QueryFunction for EnumAllVariantsQuery"],["impl QueryFunction for EnumDependencyGraphQuery"],["impl QueryFunction for EnumFunctionMapQuery"],["impl QueryFunction for EnumVariantKindQuery"],["impl QueryFunction for EnumVariantMapQuery"],["impl QueryFunction for FunctionBodyQuery"],["impl QueryFunction for FunctionDependencyGraphQuery"],["impl QueryFunction for FunctionSignatureQuery"],["impl QueryFunction for FunctionSigsQuery"],["impl QueryFunction for ImplAllFunctionsQuery"],["impl QueryFunction for ImplForQuery"],["impl QueryFunction for ImplFunctionMapQuery"],["impl QueryFunction for IngotModulesQuery"],["impl QueryFunction for IngotRootModuleQuery"],["impl QueryFunction for ModuleAllImplsQuery"],["impl QueryFunction for ModuleAllItemsQuery"],["impl QueryFunction for ModuleConstantTypeQuery"],["impl QueryFunction for ModuleConstantValueQuery"],["impl QueryFunction for ModuleConstantsQuery"],["impl QueryFunction for ModuleContractsQuery"],["impl QueryFunction for ModuleFilePathQuery"],["impl QueryFunction for ModuleImplMapQuery"],["impl QueryFunction for ModuleIsIncompleteQuery"],["impl QueryFunction for ModuleItemMapQuery"],["impl QueryFunction for ModuleParentModuleQuery"],["impl QueryFunction for ModuleParseQuery"],["impl QueryFunction for ModuleStructsQuery"],["impl QueryFunction for ModuleSubmodulesQuery"],["impl QueryFunction for ModuleTestsQuery"],["impl QueryFunction for ModuleUsedItemMapQuery"],["impl QueryFunction for StructAllFieldsQuery"],["impl QueryFunction for StructAllFunctionsQuery"],["impl QueryFunction for StructDependencyGraphQuery"],["impl QueryFunction for StructFieldMapQuery"],["impl QueryFunction for StructFieldTypeQuery"],["impl QueryFunction for StructFunctionMapQuery"],["impl QueryFunction for TraitAllFunctionsQuery"],["impl QueryFunction for TraitFunctionMapQuery"],["impl QueryFunction for TraitIsImplementedForQuery"],["impl QueryFunction for TypeAliasTypeQuery"]]],["fe_codegen",[["impl QueryFunction for CodegenAbiContractQuery"],["impl QueryFunction for CodegenAbiEventQuery"],["impl QueryFunction for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl QueryFunction for CodegenAbiFunctionQuery"],["impl QueryFunction for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl QueryFunction for CodegenAbiModuleEventsQuery"],["impl QueryFunction for CodegenAbiTypeMaximumSizeQuery"],["impl QueryFunction for CodegenAbiTypeMinimumSizeQuery"],["impl QueryFunction for CodegenAbiTypeQuery"],["impl QueryFunction for CodegenConstantStringSymbolNameQuery"],["impl QueryFunction for CodegenContractDeployerSymbolNameQuery"],["impl QueryFunction for CodegenContractSymbolNameQuery"],["impl QueryFunction for CodegenFunctionSymbolNameQuery"],["impl QueryFunction for CodegenLegalizedBodyQuery"],["impl QueryFunction for CodegenLegalizedSignatureQuery"],["impl QueryFunction for CodegenLegalizedTypeQuery"]]],["fe_common",[["impl QueryFunction for FileLineStartsQuery"],["impl QueryFunction for FileNameQuery"]]],["fe_mir",[["impl QueryFunction for MirLowerContractAllFunctionsQuery"],["impl QueryFunction for MirLowerEnumAllFunctionsQuery"],["impl QueryFunction for MirLowerModuleAllFunctionsQuery"],["impl QueryFunction for MirLowerStructAllFunctionsQuery"],["impl QueryFunction for MirLoweredConstantQuery"],["impl QueryFunction for MirLoweredFuncBodyQuery"],["impl QueryFunction for MirLoweredFuncSignatureQuery"],["impl QueryFunction for MirLoweredMonomorphizedFuncSignatureQuery"],["impl QueryFunction for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl QueryFunction for MirLoweredTypeQuery"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[9777,3373,352,2068]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js new file mode 100644 index 0000000000..701404f2c8 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl QueryGroup for AnalyzerDbStorage"]]],["fe_codegen",[["impl QueryGroup for CodegenDbStorage"]]],["fe_common",[["impl QueryGroup for SourceDbStorage"]]],["fe_mir",[["impl QueryGroup for MirDbStorage"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[189,184,178,160]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/trait.Database.js b/compiler-docs/trait.impl/salsa/trait.Database.js new file mode 100644 index 0000000000..9d979f48e8 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/trait.Database.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Database for TestDb"]]],["fe_codegen",[["impl Database for Db"]]],["fe_common",[["impl Database for TestDb"]]],["fe_mir",[["impl Database for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[154,140,149,137]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/trait.Query.js b/compiler-docs/trait.impl/salsa/trait.Query.js new file mode 100644 index 0000000000..20b262e023 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/trait.Query.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Query for AllImplsQuery"],["impl Query for ContractAllFieldsQuery"],["impl Query for ContractAllFunctionsQuery"],["impl Query for ContractCallFunctionQuery"],["impl Query for ContractDependencyGraphQuery"],["impl Query for ContractFieldMapQuery"],["impl Query for ContractFieldTypeQuery"],["impl Query for ContractFunctionMapQuery"],["impl Query for ContractInitFunctionQuery"],["impl Query for ContractPublicFunctionMapQuery"],["impl Query for ContractRuntimeDependencyGraphQuery"],["impl Query for EnumAllFunctionsQuery"],["impl Query for EnumAllVariantsQuery"],["impl Query for EnumDependencyGraphQuery"],["impl Query for EnumFunctionMapQuery"],["impl Query for EnumVariantKindQuery"],["impl Query for EnumVariantMapQuery"],["impl Query for FunctionBodyQuery"],["impl Query for FunctionDependencyGraphQuery"],["impl Query for FunctionSignatureQuery"],["impl Query for FunctionSigsQuery"],["impl Query for ImplAllFunctionsQuery"],["impl Query for ImplForQuery"],["impl Query for ImplFunctionMapQuery"],["impl Query for IngotExternalIngotsQuery"],["impl Query for IngotFilesQuery"],["impl Query for IngotModulesQuery"],["impl Query for IngotRootModuleQuery"],["impl Query for InternAttributeLookupQuery"],["impl Query for InternAttributeQuery"],["impl Query for InternContractFieldLookupQuery"],["impl Query for InternContractFieldQuery"],["impl Query for InternContractLookupQuery"],["impl Query for InternContractQuery"],["impl Query for InternEnumLookupQuery"],["impl Query for InternEnumQuery"],["impl Query for InternEnumVariantLookupQuery"],["impl Query for InternEnumVariantQuery"],["impl Query for InternFunctionLookupQuery"],["impl Query for InternFunctionQuery"],["impl Query for InternFunctionSigLookupQuery"],["impl Query for InternFunctionSigQuery"],["impl Query for InternImplLookupQuery"],["impl Query for InternImplQuery"],["impl Query for InternIngotLookupQuery"],["impl Query for InternIngotQuery"],["impl Query for InternModuleConstLookupQuery"],["impl Query for InternModuleConstQuery"],["impl Query for InternModuleLookupQuery"],["impl Query for InternModuleQuery"],["impl Query for InternStructFieldLookupQuery"],["impl Query for InternStructFieldQuery"],["impl Query for InternStructLookupQuery"],["impl Query for InternStructQuery"],["impl Query for InternTraitLookupQuery"],["impl Query for InternTraitQuery"],["impl Query for InternTypeAliasLookupQuery"],["impl Query for InternTypeAliasQuery"],["impl Query for InternTypeLookupQuery"],["impl Query for InternTypeQuery"],["impl Query for ModuleAllImplsQuery"],["impl Query for ModuleAllItemsQuery"],["impl Query for ModuleConstantTypeQuery"],["impl Query for ModuleConstantValueQuery"],["impl Query for ModuleConstantsQuery"],["impl Query for ModuleContractsQuery"],["impl Query for ModuleFilePathQuery"],["impl Query for ModuleImplMapQuery"],["impl Query for ModuleIsIncompleteQuery"],["impl Query for ModuleItemMapQuery"],["impl Query for ModuleParentModuleQuery"],["impl Query for ModuleParseQuery"],["impl Query for ModuleStructsQuery"],["impl Query for ModuleSubmodulesQuery"],["impl Query for ModuleTestsQuery"],["impl Query for ModuleUsedItemMapQuery"],["impl Query for RootIngotQuery"],["impl Query for StructAllFieldsQuery"],["impl Query for StructAllFunctionsQuery"],["impl Query for StructDependencyGraphQuery"],["impl Query for StructFieldMapQuery"],["impl Query for StructFieldTypeQuery"],["impl Query for StructFunctionMapQuery"],["impl Query for TraitAllFunctionsQuery"],["impl Query for TraitFunctionMapQuery"],["impl Query for TraitIsImplementedForQuery"],["impl Query for TypeAliasTypeQuery"]]],["fe_codegen",[["impl Query for CodegenAbiContractQuery"],["impl Query for CodegenAbiEventQuery"],["impl Query for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl Query for CodegenAbiFunctionQuery"],["impl Query for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl Query for CodegenAbiModuleEventsQuery"],["impl Query for CodegenAbiTypeMaximumSizeQuery"],["impl Query for CodegenAbiTypeMinimumSizeQuery"],["impl Query for CodegenAbiTypeQuery"],["impl Query for CodegenConstantStringSymbolNameQuery"],["impl Query for CodegenContractDeployerSymbolNameQuery"],["impl Query for CodegenContractSymbolNameQuery"],["impl Query for CodegenFunctionSymbolNameQuery"],["impl Query for CodegenLegalizedBodyQuery"],["impl Query for CodegenLegalizedSignatureQuery"],["impl Query for CodegenLegalizedTypeQuery"]]],["fe_common",[["impl Query for FileContentQuery"],["impl Query for FileLineStartsQuery"],["impl Query for FileNameQuery"],["impl Query for InternFileLookupQuery"],["impl Query for InternFileQuery"]]],["fe_mir",[["impl Query for MirInternConstLookupQuery"],["impl Query for MirInternConstQuery"],["impl Query for MirInternFunctionLookupQuery"],["impl Query for MirInternFunctionQuery"],["impl Query for MirInternTypeLookupQuery"],["impl Query for MirInternTypeQuery"],["impl Query for MirLowerContractAllFunctionsQuery"],["impl Query for MirLowerEnumAllFunctionsQuery"],["impl Query for MirLowerModuleAllFunctionsQuery"],["impl Query for MirLowerStructAllFunctionsQuery"],["impl Query for MirLoweredConstantQuery"],["impl Query for MirLoweredFuncBodyQuery"],["impl Query for MirLoweredFuncSignatureQuery"],["impl Query for MirLoweredMonomorphizedFuncSignatureQuery"],["impl Query for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl Query for MirLoweredTypeQuery"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[15674,3245,828,3032]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/trait.QueryDb.js b/compiler-docs/trait.impl/salsa/trait.QueryDb.js new file mode 100644 index 0000000000..68b28559ab --- /dev/null +++ b/compiler-docs/trait.impl/salsa/trait.QueryDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl<'d> QueryDb<'d> for AllImplsQuery"],["impl<'d> QueryDb<'d> for ContractAllFieldsQuery"],["impl<'d> QueryDb<'d> for ContractAllFunctionsQuery"],["impl<'d> QueryDb<'d> for ContractCallFunctionQuery"],["impl<'d> QueryDb<'d> for ContractDependencyGraphQuery"],["impl<'d> QueryDb<'d> for ContractFieldMapQuery"],["impl<'d> QueryDb<'d> for ContractFieldTypeQuery"],["impl<'d> QueryDb<'d> for ContractFunctionMapQuery"],["impl<'d> QueryDb<'d> for ContractInitFunctionQuery"],["impl<'d> QueryDb<'d> for ContractPublicFunctionMapQuery"],["impl<'d> QueryDb<'d> for ContractRuntimeDependencyGraphQuery"],["impl<'d> QueryDb<'d> for EnumAllFunctionsQuery"],["impl<'d> QueryDb<'d> for EnumAllVariantsQuery"],["impl<'d> QueryDb<'d> for EnumDependencyGraphQuery"],["impl<'d> QueryDb<'d> for EnumFunctionMapQuery"],["impl<'d> QueryDb<'d> for EnumVariantKindQuery"],["impl<'d> QueryDb<'d> for EnumVariantMapQuery"],["impl<'d> QueryDb<'d> for FunctionBodyQuery"],["impl<'d> QueryDb<'d> for FunctionDependencyGraphQuery"],["impl<'d> QueryDb<'d> for FunctionSignatureQuery"],["impl<'d> QueryDb<'d> for FunctionSigsQuery"],["impl<'d> QueryDb<'d> for ImplAllFunctionsQuery"],["impl<'d> QueryDb<'d> for ImplForQuery"],["impl<'d> QueryDb<'d> for ImplFunctionMapQuery"],["impl<'d> QueryDb<'d> for IngotExternalIngotsQuery"],["impl<'d> QueryDb<'d> for IngotFilesQuery"],["impl<'d> QueryDb<'d> for IngotModulesQuery"],["impl<'d> QueryDb<'d> for IngotRootModuleQuery"],["impl<'d> QueryDb<'d> for InternAttributeLookupQuery"],["impl<'d> QueryDb<'d> for InternAttributeQuery"],["impl<'d> QueryDb<'d> for InternContractFieldLookupQuery"],["impl<'d> QueryDb<'d> for InternContractFieldQuery"],["impl<'d> QueryDb<'d> for InternContractLookupQuery"],["impl<'d> QueryDb<'d> for InternContractQuery"],["impl<'d> QueryDb<'d> for InternEnumLookupQuery"],["impl<'d> QueryDb<'d> for InternEnumQuery"],["impl<'d> QueryDb<'d> for InternEnumVariantLookupQuery"],["impl<'d> QueryDb<'d> for InternEnumVariantQuery"],["impl<'d> QueryDb<'d> for InternFunctionLookupQuery"],["impl<'d> QueryDb<'d> for InternFunctionQuery"],["impl<'d> QueryDb<'d> for InternFunctionSigLookupQuery"],["impl<'d> QueryDb<'d> for InternFunctionSigQuery"],["impl<'d> QueryDb<'d> for InternImplLookupQuery"],["impl<'d> QueryDb<'d> for InternImplQuery"],["impl<'d> QueryDb<'d> for InternIngotLookupQuery"],["impl<'d> QueryDb<'d> for InternIngotQuery"],["impl<'d> QueryDb<'d> for InternModuleConstLookupQuery"],["impl<'d> QueryDb<'d> for InternModuleConstQuery"],["impl<'d> QueryDb<'d> for InternModuleLookupQuery"],["impl<'d> QueryDb<'d> for InternModuleQuery"],["impl<'d> QueryDb<'d> for InternStructFieldLookupQuery"],["impl<'d> QueryDb<'d> for InternStructFieldQuery"],["impl<'d> QueryDb<'d> for InternStructLookupQuery"],["impl<'d> QueryDb<'d> for InternStructQuery"],["impl<'d> QueryDb<'d> for InternTraitLookupQuery"],["impl<'d> QueryDb<'d> for InternTraitQuery"],["impl<'d> QueryDb<'d> for InternTypeAliasLookupQuery"],["impl<'d> QueryDb<'d> for InternTypeAliasQuery"],["impl<'d> QueryDb<'d> for InternTypeLookupQuery"],["impl<'d> QueryDb<'d> for InternTypeQuery"],["impl<'d> QueryDb<'d> for ModuleAllImplsQuery"],["impl<'d> QueryDb<'d> for ModuleAllItemsQuery"],["impl<'d> QueryDb<'d> for ModuleConstantTypeQuery"],["impl<'d> QueryDb<'d> for ModuleConstantValueQuery"],["impl<'d> QueryDb<'d> for ModuleConstantsQuery"],["impl<'d> QueryDb<'d> for ModuleContractsQuery"],["impl<'d> QueryDb<'d> for ModuleFilePathQuery"],["impl<'d> QueryDb<'d> for ModuleImplMapQuery"],["impl<'d> QueryDb<'d> for ModuleIsIncompleteQuery"],["impl<'d> QueryDb<'d> for ModuleItemMapQuery"],["impl<'d> QueryDb<'d> for ModuleParentModuleQuery"],["impl<'d> QueryDb<'d> for ModuleParseQuery"],["impl<'d> QueryDb<'d> for ModuleStructsQuery"],["impl<'d> QueryDb<'d> for ModuleSubmodulesQuery"],["impl<'d> QueryDb<'d> for ModuleTestsQuery"],["impl<'d> QueryDb<'d> for ModuleUsedItemMapQuery"],["impl<'d> QueryDb<'d> for RootIngotQuery"],["impl<'d> QueryDb<'d> for StructAllFieldsQuery"],["impl<'d> QueryDb<'d> for StructAllFunctionsQuery"],["impl<'d> QueryDb<'d> for StructDependencyGraphQuery"],["impl<'d> QueryDb<'d> for StructFieldMapQuery"],["impl<'d> QueryDb<'d> for StructFieldTypeQuery"],["impl<'d> QueryDb<'d> for StructFunctionMapQuery"],["impl<'d> QueryDb<'d> for TraitAllFunctionsQuery"],["impl<'d> QueryDb<'d> for TraitFunctionMapQuery"],["impl<'d> QueryDb<'d> for TraitIsImplementedForQuery"],["impl<'d> QueryDb<'d> for TypeAliasTypeQuery"]]],["fe_codegen",[["impl<'d> QueryDb<'d> for CodegenAbiContractQuery"],["impl<'d> QueryDb<'d> for CodegenAbiEventQuery"],["impl<'d> QueryDb<'d> for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiFunctionQuery"],["impl<'d> QueryDb<'d> for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiModuleEventsQuery"],["impl<'d> QueryDb<'d> for CodegenAbiTypeMaximumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiTypeMinimumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiTypeQuery"],["impl<'d> QueryDb<'d> for CodegenConstantStringSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenContractDeployerSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenContractSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenFunctionSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenLegalizedBodyQuery"],["impl<'d> QueryDb<'d> for CodegenLegalizedSignatureQuery"],["impl<'d> QueryDb<'d> for CodegenLegalizedTypeQuery"]]],["fe_common",[["impl<'d> QueryDb<'d> for FileContentQuery"],["impl<'d> QueryDb<'d> for FileLineStartsQuery"],["impl<'d> QueryDb<'d> for FileNameQuery"],["impl<'d> QueryDb<'d> for InternFileLookupQuery"],["impl<'d> QueryDb<'d> for InternFileQuery"]]],["fe_mir",[["impl<'d> QueryDb<'d> for MirInternConstLookupQuery"],["impl<'d> QueryDb<'d> for MirInternConstQuery"],["impl<'d> QueryDb<'d> for MirInternFunctionLookupQuery"],["impl<'d> QueryDb<'d> for MirInternFunctionQuery"],["impl<'d> QueryDb<'d> for MirInternTypeLookupQuery"],["impl<'d> QueryDb<'d> for MirInternTypeQuery"],["impl<'d> QueryDb<'d> for MirLowerContractAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLowerEnumAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLowerModuleAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLowerStructAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLoweredConstantQuery"],["impl<'d> QueryDb<'d> for MirLoweredFuncBodyQuery"],["impl<'d> QueryDb<'d> for MirLoweredFuncSignatureQuery"],["impl<'d> QueryDb<'d> for MirLoweredMonomorphizedFuncSignatureQuery"],["impl<'d> QueryDb<'d> for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl<'d> QueryDb<'d> for MirLoweredTypeQuery"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17588,3597,938,3384]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/serde/de/trait.Deserialize.js b/compiler-docs/trait.impl/serde/de/trait.Deserialize.js new file mode 100644 index 0000000000..33626d588d --- /dev/null +++ b/compiler-docs/trait.impl/serde/de/trait.Deserialize.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[["impl<'de> Deserialize<'de> for SourceFileId"],["impl<'de> Deserialize<'de> for Span"]]],["fe_parser",[["impl<'de> Deserialize<'de> for BinOperator"],["impl<'de> Deserialize<'de> for BoolOperator"],["impl<'de> Deserialize<'de> for CompOperator"],["impl<'de> Deserialize<'de> for ContractStmt"],["impl<'de> Deserialize<'de> for Expr"],["impl<'de> Deserialize<'de> for FuncStmt"],["impl<'de> Deserialize<'de> for FunctionArg"],["impl<'de> Deserialize<'de> for GenericArg"],["impl<'de> Deserialize<'de> for GenericParameter"],["impl<'de> Deserialize<'de> for LiteralPattern"],["impl<'de> Deserialize<'de> for ModuleStmt"],["impl<'de> Deserialize<'de> for Pattern"],["impl<'de> Deserialize<'de> for TypeDesc"],["impl<'de> Deserialize<'de> for UnaryOperator"],["impl<'de> Deserialize<'de> for UseTree"],["impl<'de> Deserialize<'de> for VarDeclTarget"],["impl<'de> Deserialize<'de> for VariantKind"],["impl<'de> Deserialize<'de> for CallArg"],["impl<'de> Deserialize<'de> for ConstantDecl"],["impl<'de> Deserialize<'de> for Contract"],["impl<'de> Deserialize<'de> for Enum"],["impl<'de> Deserialize<'de> for Field"],["impl<'de> Deserialize<'de> for Function"],["impl<'de> Deserialize<'de> for FunctionSignature"],["impl<'de> Deserialize<'de> for Impl"],["impl<'de> Deserialize<'de> for MatchArm"],["impl<'de> Deserialize<'de> for Module"],["impl<'de> Deserialize<'de> for Path"],["impl<'de> Deserialize<'de> for Pragma"],["impl<'de> Deserialize<'de> for Struct"],["impl<'de> Deserialize<'de> for Trait"],["impl<'de> Deserialize<'de> for TypeAlias"],["impl<'de> Deserialize<'de> for Use"],["impl<'de> Deserialize<'de> for Variant"],["impl<'de, T> Deserialize<'de> for Node<T>
where\n T: Deserialize<'de>,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[608,10656]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/serde/ser/trait.Serialize.js b/compiler-docs/trait.impl/serde/ser/trait.Serialize.js new file mode 100644 index 0000000000..61028f8102 --- /dev/null +++ b/compiler-docs/trait.impl/serde/ser/trait.Serialize.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_abi",[["impl Serialize for AbiFunctionType"],["impl Serialize for StateMutability"],["impl Serialize for AbiType"],["impl Serialize for AbiContract"],["impl Serialize for AbiEvent"],["impl Serialize for AbiEventField"],["impl Serialize for AbiFunction"],["impl Serialize for AbiTupleField"]]],["fe_common",[["impl Serialize for Span"]]],["fe_parser",[["impl Serialize for BinOperator"],["impl Serialize for BoolOperator"],["impl Serialize for CompOperator"],["impl Serialize for ContractStmt"],["impl Serialize for Expr"],["impl Serialize for FuncStmt"],["impl Serialize for FunctionArg"],["impl Serialize for GenericArg"],["impl Serialize for GenericParameter"],["impl Serialize for LiteralPattern"],["impl Serialize for ModuleStmt"],["impl Serialize for Pattern"],["impl Serialize for TypeDesc"],["impl Serialize for UnaryOperator"],["impl Serialize for UseTree"],["impl Serialize for VarDeclTarget"],["impl Serialize for VariantKind"],["impl Serialize for CallArg"],["impl Serialize for ConstantDecl"],["impl Serialize for Contract"],["impl Serialize for Enum"],["impl Serialize for Field"],["impl Serialize for Function"],["impl Serialize for FunctionSignature"],["impl Serialize for Impl"],["impl Serialize for MatchArm"],["impl Serialize for Module"],["impl Serialize for Path"],["impl Serialize for Pragma"],["impl Serialize for Struct"],["impl Serialize for Trait"],["impl Serialize for TypeAlias"],["impl Serialize for Use"],["impl Serialize for Variant"],["impl<T> Serialize for Node<T>
where\n T: Serialize,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2273,268,9737]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js b/compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js new file mode 100644 index 0000000000..87c57ca65b --- /dev/null +++ b/compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl IntoEnumIterator for GlobalFunction"],["impl IntoEnumIterator for Intrinsic"],["impl IntoEnumIterator for GenericType"],["impl IntoEnumIterator for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[702]} \ No newline at end of file diff --git a/compiler-docs/type.impl/core/result/enum.Result.js b/compiler-docs/type.impl/core/result/enum.Result.js new file mode 100644 index 0000000000..4d956f9ddf --- /dev/null +++ b/compiler-docs/type.impl/core/result/enum.Result.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_parser",[["
1.0.0 · Source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

Source§

fn clone(&self) -> Result<T, E>

Returns a duplicate of the value. Read more
Source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_parser::parser::ParseResult"],["
Source§

impl<'de, T, E> Deserialize<'de> for Result<T, E>
where\n T: Deserialize<'de>,\n E: Deserialize<'de>,

Source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

Source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","fe_parser::parser::ParseResult"],["
Source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

Source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","fe_parser::parser::ParseResult"],["
Source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

Source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

Source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> IntoIterator for Result<T, E>

Source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
Source§

type Item = T

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

Source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized,

Restrict a value to a certain interval. Read more
","Ord","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

Source§

fn eq(&self, other: &Result<T, E>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient,\nand should not be overridden without very good reason.
","PartialEq","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

Source§

fn partial_cmp(&self, other: &Result<T, E>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the\n<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the >\noperator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by\nthe >= operator. Read more
","PartialOrd","fe_parser::parser::ParseResult"],["
1.16.0 · Source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

Source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
§Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Residual<T> for Result<Infallible, E>

Source§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<&T, E>

1.59.0 (const: 1.83.0) · Source

pub const fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · Source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<&mut T, E>

1.59.0 (const: 1.83.0) · Source

pub const fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · Source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: 1.83.0) · Source

pub const fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
§Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<Result<T, E>, E>

1.89.0 (const: 1.89.0) · Source

pub const fn flatten(self) -> Result<T, E>

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
§Examples
\n
let x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · Source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 · Source

pub fn is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<String, &str> = Ok(\"ownership\".to_string());\nassert_eq!(x.as_ref().is_ok_and(|x| x.len() > 1), true);\nprintln!(\"still alive {:?}\", x);
\n
1.0.0 (const: 1.48.0) · Source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 · Source

pub fn is_err_and(self, f: impl FnOnce(E) -> bool) -> bool

Returns true if the result is Err and the value inside of it matches a predicate.

\n
§Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, String> = Err(\"ownership\".to_string());\nassert_eq!(x.as_ref().is_err_and(|x| x.len() > 1), true);\nprintln!(\"still alive {:?}\", x);
\n
1.0.0 · Source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 · Source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · Source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: 1.83.0) · Source

pub const fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
§Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 · Source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
§Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 · Source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 · Source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
§Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
Source

pub fn map_or_default<U, F>(self, f: F) -> U
where\n U: Default,\n F: FnOnce(T) -> U,

🔬This is a nightly-only experimental API. (result_option_map_or_default)

Maps a Result<T, E> to a U by applying function f to the contained\nvalue if the result is Ok, otherwise if Err, returns the\ndefault value for the type U.

\n
§Examples
\n
#![feature(result_option_map_or_default)]\n\nlet x: Result<_, &str> = Ok(\"foo\");\nlet y: Result<&str, _> = Err(\"bar\");\n\nassert_eq!(x.map_or_default(|x| x.len()), 3);\nassert_eq!(y.map_or_default(|y| y.len()), 0);
\n
1.0.0 · Source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
§Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 · Source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls a function with a reference to the contained value if Ok.

\n

Returns the original result.

\n
§Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 · Source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls a function with a reference to the contained value if Err.

\n

Returns the original result.

\n
§Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · Source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
§Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · Source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
§Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 · Source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 · Source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · Source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
§Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
§Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · Source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nPanics are meant for unrecoverable errors, and\nmay abort the entire program.

\n

Instead, prefer to use the ? (try) operator, or pattern matching\nto handle the Err case explicitly, or call unwrap_or,\nunwrap_or_else, or unwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
§Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 · Source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
§Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · Source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · Source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
Source

pub const fn into_ok(self) -> T
where\n E: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
§Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
Source

pub const fn into_err(self) -> E
where\n T: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
§Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 · Source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 · Source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
§Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 · Source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 · Source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
§Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 · Source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 · Source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
§Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · Source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
§Safety
\n

Calling this method on an Err is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked(); } // Undefined behavior!
\n
1.58.0 · Source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
§Safety
\n

Calling this method on an Ok is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Serialize for Result<T, E>
where\n T: Serialize,\n E: Serialize,

Source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","fe_parser::parser::ParseResult"],["
1.16.0 · Source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

Source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
§Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","fe_parser::parser::ParseResult"],["
1.61.0 · Source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

Source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Try for Result<T, E>

Source§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
Source§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
Source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
Source§

fn branch(\n self,\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> UseCloned for Result<T, E>
where\n T: UseCloned,\n E: UseCloned,

","UseCloned","fe_parser::parser::ParseResult"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[169651]} \ No newline at end of file diff --git a/compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js b/compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js new file mode 100644 index 0000000000..2a9ee96c83 --- /dev/null +++ b/compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_compiler_test_utils",[["
§

impl<'vicinity> ApplyBackend for MemoryBackend<'vicinity>

§

fn apply<A, I, L>(&mut self, values: A, logs: L, delete_empty: bool)
where\n A: IntoIterator<Item = Apply<I>>,\n I: IntoIterator<Item = (H256, H256)>,\n L: IntoIterator<Item = Log>,

Apply given values and logs at backend.
","ApplyBackend","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> Backend for MemoryBackend<'vicinity>

§

fn gas_price(&self) -> U256

Gas price. Unused for London.
§

fn origin(&self) -> H160

Origin.
§

fn block_hash(&self, number: U256) -> H256

Environmental block hash.
§

fn block_number(&self) -> U256

Environmental block number.
§

fn block_coinbase(&self) -> H160

Environmental coinbase.
§

fn block_timestamp(&self) -> U256

Environmental block timestamp.
§

fn block_difficulty(&self) -> U256

Environmental block difficulty.
§

fn block_gas_limit(&self) -> U256

Environmental block gas limit.
§

fn block_base_fee_per_gas(&self) -> U256

Environmental block base fee.
§

fn chain_id(&self) -> U256

Environmental chain ID.
§

fn exists(&self, address: H160) -> bool

Whether account at address exists.
§

fn basic(&self, address: H160) -> Basic

Get basic account information.
§

fn code(&self, address: H160) -> Vec<u8>

Get account code.
§

fn storage(&self, address: H160, index: H256) -> H256

Get storage value of address at index.
§

fn original_storage(&self, address: H160, index: H256) -> Option<H256>

Get original storage value of address at index, if available.
","Backend","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> Clone for MemoryBackend<'vicinity>

§

fn clone(&self) -> MemoryBackend<'vicinity>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> Debug for MemoryBackend<'vicinity>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> MemoryBackend<'vicinity>

pub fn new(\n vicinity: &'vicinity MemoryVicinity,\n state: BTreeMap<H160, MemoryAccount>,\n) -> MemoryBackend<'vicinity>

Create a new memory backend.

\n

pub fn state(&self) -> &BTreeMap<H160, MemoryAccount>

Get the underlying BTreeMap storing the state.

\n

pub fn state_mut(&mut self) -> &mut BTreeMap<H160, MemoryAccount>

Get a mutable reference to the underlying BTreeMap storing the state.

\n
",0,"fe_compiler_test_utils::Backend"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[13399]} \ No newline at end of file diff --git a/compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js b/compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js new file mode 100644 index 0000000000..617b65c448 --- /dev/null +++ b/compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_compiler_test_utils",[["
§

impl<'config, 'precompiles, S, P> Handler for StackExecutor<'config, 'precompiles, S, P>
where\n S: StackState<'config>,\n P: PrecompileSet,

§

type CreateInterrupt = Infallible

Type of CREATE interrupt.
§

type CreateFeedback = Infallible

Feedback value for CREATE interrupt.
§

type CallInterrupt = Infallible

Type of CALL interrupt.
§

type CallFeedback = Infallible

Feedback value of CALL interrupt.
§

fn balance(&self, address: H160) -> U256

Get balance of address.
§

fn code_size(&self, address: H160) -> U256

Get code size of address.
§

fn code_hash(&self, address: H160) -> H256

Get code hash of address.
§

fn code(&self, address: H160) -> Vec<u8>

Get code of address.
§

fn storage(&self, address: H160, index: H256) -> H256

Get storage value of address at index.
§

fn original_storage(&self, address: H160, index: H256) -> H256

Get original storage value of address at index.
§

fn exists(&self, address: H160) -> bool

Check whether an address exists.
§

fn is_cold(&self, address: H160, maybe_index: Option<H256>) -> bool

Checks if the address or (address, index) pair has been previously accessed\n(or set in accessed_addresses / accessed_storage_keys via an access list\ntransaction).\nReferences: Read more
§

fn gas_left(&self) -> U256

Get the gas left value.
§

fn gas_price(&self) -> U256

Get the gas price value.
§

fn origin(&self) -> H160

Get execution origin.
§

fn block_hash(&self, number: U256) -> H256

Get environmental block hash.
§

fn block_number(&self) -> U256

Get environmental block number.
§

fn block_coinbase(&self) -> H160

Get environmental coinbase.
§

fn block_timestamp(&self) -> U256

Get environmental block timestamp.
§

fn block_difficulty(&self) -> U256

Get environmental block difficulty.
§

fn block_gas_limit(&self) -> U256

Get environmental gas limit.
§

fn block_base_fee_per_gas(&self) -> U256

Environmental block base fee.
§

fn chain_id(&self) -> U256

Get environmental chain ID.
§

fn deleted(&self, address: H160) -> bool

Check whether an address has already been deleted.
§

fn set_storage(\n &mut self,\n address: H160,\n index: H256,\n value: H256,\n) -> Result<(), ExitError>

Set storage value of address at index.
§

fn log(\n &mut self,\n address: H160,\n topics: Vec<H256>,\n data: Vec<u8>,\n) -> Result<(), ExitError>

Create a log owned by address with given topics and data.
§

fn mark_delete(&mut self, address: H160, target: H160) -> Result<(), ExitError>

Mark an address to be deleted, with funds transferred to target.
§

fn create(\n &mut self,\n caller: H160,\n scheme: CreateScheme,\n value: U256,\n init_code: Vec<u8>,\n target_gas: Option<u64>,\n) -> Capture<(ExitReason, Option<H160>, Vec<u8>), <StackExecutor<'config, 'precompiles, S, P> as Handler>::CreateInterrupt>

Invoke a create operation.
§

fn call(\n &mut self,\n code_address: H160,\n transfer: Option<Transfer>,\n input: Vec<u8>,\n target_gas: Option<u64>,\n is_static: bool,\n context: Context,\n) -> Capture<(ExitReason, Vec<u8>), <StackExecutor<'config, 'precompiles, S, P> as Handler>::CallInterrupt>

Invoke a call operation.
§

fn pre_validate(\n &mut self,\n context: &Context,\n opcode: Opcode,\n stack: &Stack,\n) -> Result<(), ExitError>

Pre-validation step for the runtime.
§

fn create_feedback(\n &mut self,\n _feedback: Self::CreateFeedback,\n) -> Result<(), ExitError>

Feed in create feedback.
§

fn call_feedback(\n &mut self,\n _feedback: Self::CallFeedback,\n) -> Result<(), ExitError>

Feed in call feedback.
§

fn other(\n &mut self,\n opcode: Opcode,\n _stack: &mut Machine,\n) -> Result<(), ExitError>

Handle other unknown external opcodes.
","Handler","fe_compiler_test_utils::Executor"],["
§

impl<'config, 'precompiles, S, P> StackExecutor<'config, 'precompiles, S, P>
where\n S: StackState<'config>,\n P: PrecompileSet,

pub fn config(&self) -> &'config Config

Return a reference of the Config.

\n

pub fn precompiles(&self) -> &'precompiles P

Return a reference to the precompile set.

\n

pub fn new_with_precompiles(\n state: S,\n config: &'config Config,\n precompile_set: &'precompiles P,\n) -> StackExecutor<'config, 'precompiles, S, P>

Create a new stack-based executor with given precompiles.

\n

pub fn state(&self) -> &S

pub fn state_mut(&mut self) -> &mut S

pub fn into_state(self) -> S

pub fn enter_substate(&mut self, gas_limit: u64, is_static: bool)

Create a substate executor from the current executor.

\n

pub fn exit_substate(&mut self, kind: StackExitKind) -> Result<(), ExitError>

Exit a substate. Panic if it results an empty substate stack.

\n

pub fn execute(&mut self, runtime: &mut Runtime<'_>) -> ExitReason

Execute the runtime until it returns.

\n

pub fn gas(&self) -> u64

Get remaining gas.

\n

pub fn transact_create(\n &mut self,\n caller: H160,\n value: U256,\n init_code: Vec<u8>,\n gas_limit: u64,\n access_list: Vec<(H160, Vec<H256>)>,\n) -> (ExitReason, Vec<u8>)

Execute a CREATE transaction.

\n

pub fn transact_create2(\n &mut self,\n caller: H160,\n value: U256,\n init_code: Vec<u8>,\n salt: H256,\n gas_limit: u64,\n access_list: Vec<(H160, Vec<H256>)>,\n) -> (ExitReason, Vec<u8>)

Execute a CREATE2 transaction.

\n

pub fn transact_call(\n &mut self,\n caller: H160,\n address: H160,\n value: U256,\n data: Vec<u8>,\n gas_limit: u64,\n access_list: Vec<(H160, Vec<H256>)>,\n) -> (ExitReason, Vec<u8>)

Execute a CALL transaction with a given caller, address, value and\ngas limit and data.

\n

Takes in an additional access_list parameter for EIP-2930 which was\nintroduced in the Ethereum Berlin hard fork. If you do not wish to use\nthis functionality, just pass in an empty vector.

\n

pub fn used_gas(&self) -> u64

Get used gas for the current executor, given the price.

\n

pub fn fee(&self, price: U256) -> U256

Get fee needed for the current executor, given the price.

\n

pub fn nonce(&self, address: H160) -> U256

Get account nonce.

\n

pub fn create_address(&self, scheme: CreateScheme) -> H160

Get the create address from given scheme.

\n

pub fn initialize_with_access_list(\n &mut self,\n access_list: Vec<(H160, Vec<H256>)>,\n)

",0,"fe_compiler_test_utils::Executor"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[28839]} \ No newline at end of file diff --git a/compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js b/compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js new file mode 100644 index 0000000000..3055e552dc --- /dev/null +++ b/compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_compiler_test_utils",[["
§

impl<'backend, 'config, B> Backend for MemoryStackState<'backend, 'config, B>
where\n B: Backend,

§

fn gas_price(&self) -> U256

Gas price. Unused for London.
§

fn origin(&self) -> H160

Origin.
§

fn block_hash(&self, number: U256) -> H256

Environmental block hash.
§

fn block_number(&self) -> U256

Environmental block number.
§

fn block_coinbase(&self) -> H160

Environmental coinbase.
§

fn block_timestamp(&self) -> U256

Environmental block timestamp.
§

fn block_difficulty(&self) -> U256

Environmental block difficulty.
§

fn block_gas_limit(&self) -> U256

Environmental block gas limit.
§

fn block_base_fee_per_gas(&self) -> U256

Environmental block base fee.
§

fn chain_id(&self) -> U256

Environmental chain ID.
§

fn exists(&self, address: H160) -> bool

Whether account at address exists.
§

fn basic(&self, address: H160) -> Basic

Get basic account information.
§

fn code(&self, address: H160) -> Vec<u8>

Get account code.
§

fn storage(&self, address: H160, key: H256) -> H256

Get storage value of address at index.
§

fn original_storage(&self, address: H160, key: H256) -> Option<H256>

Get original storage value of address at index, if available.
","Backend","fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> Clone for MemoryStackState<'backend, 'config, B>
where\n B: Clone,

§

fn clone(&self) -> MemoryStackState<'backend, 'config, B>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> Debug for MemoryStackState<'backend, 'config, B>
where\n B: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> MemoryStackState<'backend, 'config, B>
where\n B: Backend,

pub fn new(\n metadata: StackSubstateMetadata<'config>,\n backend: &'backend B,\n) -> MemoryStackState<'backend, 'config, B>

pub fn account_mut(&mut self, address: H160) -> &mut MemoryStackAccount

Returns a mutable reference to an account given its address

\n

pub fn deconstruct(\n self,\n) -> (impl IntoIterator<Item = Apply<impl IntoIterator<Item = (H256, H256)>>>, impl IntoIterator<Item = Log>)

pub fn withdraw(&mut self, address: H160, value: U256) -> Result<(), ExitError>

pub fn deposit(&mut self, address: H160, value: U256)

",0,"fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> StackState<'config> for MemoryStackState<'backend, 'config, B>
where\n B: Backend,

§

fn metadata(&self) -> &StackSubstateMetadata<'config>

§

fn metadata_mut(&mut self) -> &mut StackSubstateMetadata<'config>

§

fn enter(&mut self, gas_limit: u64, is_static: bool)

§

fn exit_commit(&mut self) -> Result<(), ExitError>

§

fn exit_revert(&mut self) -> Result<(), ExitError>

§

fn exit_discard(&mut self) -> Result<(), ExitError>

§

fn is_empty(&self, address: H160) -> bool

§

fn deleted(&self, address: H160) -> bool

§

fn is_cold(&self, address: H160) -> bool

§

fn is_storage_cold(&self, address: H160, key: H256) -> bool

§

fn inc_nonce(&mut self, address: H160)

§

fn set_storage(&mut self, address: H160, key: H256, value: H256)

§

fn reset_storage(&mut self, address: H160)

§

fn log(&mut self, address: H160, topics: Vec<H256>, data: Vec<u8>)

§

fn set_deleted(&mut self, address: H160)

§

fn set_code(&mut self, address: H160, code: Vec<u8>)

§

fn transfer(&mut self, transfer: Transfer) -> Result<(), ExitError>

§

fn reset_balance(&mut self, address: H160)

§

fn touch(&mut self, address: H160)

","StackState<'config>","fe_compiler_test_utils::StackState"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[19968]} \ No newline at end of file diff --git a/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js new file mode 100644 index 0000000000..3bf04605e4 --- /dev/null +++ b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_mir",[["
Source§

impl<'a, T> Iterator for IterBase<'a, T>
where\n T: Copy,

Source§

type Item = T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>(\n &mut self,\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where\n Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where\n Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where\n Self: Sized,\n Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent\nitems of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where\n Self: Sized,\n G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where\n Self: Sized,\n F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where\n Self: Sized,\n Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where\n B: FromIterator<Self::Item>,\n Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>(\n &mut self,\n) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where\n Self: Sized,\n Self::Item: Try,\n <Self::Item as Try>::Residual: Residual<B>,\n B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if\na failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where\n E: Extend<Self::Item>,\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
Source§

fn try_reduce<R>(\n &mut self,\n f: impl FnMut(Self::Item, Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where\n Self: Sized,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns\nthe first non-none result. Read more
Source§

fn try_find<R>(\n &mut self,\n f: impl FnMut(&Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where\n Self: Sized,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the\nspecified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the\nspecified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where\n T: Copy + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n T: Clone + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where\n Self: Sized,\n S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where\n Self: Sized,\n P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where\n I: IntoIterator<Item = Self::Item>,\n Self::Item: Ord,\n Self: Sized,

Lexicographically compares the elements of this Iterator with those\nof another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are equal to those of\nanother. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are not equal to those of\nanother. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where\n Self: Sized,\n Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
","Iterator","fe_mir::ir::inst::BlockIter","fe_mir::ir::inst::ValueIter"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[136579]} \ No newline at end of file diff --git a/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js new file mode 100644 index 0000000000..0db44dc298 --- /dev/null +++ b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_mir",[["
Source§

impl<'a, T> Iterator for IterMutBase<'a, T>

Source§

type Item = &'a mut T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>(\n &mut self,\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where\n Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where\n Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where\n Self: Sized,\n Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent\nitems of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where\n Self: Sized,\n G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where\n Self: Sized,\n F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where\n Self: Sized,\n Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where\n B: FromIterator<Self::Item>,\n Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>(\n &mut self,\n) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where\n Self: Sized,\n Self::Item: Try,\n <Self::Item as Try>::Residual: Residual<B>,\n B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if\na failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where\n E: Extend<Self::Item>,\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
Source§

fn try_reduce<R>(\n &mut self,\n f: impl FnMut(Self::Item, Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where\n Self: Sized,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns\nthe first non-none result. Read more
Source§

fn try_find<R>(\n &mut self,\n f: impl FnMut(&Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where\n Self: Sized,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the\nspecified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the\nspecified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where\n T: Copy + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n T: Clone + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where\n Self: Sized,\n S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where\n Self: Sized,\n P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where\n I: IntoIterator<Item = Self::Item>,\n Self::Item: Ord,\n Self: Sized,

Lexicographically compares the elements of this Iterator with those\nof another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are equal to those of\nanother. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are not equal to those of\nanother. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where\n Self: Sized,\n Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
","Iterator","fe_mir::ir::inst::ValueIterMut"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[136503]} \ No newline at end of file diff --git a/compiler-docs/type.impl/id_arena/struct.Id.js b/compiler-docs/type.impl/id_arena/struct.Id.js new file mode 100644 index 0000000000..34a903bd96 --- /dev/null +++ b/compiler-docs/type.impl/id_arena/struct.Id.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_mir",[["
§

impl<T> Clone for Id<T>

§

fn clone(&self) -> Id<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Debug for Id<T>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Hash for Id<T>

§

fn hash<H>(&self, h: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Id<T>

pub fn index(&self) -> usize

Get the index within the arena that this id refers to.

\n
",0,"fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Ord for Id<T>

§

fn cmp(&self, rhs: &Id<T>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized,

Restrict a value to a certain interval. Read more
","Ord","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> PartialEq for Id<T>

§

fn eq(&self, rhs: &Id<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient,\nand should not be overridden without very good reason.
","PartialEq","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> PartialOrd for Id<T>

§

fn partial_cmp(&self, rhs: &Id<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the\n<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the >\noperator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by\nthe >= operator. Read more
","PartialOrd","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Copy for Id<T>

","Copy","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Eq for Id<T>

","Eq","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[19913]} \ No newline at end of file diff --git a/compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js b/compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js new file mode 100644 index 0000000000..52ccb596fe --- /dev/null +++ b/compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[18]} \ No newline at end of file diff --git a/devconnect.html b/devconnect.html new file mode 100644 index 0000000000..fdb19dfde6 --- /dev/null +++ b/devconnect.html @@ -0,0 +1,204 @@ + + + + + + + Fe Day @ DevConnect Istanbul 2023 + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ Fe Programming Language +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+

About the event

+

+ The Fe team will be hosting a workshop and hackathon on Wednesday, November 15th at the Istanbul Congress Center, Room Camlica. We kick things off with an introduction level Fe workshop so that everyone will be up and ready to participate in the hackathon. Everyone is welcome! +

+ +

+ We will have two tracks for the hackaton: +

+

+ Library track +

+

+ Projects submitted to the library track can take any form of Fe general purpose libraries covering functionality such as math, cryptography, debugging, testing or alike. +

+

+ Application track +

+

+ Projects submitted to the application track can be anything written in Fe from financial applications to games and anything within. +

+

+ For each track we will have prize money for the first three winners: +

+

+ 1st place: 2048 Finney (2.048 ETH)
+ 2nd place 1024 Finney (1.024 ETH)
+ 3rd place 512 Finney (0.512 ETH) +

+

+ Projects need to be submitted until Saturday 18th, 15 o'clock and the results will be announced on our blog . +

+

If you are interested in attending, please fill out the form below to help give us a better idea of the audience. You might also receive email updates. +

+ +

+ Click here to signup! +

+
+
+
+

Schedule

+

+ Times: 10:00 - 17:00 +
+ Lunch: 12:00 - 13:00 +

+
+
+
+
+
+
+ + + + + + + diff --git a/devconnect_ist.png b/devconnect_ist.png new file mode 100644 index 0000000000000000000000000000000000000000..e4173af2c22f6314062bcdb8945c1b6e71687608 GIT binary patch literal 479888 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

5}46Mh_*@_9cVkygr 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 literal 0 HcmV?d00001 diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 0000000000..c0ac0d59b7 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,218 @@ + + + + + + Page not found - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/FontAwesome/css/font-awesome.css b/docs/FontAwesome/css/font-awesome.css new file mode 100644 index 0000000000..540440ce89 --- /dev/null +++ b/docs/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/docs/FontAwesome/fonts/FontAwesome.ttf b/docs/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z zq1_(l4SX+ekaM;bY|YgEqv2RAEE}e-Im8<@oEZ?Z81Y?3(z-@nRbq?!xD9Hyn|7Gx z-NUw`yOor_DJLC1aqkf2(!i=2$ULNfg|s8bV^xB!_rY+bHA;KsWR@aB=!7n&LJq(} z!pqD3Wkvo-Goy zx1edGgnc}u5V8cw&nvWyWU+wXqwinB#x7(uc>H44lXZQkk*w_q#i2O!s_A?a*?`Rx zoZW6Qtj)L1T^4kDeD7;%G5dS816OPqAqPx~(_-jZ`bo-MR_kd&sJv{A^ zs@18qv!kD;U z5Evv$C*bD~m z+x@>Oo>;7%QCxfp-rOkNgx4j-(o*e5`6lW^X^{qpQo~SMWD`Gxyv6)+k)c@o6j`Yd z8c&XSiYbcmoCKe+82}>^CPM+?p@o&i(J*j0zsk}!P?!W%T5`ppk%)?&GxA`%4>0VX zKu?YB6Z)hFtj@u-icb&t5A1}BX!;~SqG5ARpVB>FEWPLW+C+QOf~G-Jj0r`0D6|0w zQUs5sE6PYc)!HWi))NeRvSZB3kWIW|R^A%RfamB2jCbVX(Fn>y%#b1W%}W%qc)XVrwuvM!>Qur!Ooy2`n@?qMe3$`F2vx z9<=L}wP7@diWhCYTD?x)LZ>F6F?z8naL18P%1T9&P_d4p;u=(XW1LO3-< z`{|5@&Y=}7sx3t1Zs zr9ZBmp}YpHLq7lwu?CXL8$Q65$Q29AlDCBJSxu5;p0({^4skD z+4se#9)xg8qnEh|WnPdgQ&+te7@`9WlzAwMit$Julp+d80n+VM1JxwqS5H6*MPKA` zlJ*Z77B;K~;4JkO5eq(@D}tezez*w6g3ZSn?J1d9Z~&MKbf=b6F9;8H22TxRl%y1r z<-6(lJiLAw>r^-=F-AIEd1y|Aq2MggNo&>7Ln)S~iAF1;-4`A*9KlL*vleLO3vhEd(@RsIWp~O@>N4p91SI zb~+*jP?8B~MwmI0W$>ksF8DC*2y8K0o#te?D$z8nrfK{|B1L^TR5hlugr|o=-;>Yn zmL6Yt=NZ2%cAsysPA)D^gkz2Vvh|Z9RJdoH$L$+6a^|>UO=3fBBH0UidA&_JQz9K~ zuo1Z_(cB7CiQ}4loOL3DsdC<+wYysw@&UMl21+LY-(z=6j8fu5%ZQg-z6Bor^M}LX z9hxH}aVC%rodtoGcTh)zEd=yDfCu5mE)qIjw~K+zwn&5c!L-N+E=kwxVEewN#vvx2WGCf^;C9^mmTlYc*kz$NUdQ=gDzLmf z!LXG7{N$Mi3n}?5L&f9TlCzzrgGR*6>MhWBR=lS)qP$&OMAQ2 z`$23{zM%a@9EPdjV|Y1zVVGf?mINO)i-q6;_Ev|n_JQ^Zy&BnUgV>NbY9xba1DlY@ zrg$_Kn?+^_+4V4^xS94tX2oLKAEiuU0<2S#v$WSDt0P^A+d-+M?XlR**u_Xdre&aY zNi~zJk9aLQUqaFZxCNRmu*wnxB_u*M6V0xVCtBhtpGUK)#Dob6DWm-n^~Vy)m~?Yg zO0^+v~`x6Vqtjl4I5;=^o2jyOb~m+ER;lNwO$iN ziH4vk>E`OTRx~v#B|ifef|ceH)%hgqOy|#f=Q|VlN6i{!0CRndN~x8wS6Ppqq7NSH zO5hX{k5T{4ib@&8t)u=V9nY+2RC^75jU%TRix}FDTB%>t;5jpNRv;(KB|%{AI7Jc= zd%t9-AjNUAs?8m40SLOhrjbC_yZoznU$(rnT2);Rr`2e6$k!zwlz!d|sZ3%x@$Nw? zVn?i%t!J+9SF@^ zO&TGun2&?VIygfH5ePk|!e&G3Zm-GUP(imiWzZu$9JU)Wot`}*RHV<-)vUhc6J6{w&PQIaSZ_N<(d>`C$yo#Ly&0Sr5gCkDY(4f@fY5!fLe57sH54#FF4 zg&hda`KjtJ8cTzz;DwFa#{$!}j~g$9zqFBC@To^}i#`b~xhU;p{x{^f1krbEFNqV^ zEq5c!C5XT0o_q{%p&0F@!I;9ejbs#P4q?R!i$?vl3~|GSyq4@q#3=wgsz+zkrIB<< z=HMWEBz?z??GvvT54YsDSnRLcEf!n>^0eKf4(CIT{qs4y$7_4e=JoIkq%~H9$z-r* zZ?`xgwL+DNAJE`VB;S+w#NvBT{3;}{CD&@Ig*Ka2Acx)2Qx zL)V#$n@%vf1Zzms4Th~fS|(DKDT`?BKfX3tkCBvKZLg^hUh|_Gz8?%#d(ANnY`5U1 zo;qjq=5tn!OQ*-JqA&iG-Tg#6Ka|O64eceRrSgggD%%QBX$t=6?hPEK2|lL1{?|>I^Toc>rQU7a_`RSM^EPVl{_&OG-P;|z0?v{3o#pkl zC6Y;&J7;#5N#+H2J-4RqiSK^rj<_Z6t%?`N$A_FUESt{TcayIew5oWi=jxT*aPIP6 z?MG`?k5p%-x>D73irru{R?lu7<54DCT9Q}%=4%@wZij4+M=fzzz`SJ3I%*#AikLUh zn>k=5%IKUP4TrvZ!A{&Oh;BR}6r3t3cpzS(&|cEe&e{MQby|1#X`?17e9?|=i`sPG zL|OOsh`j@PD4sc6&Y3rT`r?-EH0QPR*IobE@_fkB8*(886ZkjkcO{K8Sz$H`^D-8P zjKG9G9A`O!>|!ivAeteRVIcyIGa#O<6I$^O7}9&*8mHd@Gw!WDU*@;*L;SYvlV#p( zzFSsPw&^UdyxO}%i)W8$@f}|84*mz&i2q@SlzMOd%B!BHOJ<(FYUTR(Ui$DuX>?85 zcdzl5m3hzFr2S@c_20C2x&N)|$<=RhzxI!}NN+yS16X^(_mtqY)g*Q%Fux5}bP3q$ zxQD|TB{+4C1gL>zI>g~-ajKMb{2s_cFhN2(I(q^X!$H(GFxpc6oCV9#maj|OhFZaI z;umX6E*fQVTQ@lyZauuv>%E)5z-?zQZne18V5A}}JEQmCz>7^h0r)!zhinBG6 zMQghGt!Do5h%HmAQl~%m+!pr-&wlrcwW;qw)S$6*f}ZvXd;cHw=xm|y~mHbT3yX>?hoYKfy--h+6w9%@_4ukf0Et^zr-DbPwFdyj0VJHi}4bqRetSNR`DoWd( z(%n5>8MQl+>3SeL-DB@IaM{NDwd{{v_HMIO)PKO}v{{##c@ihB0w$aaPTSP4^>n3Z zC8Il%(3dCLLX$-|SwWx1u7KVztXpzNhrOZQ78c$jd{B9lqsNHLr*9h;N9$i+vsrM1 zKzLB_gVdMCfxceejpIZat!MbR)GNZ%^n|fEQo?Xtq#Qa_gEWKTFxSL4b{g}kJNd{QcoQ}HUP-A)Rq;U(***IA*V_0B5mr}Xp$q{YSYs-b2q~DHh z?+muRGn~std!VXuT>P9TL_8Km9G{doqRb-W0B&%d> z^3@hs6y5jaEq%P}dmr(8=f}x~^ z*{I{tkBgYk@Td|Z{csd23pziZlPYt2RJW7D_C#&)OONEWyN`I19_cM;`Aa=y_)ldH z^co(O-xWIN0{y|@?wx@Y!MeVg3Ln%4ORu5~Dl6$h>AGSXrK3!pH%cpM?D|6#*6+A# zlsj;J0_~^?DHIceRC~0iMq)SJ&?R&if{fsdIb>y;H@M4AE`z8~dvz)(e}BqUWK^U~ zFy`PX+z*Bmv9VxAN;%CvMk(#kGBEMP;a-GgGZf~r$(ei(%yGqHa2dS3hxdTT!r>La zUrW2dCTZ!SjD_D(?9$SK02e_#ZOxdAhO%hgVhq54U=2$Hm+1^O^nH<>wS|&<)2TtD zN_MN@O>?A@_&l;U)*GY*5F_a~cgQb_3p`#77ax1iRxIx!r0HkDnA2G*{l|*}g_yI% zZdHt2`Hx^MA#VH7@BEN68Y_;sAcCNgCY7S&dcQsp*$+uW7Dm@$Vl7!YA^51bi} z*Vy8uTj{neIhIL|PhditfC1Jeub(uy}w|wV5 zsQz)04y;BY2$7U4$~P{k)b`hZb>gv1RkD)L#g~$*N^1N1GfNMS)4r|pT*V<&KE1M9 zTh}rzSW#Kcci_#(^qf0gTW3&QN&zsW%VAQ+AZ%-3?E)kMdgL)kY~@mC>l?RH28u;Y zt-@_u^5(W>mDdtqoe){#t;3NA7c@{WoY9bYFNoq+sj&ru;Z`x>4ddY0y*`HRtHFEN% z@mFkp=x0C6zDGgA0s|mP^WNEwE4O}S?%DOtce3At%?ThxRp@`zCH6MyzM)dA9C7IP zI}t;YUV(Jcnw$4LoD4H(EM#!{L-Z|&fhNYnBlKcQ$UScR#HH>scYBTf2u|7Fd8q$R zy5Cbt=Pvf^e}m4?VVL@#Pi3z*q-Q0MG8pGTcbS|eeW%R5bRzKsHSH#G(#$9hj9}0O7lXsC zbZ7#UjJM^FcvdKK3MOEl+Pb-93Px}F$ID&jcvZdJ{d(D)x|*`=vi%1hdg(dd-1E>& zoB4U&a${9!xyxoT%$7gFp{M<_q z9oVnk*Dcp$k#jA#7-pZbXd=L8nDhe<*t_*%gj^Vx>(~KyEY~i&(?@R~L_e^txnUyh z64-dU=Lc;eQ}vPX;g{GitTVZben7||wttapene^dB|oSGB~tmAGqE^`1Jxt$4uXUL zz5?7GEqvmLa{#mgN6la^gYO#}`eXyUJ)lFyTO8*iL~P z$A`A_X^V#!SJyU8Dl%J*6&s9;Jl54CiyfA`ExxmjrZ1P8E%rJ7hFCFo6%{5mRa|LY zk^x76W8M0tQBa1Q(&L`|!e zrczv>+#&b2bt zuD1Bfoe>oW0&!ju$-LI)$URptI!inJ^Dz|<@S1hk+!(n2PWfi-AMb5*F03&_^29MB zgJP7yn#Fw4n&Rod*>LlF+qPx5ZT$80;+m*0X5ffa3d-;F72#5un;L$}RfmR5&xbOf(KNeD|gT1x6bw5t;~j}(oMHcSzkCgcpbd>5UN z7e8CV*di9kpyJAo1YyE9XtfV1Q8^?ViwrKgtK$H60 z%~xgAifVV#>j>4SN10>bP9OV9m`EA-H{bzMimEQ_3@VZH%@KZzjDu` zRCG*Ax6B^%%dyLs2Cw{bePFWM9750@SIoZoff4mJvyxIeIjeZ{tYpbmTk4_{wy!_uygk4J;wwSiK&OpZWguG$O082g z^a3rw)F1Q!*)rNy!Sqz9bk0u-kftk^q{FPl4N+eS@0p1= zhaBFdyShSMz97B%x3GE|Sst~8Le6+?q@g6HwE1hJ#X)o^?{1!x-m`LlQ+4%?^IPIo zHATgqrm-s`+6SW3LjHB>=Pp{i<6FE#j+sX(Vl-kJt6sug<4UG9SH_|( zOb(+Vn|4R4lc8pHa-japR|c0ZAN$KOvzss6bKW^uPM$I$8eTr{EMN2N%{Yrl{Z`Y^ zaQ`-S_6omm((Fih26~Bjf^W$wm1J`8N+(=0ET@KFDy;S%{mF@!2&1UMxk>jTk49;@ z*g#0?*iga;P7abx1bh^d3MoAy*XQp{Hl*t(buU@DamDmvcc;5}`ihM!mvm36|GqRu zn*3}UmnOSUai6mM*y&f#XmqyBo>b=dmra`8;%uC8_33-RpM6;x`Rrc0RM~y9>y~ry zVnGanZLDD_lC%6!F%Jzk##j%?nW>JEaJ#U89t`?mGJS_kO5+5U1Gh;Lb3`{w<-DW; z;USPAm%*aQJ)UeYnLVb2V3MJ2vrxAZ@&#?W$vW)7$+L7~7HSzuF&0V95FC4H6Dy<( z!#o7mJKLMHTNn5)Lyn5l4oh2$s~VI~tlIjn09jE~8C#Ooei=J?K;D+-<8Cb>8RPx8 z-~O0ST{mOeXg+qjG~?}E8@JAo-j?OJjgF3nb^K5v>$yq#-Ybd8lM^jdru2WE-*V6W z>sL(7?%-Qu?&?wZNmmqdn?$FXlE!>2BAa^bWfD69lP0?L3kopYkc4>{m#H6t2dLIEE47|jcI$tEuWzwjmRgqBPkzk zM+(?6)=);W6q<2z95fHMDFKxbhPD-r0IjdX_3EH*BFL|t3))c7d~8v;{wU5p8nHUz9I?>l zVfn$bENo_I3JOh1^^ z+un~MSwCyixbj%C?y{G@G7mSZg_cf~&@djVX_vn8;IF&q?ESd=*AJHOJ(!-hbKPlb zYi-r+me!ezr_eCiQ&SetY;BocRokkbwr=ONGzW2U@X=AUvS^E9eM^w~aztd4h$Q&kF;6EJ1O*M7tJfFi}R1 z6X@asDjL5w+#QEKQE5V48#ASm?H7u5j%nDqi)iO@a1@F z*^R+bGpEOs#pRx9CBZQ}#uQa|dCH5EW%a3Xv1;ye-}5|Yh4g~YH5gI1(b#B|6_ZI; zMkxwTjmkKoZIp~AqhXp+k&SSQ)9C=jCWTKCM?(&MUHex;c3Knl(A%3UgJT_BEixIE zQh!;Q(J<0)C`q0-^|UdaGYzFqr^{vZR~Tk?jyY}gf@H+0RHkZ{OID|x;6>6+g)|BK zs6zLY0U>bcbRd6kU;cgkomCZdBSC8$a1H`pcu;XqH=5 z+$oO3i&T_WpcYnVu*lchi>wxt#iE!!bG#kzjIFqb)`s?|OclRAnzUyW5*Py!P@srDXI}&s2lVYf2ZCG`F`H-9;60 zb<=6weckNk=DC&Q6QxU*uJ9FkaT>}qb##eRS8n%qG`G9WrS>Xm+w)!AXSASfd%5fg z#fqxk(5L9@fM};~Gk^Sgb;7|krF-an$kIROPt4HLqq6+EL+62d@~4Hsy9nIU?=Ue4 zJ69;q+5+73nU|TQu}$>#v(M&Vx1RD=6Lu`d?>zHN?P7J&XWwsvwJt|rr?CZu+l>m4 zTi^VLh6Uu2s392u(5DLaM%)Dr$%h3hRB>V7a9XG`B{ZsWgh4IyTO9R~TAR^h^~>ko z(k|Hy#@bP}7OyN92TKE%qNZfyWL32p-BJf1{jj0QU0V`yj=tRospvSewxGxoC=C|N zve$zAMuSaiyY)QTk9!VmwUK&<#b2fxMl_DX|5x$dKH3>6sdYCQ9@c)^A-Rn9vG?s)0)lCR76kgoR>S;B=kl(v zzM}o+G41dh)%9=ezv$7*a9Mrb+S@13nK-B6D!%vy(}5dzbg$`-UUZJKa`_Z{*$rCu zga2G}o3dTHW|>+P_>c8UOm4Vk-ojaTeAg0-+<4#u-{>pGTYz(%ojZ`0e*nHo=)XZS zpp=$zi4|RBMGJDX{Db?>>fq71rX3t$122E;cJ(9elj+kBXs>3?(tq=s*PeL^<(M$8 zUl;u9e6|EP5Us-A>Lzvr+ln|?*}wt;+gUmd>%?@Wl@m%Qm{>Q0JqTcxtB`ROhd6TB z$VY<7t$^N6IC(s*Z@x2?Gi%eB8%(hYaC zKfY5M-9MeR-@5h zZ?V`qr%%FlPQlW5v_Bp^Q?^)S*%Y#Z$|{!Lpju=$s702T z(P}foXu(uuHN!cJRK*W-8=F*QlYB*zT#WI-SmQ_VYEgKw+>wHhm`ECQS`r3VKw`wi zxlcnn26L*U;F-BC9u{Csy#e%+2uD$He5?mc55)ot>1w`?lr$J zsrI^qGB@!5dglADaHlvWto@|S>kF5>#i#hCNXbp*ZkO$*%P-Sjf3Vc+tuFaJ-^|Ou zW8=}1TOlafUitnrTA2D0<3}&zZz^%y5+t2`Tk`vBI93FqU`W!zY;M%AUoN1V1-I2I zPTVFqaw3Pr-`5HcEFWuD?!8Ybw)Y>g7c0tt=soTHiEBxlY;RlQ`iYY-qdd94zWjyD zFcskM^S{_!E?f3mEh9waR7tb6G&yl%GW%e&Sc5i;y@N)U5ZFLcAsma^K?Cg^%d{PO z=SHQq4a|l`AakzEY;A{n6Rn1u`7v~#ufV*6GZ$`Ef)d2%6apsU6^>QJl0@U& zq|wIBlBAgf0j!YaozAgmhAy0uy;AjRA2%(!`#&e>`V` zg`MfSf5gWvJY#?8%&|`Aj0<@aZ;-q#tCx=-zkGE|_C4)TqKjr-SE6po?cX?Z^B%62 zdA!75;$my<*q)n@eB<^dfFGwRaWB25UL#~PNEV>F^c+e2Be*Df(-rIVBJo2o*an$1*1 zD$bsUC-BvObdmkKlhW<59G9{d=@bAu8a05VWCO=@_~oP=G3SmO91AK_F`#5 zwXLRVay<~JYok|rdQM-~C?dcq?Yfz_*)fIte zkE_g4CeLj1oza=9zH!s!4k%H@-n{6aB&Z;Cs8MK?#Jxl`?wD>^{fTL&eQHAQFtJ_% zNEfs|gGYh+39S{-@#MrPA!XpgWD;NLlne0-Vey1n0?=ww18{L)7G|$1kjI(sjs z@|alUMcx*04*>=BWHv_W-t=rCAy0q6&*;kW&ImkwWTe$lzHJRZJ{-{ zl-mK6+j}V`wobm^^B&2Tl?1r=yWbz;v-F<#y!(CT?-4K(($wWtmD631MN9?trDG zMI7;9U7|UsC;urLP%eH1h%U`LJxT3oM4=gpi%X@lpVR9N6Q(uhJ00RWXeL-Z*V(O8 zsIyyVUvf=RXLBKX`!peifjIMvMs1YT0n$0*B;K^yZf&HN8$N%e=EgOejqihLPBT|< zs)z`nNU}BOdT7wYLy}R10eXUksn9o)jG)&=qteGc|XNI~h5R6UBfaPeIHbA32@*>orZsCB4`Q79}A=z@najfekt-_eTg7a}Mcas^D1ELlN6(y28c{ur|tmueFvIDOQxXs1)_lKrA`L2-^^VNC#miFvO%l6w5uK2bFyu?hyNLCjTCNRRVW^i+GX``giwc&TpV~OHu(yN&o)r2$K$1kjh@>iP z^&`?sCk#?xdFX+ilAb(;I7<$BQ#6j*jKsu%LEhQKe=>ki^ZICepr3#_2#pE`32i4Z zu%eXsgL)3x3Q-^OPPRhm<^!TEPoek6?O^j+qLQ*~#TBw4Aq~M2>U{>{jfojVPADAi zurKpW{7Ii5yqy6_1iXw3$aa!GLn|$~cnvQnv7{LMIFn!&d6K=3kH8+e90Zq5K%6YfdLv}ZdQmTk7SZ7}>rJ9TW)6>NY{uEZ zY^9PI1UqUFm|h0Vqe60Ny=wCFBtKb zXtqOa3M?2OEN=zDX7z}2$Y{2@WJjr?N`auMDVG9kSH~FjfJRNfsR@yJQp4cQ8zaFkT4>5XQqSVt5c}`-A#Z=3-_mGZ^)Hqayei zhJ}wgZ5UDln%)!;Wz@u=m(6C_P@r9*IMPe7Db`CSqad3ky-5-EcG=*v8J&{RtLJ(E zw2h-ghGYcDtqj4Z^nU7ChgEXO0kox=oGaY;0EPqeW89T6htbZg4z!uU1hi;omVj+3 z0B%$+k$`oH5*SeoG`Ay&BAA%nAUjQxsMlNdq8%;SbEAPVC#qm!r7j75W=A)&a6)3% zdQq$fCN;@RqI!KPfl9l=vmBFSFpD1cAxb@~K-$ZIlIL3W}?#3+|2p{|vZVq`YA zMbx|Xl57kJVwoetAo+opiewCkCIO=uBLEaG+!0U$MRdReNsx>+PIJWN6dW)pfeZ(u zQ8ei-Ht69)ZV`qv=vmorhOkF)Squ;)8AUfh<7A_xI8FGHMRW>~%o`1Wt3|8IMrM%& z8)|@=#ssro9=f9HtN0F#O085{Bf6PJnurfzS_yg?qqszmnQIYDP{N=xqPfvl;VNsK^qpoy2&App~Fe(MB7KCI)$p1!&YEB&%$9gTk zmvlt?t7!>_paNt_fYJvw^~LCqX{4opLy!n)md7}<_s?`gytfSAdoScQWTy&Tbr&~( zg9myGVv)l|4-umFBL0)Y(d}Rvt11)(O4ij#zeao~K$vh~JDn0_@3RjP2M0|79T&9+ z?>Vx&M30Sb15&<{RtpeYUf|n7n5GHyc+-FtA=7H$p6Mh=&M0O!so)tze7#WT>pp|x zfWae>0++DfscU2%>|@oiCQj+6O827)1}KsN^a>NSI*4?#ylfG-{q?3MMXX$dUH^S6Ni=Ve1d0(janpz@WqGJ?cG&sewpq294Qa zL{huwuoARdt5F4Dbh#?<2ruzSS{VeDAOtY+52t^xJW=!(0f3P&G3Cs^%~Q~~Wq{YA z!QrEk#>oXK{sc&Z7VB1_>fA1^#YyU1Ff<^9G(!V0!JW`n@EDdj$$2SVK6*7$!BvXP zmAC;h-W75(Nnzpro3CE9eV=~Lp7yS(vXnk@$g3{R`!(UG013==W*Hj{-*F!ujl+np%IX?E0*I&-K^u zY1z1I!`iOu+Ll`UtL|F6Vb?~vk=x9w6}eE^*<)O?pZQ#8YKE#b($x>w$3E*F0Kfk zfnyCo#zOpX1(P2yeHG@fP7}}~GB|&S27%6=@G^V=rmeTB$(w9rC6J@uQmcAMq zQ=Ce?Z0RkF_gu30<;5#jEW32il2?}$-6PZ?au16Y)?kUFy3L?ia1A@%S3G-M`{qn8 ze+|6jh0vqfkhdSb0MvIr!;;*AL}QX^gkc+q0RJ4i9IyOo+qAyHblI+$VuZ3UT7&iIG7640a)fe&>NOVU@xZ*YE`oy!JGMY%j}bGq!= z`R5xY(8TK&AH4b6WoKCo>lPh6vbfu1yYy02g^t9bDbexN!A`*$M5`u&}WqF?+*m?ZoW85&MFmXqQ1J{i;_Oz>3*#0?lWa zf?{tv`_JzP7D3x2gX&ICRn(aR$#>;ciH#pO?<*}!<}cYh_r{hb6*kkXSteV>l9n6i zwx63=u%!9MdE>@2X)3$YXh=DuRh~mN2bQFEH&_nHWfU{q+4=t07pt+Jfj90Or;6JX{BCQrE8bZe&wi3fwEXHRp zz8{VAmxsWU)3nT;;77X7@GCm7_fL1p_xKEG&6G~luO;Bc3ZIa?2b(*uH7qJ!es71c z{Buj4(;Jds$o78u<3df_2~DLq`e9*$SGmrR9p2OoVB5Q(KL3M{1>eq+;+lHK9N?xvyBPHni<#j$sZK{QrKEcdR9+eQD0V? zGPaq!#<-c#a>t4bt+R#Hu_|}dlIGeve@SR!d((u)Ga45+BuhHfA88G0cPrw>>(`ID zZ;aIyn|qmhuDXBthoW{J(WN+`Yud=y(wvd0rm&1*4>6?#8&)Fz z&@V=a0w4)F{^!&W_l6<5xg|-0F!~>aCALbeVsZTd*)M*^tr*!)O8w)mzKThWyQW@X zw%BFs5_@CIic5EPcTJu8=CmynV;``)3}gJ`Vl#VY_3Yib@P-KvBk_%!9OVu#8tG|Nc4I~A>8ch-~X%M@!>yk~ERI|QEcwzgI66IaaY>gx0~lm<@f z5-k^OY#SGC80Yr-tDRP(-FEJ{@_4LHsGJ=)PKZ@`eW75-r0ylN%0Q>&*M;@uZLdJ$ z)rw7Dt5ajr;P;~1P>jID!><(7R;w|Yf}qI&8klT?1dTfc@us5mKEe;qw;YKR(cp-D z6NmUMP8x7cM%~ytE@l*Mp^oN*mCF`gRNhw3gpO1PVi_^JzCJo>#mX(q+iJ(Ts$5=! z13b45gILEULS!=)SmZ{qsC1)$8-4eADGR?v z>~4k_SvdvPHAC}=4(!I^OLgQ@9EMDE7d$PvJbi+K%-HTh`P0#Ea|Jm6zj> z?R)(YWtZoIRx>AqzlG1UjT@6ba>yE z{Wf<5moh^-hu;ptAtPG}`h$4PWcOn>vy`#bH#Ss>OoAEE1gIbQwH#eG8+RHG0~TJ$ z>`C`c7KyM^gqsVNDXxT|1s;nTR&cCg6kd<-msrdE5Ofk=1BGDMlP2!93%0c@rg~4` zq)UFVW%s|`xb>;aR@L^*D>nkSLGNmM?cv)WzHZy3*>+*xAJSX;>))*XRT0r9<#zIpug(}{rSC9T$42@gb zy8eb6)~}wl<=or)2L}4T{vum>-g)QaKjtnp5fyd^;|BxHtx~2W^YbKq1HfB7@>Hw@U5)?b^H=uNOpli?w6O#~V`eG;`irLcC(&Uxz`L_Cl zS8r24e*U71o@dV6Soupo-}Ttu*Dk&EwY`h4KdY-k55DSqR&o7nufO)%>%s-Es^5Q_ z60#cReEy=$4|nW)bLh=|4bxW4j}A?qOle+wjn88oAeYb~!eA+EQ;8Ggp-UldAt$3M z7*E590amz>YB9L(z?Xx&?I37XYw?Os-t+05x6Z4vkzBE6-hrbB=GAB?p{DQXV4CKg zls@_wh*&XC<3R(CEZxg8*Y(6a>cIOq9Nss7{=UQ7Nv%O_WxSyBqnH{@(<>A&2on@z zn57W4Dh*E)o#rJ2#tyxV2;C5#rl8%%As$4qB=IbMt-z|jnWi>>7Ymq37;AW!6Y4nx z1Ogx#!WVdA92mEipgUxzy_?ddg|x)KOCyK)P5v@usc;0sN3{=0slt4CuwaxK@20eO zhdp~Z8iJ7GWrkq_-X`~(eBpthn9|`tZEUCIGiFpJjjxPVE9I)#z3Q$3tw`a69qxjuf+~ z*?v>d5~pcH-AQ~0)8PyIjumD^?SM8!Wb>KZoD7hOlc2nA0_(eG!in>}Ru}>6)>5 z@*}T`Hw{I^-?PS9>(#UFBQpW72* zsfj(2+_9@5x+57aN!`e`f(Mp_I(D>}p8)@&g^g+X1%d{ z%X5boE?hEoj0CiwTh9)#8^?~;|wgor_=Z1BI9_dI{ z&t*f95n?ZgZ5CnQa!v(p|JT?y0%KKgi`Smi9k5r!+!Mkz=&Z$%CFl;?AOzV`YBKrY z0#Y6~J6&dA=m>T@TYb8ukaV4z^Z?VX*MCKcp13-ye1*`gAj_Tm@r{fpm?K!U@Xg2AfndEo6jZN} z=XK0GRNXVLW2c?}B)rH^yR>u}b?|p(W$!TkQTAgu1AIG>MFfNchMQB_^-AQxRE$Th5-E_tBP@v(Cy|ojjP5LEU|JrM8 zVF5;$>Hl^jlHWDPChrTH(vh%bARyj5#TPb>omAs-)4zN z9?9(wybd0$Z5s+}Fiytv}-8U`IC<{6U2_NqEAkv;7lys5Qcq3EKt z0-!^Xy3idllgZ~qX^QTe=i*oGUCJNk>Y26?+9U(Ks|C81S{-v+6ebc`c(yibQbuB% zxM7mk>}dI-TfUi5Jqdu6b`4SqF)y5humuCaHhssdcR(jKf5ZGprx;Oe7VG#G6TA1+ z8oZLl<+ey(L+$Qsck^4fi{I|)p15MX73gHFUU!l${lN{)Ht_Wb%j#UE6cZ9}Wq^>+1wz z9TBA@%f~tby^0YWafmn&8Ppjn1Ng{d;S01WImtMzV<`!zU7;+8e-Xko>qM^OfOZ`Y zEZG#vcm>EGF??&G6+v(3l`X(xMn8ESv=@LdMfdcxFi%g1?0HDPG>blldR`OLlWN80 zz<$t+MM9%1K~JT@#aBZjOu9*G{W$u7cqTM|&a1)0wR8R^*r$<&AhuCq1Z{-aUhc5P zdyaaK{$P=Y6R{40FrWmLbDOCijqB(1PrKlnL)Tm|t=l}toVLAZOXJ*~-dx|_A&o65 zskcpT@bs+d@ia`f)t8ivl{(t%H?O?;=^s3O^GXqopx7E3kz06f^UQq<>gyNmo4Ij; zrOxuzn{WOqP75~PwPXC;3mZ#YW1xy&DEXsl~)u4`-v_{*B%R6xNH3* zJElz8@d#i4`#JV(ko%x;u{LMqLEEDmwD*(ccB9Wp;u*9I?=sC7g>%L{%$4m#zhbjm z)gK{LWQvE1>_yl|4T$nYKNVZ<)vza7FKU5*W~4)KNgN@;SA<9&ERxIfA&UZnB=r%N z5YD4fY$9Mkzy}!G+`KUy>3l(FSi1 zw)t)*w$E4#ZSxfm3cZLC(o3aQQ7uHk>_@fMTHoM0=quh%mfN6%{`O($pyzg0kPf=2 zjA%M7bRl4BhV5{{d4HbnTh`HM&YKw@N~47e7NFGr*9Yzi(7XQl-FJb4hPEKOC!K2x$nWy>8=PJYE)T$=Cqe(n*ChZE zklF{Ms}h0Jd|@o;Gz(~b;9d&c#0O^j{1?tF5dtMj9dG`|j0qZi^aF1r{<7KC5hZ`E zNX2nxJYEr@>u86|tPjTDet;fLn1R+IOm6&3b*}TOyNpIaid@W9c9!jIfiJOgK-aw=xb5Kpb)`E9x%CU82 zEQg_v`e+tWYClJHl=_EsSW?LZO3)o#ox(#2UW9|V7I8fYnz5fRtph`u)dywWL9}UV z*hdU9-BBK5G&}j~O6&dSdWDIpFX;&Or5wNbm^Y+A-x6(K$$Of6JTVl9n0gFY&=T5p zZX?pCxA&w{J)eDSfb?Zh*LT#AdiPlB;A%p|-`Aw6RP2mYTh zLmL~zM^VS0V@*4LkOEG~nQR)HyRB+;*KWli%QqKt&%16HWyMXRhtwdCgyoTm*5#itgp(Wap66 zyr-dgKgjl&t?JLMuw}!Boz)TOa2|37p^FAcPmxX0apWmfp$B1WF_@-dsK+?1F6~yY zEwi!-))Q_CbOP%?p%bx|=d^nLBig-_$e!nh19^Ps`s{SNq{nnW)V-qnz3y+Ipd7HS zsb}z%!+}y8izoy>Nyyj4m_br&8TGFcze#gP4?v*NEdl zzGBLM4qpvdu;5vCFi9^zXU;sW`>pPi|NFD# ze=$xI@7q9B4WPsw4CAO~UJ(S)s@u41E>#9D>!?=*N5m$%^0E` z<0RjkAj02TN9RLX3Js+GArg=Nu>E5z zPa!vMuMV06#7$1dLbwv+VGT(5V_&A~Uy3T^+|y~Q2>lA|=hZZ)ex%G`rhkN54C5gq z>w?qN=A+LgB0-@s{OJs7Da|z%dK)uDH4?m5Y=K(N5KWL)uqDxwBt>QmOk(h~1u6_s z>9x>G_+@bJhBQ;(Rr?20>Tjn}^Y`|rQvI3Ua5$aGq{HFf4BhwAFVk2oHNbk)hmAri zjQ_!g*-c^AKM>A@je&H)i1PsJ5929F<8bLXvONK4;-n6d;Zm7Q=G|k6Fp*AY!b1a`eoS*c zF413z6`x;!NZV1k5)sv;-Dqjt?t&|JLNGSA2yWhU-RYC^oiWI1+idw;6*>m1&Io`^iPgF6c$sN zw9j3KFYs@%*HNz1Jr?F^RiLV%@DyQ^Dnc1h&59pWKhD#AMQV~3k7}>c@gdw=dyRf5 zHGNU7bA_hHWUnI-9SXtjM~LT>U5!uS#{ zKSOhB>l^nUa&S8kEFoAUIDG}(Lr#|uJCGb%29Xr>1S4yk0d)9hoJ7#4xNbi?5Dt?N zBp45evje1L)A;&Smy9J8MJe@1#HwBFoYPv$=k%GOaq!kd58)tzBI~EkGG3Rqy>GOTce-p>jH0rb~c(K z1|9q=$3)Vdgcwyvy&>S3p(f~O;~?XK{)Kch&2!gs=%kNH#-Ee-i}S+a@DNWR(Xnv< zv7kIUUD(c?RS|JmPeXBC6cbxUl6qRxl;fFAiK%!>EzFa zJ$-mz?G%WqC+P-l!DLX&nfxzGAnLaFsOg^Vq~gaW2QQ<(qixj#J=;Y{m`?kHkfO)i zdxQ*`2Jr3iXdj4QE%|AlQ;|Wx~pKrr7xuNnTe=t-AO)iha6xDYpH}>yZ z+FD^H2VS0x4us;Wo_95^kElZ$>j2HW@wyeLi3i%Q28NXxQT7V1{iHY}Llc~!Dkv8* zM><6X$}-pv0N#?+N%W`5%}K0Is%8kCOC~LuR6+;gtHYPi9=dqUoin~Q^MhE;TSIe$6dEI=Xs(`oTlj_C-3c4KT+wJvpu4Kkn_RZVg5jE+RF`XNx?0xmaV~bW?v}wVTXn4{5 zO&2X+*pF%!%qu@3SLRk-npU5?`f_cV9;|pa#ktlD9VuvRx;TK+fWUv_$vC8-@TcO4 zN_-D6?7|-4!VWMEgQ}TUe(c3w4{eyxe8C5t7pS0MFe;X@U&B?sVDIGR;u>?mPyb2F zV5WLiQ2mX&1v=E#B`oe9yk4Y2^CFRk8*rV6k1!uW{m47&7E!m%(ANz&+ixrB^ng(;#RLHnX%tfsjJWM- zyBo5Of=eNl8*;gm`ozE0weGdP7~Iz5$$pI`$C5 z`U46T|8cnpt;J+VO?%~H_`Ph??bcn%Jzu`2`z~tc^PoA?r znJlfFuxIeRC?a>J?C!EC2Bn;dnhn3XeZ}sbjb-10*a7A?aS00$P{m0wm zO_v_`nJOwO*k6S$tHR@xmt`N`;fR%l>^^ZvbfRm}PUBtryK5pTwRdIZgj<#_irORP zr7I?yj7m&+KkD(;PKtLXmF-s9=>`j_AFjI$YN7_w1g7hD(md1~ysZj9;u_Y4i3Ssz zgRH~g_UH9AHR4A!67Z@2zch=Odh*4WzWc2=ekK0-ueW&=xy{z7Gz9CSbv}Pk+4ST# z#ZxnW&!Z1tS0A}`@LT_*wh{sv=f-Dy+2cPoUi{nzYTGjx)eit9s#G5^D0+(|iNBlJ zV$vUX35MrZ8K19VAN|i75_}Z#DO`R~MZQy~2$6gqOvN0Js%d70SzJm|ER&Jy5k>-I z!fh9^fC*zr22w0EG6&Uqo`eqC7_L8gi(#?!A>;y86ak0F7|oHQIhmW!15hHkZ(*|o zF+vd5r!A(imA-b0}qc4-&FS58}j>!?PW$SEg*;W8H~a^e%b?2`O8 z*`i%!x17FmIo=X;^83K2Y3Hja(b_rMns6%ts^>=(bA-9V<9O1I>564?R3a}v1yYtH z*l6T7AY0T66-95WtZgaP8(}|MBGlfNdh@=~Y1m!IA7($BPUtE`qT@h@;M3Hd z;_dtQw^?1x7-WaPK4XDxuqd5+qVz|PQlALGw|x}&MFa4RtVSK`(e|RtFN=u%s&M?) z7+HD3$diG_iYZuX{0ijc(*2C7cTX)p*3LRRtn3r@wq>%<@A9jY)yX*dv zSq7pIH0)jCA$)wa^7RfPVlWXzzoH}vzHmu4?W&f|zEC#fi<;dYS!Z*G+=!O(wLx7} zkfS~!6{@R-(Uw86L(mJl7`6&&tfKDx<)c+WIlqL)3pSX=7*`N5ysyr`8ap$bd^E3w89)ZgPiCBi|f{Ji^U)|AMCk%95n_gVk3|_XmE_Z6(keo8NCgI|@0sfZs3_s1} z$KK|ZCF;AE#cQiOrv*z^HWTBHM`H8Hwdx20FDq8lu^{(Q!@5s%Urrmi_ZX=7)j%7* z2x#|wO+pMI^e#2DpLkU+erWUorFxiNlu1s>XIg^5wIEm|joek2Rd2IsPtNkBRLQTFsnoh4v_<(`f@uV0I_G*I9RD+?L~j{1bx`#0ta zEeZiTNBzhh^|GEN+1vl7{w)Wm!`yhLKAuC&Ve`GhjRo0c|E^`tZXfkQW;&_kBLS|M z7!XYb?!E&&=u`h5Ld{_dyivFMQHW{aI!yVS7oS=ttZ_4U4sb{P=wmO6wCrO3g8Cir zRxN0ht{}^=kNOy`2fdgiLzr_8?$^fWMSdbcHb<)&+4+$`i%$>mB*aF7fv0tiFWhcK zRThLy0Mtx?A6Q34Vn$tJOcHkv?-ldg8_%9Jr8YX#=C;}%u*pWq^?L5VVi61EUkC^@ zTi3LAgna%bC9aB?Qos0?XlUZtnp9cISx)1AbGeO~JGb1<*DpHId@iRrT4e7+!$h07 zWDZ4FAXQ;*hdB%9)8U`#Aq1XW1`G)sm$Ol@ZCv2#2r5~I^BXuYJm%NgOkCQOAufat z)Mo2&C`TDc7EDz1sE;V{`=Bx<#5gYrDb+@@FE3>Yx=pZB79-7UjD-g%Z#qc&td6cl zI`S1u2Q2b!m^1LOg{LEV_eV*@cFW|i{!+a94itA#8 z2;?I%3?C8LQn5B+Ac|?$1Ejde^`AH_B}3`>#H=np*@XDR^y^=fZDd~Fz;wS>e@!M7JaPvv zPU?=U|2$6iw_+;&j{0oiARgl1!2p}_PMTg!Yxs?H%{HmJgU62_ghA}_;}{7x*brZc z@>!rSz|M}1YPdKizI;?B3~2O%LY`8A1SF;-m z+Oxu{+PYOU-V9O}bVd$T!;AU2M<2*KtciMEC29!H9V-u9ZUJ$M-4#Nb$5QVy@LP8HyfiyK->WR(e1g77J;isq@ zxu$>@C(@*mf}RY@L8hJXBrWMOEKDqt3i8iwFSwpR$W>G_j=iMN>(!1>S7GdmXt%UH zpfdn%XxP3S<>d1=1{yBn9c@?(YZkyNN1 zQx^M4-32#mo8SKR;r8t_CV3=RwbSNzS!Jbd%GS0L=qT*0!ERw05x~DzSsUKHYQ||Y zuwKD!+2nux!l3~g>0-F=;qnW{w$F|jqXuhZz#N`4WtzLDj_MYvu(*X@fb3G;s!oPE z?QMW|e7J7#=?C#3QWQRp-~(1;_=?J(Y^}oNmHRoN$^y4Pv2Z8cL)EmwWVNJh@>2ER z)el6y-IQ`!2h2{kx3}jwTf$_!N75)(mi|n=?Ylj_>QzqjfMiO67Wc4{rOcF4JS+{j z&z%duf1`r(U@ZlI{F=sZFnCGJv}cN<(cA|5AP8m+HUK z@vG9%#_zOu)ChxFSxmKsBSSO9XX%g4SU79e4=G!|Cgo(;VeA8dsRxIZ$Eqhj(brh0 z>Jh)P2`<<#u_i^?L>%2jxXAxZX%?<7l073C+~1p!t{Dj_9ZxL$sz|_G{C#{Hv@t=B zP}EsMr62u$;U#=d%MRJHCiNv=5OI3(_o-A=G_9B~AsrRui@pzUDE@tHg#6PmWEuT^ ziPt|@8=kjTNmkqdOlyJS!m{E9I87hqn;%9rT0<0-L99QeURoyK-&OxH^mcao3^t~WeS^K zH`XC|VCLo6*duA78O!ugN@5Elxkhd!CmdSX&*f=utfmDFD9PkBHMk3&aFB&)R8NL4 zD&i)OQLO z(Z_o2Zs~o#^$zu`{XU~$I{T&vAH3;ofJ*ZpJ&JR~s{J0}8cw}`t#a3NvWA?#tMY67 zLG}{Q{#6^CipQ$*V2|W$g2v->Y9+4=(K+K`;I4$BFUb9!Nrk0B*fL+v z_lcdO1uEs@|8I@xoKCB{68@q=)}90JCVF33Lb?M@bC5mog<2~vPXXzk7B$|75Lya& zL)t=%E&Pk`S-PznN<)4iAI;NU!@f0_V&wOND{4!~b@1&pAN$Goqzvq>;o=lr=43Xx{tUtEaN3B>CWZ)Uac%%Y9--wFCA~Ek7aAC_APm}b zpXAnlNOIF+;t%pPlAxIkvv1neXa8*XxNLX6ZDDR(+U5bi-=^>US$+3TyUFaf{gSPI z&A@*!TUbRQ-p-3$KUDc=Hp9j|c+t%)Z{KNid2DyGia&p6lgtpOkDeM{Qy=)H&22V` zFBRKM=Etf98a&;o2pD`R2ctkyWxz`aTDZXBjY52aOspy*2=?xDIZi>&&))8y?Pe*( zt;DkFm|`@cFI!Kx=wFn7fh&cqy-f1RZb2KRCK7JNBsApYHWk=M5J&|wBQOdb+2_^g z*;b(s3o^wX$sWZHhUhNh^+UU2+hPaWw)eN~kHy66akHOp4#cDm_4zDetK1Mqx+sR1`nMz9wwQP*hL>=&Kei3+FtV>|yg%{T(6f`N5BR!MdXj8xHG^3) zqCJiEswQF>ZLP}3Hs3ciKciD63}0Z^MFL6+`V473sGm^=U1^Mx3`Y|Mrl>H0pEcT6 zg^H5MH*WeRUNMs9VN5fcZQ=>}GHBs};LS}+P-y~P#IlYJ0P8ym@R(0L;jYe*1D4ll zwDy~vES0HtyCCI2411OeiC>SA#1wX;8DRXzVihdy^T9BjrZUmN_=b)~n*!R4%Wps~ zkbFH!%W;I*pJZ#8%)c_#RUtKlOksrV!Y3i%vh>?b076sjL-)-NtH_t7E8;OBZOPa@ zAofQ3jdT&<%k!kzaG)7qW3j4HcvQe1&&jd+f8}J3!f+>UDx7H_B8^6hA&r*!PDQ-B za5jys`+BVIUd>7lmgi)Y&fyh!`yosPQAwyIh?7D-h2#b7);pTpdfDrCm->#&W_JPe zRvi?=>OgitOs_62y`!|JbhXf5STOdjJDPjj*#EK7D|Q>bl1&L=hPkN@2)(QE#vP@l zt9uJeTG&n{WG78N)aYu19%#`y%8i44oVsSwNLRxgR6hF`tsw;8VRy)COB4`B4i4SsLAa4`Y(WRazi3X`Vv!fMiDilJX?r1a{9%U3-*f6J-iKJh{i^La~ z$yJ?ASG(MP>=IKImh$g9bD7xJqR}YghlfIHszUwEmoF2yQ`Xet0HgZCGNmYge2TvH z+d^IF=q3{GD`-m8K+R-7AdPA64e{l|c4AofbmD)4hUvwM1bw^%@mXLok{H%R#q;qz z+gU3h@JZH-G^8$-2?T_&a!E51(fhSa5Q$w^j>=mA9b7)O1^G1VKyM1v8fOAgDLfFwlSN7aDkBbh=1Vofi; z{_|sQ`!zOY>fWC264~Y0Y;ZbE!j3Cqv4wlfV?E8SiTe3tr;ceTaXo*JV!Oufp0KT} z!>xB&7aARQo9It=F0Wa;$5j)X(=fKBtv5LhYKFC6eJA)BwZ>zny85O7zI6@a-&ln8 zLF2LorHz$i{9dO!8mb#Jp?&t4L$8*9&!)KTkLxQVHBP8FA!bZwX zC$1xtlqa{pU|8*e#v_V+#E4OT zjwi(7(vGZ$V!mG>tD`=FtRvSqWZ9$*B?GPmVd1ek!0@{$s=gg&_gx>I&W_E$e<7Y+ z5K(_sDS$qH^8rKPSita&*B->#;u88_rMf;Axsguitwh`|=XF8(EVlU^L*PKbu#TN~ zwj8|9X*SENE}$egSAG|3#!^5By}_`$$?RM3+{=QMMid7b`V01GIvvI+&E63R2wQNp zn}sc$*2c&2oUL%!tO4~7wk4n)tpFT)D3<_3R0r=|=}&0KCf!VqIpm|jC(z<~qb-#Q zZxk@2wJZtt%hiN1;J9w_Hzt9B+S-HzVkb8@NIl-+0XLm`=_dDWyDqXB zn&w}0*`hmpYVLH;R9>jKpbgr%Tssmku7 zB4?i;DJ=yE$6)n>a-tiWd=_(RksK=Y6Abz5;b5mLI|>)(FA9o zGzACes-Q@1Vend}5C)iY7*G)}1M%Udge?eW(1HnSXri;yq(~2bXQq`x;Yrz#0k&ke zS%JGlk~lDWC_ny*-Pvc@4#dzy&@`+2PkV%% zOIv<3)+u>drFF184*~^AoZL$_J<;#J>d$8hF1HEz)8d7HT$%mI=(a%Fw_CitukY~T zzCPh-wvU#V(e-YoddEiUO$O~Gr_8a91@$Jc+rpZOpW6;!qTct6s-1GiRv51Kzn!ku z>d;8_q{~ie0yF5Z-59^#vLXATUx*cq!zD=G$XZeu&u5Te*HqWE4IIDJ=3 z;X=s*MnE=AeJ9|E8#P5YEW>Y3>i7+gy{D`72zWgEJ6_;p$$k1u>hqEMJ4WhXT+1`J z2UoHdw1-mEKE?MEYBN#+HGKNk5c-SiJgPNDBrxIO3hq2zQ?Q-Gzn`%I_?VYp&dv2M zvIvf0jiNBnpf1lm=3_A6ApuPS)>4!*8O26GMgpxwaM6T-up7}x$fShgk;qe5v^RIo z>TaB#z4r{2{wUbivuj#sL%^MIIAif88=Zo8VO`(VhtJ#lK)G7`AVbhecjuza-rrB| zo4s>x>$20;IoY}UyhY=kM#Bz+WZSjeUwYHVtw){{#_rt79ybJJr`6`3xa`^N&f)n! zT=yimh90T==dW``)l)vNIle^QUoEWPPd=w1q+I0(zj?aa4;5EaZaQsy5FJ4LeF}5{ z$zg##sP#GwKG2!Ph}IYe2=jqBViZeEZy;=DiXR5O3_2O25Y~Q9y=cg)D}9l1=&&Xw&3l?g{8))$`(k@{a1p3a{ens7utuI^2=vshxrlD-kY-br`D+hAM=))3(PZ zpyB3*357l{^D%K-(OTUkjEoJ4X>x<^UfmPAA7hlXG?QgK21ybCZk1lxS0Sifv<291 zEjcA#Q%-#E!a(4PJtQIWk)#atL{s*GU*JZt07Zc#S!1%fwV7fXkwZu$LI=?Jii9b& z9N7&))d3Vh8fPHy4GD@Ijl7yD&?%NGuJ_OccYXkIaDN7{Ux?ntALbeUyb?sbz03s# zLfJD@r)GcJGkZS!PFErpG3low5RJ#jCL63{qLHqyaMc*AVNejQp_b+{ucvHN$a_^~ zK+n|6Qz^l#n5WiWi;#UEURyWC?C}74{5m0i9bm^jS=(82np)-?!p5j&Hj8-6#y5q$ z-cZx{GVhaJT^!E3OK(B$?9)Oq;h*nmgonr@l}$~5ny#*74^BUz-dtT@>WZ;S_3r_} zQNaQi9BKB}jHzND-dA1Yeacj3_qnU%q4vw$L-Baogt=3ig3Ri*h;4T_HQn8u6~D8% zu3dIGR>z7KUO$}07IDA zm>ULZ#zLtQpB=zl`Xly=k@2w#_&57?*Xi!kJ;wQT>Y(diU_s7c9> zJt9NLo6(QTdY?<&%(7s~gGuhxX6Ia@TxNd)1c%NSn z1vg!?!9F%t+BbteRT}T^ikFtgySn40Y{9CQ#s-^l6%*Z|a#r=PT|QRt>uzZ1KDuU2 z_UG&)_39e07-r|Hmy8d@CawADtYBN~ud`dnC6l4WwkC7cwB?%@#G0C73m(O(B@{A= zKYo4MwAZI+m;dFW_8z_0tM6&w{t;apJRSqCB|8-3|G^xy4{cteem4EFg?KyO^H>jM zvPiWhJ7a++c1XQBBKT_Aev;X1adZCx?O6i7i}=MPVM!{DFhM1no>Vgi=FJObSSzE4 z!cz06q4?jt9&?tl`>Ym||8Lbn@fQ|L_G8v#F`IpVs|l!&x&>B}_z$1B(XGyIsHAWY znA8qOJ=@^)4xPoaU-h^g^}_jK@kTQ7$?aFf|5I6D)sIC2%qiC(coF8shYu$ie*)ue ze%G2{U`NRIn<&=&^cNmI;H`MZjd~?#3I1s@KF{obqiu%g9@l{o^DS=Z{*u!j)-EktzHk%L~ zUeueNeuutfbuxAHnCfe9zB#!P8?xVF){CM-QK}``94{Bxq4Q=lI*@*(t$ z0*llTSuC3*FY_i0Esz=DU(#!`f?@wi{if=Z>r@~3asMrB8H6RvvkTcW)vbP8ZeWX4 zzxps+&i<@^TXl<*)K}C$u*vFs=c>O<uva_OepgZ3^mp(p%~u)K{5Z{k!@f>W^5N zctHJ;`gb-C%!>u<(kED#4A{XPx$+SHa}?%+(O6P8P)JhxL-2PKS-#1p!TbB=d;5nL zMMOs=yP`{Yvn%^wn}ki9e$C!VtI_NeVz`$Lz%L_RchA@F7J^6AM{gFM+M7MOSKOPu ztXH`F#C^w(VO);r;56Hd1-i|6n#b*T>ceqoYd9adu&Oc+x`?PF5k{oi7$_HEV@K2z zymA4)N+`DI{|3bN<-4D@&N)YxIVoqR5q@8N=Kc5COtz?XZfomYb%y==nU^drYn>b!5Ctr?PZ$sZJGC4(Lx<*GmYK3@9};69v2?xCz*86!x1fq z9-^Oe{|eU+0lSwM-%%oRlZiDYBcsgabpN8BFSM>vThx{{TLd#395z2-=dkJ; zUPumj_0A`QOXa%S$dG#HKaV)PHrXJUqTZlMEURp*D&K#c?PX)`>TojQ>yzh(U5ggE z+}3v2ww-mQmrPrgHX82`E)7LZ#9*S)OrYMVHZ2*%Ix2 z-f6n^R()lg_{@W9puD-%bs!$vZY>)VYBn{#u=iUtgZ1U*4oibOw!C4kr;~&cIo+d? zul5rmlh}%uY=)i|^mJ>IyR&mweFZIu_7x~{W-C@zr5Q1cK^!y+OU~frPEZqXZ04#L0$|tY}D-NPT^J>z!>2 zLk;VdDSg7vTYSmLjc%I1lCVSm>+G7BEY6w@(XH|*G{ zSt~)o`-!M-5J4aV2N@%gOd!0FRFIBn|vW}Drt z-eWVGJOi3H9hf$!nudR8+Nmhg011-@!@NC3DA2QVhVsnWtq@_vVUsn7Lgo{)!})lf zHnxUxXX|Z}q6~&9Cutz=WXN1iJCP;&D8)pBPR#N=xfBTp2pd7-lFF5XXBc!;f}%nR z1Ca6zjC^CAo!5Zpsbiu(lgpE2dZaZQmR3Pl1Nu#$p&}HOO1KhD0hr0cDxiUoC%PDR zz2y;b(?1FUenyXAUfrc`fgeIi%?Q>s#3O>1`S`d7)!ab-ztxcdp zi(oNgfzqrSy+Qa-h~$kCFl>tV#u zT0yo>Sj8|%X=Z5eLYl_j3H$wFA3GlQ`NIC8!J3ZtWgQ*Tf>iySj%6K(I%;b=*zAUs z@a=8sq4nu=XBezD!_2jBtet7FSqQn zIF@m`p^X#2_+Y@)f(;Nc7NdxOl%T-$NRFKpzZ*Diiyv-9$byI~Y_VA7@fF$z4H|Dx5g*3@-my-zW{NS^+s=4LU=S;5ULvFYRU7E$thNp8*A(h3CX5s zqQ~5@=c+ot#VX*Ndavjg1ef4*RI#r4+51F`-Xy>#L9~eMYl6w8mrb%>5bZT?ljVD6 ztEdNv0*uOqR@o*xU>7I~%q&O{-x-#ny*Sp3}O21M?Rd(O98C84<|F{P!iYQi+&Y*nsLu5^Ihu$V)k)=GECZL$l#xZCMb z%xz~?w@;eYGR~3+M_}0ce(?P zl902^TxqD4$DQx-Ouql3YC)>Mv?0+^0b7X9MdejK@03cTh{%+U%}ktHqQF-^C6`xw zO``FD0}P~L0z_&PDjancf@m?ZGR0TUYN{lM-RfudpltLzU;yJ{R+GzQ*P|q&zCuzY zP@pguLKr`*Q*oFilK?v&y$CF+j-b`jSz!_lC6mW>m+2px;ND~mcq=BCmMTz-PuXY< zOa5z2j)rQ{(LTN*&~0=Yh5whf_W+NhI=_eaPTAgjUu|FYx>|LuiX}^yT;wh{;oiU% z_p&Z@Y`}m`FN5C~v?rUXJU2@qOB4H#QH{+~N5*}@@#Jm2%V%+B2D zcW!yhdC$u$WMz8Y@Q7Sm;An!nZCaUSSuojY3}>m>9D|bq{)XtxPsx!lnpMKJ$>l0=VE#0Q${LhbVQ?(avB~M5H(A<6VIs~Hmen|XCr57cj;wDg~y7PjIZR* zau8CZLCaPfRJMsKeNi~1P;*LSAkgMF^Q=afBekooDqXYIppZJ`(kv}2%`0n&8lEg` z4=C(+1ET{^|A%kM#z zXK7m|9Wcfc3=~;>1jcJfX#rU|Ppz!j;7pMyJxd%-z##=(QTY&BIZl!@lVSAb*KE2t zsC)F&?X{LH;g7;@GHGHi9oIy36f@s3g3 zRt#I$TBG}b-9;4UrV$&5Ij9vP)Y;Np6VLT3k-c!=P<<;z&y-p^C+_T2?PjhnuA3&) zZg_w4iMx50MTey|GHd-~Qvv|JOonzEpncEx-PZbcYu(#|MF)Yep>~>mY?NK)j*MDlofYp2?IA zdWFjqQYB^@4u{F4kONMK_E=?Xxs$LThk3UpU19S{Nzmr?e_{2qb`9sV2yanqH0d@5 zKGJp8aZ;((RpJ-E(g5Ey-P)#3bab(6W+bgQb9J5E$fs<9fcfNuxIvFo=h1Dgwcy+w zPuTU(HesXi2ZPm;XEiGog3BROSUdQwi5UwQ_J3+1m1G-UYluB@01JOMr|AGf`7CDG z0ig`8Ee4)kL6qbPGy~CNdwL7bt`jNhr{b~f<0Mqx@25+$lS$DH(Vxp|&m0t?&qQTw z7?k*9V*W>p{DU=}4O&dJVTtJY(^>`^lPL~F6O|IFf&j!DWck6E9}tqnNz(gl(B;1+U04#Mx7H@PM!jr;8}`p8X5AFzRgZ z`H&lBbVagpDgs^cAL}3%1zD$XOne$PNmH;OFF;TKQt?TS2u1Xly;A5E%X>i&LS8)c z94WDnS|omqYiN=XeK3B}x+|c@HmfZ(WQ<~YG9AvJ!q|jbd#I*5WUrl&T>ys=H|eYa z=2P;fwY|sZguD`qxdX)M>uI;{{E0Cl55B`!K{}wLHeN|4VH*YnBfJf$tm5E77<2U`gq>@HG1qNC7Hcyb!M;d687pf$B(PUZ=T|xM7)L(EmRVw z;~E{-q~ZvOOr2pdE3KGuy*wmJ%9P@R0*A2yuAhIFS3E2{e{lXEPa&La>y?-W>-8zjMwKGjQ$BzcAdCp)p^-It?U!LP5Hxpchm^Keq$?$57$5a!Z+()BJRD{ z6WgCQN}23z-^iC&TytVqsnMs6p-*RQ(ixw2F8vzfP=&GB|8F?{vwhrLatNCSGk0hY z#-0-r+MT6XGIxqGf<)4vq(!0^mfU%UhXXyCkz}3fmG;0s&`8l>X!W^JfDuz9HUo@{ zuuFqpp>Uv)!psk76{RqQDF$&!v^n_ECT`}V@{zZoqC)oA7_w~`M~N|5Q|_k zJ;Up>vyh*=Kjn%>HQJW}(v6${w!9Z%lq8ZlF>@K=Ek<&|IT4DB~B~Y_O;v9%9bdID;FI$4}a;O}@l!+Yy zZ67)fU;`NEa8WOT7DH7N_&*q17&?q>qwQXMcFgOOnF<0N*-^sEWbzzvC)kr_vv+i5 zgPm2{O*$B>IAd@{>+WUK><(pc@%$Y%QkK)@5Tn}4^Ln|tOsDsh=f>O`Mru?jc?N+S zjv9?oZ;e0J6*s%IG6n*@)S#6c137i!nnDgDIU_YINmjH(${tUCloc<{sdVK)q-C~s z^SX%F!SQCb+A?8SAq-ab;ILesL&}?2F1w-0Zdb;3_7dq1y_J`mAZv20%2Kk(?Wvhm z?BgJojYahs`X@A7)HA9Qm5P}EkW30FIDr{C1ON{u z1g5dIMr=}b5GjQLE~kiOEsekhAqGW;iWew{c8QDP()f-j!!>b}0<_?aiq6~yI>*3B zi`CdXW~Cg76+JS8SL=N!|F26HjVUaAW#N(;&=GruQ@h?1{-Ra%60++(*a{-;SN={& z3m*yJzP9zU)P6F#y&<2IYIRcSWv>_H=QF%ksji&bymFkwB+s?s!OWBD?KvFpwAYaF z6HB9tl5(fq9jdFlXQI1E?Q^gHxncuVOg#lH7*|HYd$Tnnm)HD6gV_v+Ekb4 zp_-m+TC}!*?8^M?Y`$XK{JN&qk1Sq6xYYg&+mlym)o2Awb#46$jTWSN#;OI(jOptu zaCbaIeUAorw`cR3Q9bDuE~l}?)pf9WSllS}RTN5{AmKP8TP%l##64O+ z<9w~)>KD$L^#-v&PKLdn&JjL-V;0%hPd@a%E}(nDen@49b&%5#O-QsX6;-7Ym_{)3 zVl37&u%3X?ma&!7b)K&CFgV2vcWds-QvlU}1h5qyxV^(mlpUfHjzhVqKa?A?iY8<~>_=ad! zk8dO`rvOwQj>Y9oP2*Ot9wKK_hBC~WVtf!r`yU%(p%oD8e+cg4QUi%h2a{}O5}EG* zZ-HLS&Y#FkWd<|*0G}o#4taLmE^k0-iGxUlg8Xl6I@jpH*%~?tx@JuRJn#pu1 z@%_I=rNM%Y&`YFTCG|8jY9=GAaO%H4EqhwG9gJlaZKg1oi{db>rau>VdE^b)^5%>b8}?cL9itw!Y(Bor%WpI?%Pj4J{j!bwjl?n=A z?##%PqWmuA8zS)5vCxk(#bC(9jFU0xQk5C=7R7TRzMFn&JpLe}gI6mL{C!MbWW0*I zJeV8RWO=t%FK{h(m362pOLR55=AN7W`u2&T{v&qlpQUo)8&gl^+xyG^_=H+E&E8{g zDtj>Tm&AiGOuNYD{?mSBc+fDm!jX{TQ=#IZQaQll|>^G`1^D^SV zM+ZBRqk?)b(96%pKAv6kG#;Gx_9RUJOrL=Ch#REmXQRXa?RfD@|1DZPOH<>K-+Z~L-ZeSdCe_=8y zv$DFgjbD+f$Xn5p?QtF#T$_pgT|@$@QGPJGo8D>TeAt8fg6onA*w0M>p@iDdM_^a=-IIAa==ijmLcDs$P+!j}iuEj;;q_SK-hF(6t&u*(3 zU!LE)pqCz!$h##W9aWv*rYjeIUm+JxEFjgC8ezyBN-_G-vS}?09R$E(jR6BMU5U^@ z(V0P0B}3^eADjeW+@$S6T2jX+!gXXQh=c{DMBthD%*Muwk`k2(;0!J{>|O2$aekt_pC0cNlWBQj*NqU$H3%h)ui z?qoV$6o>@NL$D;;M02ATJ{}%ng;dfcXd{fw1p6fDH854f8 zL_5c+rAD;odO-?4m`z)jE@0QsIP#m%s{3yxi%G|qJ9mC592Bk*4$?J5vvrf&4==v> zL*Z%RPT^^~#-wiB-EW#fR>F=Qt#Nm25b;_CbGzR|l<+O7jV3LT3y%tNHaS?@`}o41 zF$uNZFw7Y~77Aa>jb2bAph2cqyb2hF{`0@kc^4I@JroH*5@Ck{3%HA7J ze{=QfTZrXPG(~C3e0zG=<=@}#yeD$(it9e|@}t3Eyl(l}7SBEY4FhdhBIcb^!*gCl znFlPvfq4vU4akQLkM!yPH0F@Xp4CK5WGsrIY#-Z~%66Yny0cS6LL^vZ{#CoPf547v zDOQeSMJf?e5Ldtea!LXg_#yu@^rU^*gZ%^VuaIC)(1`K^c$#TLNtk$0pons6AR0!$ zLUWQKxeJ{spst%xMbvmTKy*u_|1@&<2(Jsb3$Ne98JRk3nUx!DJ=x2tx%A513Tb^+ z6{A$>`g952ZR_y#^#BMQ;Q?NEWr8Kwqc!wGt6zh&EFKrvp{{ zN~{S=Y!iu^0Jos91XK~^De&WAO?3BQ!NF<=uyq~mg=ar(~#oOa0#k@s$PSzc6DGpZY zT%MiJKfg1}p{soS^vIIw;22}*cuMOjV++=yo`T|dD%z@Ov!(S!t0^oRsA=_x^+YR- zRun2H5=~%|fM4gQs|vMD>7n5f8#?tsN@5RaH1W^l8V#@Kb6(2f^@31PSCF5~CtaD} zHvqx#ExV!o0Lk}Jze|zj2?JMi!xC>^ZcUbx|8oD`UrHT5QaV&bC3|pDTvIB|$&v2% z6%>eP4*a&})c8hn-$b+WaF^U1-Y9%4?aZpl@s?;DwsrU3yUt6`1&HKhr(r4L3qt&ZY~Ue$d;q9YOJv}hM+5p1Omb%T%HEakh-=S^t}!cIW|NCt zvYY;N*Q~sC1sQXeEuA^!svEU*$tdANv&&^(v#x9Tve5*SsoPZk-nva@m)o@7>0Un? z!Atj^ZD6Nk^lh>fKMh(sMon0&1|FKqIv6qslh=z6Ed%72Dy!IIOJsI&k(zNe{r5j` zk_^X6`ZxFWKTWP6!%seNfB&|pQNmWNqVSmX-rpQQ`2bN0Cje~8WfmX!`rCUhuDV6| z?tzm(+(*>4Rl?Uf)zvuzW2UIDP+k<|WI}{Ib%x>RC*r31(n%p}+BT+-9GkW+IrRJX zl4DHYwrN6EI=PMW4E<6fuero2mvA4UMJq5i)7)epXyn;=e>z3@9f-LGcf5hMl*Uci zj^i)l8w{96&a4mrQ~GllC9!c~%TH#{M$B;EW?N3ttH6-F_R*bkE z%xs+9eK>1JJlEyUi3|T4SYbBZx6y2}B_?h-TH3hruKPE(H$8SVQM-|~4Xr_@In|BW zVgnhInnHim#YFuiJF;qqG`&6hB@?p%o1y+ku}Y5rxPFzA>{ANaiBNe-q$cmhZ(g6f}5CD+Sf>5JC1{YNhE(3F0!pqbX3(RwM@_N|c zFzw=ol!l+B7sM0Mdy|AsMx{HQl(76 z$#hO*p?1?0eXP0O(<)bIWm(nM?>D&fvK;|!P?al}G1;T~4{9s&3~cWA(L?15m&fK{ z)~>Hj3O^K`+eU6-gO#NfAS4*o;1-7UNR|0&(@~!?n_WwQKqAZxwyrJL|JM&?c06U%ORPS!-dO@oAf`H*?OVR=v)~F4S5z zN+5)YCd&}E8gy1RrguKlTO10oX1m^K%4>6G=~)DM_>yi%EXJsGuk#kUP6`2@0mFH& z*Y7NFja4Y}-Gp?I88a-Qs4d@6Y3k4^;uG$8HkVZ>6{d2Ts(+j_*H>Op!RM>kkox{2 z;Rsw5Iu&f8xr|1}tTY4tlHM>@EiDGFo?bbl;~Fu({1Z6Pa>+DgRgwURk+FuLorv&p zv=R76sC6XM%S1>W=qad%1G_wM3Sh6nDM0zsc0|E!6pSFE;zY!kd0?&wr8l1tn`~l0 zKjN<7P2T10Tav&7>10G6STwUFdt$Ckoo6!J;)Qlku~Vxs*jOESa`jr1$`w?}mAukM zx|OzkuRpal^rsm`;TczAm!Ag(3+p`9y^Z2s;Xjy+&E`xnc2|LnIxpPt&XsPg6uUf-7ft7w~JT& zfw+4o-?d@ch@?j;51V6l_vA4*Mm!^38vC%}t2Q0LXa*LS0U5%JS+ZNQ2IGMa4z4Ku z1XMXlM4({XWT3mXmejMX4KfvQpFUQG=p6zh1P(#hx0TaeK{z8y&FKjo3kEhe;iDcE zfcF9NrmRd+z#75I#zyOzI${$C4z8egkGJ98@%p80)mt99&dA=tEGF*_>L9oaR=CWYsR-P*G_o6S+z$z#(P~a{(6#ymX0~h z+zw|!lNvkPaUB%ja-FB?(Fv**Bgd~HFZW*OO%_;My4Q{$zEnTq*A43HRN?uNFg=hl z(mS>Jp)!boM~Ci|rMz6Z8QFl};xW z+VC;%K?kAOOY{Zm7ozQ4hK7!RFs`B9d6c9mQ-&9ZPv@IOdauhoi;5;SiiX_ zWHK;M)?aq=IP-A2oqKccL$m)pH~*+mz|;ySZZ3~)-BsluH|nc;xl+!#{ao9QcRBNG&Y@@wdtJbh8!GYyZ)Aw zzW!rQ{z;Ot{z+k{O^#r%wLyJLxwd z^XJOJx5eNf7|~5`*>4^z8HR_EXsbFq6_{Qh=&*U_cl%k zwM=iU2Q-PXbe70@^dA>Q@*j7JJAQ6|4-hly6bGu#Guf4I3#=NJmMq+jRMnDLMGTM8 z6FZqoQTr`j5OI0-s_>JgLyrB~1ISJSSW>S5iIM8Fd`kT8G)kmiG74kB5_qw%knBSo z@oyzBOWuPdb_$`9K7a)3Pq%~9W`D>*IUiM@0O!f@)4ww;cr6QD5gESP1B%!6;MicH!*-Y@P77+wB?U{(vm~ z0JN-bp*I7tds}$B|2Yv_ml9GUw621L=mG8zKA?tYOyL8Y$OA*gF20al| zE!BG;U}OpgXwsPQkfX7WgsEmUAWlI(Q%5G%c5JA@ zvU7cnaQC>*j%_XCf?T?a7#|JPH|92fQQw$ue`M)hN67HnNs*fMopiZ@%w_PtA1jc&hb32b{w#B}vxOro)&kk4QYrL#`LlzCOWDbu%nMm`flvZfG|KV$j$ z-FNRE&whE;GvWRhXt!eH;b*Q&eRI=I-{8}UJ`2g|xFh(1d6<`@`9woMA|kP%%i+S5 zK1F0WhSZW`Qt4EZc`V(MZsAXaeCedS(Vb5ELclEaS@QrmjTB5H)0hpPEE5EQNlSt? z21ITlh|EwEWF@giEs@COAQx(+_op}^iJXqHgKDa5asPlpLpVlbgj@6s?#6S zYL9`li=n^zx)AA&B=wJxE3xcTD*N=wh_LiAeKO-y5#$mc`A=Xw@xj(!AZfrCg?F2! z%%%|*5?(3e55O%Be>hdJWqz|Y>@NYc35+My#uxNsQ%rG0cZ281FRKs`l-S?BR7$Qh z-dVrO@Xl=E(CcZ!zjWz~bC~pbD^8Y^*o%J<{*O3DPI*%37d~UUCSH7g{XNT97LQ$? zYDwS3-Mc~fzXjb-ryofsKuafo;|MWb{O%5q#oGdD3s3+{Gu!C$mzxRqo(e`nj_uaPooI_7+V3f_n$&KXNEvegYzVOAmOI2;f z%Txl_vJgS~zx%NlOt`B5A1jvKoKv>6a#W5%cB9YQE}Ng#F-&RRe*ZmNFS`A= zffzY&T}2~NcH;d+T}$M2l)?WJg&c4iEkTi+0V>Z^9RNlas=*@uckms`6J|+}MwkVl zE*N-dTsD!&Rw6C9;`uACcs{*j*L;_2erJQvcU_02%bc~Ubv}FK!A+YVd~oxo2X_nq zIxLJ(Kec`BV~&r=1*4{GtdwIw_4r|;;(YY{D^5OnWS2C@x2K~s>682AHEryBn;yjZ z4?M8>3E?~8cUvB~Zsk;R?@dJv+4DFYRsX`H578avc%LRj22up7SnVaEaV$dP+@Mb2 zq4CIrhOkSI?M#gOW_%ee~$=YyOXUUtta- z@3Q5iMlTbdyK_ZVk=cxE)U2`ldFI@H5%zHXu&HYiR*LHY$S&l*@|^Pwk?pbS!QI|E{fuLT9l>Vn41g5I@&W>ri?f&GFo z2Mvui(Ha1iNH}VO&gaA?EjuED!@2g}wMSvNZckt@^ zbBcT{_aqY7%7ddWm!=M@i%rJXYvdmtmEHZ<%5=2wE#Ya?`{vOxdvUPHUc~Hq)u^&+ zVxd}piz@JUQn_L0+rqRxfv#aS1_Qa)SFTn?$r9m8tB0)&yDHj4Q)OzVO1NO^@T(S# zL(0QB&KiTUe&dAnr^5A~AR?Oh+sP8L@Ls*u%05spT>iM4%=WoC#%#@Vlnc)Y*M>(1 z%>k=bX=I0!#ZUiZtZ{s3P3^i(18oF$Y@`P&pb7q@ zvO&%Rinll&IO>Nvk;2BP83HY%nxOt@^RQ6}1388?OVhV+Wsgs0?25ERVP|+&EE0^` z9;D*zmtfJOHEx^cUSPX*CM%hFt8IaM+BUL@o;Mw^gE?}ONuG9OHsL}9goCExOl6k9 zcBF9hZPPbzo-Rz=Cbo417-4=XMb6q`w5^}k)dn8)rye-Nvy7(}Gh*3HgK@Lu%)3+n z3oI%!*v)_P(IJ#lCcqSZfges}9(VST_vZX!8Iyu_9WRljFOkeF&%DGjD#;zAuOeiL z)kL;tDxm*yaTD@D7Ic(j;`>P;SyBFLyqBneU^?`pM<(c}IK9OD2nZ!U*T9lL1{g;P zQHC5spChCsLWwhCBD+2mm(S2;iqgWTOcCcZWEYknl3hS(8+Jq-!Js3u!vGXFx%%`X z1GZyXL7}pT{gaax|rmpxnPf6C{R0 zTib|2S=j5#k%yaW)!9?dat0A=*X;8^v`SQ&KeDAp3DgrAcLuh@xA;PZBR zg`=d<4p03_tdo51mGomi;T*5W zBR30JjLniAk}JV|c8{b_@+!PN3ED$3pu<0a5gVJRMq0Nr)(md5j3YKqt%Cs={mM&V zt(QUujwTQ>MqnxgM4FbD0^omUM`j%X;ov|kMM@GAVteUvCTv*~XK!V8i8e-rGO=_w zoddypK}UkYEyU(oO|oKfA7hGR%Au_RIi%5mMX8P!NNn^DF#hO?MyUXe5YZ^CBuAyz zAaoLmQ4tEOMf%#4pPP{;jWHM)?Ifp@kt=LAg`7AKI~*z{W3ezw)pVPUQEMy~jk*Wh zTB*WpR!FsEi}0SsqLk?wqmj|el+#Tnl^ko>maAr>%xuC2=oZxEl4o@~9aI9XR%h1D z(rWcqJyENP-l}^|YjhfkRH_Dq0Csag*5}@Ne*Zr;M)&xhr-|1PuRQ|g&-ss8aV zHQ)cOM)PgI#`o!W$Vm6yr&5JrWzH40eATw{n%~Tk@(&l_f~OwphL< zCqVa}HZY$G%oj?XR`mrDRG?uJ%%7|Dde!ITbG2SC$p5Y}8a2z$XEq>ISjNkZ>1)ov zgE4B@ZHNjMe(1B_iMB^&AdI3IXEcx*Chj7 zB70ZAgoM~V!p$$OCVPKo`w;0RGhZ4!{v}p2VcgvrJjUJQ`tKgHL2`y{a5*?8l{pSS zVw`E_9ZV7@{DRZbcUGeBT!b+Rqb4RXao8LXXKXTqpXO606l_ghxNxwE%@d7RW#3 z3UEXjf7lI6*9ic+0Pae`^tPR>QL2SMsL3oEYnGOP$E&ou>S`~7xQVo(=)(GU4qQK3 zr?C@W$tk9f*D9E@M03cl(WrbDVpAIxG#Fl;5L{*BOWVj61YAL>qYM>lvf-j@87tpW z>ZJvtU!o^7M2?;aC>6H~*pz?_@A_f43oiSGu}SQ@oNif|jUiqc=UP!8 z=>_F32*pk3PFPZ*vcpA%CN-p;Wxmn4U-oTG7E0BO+K-oF$b+b15-I&yI4^>TevPA| z*`O%f1ySQ{Y5ZqvdO^$W`%*F%#Lt9hQ~Pdj5nk<{#WM`}1&EZna`}}EkJxL5;b(RK zf@)(^i_(k8hi0cS63J zs|Oki5QJx-ntFo~>>H%pY^E}xqM$b5MkoYvA@~kW?9WyLsNftU=J84%FU=uI1-qz& z1e^PwZW2CepU0^YenL2@YGH@)Zu1jQ{eo)vbm78VWF|Q$<=}w5W#K|%AkIaL_Q^~f zi|eTOp-#ROKBVnH#1e_)P3HY8s08{;dZ}0gP%Po!hLQr;BV~334uMWAl-Bd--#Lr4 zPP?Qdr)gAseNmTiQDw`*c6`PC1Bk z|3&YFAt(-S5J%N3gxme>D{!fPNgp+SjP6|uarzfLH$e)iK6*+D$1m-L*m8QjAGFH^ z!4#H29_}tYGe9>0-gpLnEkFNVf|O((Fhz0>mN{pkLJV{|+nAL!+nm@Nc5q(1;$0 zM^XlI4futW(0Z&+Dmx`;z%>=+F$`--08{c%b07caoO2rfcx&P4E_cI%*(-V`x`@j; zY3;gE`&aF}^~k{oo~)8NnyMR&zN(UV^8aqFW1e}|cCqmFEzbNRLwxxa?}InfKOla<+Aw3N@!C?SkfJo8^8o_ zI-fw6;_#rs8M>Q+4?{*lf6ip$gGD1_2)F*3nIb$OJoLNYv87o1MtGo;=rMVHc^Mg* zzJq)5cfvzNlfHv34fMZg$+Pso7znVXSU~|SIp>ji?}fH(>3^H-I{4m&4?q0ywD-t7 z&`*A`g)pImWS4M#Zu;G9Tl!s%h6&iR8RREo0+8h2rQ~oF4^Cf%UjrF-Vx~<}RSZ*I zE(2MIVn4)+wu!iV_&KCBJ7WozHtAvFJ})oAL?hICnfWHzmC33lUvkOkcX2xQWGg~> z@BaL}sp{L$pV2vjL?679*l!~z{`9L2m(0`GtD8C#ot^Q#F%1oEW0p0nz3W%&ub4Tl zv7>Bsdu8sZhQ_w8CH3p>X8H^MuC2*;raREK{(9zN$DD5BT3H_a=?1Nud0!pn*^pUZupA z00^Tj5tSm3ES7<&%$QX!=9c9_0)sU3X6E^ShyF8t!uA7Cb=}?d)XA@&a=V}EW*W(c zOu_RclPZ>-{Zx1NQ$Vf%1X5Uw9d3Fmy}|)ud-_SSfJENUoGgFpK<0AjCt1h|evE%Z z;>VXe18_1@Fu#N{v}Dy$lYcahh+FBgOa3nO3B5w!-!FNJjDG1I;T;eXh*@fdciwr4 zjDCtq-A8v`@^_NF?=`aGOWz0iLhnbEgMcy@d_;QkKk$7ipcWA}i23ZFsLEMr>E*^m zNiljMCxS`D0CtQRk`;cwZFtH2PC&AwZk-Esg4y{wTFw0ENVACmqI*lPKgx2}QEvCVye^Z; z7cdw4Cy!~hT58(tTvkqTwpOE+DP#Ggikowbz?sCpE1Y-gkZ|y`3z*$+64-JWdFkBM z*Ij#OYe`h^Gw4gVEuZc6IEwvFsdR;*#pxI9Sj47n+C_64wj)Xcy{3t;pT-^ zp1g)@-ZnI(|2o#{s+>8q(rfAp^75*M!p%o28Vqk=(~!6B6Rq}RU(=z=?xM1(WkubU zhnjpJYqg*F8xK`aD#}}&S2U^mP@|C3P(crm1S=Pk9!@{A(q$bR3U-;imDb8&gx;j0 z;T429XfFCd_&s7}e*eKm7kxl#5W7Zh_&9LS%OJK_PssaKWeGE7bk2mF(NjBbZ8CnPRDNY_y0vqvSTwEU)@I|E zO68Zv=36_MNF$?~kh8xcr^0{F%jpBc+=KqI8uz?&m(F%qRQMx)?AV_(LB-(KX^Hq` zc*ZkN%k29pbUyV*rbJ(s3^CW0uoy3ptf1(|FpOf9QHdS+wI<@yAcjwBu(VmQ6c=8m z6b?EH45R20DOnSoM;S*<`PnH@ znU-mbX3h<@cXoy%caE$qshO~gkdgW$q6rpc|}mM zfW4fn2@zHg?ak<`h$MyQiiQ`Lv=lS5hhmgJXsl0?YsZi4E)8$=c$QBnnXh9F&2c*$ zo}1qk)E{n2YI&bMPp&&}lpO)v=eQDNTY=41B&;b>thIE#&z#?7w)+at2l>OB;qvN; zop}qqD&bJPd~C*5L)|+2Gh=x(#-YO)hiLs$8|GplsgTtp7@+wT*fLZpU7J+vUEW}w38eItqmZNf`rIh|C45G*4gvtuv2ThuDXc4 z_`F(~o4xr#n>-TrA-kYAe{7|2#8J7Z{f-(gd;Ga>&c1)lWrqs;pUj`koHIS(pOU_D z^8LS$#%g*dRg)QD^LVnOJea-VNlv(W8>d}4abi{VBvc^g{(<%>=A~8;kSobx+W^dd z&`(FbE}}m!n<$swWH;yBxQ58)FmSG&`4)_se1oQtH6u;oagR#y4*UV% z$RlzEQQ?Bxx~KCmCdnIwnIbM2*apCK_K0`0o;qZC^gB zrnD~peLitnc+7HIOQfYaR@=5i$KjSiQ`sTL}ZLR4Z5zHCAtN>{bMsjN!6PEI-ku9@ESMg(;v}J0-^JMuS7w0b5 znX@cD7-?=8W)2tRaCYfAMyrX35sT!5f6!STjzv9;6_lBvK768%HD@<*NHttQXnIdk z?y7^F`IN{L?uU%rCUVHqK1zo@akLs-EoXkZnBZUz#7i_Tpn#3a5+TYeLYd_#dc{U1 z(h#`k#S*5uBs;gUF*loal*U~7`L0;$=f#;4=AN=BEs2&1-}$2Zg%57C1^v#VI#-t> zJzRMAY0~-3eWdazv*eQV6Mxve+y^*iS4kA#R|fn- zu&3e;qG3vLMn`=l-=NG{P!dW@q#yXDaL&2329-vr{@Uo%C`>lC=j2i0{4mP|q$wR{ zgn!v%CnO%Y0uBjp+Bjf5$TTk4KkHU)cFe@~QB_pz^SCGfJ*?JQKf0@!=#AcW;GQ7N zoi;maX8SBB zw0v&=GnX)%`~NoZ44HYcOdJ!a{DCi*(Pc}iWH`|I(H=k{g-Q{v<}ma?m=r%QWf!J} z8H0%E83q-u1cZqn?7c^L{#>B=FH!3BvbI-O&wt|5F=H-$V*bp7Etk-A)B;d}v8Z?J zB4WCFFCq`qCkDZL$3!R|>lU7)++0^}S32aEDj4OA`8fRuuF~3gDH32)EFsOzy=Bgl zbuV3)$8@b(Z6hmq6?u zdXVtQzxf91Fn&M9rzk%aFfXVsQ6;NGq(q#$=}<**)WJ{ZWib+A-;a)nqTVnf6_5cn z4t)>}4PzEXog;w~#$Z1ki{Lk<(qh}xw}&MofCb9!BjRB5?P=tIsR5L1!lWmvIA=!w|rhUdd}Y5$nj z@Zd2XuQLzdk4WtBzY3^hY>D1*R4J-QL@7{T4h1Gs&|F;1!b2qrcn-4Ri{yl`y@Yd0 z*^pzgBXmX3x!4)Jdgi9aQKc`rW~P=gL~>^9sMO=stc>u zp1E|DPH z1|+>G%%}<4&@;lb7~m`>2842kdFnKRX;3oaB^xJ=tNn^$zN#HJY2(KGHZfn-jm65O zv2|Y|sE=$MDk`P#+f=niuhp-qLb%_?NizMK%8mDJtX!j)P1?vF8!9)6SVmEIG{8bp z2aE9}WF=dHrxwk=qJ>vZKCOv%Yh zo)At7f2FjnBAx2PwiC{psVaa#f^a&N&m&A4FlmWM^^S9%ZFIKlfmIcYLA zle~cwab?#R3c6H?C69~O?j5+5(Ku}I{&=DcPF1X14!C@Ld06RKKXaA|hyZ9WLm+u1 zYU9HRsSL0LRFN&gn`8*8j+(;EIWTVc&J}Lr|J??}oqO%vFY7Pd{Y6}OUwA+M#qNvh zzMOllm$Y2A^8D}4UwIj6VU8R*BHYKNenP=LIsAo_?BrvlN&QmChJE`sbiAY%o;Ws{ zJ^8}+nDF|rXml9KiJ>Kc>Yu7U7@IPDQ1zHiY1R;GVYn5!>kiY=A@hYZ6D5!jXKm9F zjgDUbX@8jR^5dZ3&mH;m`~C4Uo)bA9>NwaLyc_};espuXotf1sT)&St6D)?TGRdDT zPCw<2Figb7ochV#|KTi>N(;hPVQX42l#brCNgD1 zvWp5s5{;f&-4$_d+2V?%|A$k^r5fdYhRjiF3}qc7I;+Crs?HH`C`>$a*KxQcE=)hS z=pzx^E@g3}=pCRZL~ZT#1ON~Xut5lx&eUcc*{uON08|U3d`6q&Pp<)B?F42E1NRRy zJM%GAHH^}96C?Sr?6UqhDb*1YaDnW1aE>TLszQtvMYxNSj>v)_3QAO@Im7ql1+=foE6>vkVT=e zML-E2DW}+g0qxjgNR(UI1)Cq(jDO_2P2H0>Z=T$}>HXxWlfN2Uojavei`8=j+%dd!-BCV*E({dFq=jrOQYQES*I7_41O!tkCj<#5M2QaG8ryvdqK7=gu9TZr8csspKTHAy4i_ol!q6 z<&!|m64QwpObHr;Z$XeC@yn?D)x@T*VtiL!l|DIvw7dzSd8F_dSYno+%Z(I9k_YJj zv|M0aC;$HDo7~;~Dq$pkFC_j<8=icM@OSfRWQ@v%95YffhmKT`I%QJSENWZSf?);l z!poo|oEX;_!8Rr%>f(a^n0^QrUm-z17`_DZ-=T;mxdE-G&1&Sa35xRsy&xnq5mJN0 zK!wb!qvfZ98jkQ>%^p&%D|XmjyV>G3!aoc_lNykvoS^23*1T~x2U{uIUmA95?=I9L z*Jlw~^}!~T5!peeSTkrd+Vf# zRppW?oSGxi$X>^L&`5?#8hsNQ=(QGe0tSE&-C`W$&(dQ$TdnBh+>We?VZv27Gv#S`x zZY2OyBt_P2SMC;6st1M5LWQvTL6yp|2gJf0<7BwUm3uT-o3rxrvdkMw@MpJCqwJhC zsZ*&j?k0Nqf?0WWb$PpuYUTD_yS6LUDAXx#+PCi}1wHVwKmF-3dLTu?Q9A&nV6oSo z@k-UhPdpYrmPL~F=$s-#*jh4}6K)VM{Y!r-HzX`A;+Gyg=WM=6{lGoW=DZ`R5fm3e zUJ!qT%nyqa{2SQ%$wGES$NUcb69&&849DX!S%_!9&{1|m^t$s{#zpXjSU!ThAZ`em zpMkBPEKH+)mURqx;F(k6X~?W8PDi4?A>1LBv62%KdYqIl(To)^r+k4rkHRibtuKrp z+A+}kFuI9BP}DF9=o3}v!~q124L~~#QGm2Yp#;K80}BN8x{HW(2&G>btrLYno+H9@ z35Jh4PFn1&B4`XL_{g>k=KW^r+_+su5K}zr`hwB#F1xI|d$y4oOH{&}z~X<*=X;n5 zfz3sWma*%`tr432PLpt_&gu7BDvm9EuOiIYq6=p1X{ncj7rFYuMO!}UiUBs)BTs*) z1o`Z5JrSoV`*u2pM+f-Tl<-D7;B|slWs{gddl4xwg@uU$RM2QL(h>#HgZf$A;YVLG zl0$wIQT7Opo4-^W&Ft;P9i#4#aYx_(jN}G|+H66>&7adGyzLmnne=3yCCIN}dz^55 z%q53NnLa4o_=l&E4%Pk62f{t%3gK|tBrIdDXQSypVUnQ#)ZYSK&Dbq7n*`JDF?m)27D?iLX(kMOA%T@ zfiG0Ffqf_p6^<=Uz=~9Qb}N=Wa;dfq39?xAiLF(tr0^|+?3lV+4bD}=FZvDP!*|ZV zleuo#==FO+)Lay)iB4#-+S-?Fy@|QJIIp+>9J{11)nNVZ*TGkL-3_oO9~YaG97`l8 z*{J|YePRu82%1q-h4#rUt33k4Y)Nlow(4E0rq3O23t7Bbe$|x$vS#+eW=Ftc^%IBu z#`5&R9&0=M)JgGTyx2DFr|X7BOXMQjAPG%>5=Me~z-OXC8J2#zo#gSvuEokmLq13>Ks;moLJ;z3yyYjIm? zg0+BGvYJ>*qa~#P6T$wBIE>PGX-G8vh!q|}3>8NeL~*NpU@c$^L@~tDK^DVraY>x& z?bc$O#cGkc2@KvrDU$WVlNFHR@nrPQ)cb{S2>N5OmC_7h^vhB+a6Q4DaVe_5(lU!# zw4+1&r_Wz*i%LbWS3HQz&{u#fCNW?^PSAZ(dZ*GecfnPx^t#xIhor9}Uia*q{^*2( zor4b~3k1>VM86!(%Z+PMc6V6DU}B5XdIGL@P}a@}*xZcN_4A&%c+8lK56{0owQc&0 z+cr&|vU&5AsnfR3n7%D_{rtmp-xKq$XXeNZGSNw8Bf?kHe2W-ikXB#O|-cKR7uZ5(TT(GVQ1;IKD*BA^?N;j z@0}ix!ATR1xOEQ{YHbdiSq;J%Z=uHSbC@*_zsJ8-uF;r^io9-jp=FLI67~A6TB9W( zn-kh*Q+vJO4pAtKQNPEeH5!aIo6)4#n%(}Fki*jDi6SSb_5z#QlcAS z@#%&1i23tyME{#Ci!?+UvreNCDv`Mgsb5hG8a^*#cNk6fiCMnPiX-Hp+aBztPl4Oh zyHn6D*0IHn$3DB=tiNbPC^UlpZ*J0?V|6jJJs@Q`rA}qn+Rc8tYS7vYi29IOYhBsd zuG*5FF<(~HWYziASy7zd5#-z)PSo2q#2&G$?fT0GFSTxP_hrrNTFu!t*=E!SBi0Cg z2=SRH$2YzncHm7u96A(;d=Z&(Qi-??nsK-hIGvf`4q1jA~oib#XKO7tb8)6w1$r@c;e$bb_`&F~Ni2jzvZn2Fw$ zz~B)d_)khjggJGS~kwcJ`S$EEhn$FG)b)C?Be?Rg4{?f);@1;dk*(~!#;TB_6ue~koujG{(Beh zUbt{KVXkcLp4__g$fK)QtXTahxoGr)j=G9-8WhCenK&*7rYIphp6F!0FZDa$cKI}A zbC$PH6CR9|P9~in$MVcdqgHQm<%JWmV76W(Ra?!jyjZd}yEEKSQq&abG|$;JC;bSc zi%r_Ko|C*fHU5MMZZ-d!_K;<@%9@Wx|6OFrky`ijgBLxNotf;yC;P z19KdM9L-wjp>Ck8BG5)h!T0r&0%+sf$hTN2Lv zkjxKXirD2~To#O4g3+K1RK6xdDPT%wEeGp9$`BglwrgN{jB|EL-iaRh)`YmW(^uJ7uLBa*m(&$7XGI-Ke zN;nA09{>_C7UNiom=;}hVi~*+tXPQjh2p-!$Alh2G7T7~LDWZk#B@Y`_||eS0j5c8 z+}MXS8)x<*jNC9-9f5cm&Im-bpfa@rDJ#}aeD&mfrlGy%ww*gk?W`wa$f&eubjT!agn2CWzTsF$9FQLv-MyCyzdwe%0(XgSv}M>Fy@F$&>plh^`XnrC<3lF=|wT zxwE#mprEjD7ST?yA%cmit*xpe>+d> ze4^cc(iT%F0-o}GzhxHDd0~0Nw%;391a(%WY$gC>p7cuGwE}l#_6uJTU3%q&Du-Sv z1BNQ6(xHc+GOV2wta51Ju2zM;w9pK?-$vo<7hb5Tx!}@jjIK(9#}tXZhOa3(4AZCt zeR8mWs=yNvM86y>IS;5hz*qP;0}qHi0D~PqBaSeil!iUQlCV3>8lbEi7?siLw38X7Ay0^wp7>Q~U9X90Kmz9u zGh;-Yf!@kam`UQaU~ zKC^g{E;aY>7jX`w7r}f$FY=D2T_qmcXkvb7<8v^QFe+0lBwIdIEMQiJi?iI}QvaG9 zFIlAGEc-(x;`Yw!xJj5VRhrI|!-jRvUkNW&`eTdRs$1-4wL%XTJcV-aZoPtMmT%{l z$~8)|v|`{C&B}j2h3Jt^>K>w12|Y-kXd!bQUbiuM2zE$ z5%+bOo?z+mdio*1I#~xKh1Nl9@bD{9rvijuq<*AxPY@W|#D%3Lf z|LDW95-oJ%uc7PzKjz*$Fsdr;AD?r})J$)wlbIwl6Vlsc5+KPWKp=z?2qjWO?+|(s zVdyBJ6hQ>RtcW5iifb1!x@%WfU2)a5#9eiDS6yFsbs@=IzMtn#5`yBo@BZFDewoaj z+wVE&p7WfiejXa4W`Z0o=tf#%Y#8W@tEJz+IKR>U~HRPH7}){FA_g z2@RTRpp84qzJ|6Tbl~m%2s1O8`iyqZ5(?E!d*MNCf_fBIp0pN>Y$)^p^{g6c-qdT) z2G|`q!rdp`_EOQ1xd-;oeZW1skI7UsOBvE8XfB>qbJ|9n@GEyp#)N$*zuR$;iHTMl zMb6o*mJJixJe)xE3Q6_4>)`+&0VYGZT=+r_+-_y*&qQ=9TDu^?KY|vD9{9zI3DK(5 zME=Du$arMS#9PPZ2`ya}-Oqi0SJ|R6){pAu>P}GuxC!H>S(E&)JRvc zK(%pLIt!%_Ggh;J!P3mN(C&zQ%b!{2zgdp>O3i+p(=nue_40cDaryCg10&jdx17tO z(^oG`_H-m)1cDqwb`64b;Smyx)_@t0hzGhdMCC4<9`|!TD8jm$rK?L{m%e7ES5xX| zjVv*(Fl`#N^Ymjk_TQ;du2gC}db*#$3;ZWOD(u{Xf?=5$H@|z8nKTK#24ycWnW{7M zAKQD&^LZK7DvgHE{3S1zo_>f1NH&P+M;%Csfl8EPu7x`aIkw>Sb*g?XAd3zsX^HUS z;UC1y6~<^aDLl9k{x&4~;8i-HtfOnX;mQ^KYx5>mteILiZ%SkHXs&4RwL5E-R@LO( zM6u}hNxwS1`A=KMZudb^r4d&kLjbo*jB_XUZm7xw()$Npp75WZModdD;0bDHwr`R1 z_{sVCpn^HUU7WwBZ2nzSn$~Q2(Y)xssf8Q^yiQfaGpCL)?csqTYl$*OC+Z@HVq^XB zOye(GF$~=Qgsvvqt>JX}F)?~g{W!WMD}jH~8i`yrp|6CFShk_1l1@(nOjnF*SpCVK zPZ>c(Klp(l_zKcZz|T@YCZ0yA0EZ^D{lW`$b84Z^U^;j-tpQBvB00=t(w>;jRGNw zHbmPcyBkeUMyN*Dp&<=!4Z*9_kr2sB-A2w*DIcMAtDSr>qu8;Cw5OT*sv9K9fcGOK zSm!4y(a2K=dfsK5;!ihJii?WuI$xqIGc`8d;YdoW%gL@wbJ?B#*wjo{qOWdT^k9m- zk==Ptc1~SdlEaZs=lt{%`6zA(m=DT}5dFZ2(yka(5~#H%rX*T@>g=_aAidv5RVz4Y)D3sGFSTS2r^}yJIAKH`4lg%ntx|R z@g|#cj@ugfX#OhfWp`jJqBtUbHkZ4DSHKDHin0O4ELt|2GH9gHaP!L}3}X%RMu9^v zuS(%Jt&VKN;Q3N&Y~gBXg}t%bWVW+k1Gq)5L#s5@ZkEsLIw^XNABqBodZ8Z+V-=0W zNfK@`WLS{B9Hl>p2R#J6Cms(mA4-IIVD5qlOg);Cpn%vztqY4NIw=`LQ{iB&^7#Wa z7a&uV)>V||WdnY{zt5auLkdb=`8s!>hE*dQPt81kI ziO)fk1BII*_SGJx{lTuOLY^sHz={3|Pb?n%Yie4$M&R<(ilKI}PV{R%0}AWba;7QM zlhO+kSbd)<)y`7?fZ^f#8IR88g^8yYJUP*(>zlFUnxzNtoZYl6N1f{El@=@+k}>b# z?4Dj;?9= zS6nw@ob*rWHR+$@M%;ibXjl5MM&Dm&83`?45etEsp3Zfah6&wn{SbZWiSl#g2s8QF z!b4X)kx8BIv0a|9d#)&qO#jKn1JeLSU&g}PO{iQL9$?_n`%N@9{Doli;kV#$3Nk1^ z#U4_1qX>;tNcxH3ovQtK_!)Q;noSJxssaap?qI9Elad>s5bi2j#ytCs3 za>OCS+>#mBw~`ecHs)WC{zzU^cx+5Je#R3lToHj6;g(tCOO%@6wkpq&GX4R1 zbtJ>0R7-sa=3topyX?tUg83mJE@(3F#$*?KY=Y=`;PXg{F}hsA=r60uXOmHR?c0m~v#F!u!V#*&AI! zFCAz1AzPG%yv`L)O!?wt1!(?ra)UJ3BIHo!{9Yy?_5{>Guyf`FChX$Fc_I zzkl<0r)IOI1!D?xv z|1Xy@#d)U%ppGeWtaJ{l2B)wBCoHNdN?uM*O~xylSFjm1X(4SGMWdi;NKxSuf(5t$ z(yq)xWA3qIH}GW;dPcJn8YKu5f;{oiO;wizg-JCFwS~i3j<8^y&6ATjN8`%xe@W3ZTPIsDF&xo?<=iJvK1bU>vQqQpAR2|98e;? zywn>Lli7c4!^k9)D%NBa68o3AL)UnD;d+hQ!;L5&d5@<^J+vey>4Buo;w7UeC9Ww; z>UC`7uuab)c08w7zw+VUfg^7(8}2hqI@xh>QPckSg{{)#cJ`ZoB^^z5>Wnx}rQ)|t zm9Bv?Y4QiD9p9(jwKLujJIq}-HB>Ae=~c1k&Xe~rE;Db4B|o4OT`5J0Rv@-mt!atz zj@X>-1Cp1zVgT55j#C)|HMfmO@q}V#n`2Twx+XYdZTw(Y`5GfTH>Yk!#zc-pZW=AdnU&ctSGLmPRA#Yl%*st2 zE5@3|99PQ)1!p??$QLg?_qS8cq3YGk^9J=x+wtQaLmvIzOJ(X93s+Gg81?GDFTVN4 zi)CtqLG-vQfkdF``vU)J8+thXfiD0dYXo1A1iUiY;}P;M1b7IG9)w;9FLlWY2N_j$6R}D_C#tuFLyR zQg?8Y>?h+f4n;=rDT>*O1&SreUa?-W86MDk6bIlb(X6-=xcVo7u>QE>DaBdEvx-;o zHejCOiI7E?piCY_R(m?>8YV(eH+fkc1o9v@DE}J~P!EEwJy^lDDl0jm&=M6(WjI1} zhsug1OnxZaJWem}2`>S^DmBPMa~QOGSg}|L3CHQ+J#ajM_k+p-7#qsBCaS65;S<0J2iW7)(J59wVcB6%k{?6%EJ!OsS@Utz_$(y8; zY_=t%V?5*DFrIlzZ{ki!YtM2>w{6Pe9$-Sq>~eHS?^dvtrb=lv8>;ST64@AOhk#MC zHzd7!sHq55P!v@j9C-9X0WZ0+LTk2bC|f@z1F_*7DLz zruI=vvH$QnNO|>oNZOsqiluu5BhEgp6xpgOR(aQlPoGxv0hs4a`qNCWlU_c;dVlqi zTDma!WiF=mlT6^9KFbP?yQEJ)%wpTyIW&YF?FBzULCQyRsUJR;KJU0*`iv#~`OnpC z4l-gG(E_)Pgd|FRRmT4(%sYi_RPEM6;$3%-Z%5%{n>c_iJhrLhpPL>N-gq#SBPHg9 zDzo{9P0z5IZB?7kp52`GFuR8^%q3e+zbL)g1bTBFEEJU4yBB)6py1I-C^!=N&1nNd zCbKBK(G8K1;))gUZ+7rVPAR3Vw7t$6-x$fJPaG&+8+m@w#PTMtSUR>8IWwlE8>A1U z(8^i-@18xi?eGFN_%(Z7r8sxBlq5ZS&Db~Cl-F;l9Je^~taR<5acm>kyS*=)&e>K> zn6*kON8)>1LFFjt>#TO+!OahJ(gx)D`j_ncOO%}4G{JPx7gXF@3{UmqLN~)yN9>Bc zpC>`rSsX-oGVPMHLph6`su_njt$XR&Kiz!upPqdwyjDEi%D68N9r}`S(*JBYcVz9o z&$k{p(E9wnYv-(faNH~R-S=Ja_ctH>=)vYCYu{Y{=JESp5mvRUOUK`Q^Y~KX!uq*$ z+wUr^XJ)0&pP$0-5Nl^v=I{ zJj$bjzVt*|k!cGIjUTvd6KyVeA${ty&7gHGB<#Q1y14zTyV}$4`fA-A?XMQk9G1;8 zp5EWF&#>*jJebfrN6kWh2{r0A9OgK6uv*5?N2oX#x;mx`pR@Uo*GrC8yA6OX273VP`NcBT5$Qr0j?G(M{{P7piqRt*) zN=el73s(VL`SV{oUT6>g%o)xA9Yvu3PritOk*PmT7!2X&#aO|Vk=pG~2a{1WGXR_p zgE>l4UMm$H7b0r$wzikJ{oJv(mqs9+QS`6EILDZbuS@=&Z5%$wIA;~Ut2=)?DwiM7V8y|a2de7gte_wyolz2Y5-{hoV zNoufec(7NxJ*CD7ZahunGQ>M#l7ayb)Ka^pQ*2}^2^dYOPAi<uj~;F1rK7F4-`>hvE3z-Vn_W?n%^t`Kao>fq*aO)WY&#u0N+&ig zJ}Q*7oyn@G$P)Y0@>jpY5>F&PG#&KoJ^YRX^+K*%Ss=<$$y_-}L{UXErgc(E5-&jp znr?_BbPwuI#L%IiL?tQGQxhLhEFNIO&2PPbbo8M$OJ>hnvg%;{q2Ii5`}B85i|$0V z!QOX<^!@rRpKN0Z=T@CRx@XJQI$o|_piwYoJ1MS+k z4@{;Nph^J0Rz&vw*R{6pWnO9y>5qG@xbr22mF}0)L#gr~)}4H_qp>6$<~$925GmFS z&0^K?9>3KCfKji9ml=9*)MPGa_6R~d<|%laTO_^BzGM?4)z`l!wMngf1bd$Dc#b>y zn)D5~h>eq4r8agA3&T>^5wi5Qbc9S$4}>iqA?)E5ky+fW9UZ(72IOS8<1gH;@(K&j zloXa+bBDra6BOoL3kUoHL_@>&^ECv-8f4FE#sp1A{n>?AMziib z$qd)|3UYAtV1Drc0u&k(6_1!N+06DIJd)YHfVjlPDl1-ccwBwGrPxwmkM*Bj&`JO9 zczs)T=dI|h&|7Ak>vWhY=o3EevYFqaC&{Tq z)3qak!8J0(ysUS8nYK5}M38q_I^SDc7B9UZ{n3JhIN{&iL_m^m`s*5hGQUi*X#Er` z6bg?OrWdP`5fltDi&4H2EUat@&_IR9LpUa5W4Rg%4tUpe(;Ger9WZ1j`qB}QTf#b^ z3yJPJRD~)R&xINrsUgCROu=#5G1XI4iK;2pV}O@}KOO%07*Vf-`?EeR$EwxqVsv_~ zH78B)v;dStjN$1NIP~7JcXh{s)q6EbIU@q&-f?ixy=5Md=FW1>?>pa>4E#k(Gs<^oc+1PZ8N16fN=wp54FANlzWFAaH=&b{ zfQAnN$J&Hh3yED}MWOIH7)ogV@}!cEsZ;SyN(m5WYD~`QDI`rOS`C|IRmP8uznuy3 z6YU4j3nT_Wj2)#Thq^tT0U!@=r>Blx9f|3`@u^wA`q~sTeE7h|h2DfqiUHkf@F7ED zuYDvW)BRyvr)4E^ilw7Jav_Gs7aQ@|s+U+3X3)W3FWt2JrdKY!z4Sq+^g^o5V&0dV z1qHkqhFbheojd#ItY@|lQRzNyUi9L?d3B#|Oz?MU#uKs^g5D++Bss#_E~hJT&JrXc zz?^emMMC_0k@h`{lHJLW=t%Jn&Ha_?_9*|MfFDXLc--MM6MEpA;3i*GXw={t1haxc zP`O~@;Da)-23idkDiZUq^f)0+6fq@S=PW6PuYLV{sqOpMudQ0PYG8bpASTE6ZY)hl zG*aHwjnBOO%*LsCJTs=3HujEB7KN<%fvc8PNnxb6k3uS-^=bnQO7TWH*Hy)gvgG8l z85Q}%i&JB8E8I|<5bHDvy5v-s&E`r=ju8y8&IB#)g!{#$77yo#OK1lAl0AaH(6h4> z(VSQ$yN2aB^90#@%0m!-u!JJq(ht2_FagGX;(L(h1it7V^eiZib?`=sRIu_INiKC4V|*i)2yOAx9uOS);1I@Ox3+wfauYF3K4 zOuA;4)LOn_QC(VE-J%WUtrDkDYIq@X0)YDCI7@<^#YJY=;(>PkSyL*zZ_nWm%{ET# zC5_}x+2RxIQr_V`A6&?+38kflYBDbn563}g9u_;~*cxbq6e@C1CRBO&B}a9MFmZHg z>&!U}3RApc!IDO{B7B9g^xk`|r1yg^5$eF`>Vbc3h|%r%WXnmGaS946*%m{#AHL;7 z=?R!_dYl?{EfP$pnC0-+&-WUwd!@fx$VwEwO6D^=?VyBEslcEkgpa6}lN3z`4yHZX z0PJK?bdvJ0Fj_W+No&{9n%>9*>{puinPiN$s+-au%71qGl-(Z(C}l zy-X=>xb4;D(X;8Ib!?q{o3`-fx)3Rmbs0h!^KMx*b`G$h3KiVGf3^t&K3Le`N(YJq z`T??m-Xc>Hm9neQeEFW!XjHi*jq+ootM5tgo!)c20)egr?CPwRuUfLyNo8iMvLbTl z7wD>#prGjauD7x7YW3UykBu=V=6-d>2Mvl# zTMd@Tw#(HL(Xa4!u(TMqUOM{n)hmcjWIp^F%XAv5s*(Aoy|L%plHZjaTRM->L;jn( z(Yu2hvm0`_bA)sevFNaIg4T5+6&Jg&Yy|O_8v!qQUC|6pyf#nEG;`oi7ov(2?tsOx zW$u{H1LI1Mvb{(D%T}Up@bb~XA}v#AsS~tIo6y!hUe3Hpod>3stXub!RwUgIXogZk z%z6oQ`n9kwl4ZuhA>I2=`@QF9hzRu%%$g3QTQ>nzmM@SQ5=@t%DGc~QxEVaeP4Jqc zE{Alb9FSjsl+J($zLMM^QvCIE_uhN%b>{Eb2iB!!>8wMCW-XNs%-qH6SFXIC z3q3(Y{R#O1|M$bvH>XTjkfI*9XHkN54q(mprAzIAYmU6KiOt`%2|=Delpg<6>)oYM zq5=0I!8m-lQR)EeDAT#pyIcQs9D(S9f?ZOoh&EIM?{pHpqp#BEz&v%nL&nrW6Gbh|z9nE=Zz&d4Rf@@`|1|q{5LbefQW~ z(y@Na-`H2D*4*%?Z7cqGjog2Fym_fl%A@S)Jyb3{)5Cj6+>5ufz_Gs;=VK3ci$ultSBF&OH3*5JvSrRY&ov&|RRcDKAZ z(cw&Ty~QfLtM*D4J5(^?V^3o8Thg=GgEmxl+BF8F4JW{^@$+qnKJ#x0Zx>;LPPL%3 zDdoN=vwA^5&Z75q_c;@~T)1b`pb6d5zaIJc$>lpxad^4*pst56UgwNs`X^hT+WSqu4jr1Y{0Y7^+WF+oE2$aU?qR7TA!Y3_<4M?r;FMCY> z>^ypYr$&JXSqv) zJkOTO`5Ya&wv_O*k&sroHp^$Wtud4XmQ7u&@r=;Yy;MG736DQB|-Wj=&+b6p7iRe>0zW&L)D!&`j4@G&%F8+)rOvC}XxURy=?4n#mJfM>!i*&PxL}F-W zkK9IO;HJ||)yaiLUj5NCL14o|7!omTpTvmD-|p^AUS5hQg_f_|cA5JFKL-naH`m7n zI=RB=4=O-BzC3o)xxBqV0Xqb!Tu66N_d)rAQ6f+M;=QQ_1*y{N7hRv__Fq%6 zbo;TFUW#~VpBOGkZ9AD-z}0_ob4dyNou+y3yBady!b zsk!m-lN*MHO8omWr)7?;DG;?sk|%t|#pff(gj0?OGPsDT8jDC;_neTvuR;&>6WRxhYVu;z}Q4(tjcOss|yB*Dg8?( z$7qdB>%TlPefo(nCH$-!{@qcKb>@6!)v8ydFK_+LNon%-`Kw;x3K}$`)|2TElxOd4 znm1NGzMq5F+ilxb_8P59T@woAsifhZH^I;PSC4-=bhbE?ZX%tNzIxlhm1xPGGD9ey)#?$3zhFH_?bxWu38Tp`)Pc?nRWaOu>(v7H@ zlDf9o9vj%k|G|rRTJ#G<8O$^XX>W<(?povI(@G+4a&HDuP4}|f?kLjO$)v~`g&X*S zz!hZRIEaPq;YHFl4|uw~M=0fi$Bt7-bx&?hoe~UINb3*u)8{@Rbbc6V9X8E&&~9{n*uB*L8l|I+P0y*hf| zNK4U>ZwhW$9hk9v`s9A;<}&=58;4Mm8R~;!)xYHW6)Fhbu&aL56A>mLqh-iT)S*Hi zVh9wVw0xuvlQ9-lBDsDgKH@D7cZu={LF`@K&_guDLmGUhP(n_=q-cY(TUG*b23?^S5*O33rKQWp`|kc5{)N;`2O~X&znq+_Ev|3VnupxP#M8lT)F{tXa(Ls#n=<(4Vni86uEij zxr*|XIyD@2Vjt;y08EWu4f$gMAVxChP$i+o2Wl3vT ze{-rKhD#EJ@$K`FxbsVGu2WcMOEg|m@UuFOGA&o#{-?NP{RjMKe8)2bxiy?IQ7L@~ zEfdOxcE*?_JT62j^u$+(_uY>$)saQ&N+fmRWYqgDRx#?5Qhg_K4@cvaa~1tzS?^#< zW`Xyt7j(Wa8^}hmNx-38$$rhAWADKLBXMvj6bUJf)Gkm>Ad7i46SLo^49e>yI{B2* zb1>K990uf+PH-K6bk+q9Dnu<+IR{;@1H7{%dPl))ptQ$`M*zGUTr;9ez`u}u>kM>G zdt?g*8%I+e)b4ngzX&&rURUgJB1?hOLAO9)H9pXprr|v~f`#QgMR(BzNda6c;P(@r z03L%p=H<{f(h)kKOoh=j`b@ino(y9E)c&-jn&BEcOpjEmQv41l;wO9}o`;I#a@++C zlTUGFbVU%HM*z_j)J`r69t!#tAQWWU3>5J`RR9)gdB0CAhvqY&gwCAycq!YK3^4~= zgvuc}i__2?MdiRTvCB_ZqTYCjI#r4M&?vJKP&BlM1bzo!Ovr*hl!mHR9HfHCSApxH z_%)>}6=iY?K;_1Ud`+soz)RIq6(jc}KB$j;D-mGp)GFlBi{i77)ILjGfMX*QP^lu7 z&l(5Uruqbjqf|dOC42C;y!70*CHgVZ)g10+)+;q3rPx=LC^ij82I1Ce|5%%_=(-gn zxbM_f6&oKe&TDW)Mnrz=9GeeJT~4&Bm2rjyl}4ACISiqiVXrP|R(u;|{6mGadqmF3^XjRN+iBC;*8a(j{I;}cU z@07mRjC2VJi8lAJ)Hr=VmtN#c3XOwZh76tEVRBtO>l&%?SQ8V{lltr9QoY8)prCou z(8rpVof99&zo$0yyxyFi#bTw_FYdbQi@S>F%w;NV(uQP>AWGk<0n_p}Cn%M=l&#W1 zQ?F8^1u*a8faiGcX6C%>K4w4c0nm)O${1f#2u;08%PBRg8040<3Uf<^7?%ksjlYiN zigUAK)MicZBsK!MG5oz&H;Abliwno-ox*RPpL%?X(#a)jVzRVWpmSMAb2e^;|)N>Gz+l?B(pIZGYpz!&J^?7uV3IA#fDWGz5!-lJEpLB;|`NorHQjTszjmC z-ebKXp;DtqKHLSOI69@rx=>|QXD6fq?ta z-5z8G>m>ry0eLfV$5^$`?5;@f6{yy5`LRZHqQn?YqRFDyXcJv_HU9u$kEVOCO|l9r zGPd;AyA6iW43kmImagUdZ_S_Xj!Uu#)}(89BpZ5f$xs?i(<{xDYZnP<%WLNGe%~&u zMWwcF>dSGPjxSq&{P^-^k`Em*VFd=2jvv(TNui+u&2AetQZ#Ze^;sFGR$5FqCvh8{ z`du#s^Pjs_ZwGu6VGOC*xC{(QwLV`|1K0^SVH%s+ssr4bxwJx~&e7|W($FlC%?8uJ z6}p(fyy8F|$MyZ7qGWMd(e^1woB-f1t5c`f)%Qzz-EQBPpX%Uwdt%=(%Pp?*dDze) z=s&SGi-0^1XD9X9Sv)Tgqgz>RGUTK9NQ_N9Lq83GlELp9$zvM%ysz-gU@o*P>@ot8 zBvrYXgP*h~k1U+C^6S?vCHzG9{bO7&w3J&?jaj zO`h0T?TZV?l6?;3_||BI3Sl44qHHcOwkQ$U=jhB-M2LSD|0j}cLI< z(l?ECuyNw1O%tPQd(WNgxDj3x#L3bUEsH+V89N2YUfIe7UX1~7qNg`14158Zng(zOWHZZB`0%GAORjEQ%lLEDZf_T|T3sl8!I;#U` zLC?`F!N%B3r}6U1%@mY$MVS)1%M?`#QxHb|q%`cV#bNea923nMVrzz3v?}Ns3Lcz1d|VaGZ6{zYv(1C0 z+pqM%ZPX1Mi9n&bNM3gq;|L#;TA-r{g+kJ|O$amzg;)r_FfI5sH8n9)NDQ}1jp0aZ zYk2S8a4Y8yvu1fU+MIZv9M{m5?SZ7OAgFjHo=>Bx?N1NlS0B$s*YYK&MZ+^&$qq(y;2J`Akhi`c2ew>|nRVJ|Sf!+aP6 z1uA_3C6dCF3pjd}fa9HiZMXut9k>Xpb%|a}7jksHyp5k|E3{*c{y2Oi_|PAG zh`OFh4RBc&G$TqC@@WrJis+;irPD*bRt2ROlCzhji^!QyY1+f=I%C1(1tSq(+8Eti zlHSo+GH4`rLZ(DJcgdJa%=4rhKoU48cD#7g_!Jcr?WTl_Jqf3{>OxY?6EV_v%-xQT zUBX^UPkbEd+B+0ok7kMsTAXo&M~7hU^b)=q#~N`GGPzUHO7LiUnVon@I@HOJ-Z=_6 zDirXC>;@!6f{D&`N1+2C+EK9_`LL3i+Z(_!_!&XEfd~XsfPsT%7pdMLl?I|2w}EMg zTKqJ4TXlP~Q?0%AR;}8pcRBf(9XpU=*4aMi(;@xluMTYQmB9vauS}aUf6bctGp6Ou zPE1_?*wn17sgJFn!PktbDh-XS0y`;{vcC6PhqjmsMA(v`xE#REiM-7hCt#Y66{;ft@pA0iz} zSjM^~tb=&Orj}C=FhH${=v%+Jm=XiYNEry&a0^Th zBfXyf>(lt}6&c)%y(v8>eTO@|xAJyoIC4Z9vg7-^8t;(adGcQAk0)o`^A)eWqB?S) zQ*`rc;4Q@;&B8y9Oe4?x%k#91=@+#jfR9jyt@?H-ORah#q_>7ARkh39fB@D3W3KC1 zv&<;a&PF<|bGI<`^2w7}d9$oZp~+O} zUY+{il&BYt2mU@3DjYROmt#gF2W44BEOhDDq81nEf`JhYWw1aXHH381y+hdo+Nrn* zGQlg@BZi7}u929YwicQ7X-uy$NOoFff3r_rJJrtqMjMfes@&YFTw(Xb8~1JAcjLtB zCDUgMmLV2l_Vgvy?TV}I6+)DKArj)lxMkb-GKVQIL>(R~uayoQSSqiWaPQozjwvmWi`5;Z$A2@%HvTz`RJQFbywZnQ^%PNos)tAUBF@Ka(SRW84X)B!CJ#z22<*6 zFILV6JQ&l^M}Q6(c)JH(8`__uVljNax%qswO+r-n#_nxVZllNzLw7H&?od=O-96Om zbXsXk=-Lv)$T_oU?p$e+)PA|jkP`P`MC@VW<$aO9N$Vf_Zu92v9$KHI@}zrIS8hh> zCproGM>Y@@;Nkzjs$nMc*boqi&}q(}iu(OxwOTtA8vYwi|HV6pd_H97;{N}6O{&Vv z+WKw$`|0(`$?H%5eIwCdqWzc4PO((~o43=5~p6-pOh*OVS)S?o$2~{+?jdTqg(ywmH0_V zD%`WDkb2Y=@4*P`b`9v^k4Q=o4#_!czsI0fAd?iXC@_o9#e0#hy+pL-V29`mXdqPPkfAXtkqjNQ(vnVrWf-TBTXy%VpThV+J86Ln zRRp#Xoy1s_v=%@m47R+Ohj8Q$<>ge#i&R$ZM_w6-#oGB=d2fN=puxe)0#QAxvb3tt z?34ue^qu+z%BH$Vc+`C9wIREv=|ts@$wfJXgfPG%Cg$}+WMsYTKKgCVO_kpDSCH5n z*DH-ZoYw0H+U>qBy;99p<%HK14i#CrAf-58b<^}83QMISvAK0k%SW;FnwhQBcCpDD z?E`46QTr&Aji3|xKw?*rVpx`w@f!#AEj1H04z&!L1u};mB|_q9*O}dIf%q}x+2Err znV;|_NIW5zU}}w{6RO-*6RHmRLV;Rx#SL)}rWC7&h}cK_-4AbHnrwAW+coDF^$^2# zBO-Nu7op@XQJ@X$hVgiuNT$^GE*c)VO9#;?@nOf$#J9K zcAdcO&UtQNnXqe`S-EqLWJu4H<`178%;gmQ$ILyD!XBEoODLoI%RG#1>xFj%ydpNI*<~C9GFl(tM$4k0N>uX1e^R$82$DfY?lLM-#^|M8<&5`68_?lI zW}+zONRW(_aFD}MYD}OJQ}BB<$_SQq*+!ufh5XaUDxBptqSQY3z=64ovj&epFgGWg zTZWn7!2B`N{S$6Fe9V^`4k@*!YL~GJViIz;0siMG!tc|X;FCr^q9f8_xFK39z z5-I2WGH22Jku|J7vluFZ*S4ooyO$OX$ni<9gm>i!MAz~GJ}qp4=EO~Pa}SvReqe57 zdczL;XeamLz`=%~C#On#NLyEMNr9EkdUd?r>nI3mnhinTd_i3sNUt)y6hfHK+!rb` zXLcy8qjdwaxZ47?>pc0=yE*06Id8mCouwWT$QWb>#q8{RvOJh3vil}EG_c8|{0VqtyR!Zfb$ zil#aV30s_eQu;?G-UNINjDl>lDw0u-0?ouQGHIr^Rfa<9+R@KVF55$ zL9={*3VN0oWRD^8lK`fee&v8#z7vuJ@%hSBp1jjjG5tlyuC>Q18Vqs$7|RH0l1ZNm zcn$F|c17tRF2fKn^08NkuC~t5i_27NCz>~nt>0*?pJm%vf6W%dgjK3*wLwQ-N`Bm& z1EmF$*nf1suS|32`aPO5UtWmc96wD{?#r#>m#GBxbaj!3do&}3wU^WuVW_?y8pI2s zTz{EnS^NRM;*w%=E!$ICnC)O6Cb%YU*N&b)YlL(syKls-rDL@>OpHyH6sk;-CEeXEy{d`^M~UA#LiWpps$zpKvy!{UCw86PWiw7no zP1=|^!8E%nQV=DC`{xYobKtLT=B9rU^MRz0!mkt$p_Ww?B37WOaq4@$`j(`Z(L4|u z7aU$2XykeahldZ(`+yr@AFJ9n>AhtOq}`zrQ8GB^mQ*fv?g2RGft&C8cD51mja~(1 zv7Mp-OGapv@?00KVgP|-Q5U9UB8o&0sS$u?X_TP|8;v#u+1bLLF4)iOV(`qOG z_+Z!c5$&Z+J^^45xIOwhq5%T9hKM7@C1MbZ>b|+VoTKeK8Y0u@9{9WYz}&h`iDnS0 z1p9#HPkMre!2^Q@b)ZdE4>-K`c(s1Bwkij^n>C^KO7(@AnH4X9D%FNwGE}8QZ=0Ak zKsVaD%RDF}FhZSG{l*(P)#W+TyZN4VwE=#$v*Ot4NfV^|$IL$frkh)qoiq2q_`z9= zi4aTeVofm3b?k6OJ{xI^&#BsGGG$s4rH^Pm&BYomHehAXa>Pbf3|N%&CFdmlC=^Bp zZ+30l--!od%UJJtpe*)(UenI&eMUaJ{~-y3b3542idFMO!6?b2KL*5!Ij$J_G7Sr+|rgT<=t zsL<=Q<``~>G#0^__eLIyF>AF3{@EC_HF6;~L6xdO(3hF2gbH=ySZWa2+&dbFKp^3e zwTe+xxh{U56e!Uk5YTuaB}C^z2aFt77)hW|=r)j$!9=k1^^Cgqj;cXLuOmT+^`K4t z++l9Xd(sZG!DMC& zq&w(71cMWseA~_!yk3%~qR#;naQ4Kj;5Z<%w`pUifwy#_ugmdESS=N;VdElD$UO9S3EG< z^u$wyF14y!M7QiyqR!sd&7JEVJjVu68>}5{r%k;7QkgHVkQADXZ z8=k=_bYU2mRIwLu>Hpw%&){~rumKQyKkbyHtNsA`x-_(n6?TPamdyb`avHBdMaWsO zt54Qu4p-qWPhP7B zf;c!c(gu=82Sjrs^=VKnkxz(6PJYhqfFn&1ZtFo|V{lk7IIP3JxOp-Dg$;}AhA&y% z+%e$T(q+f){QQ`(@z}DZ$FR}yvGhOBT=(|cwQpbd41cdAAGJjgY=W z7F48EVCw|7KC4`_@Q`%j@Rl#?a!2Y$yX(H(a#*@>XrZP&i!IpCZu?U!yMarHK0e6N z(~Bq3GZ!yrav56W2OndfA3OH>F)5v`W5%`T+s>~Qbc+^_KlJwUrEeab1kY#e#%sW1 z1)*?#;Vn+n&4y`=>8%LZ6ul2fRa=XEk^i@E2CN;a!ad zLb7BsK+ZYv2%?eA~Kv}WS~~$IVP{89HcxWKO`4m{y;*=fr#%bZI^yvS|Imm zr2~&|+VuD)mZcZ;>Dm6JFV!%e%N3J6Cb{2B()Y<@u$s(tgI-N9 zYAPLnm)GYB<)v}Ukzx7_?)1Z%r`X|56DMriG+|=o?u6{LUY@ub`ylx)dY7v|{EuBO zy=x5J&t4Pf>6Mn9U~?HP@q!^W-hrIw@fL$io(saV-c6`NQhcNa(eFK6<(5t8fviTe2ViJK=*+{_BKX?>ElzO@@yBqSvF zNz*#g`_dQso>?*!OO31{6cAu<(q3FiE&KoQp620ZwB10gn54_f5&eGl37agIM_uR9RZ^068 zmiYOw@^LW?KR)u|lLbf_jS&FekOCpqT;|9%GQOuQbSsl8$8G;idiH?_rDs3iJ|VBZkLUMlL=mwS2y9+vhCwAg2mVXn)s30E_tpJkl$y z*fSu%FhyERIvs|x90U!RMSV_0WD!gih+;(WMJf=%Jaz-H^c2Xf2DK-8TR^l&9k}3@ za?<-kgq;!0Yef+X4#trn3C^E&f>#~#I zcUa#^@*U$?-+p$_eD}hN*#47Q==?rw`4Z20{bwrngkfNxc=j4&JIW*9d1i5sSO+*FW&%vPA*H>)gG#i^0hLJ*21Q<1YGUj9u$uxPlPzLa=~j;p(&6w0j|L+ zS^q(P!zq4BFh?|wXqPN68A-trBv@WZOt~0*LGpUX%neqUQlCHr0C5Y_z0Fa9fobB% z!=ooNa|I*AKjMjt_oWnoH<+YZzIDfBUOJ{)wRz_x?uOZXVw|AwGx)7Q(WgKmaY(sufE+i9hOTeI~Wzvk|}?8NQ&OYpx(+-~s6w>BC6< z76Z3v6RTLE#1*I8Xj~zV5_+VUWov?40ZdQ`)3ig zD>3e{*bD1=6;7)0mX&HCJ~?{D_r2%3!Ka(|&r8Tu_sbqTJ;Au=dIpjraHH>dSNigj zf@NRW#740JEOVmt7Xxn|v4qS1U0*eLL?(_%RXOvtPxs3lS_1FKLO&<;PUBP-y_%mq zLRXfVTr)E;{?$`HU;V(7Y}}%u(md(;^_LVM+&8V0#-aY0&r)I0R}c{s$Y&EKQGjz| zFc4@EU|0#>8?duTKq@c*n$yrK2BItHr(uKi#^;YecUbyrX6-eCa82z@W;^`c@zv7n z_aqq}kbe8=R^qWALW^|ox{6UHZ0e_fW>ZV+E3cF8L%B&lG2y*^3onlV>?GAh z6;vKl>Hz=(uK@)_A<5SwXz?m}ivrRK(C1|69|uod5tMf1oQo@D2Uq6FA=L|rV*7?a z-aPI80(N)FXVSS7Pu=tBU0-LLC%njPkN=|rsYT;lM#ZIvLbFHb)y}A%J8J&k)vpdH zy!gVDF-vb*^H|PQc7c0WeD|i^f8fTJra!*Haxu&~K& zd3Uj4$PD=Lq^=Jk;J18h({2%8Y6Ds~_sB6=z^7_BUrp?G6 zT%8{iUzO1R?6G4n4fFL1>0@-x+sQbsIx~uaN~w| zd9+gKA|&h41|$UX>Y>0*d5PJCqE~_#2Nb#j&t^)>Yal@%pFk=(qQm9f+!=92Mh841 zSWLm`=&O{olfYx_X7odvtfHF`HL0~aU!x5w1^AiMGf)EHb%IKE6_qZg`_Vx>e6@1% z-b2TZAG~?d;_{3bp{P(~mc)XYQ^T8g-?Sw>MX5E$*wZ9?RfRp#Y}9JXt3<8Q#97o; zRVJ53uT)i5T3iY2#hmOBb?B0DEpqtnIf zHLAHY!Z&Z(kYEAn({H@z&V$$Ml#9zlp^B!ay|cz7s?~{%A2(p_%&EmCB|(%};H_S6 zq+DWcS(Rwwj0TmqvdWZX5vwZAu7trW7S0(_H(^5E$k`rMg4vWftv{>hwl~f?w|Czg zCS5_Hn&*`_&6-g?ux?O;G_7CF)(0oQuxsbeKnjQS=W5Yucy7%YzsSdmLWT!Ev3+G(b#j%Fj>TBSu>f^ zpw__F0smj++=867(&hxO&!GQv`Y@|iXYj4uzI)T`@{)$@R_&ZtU{4vVwD&FQYmwg1 z8n^EB%;|Sbsf>#>R#(-GavA!}UQpRrsZ6q(f+PCnmycgQv6sdOggjw+{)1!E-!je1 zukU5hTC;C;s5Cr)iK5A3InI=)RK>7+lB)_bbh=jWP@7HX=rcB5nOA?)_)$A2*7Qo$ zaO*4G0nXta8BFNAV*bedf|`lLQzA#lGi!P#y-z zl9w(wls=@q58ZI?bE1^#wBlgX7XKVt@AV>*=n26tghev}h|K z49Acbsu>qTZYYI_ssb#nyBT=J<#h&UrmM7CxM&D##>LSSBX0?cmY>wwAlHA`)f=OXtB?`4oRisQZ4=|BwuRxG^w2{Z{!MGYh`{_h${bV>?josn9j zE%O13HdTA$f7dKrUr7PbWp}i_aX0z4k>3ABV~{Kz<$04j=?Dpb;8r?+FhzHU z-72GEc6M{Q9QHYionTo|*EUFRa|#+Hd(T-CE%&e%V`MQsn!8EJj~<3v{KOC(JGYlk zTS+PlJll(L@ke=%@=}~dR0Y*tAx}4P1V41{3Y zb3@UnR7HAX#~FtDqpEy}jiG8i15RE?NGR0)(x9MQ3GA`4H;@>?i%F*Q6un*M8VW`$=60JJjrr3({3V6f+6E?_ zXIK%zv(tMgdB_cUh$2^v;LFJ&wo?b(l~JYZ7aDC@IueOP0qa<er^N)+%bc*@!y_d=@)A1hV&Y`*M#|WlEr?!!7C(z4)c>-EE zpq9Zhrvcs%0%=!;NKYN`75gBWmy6Ja!2^<^UM_akntdtFmX5r6)5ft0u{j5?%`6>I z_8Ob^=9_E;Rk*tL1*t8+QZ&X2yojLM7*3UE?-lFP9eL!k$%uQTM~$PkXW<=RUElQT z;DW~SBP!~LDB9cdLiEuuqtzg9Xc{ra;Tr)D(_ z8f{rHH1A@gRZ519o0R9v4Ahw=+5h5r*Q^hr$K^pAYa45O%)_JW!dBpq#2?hMh1s_ zNS)-d1Kf}l;-q2RVAu!lE@1XRlIuK=%E9l9sZEZXH!m)^HfD0b9gq&V#`}VRPuER2}!z+-;9AM#K$N(^$dr~Cf#Vz za2h}+P~E4?x|v+~@r{7BhipAjgAC%wWFrj7Ir%bpVMBI`Q1V6Rmv&2a(w_6W!t!PHqx-(kdM)E)4Q#Px zP-b~U!`iXZL$g`dAA66kU)FZV*tHD}#*n6!@*Q>d?xtGqR)#);Cnba`p7RTDL z4Q1sG+(W%5$K@2jXmcy{0MJ0?lQJ~u#~R3rEIzM7x^I# zQlrkL(`qx)(=)VMZL%)2K%*(RKo1+c7JY+ElPhpPBBke;u550~+o(>)t6n8i#jmf8nW1XBHhB>5lJLC~XT4=89`r<8QxX zqo(%VG->F%p(XKvpA?60yrrwZ%D(kcH2MUE0zD1Ak!E1(kZ^knV785N)rA@bqOc%O zP!I=&sVE@{{0sZsTw|meq5(^x*bM>FMr&&o+{dHyl3e#>)E@J@7ph2zpCI6rl)!;} zbZJoGMHSW{k6`f>o*oHDoqQ^Sg`fw6_kl9+{lVYw+IM01=shnk-1Oy;KP;4Pf8|%w z`){vX_crtW>O5O4g}6tS!BGCqqg|HrN0IE}_;t7Y8@Ic&W3<^nELwHL?hAVtzPM-f z>iO5*)3WYu>3vWS+~OUsT566+u-JE**QM{jl$JF!1d)`aqi?&xr?lc75>`tm9zoE< z{APq=n1Sfb#C?%N6Zo-hk325iZrd06icOGWI__c90jj(4mX42>@#7+Kjgvd>V#B%h z9UpOM3VF^}hM^NAd+v4UC~`(}NOzE4kg^8SU36W<8;LqX;upt~5M_!Mid`J8y?hPsg=j2!n+uy7P56f~wevR;29`yHc6Wcp z7?p{+Jy{-iw$DD)WbUgnRVP?#tmy^Jq>2%{&!hX8T1}V#BPJFihc&5%`_^P?;+n9K zze*Ja{BAR*{=e$p13ZrE>KosCXJ&hocD1XnRa^D8+FcdfvYO>?%e`AxSrw~V#f@Tt zu?;rW*bdEw&|3&4)Iba*Ku9Pdv_L|PA%!HAkP5cO-|x(fY}t^!$@f0r^MC%fcIM8V z+veVL&pr3tQ@lQ(H{B5hU3cf}4x7V@V;L~v)I?6_*wq6t@dtRqF(&Zxdh`_-87jFo zg{9(bQc^a6km*oxBtb82j0+|3Gt$9d#X?J%2b?W%t;(wOlfeAIqtZ25;A4nbqKVe@ z8qq%asL^OLI8WZ5S?G*P@uv8q)`9n^>;UDX_ULuK%KXB_tZ0`vF~1;IzRt6IISK77 z-|gv)Eyz#wx}viZ3-c>|-7zgy^wCu`W4o?X0{{rKZ1(}3OoJ%xgbRfJ&Tt)B>$;bt~Ya)oH02^A> z?zHL{FI=YWUC4L_u%Zs96<+WowQSBTzrv!*aGs7Lwv$2y=zHr!2B#q>)@n^jG<&zc ze%{XG;hsiMezkXY7Y&E#ncsi?kFPxOhr2$1aeo!7dhU;Gm3R31ubRC%u~1x$o<2R= z8k`#4%yc`wIbK)1ExM;C+7=&Q70n)*)D%-t6q_iRE0U+rIPYg$_ijm?=dI57%-;XT z{{DGazWCW)*MH=B>?8TP-^D$-<^HQvZBbL>I~nhcugb8+Us*55zK~{%u8P0)+2_6; zKQ$`angE(21O97%3H)Kw^?{5e3Q?J>K!-R4#1|JrMzTtP{cS}&H-*?hL0I&l<9B)i z6o@xu<10Ov6^e?+7tRS`%uDbl8>L@f`0%!E4`2B4(2c2kKkj|(ycU=)HYFA;TE8$q z!RSrw$;uu&5M2;nyJlvhWBAIBoSaoVU)Z|&#fw(@lk>v)QC#ne4`vi5x*f|iGwWM( z&Hnlem(96g&CKF7mzmpEY}>YC<+g1 z-E18(f+jMBv@km*uT?$Ws`}>>XgO8h2Io!Cra!F>uk%$gXCXL2%;_N?C)hp_*NI3p zLO*9c^P;nL+SwtN{ng&RU&-&_%08v`D05%sR4GB}+=id{&fc$1=bESTv%dZrXyY0B zl{^}LttWv8RCRvzoLD`v1a|b__0`w<=ggRC@<{)xcgob>IE|eDZEy5ZXQ)H;UvvRJ zdjbx$K;{Ty_n9R3hq1t>(ZxW(1Ldb;KSs(Ir|$s|xUMuAwG~zi!?c^=p=Xxp=9N5eEhR^|KX^olF;(A#aC4bl_-Q$^6);{6eB9CdQM8S1*_Np2I_X^o_%P!ZYABl3X2mGHCDR>zQW zM&Suv;SA%DgXBtCBtD({cutV6nQ`n0z7>Datx)gle30qL!MpT$DK7KGg=;Q}xGrCL zhbpgr$I8oHkxSNCrWGK9?4#dNFioHy99v&Fd2%5?fZ)kv93s_6;?u<(n9`0*t40`| zB(GDt>P$EW@i}5Ty~yEd;=6Jidwh96CF)-;PiHsfms7YL@Sh4?@@vou0_@DgLsq&# zhhK2HffFY(<(4WC=bWG-{d9<+MByX3&V*<_x!eGAnboY! zVK$59QoQ{50z>REr`aUTlM(s=hgAsum~KePrdLx~Ny(-!FvJ~G-=7XqIVNI9;pqII z$6`h} zUU)nZq6Cr^WSIYowj~UDC{{Lwnfvzd-?yE;CcnZ0a`CA(tXe+0Mt6$8THSy5Gk<^P z?*8iW0Q+#?e&O={`%X5q*H{4mUmH89JGBO)3O_&wHUI?r!jI1{DLMbgtO5wHLJg~P zGaEJlV5LoKmoBp`3*P!%#3>-bN!W00}QqoFh(U5 z_I3)fCvSpLkO+H)?~@-H`}}!1@Vqe~6-Nv>$hb*}RUVB()kzcIXv>RX!ILKas?#Y8)jb>rWA^~=6v($U zWv7;bzCwQyw=J5D9yuaR>)f;J%XMt|KlfcEXDhZ1Mq5|NV~=fprP4LWRr$)+$KUT=ltlgu{Ty{aMm#cPR0)3*R$@YWTsR5O zIA6&3uq7mxJGM^9vKoEz&eva;clwN0t5JN%h%MXW@_N4KSGXKsT6H43YU$D{@tvxr ze8cFd?$owzGFd;+so|5iQjSx)d+x!UG@i&t8RFUl2M)N;WFt$Gv>s#A2-r`dRf$Bi z>AxOF>X6ofSS6jCQVeH>63_Bk5f4s)J_ddop~SgAl^4$0uxL_c;p{9-qi0y?N@4$dG>VPyZ;IP+7B1L zH0+AXb|$CfMJ`#pILf$q_uUtd_-ge+T1HGIX8whfFFttPFP~?DOJ@u`aOZFC{&3Uc z#a=jNOyaR{(}54sc%S$VvZg_HCpz$Th0GxOa8#?DCEGdhE2#WZ5~D0D1?v+*oGL@y z5~4St@wFK#p0gJL8!tbqFgW?1{-==hxP0QN{{E++Ft;7OwL)25*Re+~}0H_}6{CX*0oRXs#@+*Y&tIGCWw(8|;cD7%( z`BrA!|Gm`Zm6GqX`1)k_`wVMT-pgz#XJ2RMzOIw+u3x!l?^F9u>>b`S`DOn1hN7`w zU@^4~_>H@!av%5N}n6I9m zvS)bjSNp!dZ_o1HYhK1z(VlUf-X{s&m6#W&542T6n!zXlB-zx%Zsmv@<^mME79>ML zJ3cXrLWL~$buQ;TKC1C5o*G0`w)>7%&%^hp`% zPFq|?O75ft_f)HXp&{OU^dVM<;wBa=KYGqq1O1V8N|07y+)a?xn6F!hKB9F>;pTuu zgG6>AWXypxT=3$F|H{5PfuwtsIfqT6p!g_fblgBT7%}xo@&{5J>HaLZjs@h9%YqV%e4vbA=;aBYfUvbgnw@=pZFuUNz%ud1nDwW_*iEIp78 zsneHMX_ zOssGM6bn=xAm$numq;aA5H6YM&=B$gPUVSqYj_0A35IkspBaRNOlh)^@*l)_*+1`L z!t%(vaBx-6*t5)Kf5+~Ue^q9Vmj4#xvhjRVG@E003zJT~Ab(+ZyY0;SBD;<`5~t*q z`YYmL8HL&7%l&ydRY_6&al}`hiH{qPhcZr+qvu&HZRLV_`A)#~k&iZ*wwh>!m-}4xID_ zG^|!*hXR=*3CtZ5mh)o)CdLgc0m4fdEPG&&LCBw^P{FgO_mH~-?9zsr#KP#mvO2hc zvxrHAjG%kK*wcGJjUx&SASDKl6_f~UxKWN0g>ATjcg2IUFv4DDhIegjnoVz(j4U&g z86~scmKM9#o8d5-jErZ*FY~#vuc(+mH7P|el=%H6I9dNlEq>- zCKQOK&1)^5DOO{2RMC>MI;)}kUHOZ5ySHYo%3v(oXq_V50rfescC*N3;p{hNyS_($ z<_6j1L5esaFF)`iMXdS*)BRx;MfGCI`>FhUYz4v5ql z6V~H?*!H|}6V`n|7DZcb6R+jmIa+B5D*-w%hIi}vUr*BND`6?@Q1GX~hzUw=5E#tG_8d-|q?Y7r{^tJ9yvIzVGg7UAc>DpVJI{$37J zKpTy)c84=_2JI+igw)j%EJDmdjF=*-sZBi{Y5Ne1L-ndKJ{HihqBxqi+G{X96iGlL z|G{@8Be)RJB-ucc0UeJ}_x-rqMQFffI}}py(;M-K+BG>`$TJwnFg_$_(V_dU zLeDGQZ8H51d)NtVcac%BMhudDsp>4h$Wvc*%4@ zB_<3{JjklBxfQ`oWI|$avv5WXcfRUy;5Gb@BO}I239C$V8ZsbNLdEKfQiTN%)(V`vnnc%4~>T=X>a7EQFGF(W|S5SHevO_?5Ko{=$M%3jD)D{ zgRAvU=plb*cVtH$vDiI7+ZVNeOUnF!A*G?{ysNXPic)d*;@O3vp^l7r;epdB;?oO~ z;?y*vF{5l^s_1`H6|*O@bgGM2bJ)b59V$;XrevjsF4pc`iDl90@lh#JtZh-o>?o5d zYIeq=HqH|^8`4>|x5T!IS#D%eZE=RGdGV8`EsjD9(N1%LIS@VjeEBG)kpFh0{8^hP zJw;8yiZf29$oLm!1Gf?ltM2PuuqZx{B-E7iYs@JhQQXAA2mQw3r&xPZW+JwBFm*)p zlny~C5zSLD`3o7iGvs22^zN_>I^cC4q*_4q(FB3rQ`|0j?2=CMIf5W2Km3toWM!vi zlzI=WCm25bfy1AalAaOtuDWsT+2dnRS<|d{TCMtOTt1GUUVG81S8Zwhs0QwPHSlL2 zl6yOPQ0GZmbFeV0cu8}`dWEfdIH$JCpPo~+ymb<0&)DTuEJ{tY>h-wVK8~Ayeb=g2 z!F@Wz4|c=GODFXP0G$2^7||CBNkB(Kevkr?=O9%lQ26Ma(f}5Hq)bnvvkt6}G@~@5 zCpaQkML$Sj9Q}2!bu^*H27(Y&q1#d!Y^YE4CPuN}&a=hXR_)?K$rrKtYxmE(`Pw)p zdhD|ca$}N`J%-q6Dd`n)9m^K(T@j;qNrGi#Z}EI4NT$cmQqCJos0+Lpu)rd9YxVMb z{q|J3!hW7)oXb7OYd+RTUGx2>y@&KXZBekLD7MHKhskO1B-JlWTi&yNZ=+|0$Eu$k z%}m^J@+>tyP^pl4lir0r`Z&<3I4dJT5Q855Kx$qdKm#EG;>&`pqBlw}67LtCL#LKr zP^n6%fyx4~<*FiG1V-UfAAC0&yp#+mgZ~~%Q{JqsuAZojX+>h9)otd^YNv~T;V|kw zjnyf4Jm%1wlZ@WA+aFxF>u}bxu>V$;T3G1A0dHd{&m$Qi&%i$XYT9{E^}!V4#yOG@ zxn-#*#kEy@H8v^5;jNVaaasPNc}0*Xu$t$x(A-sHcNlC;aGKT_T^V~)Ry}at+B+@{ zjds-~GH+I3hCelX>Y9z~a!p)de>>iD{Mjp9Ci%J+`P&&nMU~C)1Hcf&Ir}!q*G++s zxLxQS5{1Pd?SfIV21sPH1yE61Ks!KUYfG?yMm_;z`P__1pOuD?$VxJ=s`*pE`x!CslJ5wr>oJ+y}lyT%s!BB_805*;dH&79sLC)5WEie6Y2K2gqSDZl`=kM z0*kfyQf4Jw$@R<^E!^f19mUqN^*m>9sQUf1+|tZH#@W+S=f*-K_N$nf%=FprKVRyI zNz0rU^-RQ=91A7V@|>)4p(%P_cE#O=ljT-lo>=ZH&xX9AZ*opnkX1|7Iq3zH*P5qh zW)$#snXJ%ufpGPsoaB|xGLx<#c9?O}`6n}NPQ^}BrYr$x(!G2%> zr!KVMK$Rp|rN>f;J5Bo(?6!P5qU|vT%3c)Pch0badE&A0SC%xadgP)DLtKPqj?|r8 z?o4ln3%Y;A8_*G&Kvo5>0)u2`c_B+7F1@WH1_DY3yFQvf#;ko&!`5i?`K#NYoc!vw zZuhEF-$IndWj?=Jt~XTX2><-lWSdk0{(V+nEIZ#~zf4?zEI*C=4Br)kB`oTJhvkp! zW~`O_65UI;CT1r-cp*$5nG6r}itnyY&N8{3ZmY-W6;2F3Z*!TeoxgF(pZq>$PRf

|iJ)rNwdGr)EOmirSOj@aI>%6ZNkal&y#akd%Z!h9PH=pX zunSE4#rHx6xEAD*#{#Db`j(nTHb$rq( z`SIDCw`IE4UK1Cdl({%QKiRpYvTI-Ol)2E3n83%6*X4lQTMw!im@x|=F;1LfZo~Bi zz8NanVFA(DOnN3USPvw4gNFtrRu0qgkpyHaDRvGISd351$@kpw`x|c>3KfXn$u&2; z`YH>)`XD!_1eR6A#F*dni;b15*+r!}i>5Wk&f1YAUQr*cES(1_$e9xt2lm;#X>q1N z^~f!^j11l7%FB=Wh5XVRZ?du2qN$s&8EW$xAD=en{wJ`EcLpk)nsQzwbcYS z`Gd1Uxu1V+O&I5g%~#~+ly9P;rmZu+8N?k8GcAjx>r1RXidKDjVTGVLT0Jn;=%&b4 z;Rg2DM0S{X%2U^#WXLMY%5+<^EuvA1%GkN&g*j1>MX_d^W76@)P`%T0883Go2a({ALKF?KFD>=KXUSYGYYJ3Q7Tk1Ni}n_TnL=PkP}eZH%SJ7V22 zNmh?T@7kRtc?vyJuFI61o{T@EJ6rOw6X){5n9c#d;0Ek*S7H2tlnGpED3z&Cv;vSa zF%Afdu{fd=#`T$~KS;8SP>%}g=rPh(qP!r9DH^uY8h5@~kzlghqids+!c%8YwPtRg zpBPMh53UQm?!}(WIA2w`YGpXMVoJCwB|bBDQB<7UXm}4v=IzL^PMtF~nB=H+N83#a z)$d57Y|nX>TZ*nWBxEG|@?BYpj>LtRrdlofq=r;Wd8SR0(sQyC60&pBCCQOlX-REJ z(p#*)-3yQ~%bk~!kQr~dvUqFdWm_=^&YauN$6lVGU&EvSYZy4!f`Oz{;h+$3V9B;B zaIj;o02H~N=!ESD}J8h-5^cocoYSL{%o5NvbyP58+$p9d*FRvk~X$=Ub z2Ipk}2>f&XbGS231p}FPi6cOn+?AjyX?&<~CXM`ez-!(c^n%-K7h6Hs)HHe)q>mS?`Y}S4F6yJZNv{ z{?h5q!P@gT)#`PHs~cwK7U`ouDNLH`&)28CXumgfp)=WFNSN)*w59lQ;%<@eNHWB( z;4HB)EeiZSeHrV6mm!lQtzc&11LE9u=UrX1aMP?*^-M*vpV|PLc`fWelWZH9{J`%M zerZ`{23RdQ^CPZ4aQlQG&?DU6o%IWH$X3#vA(W62?Na2jp^HF=uF6HqmHu?hmG#yG z`BM*eOqoC5?w{kg&zn`-ad1+}gKuTIj(s9YpMF3I3a1?EsGAAop5<3l9GX)2z?+#d zNRfO{{>!0F?;Kpc`rtd84l&!onPdH9{rnpK!?DR@lcgVy>BxTpA1z3+&zo7_acD}> zgKuYgKKfj*|Ma*k`|StwY7TWyn=#*>3&|$?{F!x~hbaXr|C3(-$p^0Nw;n8-a=5c< z{yck1;SuJ5q2+fsZ+e$3HamFo7?&?%+qlfOefbl1lTgOs9qiBK}bP zSV!N%Eo;293od`*1>x8KkdwXXWuZBXda7=zaJ%IXKYCJFdh$1!Mt*y1V_f6{$v@*z z-^sD2{Vr+7ijV`Y20{@JRSICq&Z6Yl^wHK%S;Vm{VXvZ4>(mBX$~nkA!t_dmJi_9%^0c(_i*qJt=OiWP z+?zc)Cnq^6=Q}yLPaeN9>tgwx`_Fsx>V+|#7jI6UQl9K9!>`YmT%K5B8@Tw&8Bxhi z;p54R9^BjCYLgqPTdJqFP30rAztuAL>ayZh?V%MJ5PlVBFJa!g$(8b_tHeopS^;G! zq^Nvl&&D<3;D%|wtQE757RN>x)b!L&^0>U*EtunDoy)$wG(BO`vPBh=)dq0!I}c{Z zr5BW~6n|e?R8(2?)#AbAyu9SWkZxNYBoUo{l-2Ltox2TJG9myfNxy{BQ);oi>mE`510-d+FPV88sw+UkSx zY%s4{&0kks-^g4k>kNfQ2g^GvF1zW%#X%hGK+&Mk@9w`utges@Qk28R^sz9avHSDn zlE#U9_&CUpkd#0$3$77pXRdG+A+HS>aAHI;VM6I}830cLF{KlU3}L@sKJW|c1&ytj zU*5WAa%a!}Bgc*%x$P%xMQ?8({;}wDNC>_uHRX~yE3SI}s!5SHlCOAu6Q%288_%T< z&>TfyjLy=t@Bnotz!;F60oD&mrd&BL(<{=?pc4Rg1Y{n)uH-wn&Xhk~a_cKcrp_6C zWOUBdr>}2qwLce}yWFzd9q)&}>f^=s;G|;tJJRyFf%;XWqpRu%;_CAqJSUoyvllx1 zUH}AA53Fm5s9PM$y8v{hG1t?dc1>}O1U%O@ z`h1N(y~$h=A4o6sT(IawV+E^xz*Cty$FjQi(2bJMnqZGHvYerTc|{fdQL{pBABPLm z`V_+@>((5s?YLt_#m^EG@^ayI-(yx(4*81yDu%FC@$8S$Z%8YhNJ zp`~;R4$V~dPG`0O5dH>X04mvw4)m}Lj1BP$Kwj7dAV=`I{a_A|5QCH~2C4)D)EmBn z%7evN71PkL^|n5#skpJSF|bBy8&r!3Er2im7X|g ziAS7ZSqK+sje&V{XU$zuyigcCSx8FM!s`x`p)9I0v}Q}AI3qPPGp#{t+_ENA8C7O5 zjotZ!DaJTU5QW~gK%lp&GlZSPC@W}*Gfw$|adKLL$5Z5+O6vvj-PCU_fxmO?zyV75 z8XTSrd1O{!wPc}r1WXntL63%)Wq{-1io(Zc7E&ro4K!}h1ZXDk*sy~@e<2g~7_2r) z&t@3~bKV^nidnhyXJs;$Icr|NU)p>}78;vrOt7qdLz;_UBRLp!(2j`r}o`(yqxwEOv*>ejs@{S*0p2Pb~@x^Hu zH48pp!0Qd9rig1UN>=(tG|jw4tV&5sOQ{l{&o>HVe&NWX@>##-waMw}$+i6U!zBT$ z;p9594|3nhbxNlnDfbVuW+^$nBsR7rJvrmvM-~#e;M_O{Jh?vtuZ+tb#p{w`2gr}T zXh63STn#UnT$x!C^9ork6B>4Sb`wJ$FeC|?tPIxED7q{QNAi%vD0A>E16flmB8hfr zD)>WLegPte{;ct9Sthtuo*0*+=pExF8yjV$%Sxs;Xd{cvY}QL@?|@MdZGj5yrymyo z4MgM=JJ>Q;H1Q7DE||B(Fg6u#apjN2cE@k|*avLHC9e=}a3AMa0Ho1%B?H(n@7TO|ErL3%|m{Y~T!xA+4+ zd+Sec%BAoA?QOR6O*Z|fW5?fOFvE6B<7e}k!z2V7^!(6^>}U6#c<2wee$F>M%O1bw zGKiT=^{mMt6|@=I>tls>ga$z-7bssm@rlIo6pf7EF({ zRm^N|<~R0ScU@2Sb=S%BkJ_V;QFaO0p(3RSeUEBa?L0yGMiV67R^ZeRI|1d44$B%a zmPiy9Ed-#WCc*z)pbEB)=qu0q7VWFFq!Yh9=3JS2QB*&zxNv5X&uN%nJ9e~oKC}iF zgd{^CrXVTDpOaJ&6W|ZIZ0l$ijbG2|1)J*>^ng!P(|ZxKSvVh`+Ko?^A4{7ubH$vT zx{i*z;#KSC2E`PM*MxswO9~S)?G-o8>UCnTP+^1?NR=2@%})+=u1CQyPX$d<1Kq+A z%vs`_k3#@g0Dx=aWuOH7=&5nj+~KJI;aOdBkq8SjGNqmgjW4?p6wyWJG*;+~6Y_I& zbMq65^%add(X*g29bUBK`#W}gUrd`QN+07Gd(jaSu_U1x;E<0H zEa(9dY{_VMYlWETaGOkSN1|BK+C932Po=_l$iJ;7aH9*0Mwu}Vx-iR`*m(q*>n6aY z3Z+oO14HrD=-2vh2YOHi5-^!cm8Gr>YIa=PT`1%{fNk6!M@R#{fA#FbPKml)6~P20 z1`0*f8q`8xKe-Wgv%<12JnQQnyXU{?Qb5p`3iPpcN(X5cJ;>$v=-S#Z(JNZ_zB#(& zYdy@KRJwO;-RX|}^mOn3?R4D907142$qzqz zTB}j9g!`i#Uv|z~v}l&|IamZg&|n@y+5C0C-@AF;Dly%K3Yn4d|@i} zw0S@>)vg&21d}bg6rRfie$4_Ve@V5ydj;9v-77!*8A=y>_n#4K++X|ocGk1~^SiVL z>vbec`N;R6hI!SMe`d3l>?fwb{MAjWtflFCm> zqdjdEvu9U88A1W&6Gxw%8{gnN#=VHsa?*bB4?V>_AimbaQ4Kn53gAksICqyTN5su zJD1&}$mz((kWj;@r>z00&nlWd6UqA4QPPQ1{onQD=~bGSDuBTM6;91O2d7F3(W2s9 zLYn8|T-Uz|(uGlC$j(HT1b)7sgrKj;IXEZj>WT+fM&LD1J_OR4Ls*l*q z(0*St?x?Cn66Xlq2=RBXfAIcmuf0F3!jl#b&CDrGE$O=Fk~`|^*v=7bS7u(Zditi- zwW-ZL2jmZbwQJY=ENTCiKfZAN(wlb|t*M++%RhlqRfYV#{G9wl`NvUtlN<7qoXx9x zBKzeX35|WLYW%Zc^=lYDzVEu5<-IgK1gx>U`KST(A29 z7zKa>5}U&3kmea3T`C7PP8?q(!vL&C%aPcrM^Mg1kzT=ZU_koGHY{==3Tvr$@}meu z(76{7H1?;&I71DJEHUJbY5U7kF&c?($w^%6EDR3)04!Cc>mjVaVxT%7K77Y zh?pqBk>{-y%(hC8Bnm!1{Hf0!vV!feb#LkwVyxaMx5<@y*LL}%dvho98^~G} zG!Mgm12%DxTp%-y23ElgP>F!e<8u@r#M`blW%*7XNs4jC{))30i@_o{144R^Rr8*2 z&`0p*=TzY~ufG2^DI z;q(2Q)BlV7uRm}~M}+kHr>C!dWnn&ErK*Cu zE0x>r%5_Y=!9E*3GS~n^U_5eSLiybZxnwPulF6?oQ?HO%i>G#=8S&=)RljeYeqj9x z@a&1IUpOl(sV3iSmhVvVt^C?Gs8pfKH-G)@yI)IBZS@Byro?W5#*eMGzbgOS`0-~wIj{%qH??L=S2NXR ztHxf1SHsRpw0yA>v zFz!3P#c0_0114N`D=T_$``GdAPi)`*1iPhsjS;ks*I=%!9eIAkj-xhnU5(igD{-f> zshbOzynpf4|Gb7RU)uk6%gU84Z}%;`lj%N}&tEE7O~uhZ@RAp>z+(@yf;-KIp8I}x z!DI5P^955(tf|OqvWk_zW+iuA#iVDpn#>zsli$mvI=7$FZGCgP-e?YHo6X_93;UmF zwmN>eWA&Yr&E}k-$*7<8?giVAU#2(g{Ie=s13AS}aA?3%B=_Db)9(y}j{!}bz<8*~ zJ?g%B6!NI+Chq$f<~O#PjBK3i&fUL_9~G&2j~%7mH(fB+3jam%K`7{~!1cNu7L~(+ zy=h;dw&bj>vBtMm9KnNrBUkX)?+a+$*pYEY0AHsXIp-+-6y9(hF$h$CqJVmdLqK&a zaz)CwldWB7-owEOwgIH1fMZBlS);Sa6aa|k1qDt}&g~oVTYJssk3Tk>_X4fr9*@9T z&wOZNx4r$Zl4;pQ*Tg=hzCoX2Y{;`c@qPYdySUmWO6x80W2*PAyVU04t~7VT^GVy+ zhnU@kPx*$lr}N4$i@LL5fcjI#@d_-FBkZq{^@S`jHYmR$t@{QVp0)EJjtpP>CVHKC zwK@aG`T{8vN%%r}=W%B$ z(_Hb|gBcG?AUFkN5Y~VkE(GrtKO*q7;wN+fJOUo29}*gAigXo;osss59xv!U`MCtT z0Y-7tL3UXoH<G9z{;ZqrR6sUVoNd1cHI&I+7p&q;$?!N3uAwtrmOGDX%no4MwBE zYcw26x2D_tR;zm3LQw{z$I14jT^sfninHcc`?<&9(%S_|Fgz!CeQEma<*PGWbp4^j|Y{)20DOhSxob0p(vRs8Wo6THMV&gai%S?{*q({Z?zGt@82bgi}jd`<0OI%h}?mLwImJ5vIN5RxqA_FrH zs@2572~8G=#8x69z5(NV=>~rmtP)1KN?i~;E|k*J)1YM>DD}XM1K28x)-O3(Ze>l-?J=9$=Cy(7F3C?I= zOiomcQC#KDxT_pC^QMT7w4}n6kv>CmQNZ``#3MQW;Ul8Q=rkAw7UD+1DS2AAFt5=8 zA(0!o*B50lJByg6e69S~^~sLO zw|{F_PIhXxNfa*p$t_zOL`Qkrd0#$!O=hMi9nQo;ugPP(9?98#=>=I?S8aao(^>ZT zhF`y0oHk=sMkaa7nFW=1eN=iTkVoP4?m&{jrHbrYIKMKwrruJ`EsJt?C59YnzC*C! zQE}jx$A82GV{%*XJUltl`DgiwiySp_^I88y9q~t86c=iP4J! zOUleNTViVGPR`iymr8w3ZGBv<)8vY4j&06#i|cM)Q)97u{jKbLX4*CPHTjQ2sg`&c zEnW%xe1QwPR>j9#8~m4DwLLeN$2j6+6B4ZEl*vZl{wrR(WvDeV%`t1Tf8LPXfbq*b zW!1kU{S_xw#h^f!DHf-&ED-(&wMYUV2B-?j z6~eSPWM;Y7&#Oer#)Pmg3sa{oS+olnaA``?^re-%BGFb@dQ7QI$e5a!8S92~PqrcW z%%9*w@2k%r?vR+n>=#QrVX2g@V=IT<{4WbG{r+p;zjT3mV*@q6gZa~+$nVMWBaO)= z(wr-w`rxy_AAe~0qngDl_DX%?Ehd@uOH~qD* zwHg;Z@OSyv7j9++e|`O1ksR-mTZaNy$`}2WEw7hQ^6Gt0{p{86?_I%@+xEVSsR4Ns z&@>7TC3|*7(9tHD?tbWIUj@DF`(gVBa;IdW66dL8xw72&(=`%gnh zzCs1%*%DQD!bmw$!sq|PoyLagim<*d!1{JI(VBo(P%#kG@j!@A$c(}>yt)?AcAAc2 z@J=zY5+y+c4O{4OQ9sO*D%dbC07Zs_2{OW>#H3(>#ID;VMJbP904q|7Nu-?yyrbMn~K9OnSo4Fk@c z)L8C(P5yJcZF;~~_JlV8LqFap?nsI^<-%FC;u!KJ(Ug!T#wSog@j;JP4s(1%Im~fR zISKJ%T7pTGUs8NphLdtl@$8n=Zd<7rjaq-iUuw=|`8UZgd>Wmb;xa~$zD2TtZ;eJ9 zT`9TIpR$UZaXdqZN7Igq5s^!a3Kj~lCj;(!JkeM~M1#cqv_}Ts%8;Hh zH12(EWcaYY~)7fzL!mxZ`r)XYE+ zt0PLtbgAx?I7Pm7M1JY^N97k^h`WTX8fIm;KgP;mi1REbqDk8un00no0QaC}BysLa zx3F|qR+-lT;-vs4*|IY6gBc`0&i*HwK019KPci|*!?%>)e^1Fn^I|@ak*BfZi{;nY zyPtP_#j9P|C%d zIzDS(x!~yqYn5Ecf2Jh9=^Lm*>{(AS!%FC^F4wi_dSGSZB6y*CRQIgzW!*cvk942n z8zGA2hoCFA71%OBmJ$;}uWT`($E@x(gc!ZDg-~`0;6^B1i7*L+hrI!1y{AYTqa2d@@6zTCo1Q!H`o@u428IC!p?{x+;^E?Y0l5?UBS4;X7dxD;~Fnwu*TU^wrhboN7w;8N~lBoLGfs-|Qr^6m6 z2+l;l%xXx>v088$i^-UZMLaqhS4nhP%WM4Bgv6RlriFS|_PQ@RG{wp~{yIG%EZUUo zugVZZ>+5|x4?i${#-&@97wLlyF}@Rnc9YvxVpFd7iqUC_a7yKjN)&H{44Es<7~^)Q zj`cVli3wAjPDi+ket?a>MUOv_72z=D&!M?0i14E< znc=Akr;1+YFkp|BV2duyO}yg#tJ$WZ$8Pq0S2##myV-&$Vlc3FA#2Kmc5Q-#L0 z5dz+Ga;S1VUEFbVF#@!6v5 zh!ce$wCeIJWPazJe&>?M~T7=80Km%%z<$p*1`g0SAVL7MV*HckBHJs zx(s}m8rCDeNedfv-)7sjuu&Jww`gIL&drZ#VT&%8Kcj{1y2*k7-b6p-jkmzhX%}o^ zbi&7&51O0JIJbx(G##NnXf$m>H~1emZ8;TqtN9^B958d9Djx*_BnRC2c=rLL}j zV9Q`vN9VAwzIkKBH@&&9ZHq5ZToNwy)%5iElvhK(!N^c#aATwm85+=@KD43+_=!sE z2Spn}bbsG)&8Emue=i;uBBlfKE3@Y{^Evd%Nyq}q^SR(#-++v4WW;ybv|7X-&TfSF~Z~hqFWjn z9O~-t^92jb3X7GG{Lcz+#D_%iDb#h;r4bw)Q78J)4gJcsQ+e}ELq&O7k#4+U?Z~0# zRP)d?btjcIh&tMkzE|nCZp1Ysmg2jxAdDb1UP>Qw(Nil@5796-_C%V8A{eLk$e?ey z-#6SD@tqmkp-Ag6eRz96UgAwV2Fo`**xVNBZ656QH4hIDcD0NsN&5PSyILbd+CUGY z76PVohI(+=cY3V92^Mu{U`eNd>@YyM5+r&NdQSb`=CjHyRK85tIXpZ7y&h^_vkFUv zUH$(}2}KwwwO9I-(JDgbZz{8>2Orrt6v2Ci#-ZE4`p2Kc8wN^9z$xJ#-EN#QU9GzY zwu1KRu406);cgXD1+m@36aLx@U1YH&13UfBU`{0vPIbGEn!R9GPWFkVOFwLY&BcM z*0Lt-|C(6~@Y!cN8*624EW+AZ2kT^AY(47+^Q{;9l>KagZGa7wAvO$?up8MXcq8A! zwzBiEF}?ueliS!RyNF%PwzEs%c5o-#1xb?2pt`z;UCypxSF)?v)$AI!mtD*DvHk1- z`xcC{UC(Y{H^N8IL0ITM%#N^|*|*s(>{fOgyPe$uPgi%byV*VLUUnb*4!fUymp#B9 zWDl{2+4tBZ>{0d@+^s&ro@C!=PqC-j57<#y<9wDq$9~9u#GYp_uou~n*-Pvv@Id`C zdxgCUBf39hud|=CH`tr(E%r8hhy8-R%id$ZWWQqXvtP4g>;rb3eaJpyzkxN?-@$Xy z$LtU6kL*wE6ZR?ljD61j%)VfMVSix4=7)jl*ytck(D6&0XBhW4MQVc`T3P@jQVi@+1y^3#>Y)@-&{#GdL_q z@GPFqb9gS#c`5L~KH}Q46nYZv( z-o_)m9ZCR% zG2hNF;XC+FzKdVVFXOxU9)3B$f?vt6;#WgcbuYh`@8kRV0sbw19lsuQ|Bd`6evlvH zhxrkHGygWfh2P3=F#jHZgg?q3=tm{3-r4{{cVBpW)B)=lBo#kNETa1^y!cF@K5wg#VPk%wOTJ^4Iv!`0M=V{0;sl ze~Z7(-{HUD@ACKfFZr+d`~27Z82^AD=O6Nq_;2`c`S1Ae`N#YZ{Ez%k{1g5u|BQdm z|IEMOf8l@Sf8&4W|KR`RU-GZ`34W48H>a)ewVPskSv z1n}a7VxdF`2&F<07AV6)nNTiN2$jMlVX`nqs1l|M)k2L>E7S?~!Ze{lm@do^W(u=} z*}@!Qt}suSFEk1ZgoVN)VX?48SSlMn~gl3^dXcgLoh|n%{ z2%SQguwLjEdW2q~Pv{p0gbl)=FeD5MBf>^uldxIXB5W1T6V4YdfD*|zVN|$CxLDXO zTq5icb_%a^VW$O5rNuYT+7TuW+rfPuMRU5WXc`CtNSwAlxY2BpehD z35SIv!p*|Bg2=@!$6&}#-lRA2uhlZryk)f_u z{ZOQNu(i_|>Dw6T=^uzlop>G=hlZO6&2(vs^bQPf5l29^i0xfHy~g3rCQu+95kA~$ zpm5jFFz@fy4@P?XH%1Iw`}=#Fy84XDy?8^<5?BLfsCb@jFMZ?+8dG;e8Y?HX+DiJ;Db zNb|4(OEsvfP9rr%DX^!%wOefOY3?xNW7-Bf`}-n8=8gS5BfXI(w8x?asREN09vRSY z7;Notix^ta9k>g_%^f0sLt;yRf47k?w8BdRgI#^Y`qt*&$Y8Tb%PZdZwCTHso3RjD zh9jGYn>r&z1)7!crmnW(PBY$h^fmQF+J~)b5KHE8WYD5MD3qa14X+;=8t!V}BGR{5 zy87CXPR*xW!>{q|sHvXV|f@z>l%BMx zL8TQ&H9Rt4Rs#w|C|yKwgysx&ZH+XwkM#6dweV1Hb5D;mvbnXVxwrXrv&4?B_F)l( zV>{-^V8j^N0zkuPm?+TN(?1lkqQCmO`Z|=hOX$zOh_SV~C(_r}Jg6VUR-wPw(AwYI zi}BX?Hh1(zhRx&sH8OCzAE|u+_u);E$gmBcJ}^Ku?5h8&g&CfB0W8p zR_fMvbnI}%+=*dqQlVQ3(tI~4p^*WTa;FZ7Qh~GS3`9ns6{8g3I4f#o;OtCP3~+dV zOGLkE5Ocm$8g3ry9?}D&qR&h%gI$sKR%~L-1i9)wkvazZM+Sga`nn|mS5 z$Z!*VDdq_UF-g?`b*n`UDt(1{1I*qxBo6ft0@QF(vKf>RCeQfFMj(PULWMOE?d}J_ zbO8R_uq3tgV~i~tI8#dNIB3%Y;rL;|>o9hC14cmlAjZBK7!f$n4BXxcq&d>lVgz2m zICn(sN*625pry;IKB|yvpry2_x6OjQ!=3#@==_LrXrybHM$AY+MK$VMu~0=KSYi5s zm1(6^mJ|AfmXWR=%$5!#G7r$YV`}b2?ah6y5q)o@t-EX3(oRi6E$bs_dIal0r_%3Y zdvSXts;z$n1J#6f;!2$veO8PLe`iGj{?2-)Q8Ay%Z&8CvMxz=gjH;ARNeyk0p>8Z2 z`kv+ix+#D%Z0+rDq3=>=qg8`<1>VdXM*4@ z*#IiVra)PRWx~p085+Ti#PsbN09cQ-s39aPFSQPgY~4zI*A;1vU;(89iOR8`2@;{B zAL{Ii^t9Q>7aFxSQM5!g0lfl-M!JSN(W8Svb`e^5Hn+9`L20YDf&ml&IV(m5kh7u) zK~2o0AgIpa-ky-yIy6+O2W$dmnpLby9jRc^A*_xrzrj<OOZWXSXNDEchhc(j6pqt1Gw_b9G3NSBax3s%#S zmWaBvX%FIN46}(YO7!V8)R~4hzzv9MpmY#`n|t-`plQ1Yh32+CvAv|M z#NN_1+ycZ7Y^)9gFk#Q2Wmvf>QI4K|RCI=zvQ2m%8JPH%;L17Stvbawfz0jSG-SXu z9qjLFlQ1zxHlvwcEwr`_b#EEKqSik$IJ98|ivq|2fJ(o<9cZ~HBGQEx@ZqijVQ7Sg zHXJt4=B8_7L}(f5;2XQ8O_8paerz22@P`Ct0lV_;m<}rDrnq2?`T^r>aF0rY)2pz( ztsnG&vi;CHzpUK45u`Y%Ql(8uRbFgUS2iW0sh^?(bSb3^ja7MwE@8Tq(WRU&6^4<% zu7;ADV)S)$31TWJQ$;B~Ql<*ZR6&_4C{qPxs;Cf~g2hUX778Ipuo%?@i-T%uwJ0c9 zj7-5|WC|7|Q?Qsal@!y3-j-0N63SG9YJw%GCRjo_N+?GOI4p?)>g>sZ?&8yc6tS?auu2)h})>5rX_)S#0r9Q0P zsqi3`5u{p!RBMoG4Jt1vYf#HNjVcaN#UUy-M43XADMXnfL=X`ohzJoxgo-PqjS=8d1PLTUR91*UB19k&B9I6XNQ4L^ zLIe__5~?IXl>{gU0Yiv@Aw<9sB47v+FoXygLIeyU0)`L)Lx_MOM8FUtU#BTP9k=(tdha0PlBIdGvI7<7av2Mv0N z20es9$AxmxpoeJCLp10i8uSnidWZ%+M1vlpK@ZWOhiK44H0U83^biethz31GgC3$m z4`I-8p&Wz>LWBuIzy$4qvWPN20_EzA3Q$d98u~B|eOSW>fpT>^1*pC-0YI1lAWSGB zOt2KD@ekAZhiUx7H2z^4|1gbzn8rU$;~%E+57YREY5c=9{$U#bFpYnh#y?EsAExmS z)A)x2>a+~hXf3Q!=X{_hptiiGRJ*GaE>NR2wML!!ftoVyeYtiYFRw;>uGQ{!+Pz-8 zPgC!;TD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4swOYNkTD`Sey|r4s8qy5Z zY4z4=_10?v$(?k d0mW2@EHO9NV8h3u2x_sp}KECIB>@9+Qn{FBV{ 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

5q!RY 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 + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/FontAwesome/fonts/fontawesome-webfont.ttf b/docs/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/docs/FontAwesome/fonts/fontawesome-webfont.woff2 b/docs/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/docs/ayu-highlight.css b/docs/ayu-highlight.css new file mode 100644 index 0000000000..32c9432224 --- /dev/null +++ b/docs/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/docs/book.js b/docs/book.js new file mode 100644 index 0000000000..aa12e7eccf --- /dev/null +++ b/docs/book.js @@ -0,0 +1,697 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.hljs")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ""; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function (el) { + el.classList.remove('theme-selected'); + }); + themePopup.querySelector("button#" + get_theme()).classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + updateThemeSelected(); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var body = document.querySelector("body"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden') + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + body.classList.remove('sidebar-visible') + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (body.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (body.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + var pos = (e.clientX - sidebar.offsetLeft); + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + var html = document.querySelector('html'); + + function next() { + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir == 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir == 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground, false); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/docs/clipboard.min.js b/docs/clipboard.min.js new file mode 100644 index 0000000000..02c549e35c --- /dev/null +++ b/docs/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n + + + + + Code of Conduct - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Contributor Covenant Code of Conduct

+

Our Pledge

+

We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation.

+

We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community.

+

Our Standards

+

Examples of behavior that contributes to a positive environment for our +community include:

+
    +
  • Demonstrating empathy and kindness toward other people
  • +
  • Being respectful of differing opinions, viewpoints, and experiences
  • +
  • Giving and gracefully accepting constructive feedback
  • +
  • Accepting responsibility and apologizing to those affected by our mistakes, +and learning from the experience
  • +
  • Focusing on what is best not just for us as individuals, but for the +overall community
  • +
+

Examples of unacceptable behavior include:

+
    +
  • The use of sexualized language or imagery, and sexual attention or +advances of any kind
  • +
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • +
  • Public or private harassment
  • +
  • Publishing others' private information, such as a physical or email +address, without their explicit permission
  • +
  • Other conduct which could reasonably be considered inappropriate in a +professional setting
  • +
+

Enforcement Responsibilities

+

Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful.

+

Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate.

+

Scope

+

This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event.

+

Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +piper@pipermerriam.com. +All complaints will be reviewed and investigated promptly and fairly.

+

All community leaders are obligated to respect the privacy and security of the +reporter of any incident.

+

Enforcement Guidelines

+

Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct:

+

1. Correction

+

Community Impact: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community.

+

Consequence: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested.

+

2. Warning

+

Community Impact: A violation through a single incident or series +of actions.

+

Consequence: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban.

+

3. Temporary Ban

+

Community Impact: A serious violation of community standards, including +sustained inappropriate behavior.

+

Consequence: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban.

+

4. Permanent Ban

+

Community Impact: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals.

+

Consequence: A permanent ban from any sort of public interaction within +the community.

+

Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

+

Community Impact Guidelines were inspired by +Mozilla's code of conduct enforcement ladder.

+

For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available +at https://www.contributor-covenant.org/translations.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/contributing.html b/docs/contributing.html new file mode 100644 index 0000000000..4d6ebadb96 --- /dev/null +++ b/docs/contributing.html @@ -0,0 +1,266 @@ + + + + + + Contributing - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Contributing

+

You can contribute to Fe!

+

Ways to contribute:

+

1. Reporting or fixing issues.

+

If you find problems with Fe you can report them to the development team on the project Github. +You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.

+

2. Improving the docs.

+

We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide.

+

To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.

+

3. Developing Fe

+

You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling.

+

It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board.

+
+

Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master.

+

To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.

+
+

4. Community engagement

+

We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter.

+
+

Please note that this project has a Code of Conduct. By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.

+
+

Processes

+

Reporting issues

+

To report an issue, please use the Github issue board. When reporting issues, please mention the following details:

+
    +
  • Fe version.
  • +
  • your operating system.
  • +
  • the steps required to reproduce the issue
  • +
  • actual vs expected behaviour
  • +
  • any error messages or relevant logs
  • +
  • the specific source code where the issue originates
  • +
+

The appropriate place for technical discussions about the language itself is the Fe Discord.

+

Rasing Pull Requests

+

Please fork the Fe repository and raise pull requests against the master branch.

+

Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge.

+

New features should be accompanied by appropriate tests.

+

Finally, please make sure you respect the coding style for this project.

+

Thank you for contributing to Fe!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/css/chrome.css b/docs/css/chrome.css new file mode 100644 index 0000000000..2314f7a161 --- /dev/null +++ b/docs/css/chrome.css @@ -0,0 +1,587 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +html { + scrollbar-color: var(--scrollbar) var(--bg); +} +#searchresults a, +.content a:link, +a:visited, +a > .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +.no-js .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js .menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } +} +pre > code { + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.no-js .sidebar, +.js:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +[dir=rtl] .sidebar .sidebar-resize-handle { right: unset; left: 0; } +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(var(--sidebar-width)); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: var(--sidebar-width); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} diff --git a/docs/css/general.css b/docs/css/general.css new file mode 100644 index 0000000000..e7d20da725 --- /dev/null +++ b/docs/css/general.css @@ -0,0 +1,234 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; + color-scheme: var(--color-scheme); +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); + direction: ltr !important; +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-block-start: 2.5em; } +h4, h5 { margin-block-start: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-block-start: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-inline-start: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + /* Safari does not support logical properties */ + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; + background-color: var(--bg); +} +.no-js .page-wrapper, +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} +[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { + transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: .1em solid var(--quote-border); + border-block-end: .1em solid var(--quote-border); +} + +.warning { + margin: 20px; + padding: 0 20px; + border-inline-start: 2px solid var(--warning-border); +} + +.warning:before { + position: absolute; + width: 3rem; + height: 3rem; + margin-inline-start: calc(-1.5rem - 21px); + content: "ⓘ"; + text-align: center; + background-color: var(--bg); + color: var(--warning-border); + font-weight: bold; + font-size: 2rem; +} + +blockquote .warning:before { + background-color: var(--quote-bg); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +:not(.footnote-definition) + .footnote-definition, +.footnote-definition + :not(.footnote-definition) { + margin-block-start: 2em; +} +.footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +.footnote-definition p { + display: inline; +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/docs/css/print.css b/docs/css/print.css new file mode 100644 index 0000000000..dcf0ba64b9 --- /dev/null +++ b/docs/css/print.css @@ -0,0 +1,50 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none; + margin-inline-start: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + direction: ltr !important; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/docs/css/variables.css b/docs/css/variables.css new file mode 100644 index 0000000000..10a7590944 --- /dev/null +++ b/docs/css/variables.css @@ -0,0 +1,277 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; + + --color-scheme: dark; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; + + --color-scheme: light; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; + + --color-scheme: dark; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; + + --color-scheme: light; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/docs/development/build.html b/docs/development/build.html new file mode 100644 index 0000000000..6b4dbcc968 --- /dev/null +++ b/docs/development/build.html @@ -0,0 +1,249 @@ + + + + + + Build & Test - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Build and test

+

Please make sure Rust is installed.

+

Basic

+

The following commands only build the Fe -> Yul compiler components.

+
    +
  • build the CLI: cargo build
  • +
  • test: cargo test --workspace
  • +
+

Full

+

The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system:

+
    +
  • cmake
  • +
  • boost(1.65+)
  • +
  • libclang
  • +
+
    brew install boost
+
+

Once these have been installed, you may run the full build. This is enabled using the solc-backend feature.

+
    +
  • build the CLI: cargo build --features solc-backend
  • +
  • test: cargo test --workspace --features solc-backend
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/development/index.html b/docs/development/index.html new file mode 100644 index 0000000000..f6303ad287 --- /dev/null +++ b/docs/development/index.html @@ -0,0 +1,233 @@ + + + + + + Development - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Development

+

Read how to become a Fe developer.

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/development/release.html b/docs/development/release.html new file mode 100644 index 0000000000..048fe304d9 --- /dev/null +++ b/docs/development/release.html @@ -0,0 +1,255 @@ + + + + + + Release - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Release

+

Versioning

+

Make sure that version follows semver rules e.g (0.23.0).

+

Generate Release Notes

+

Prerequisite: Release notes are generated with towncrier. Ensure to have towncrier installed and the command is available.

+

Run make notes version=<version> where <version> is the version we are generating the release notes for e.g. 0.23.0.

+

Example:

+
make notes version=0.23.0
+
+

Examine the generated release notes and if needed perform and commit any manual changes.

+

Generate the release

+

Run make release version=<version>.

+

Example:

+
make release version=0.23.0
+
+

This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.

+

Tag and push the release

+

Prerequisite: Make sure the central repository is configured as upstream, not origin.

+

After the tests are adjusted run make push-tag to create the tag and push it to Github.

+

Manually edit the release on GitHub

+

Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.

+

Updating Docs & Website

+

A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions (See GitHub issue #543).

+

Preview the sites locally

+

Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.

+

Deploy website & docs

+

Prerequisite: Make sure the central repository is configured as upstream, not origin.

+

Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/elasticlunr.min.js b/docs/elasticlunr.min.js new file mode 100644 index 0000000000..94b20dd2ef --- /dev/null +++ b/docs/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.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 A;{X5v literal 0 HcmV?d00001 diff --git a/docs/favicon.svg b/docs/favicon.svg new file mode 100644 index 0000000000..90e0ea58bd --- /dev/null +++ b/docs/favicon.svg @@ -0,0 +1,22 @@ + + + + + diff --git a/docs/fonts/OPEN-SANS-LICENSE.txt b/docs/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/docs/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/fonts/SOURCE-CODE-PRO-LICENSE.txt b/docs/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 0000000000..366206f549 --- /dev/null +++ b/docs/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/fonts/fonts.css b/docs/fonts/fonts.css new file mode 100644 index 0000000000..858efa5980 --- /dev/null +++ b/docs/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/docs/fonts/open-sans-v17-all-charsets-300.woff2 b/docs/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9f51be370fa913ce6de2922b580c262c4822b337 GIT binary patch literal 44352 zcmV(;K-<4}Pew8T0RR910Ifg(5dZ)H0f7hr0Ib{q0RR9100000000000000000000 z0000QE*lUWfmQ}!0EY+&fhq})G!YOAg!yQMtSAeP3IG8%0we>R0t6rhgFFYi4Ge-h zTM$x_K;*{m=TyO<(oF`$dr#+gT@uRz<@OP72f1way{Ld4djxa`IG0*=K;{4c|Nq>i zF~-^s+Z{rPn$}0zLzV=G*ddk#MfRZCOSo7Svxg)@O1QTM(GtC{-8am>TkfXJ&}5JO zXokZnNWAaG&x#r1r&DFc3k@sfl$|@RDaX?kWW{EN@TZnHp}gCDd}u9PW@H>gZ142z+QEhtr+J1&#|>KAj6Y2`)3tZkBe+ebjmTS6=W*;+$iHPBB3Un)Qo?6q*dE(P3T9y565vHowfyevYxI9K2P(y z$<_L{@8?J5hBF;TxvX%vUMY{MW;AQOFw;MRE?UNs>(i)Pw#F30SO&%}gA&nV#5ynh z%lr4w|41^EwI78NR7X_&MdMPeXq|gj4oJ6}tzd{4Fvwwq1Zjy_sfS1l0YYgJLOuSa zG~qZt#{MG5VL1;uY?c0qywYwhjn*_`$CiZFZCFDFz-?kG;zz}gkK?(Z;(4Ip0|Y@p zL`0q-DhfWlFW)O~_Uv1l(z*7n%=kiif-51?{(S1>dTz;-%RXz{zW_NG4POWVdSfQ{H?gb&VPWmSuI@as@lXQ zCML+EVq_sv+K31qR)E!rHdbOZcI*#x`rpX1-FQZd2?w2J5+HD^d^xN_9WLUu;R1_>$Sl2l1j{i_PqRoxBKXmEfAv5RRCG~gHz zoRPqp)jl)`>4DtY_ee=+oD0vBlrtv1+}R|)Aj>WYFNl--dsEGJL13vB!x?g=A&fDlOONKn#&pyZ<<^Gt#Y5O9+B{||V8CFK!GIY^G7 ziird-fZ=XPfYkAzOvx!^1&5rvR8_9Zlqy%TZCti4x_G(NsHD}UoUD}Q&&1ywU=hnR zK_eK;d!w1V-89?ZEBgl|7bFMOFTBI&;bU#pwZ9KM5d*ckoOlTrnn@#e=0bxf_LKF$ zd-0Mi4MXYT*CGx?Tq%ZXXdY`yIWWVJf|?K(5DNrL%GP_mZs@nw-vBb}Rw0W;wB!)N z5TjzUSNZXIA7943^nXK*r#Dw9|Mtf&ksu-=h_`Yp9V;Dkh;8<4psUZVb-$?#qp%T! ziAdB1b$5t5hjOzR8iD$*)2$e71R6>Zt8%DEY$Sg2KWN&b4Cqr8h>8`6#((@8#L}XktLaTS zryU~vMx03nNxOB%uQY)H>VL7pz)zP2nhY%8WH@)-0RsdY-07d0c5ee-ah{%=QSM%u z*8so2)#K3GU!m!|?O$6+?&yD~(Fj>ZOxK05BApxGi zJr7YET6WG{j1#TYt(MkW%SPIA4dOUU&zsN+<{}nS6r*LQrr)v8tl?2R`* z6w<>(odO>Dg>%+<`=H~%Re+D2bI267Gb@WPo}vT*tKEȮck{9tEK*~BMoW% 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 literal 0 HcmV?d00001 diff --git a/docs/fonts/open-sans-v17-all-charsets-300italic.woff2 b/docs/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2f545448418cba6668a2e7d49e9616e8c69dfd15 GIT binary patch literal 40656 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 bQBM5)6s%p?oy_T)fR3IrepgG2|qH4K6n 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

D& zKmG7e67!kl#@t`?2092GluuaI?(wqHGc$CxbhOu&-QklBs;yusvX`9XbS$sFoH+FwvSs*$VNBEt-3}x$RNG$?<{E4Ybo(b3OQlfghskNz z9}K5Z3VQ3758HkG0jW@{RIXI$g7RShkH;@~Tu&=BS_r#d@9~%{hig#_2T@|P9H)w? z=gh}5S>q^Cq)p*cpk@GaSXq4sH<14^6;np5c+t|$J9x&lS&Se9UXJl& z`)tC!CGF^PM{9Gle70PoNpUr~Y%X6Z!}+OG>@qySno#@WZs|(!*Vl)pnmp&Xm-VKQ zd#My=>7WO!yH+kA!}m@QP$?RL){Bk$Qv*y2cO;BUYachhU4q|dA!Mv|yd}&v+!gE% z{DqB_ousX_y~Gbfu*tQR**BQz*PQqTVG6mV8#<{f+pRkMaZ3L)vy(`szQ9`Qf3L->DdXY}1dMc^^Csk2NTKs7&QcmZsc@0=Q*+*}0+ubaVYp z?_|MQ3hbnc(VG!jcF*kMaE)V8EC4oZFthXNL(^I^9lZlOJ$lJAO5=PrN|Oa{fGt+^ z86n<5N4dk4So5{kLjS&dhC18h8m3KH)**}vqTFD5^iMTKEbcl&5* zW^QC_D;06l5fzsu|eN0BcF>w|9d0O=b_CFVJ+E}_9y>Lu<@sRBZRB_KQXt_6*y+3*^M zE`8Gx-~2b)<#e>sMPht9=HdY`yV6x{- z64g$bGMR7NOT#uSC|2C5PQzyT^d!Zjg}qSQ?g6h$P4ccGk1(o5QhVy0CTs#8Vc)~9 zOq7?zT_f$!BRru4nCKiVUdJbNGaH|)2T8r+vx5vQZAuho$o6xH5)jXZGCov~fcRfT z&bKQLJ3z=#;>0N62R2Ai419Sb^WkaElLsFHLI;>$2KQ0{9@j2ZT<&_5+_Qnn+unjA znR%4OQ<~yW{LJ??8#ND;4y+f5FkhH;oGaMu*V%`Yil((-`_{i*wzrFu0@>r@;Q!@9 ztG-5C$|o66q0!cO8N3oR-ZuJgm%HhR9u|9gr72nkgf z`o9%BG~SIbmXx=T6}XWG!96o?82ddt~la{g9g5aRjJlk4d!jyanU_J7pF% z77h|AA4MVw=oD5BKVh$ZqKjco|ES*^`7lni8w`M~OOWG;!0pS{gxy|=mLhl`j&hO$ zyh#a7>{8aWnp$JtTk9*E)-=y}7@o8Aa4GKMcm(?Dkj`*yw&d^BbmmXdiwG6W=0S!H zhPH0Do+Bm19r|tQO1}!sqQwXgXJt)nTYP{voU&oA`&wBCy5wXMu+q{aM~Pnu^`Xm% z>~wKZWVqL`FH-T@4e}yAN80yR(3BfT^Ox^K6v1kT9mt8Me)EpvvO~*=Dzl0TbRG>Y z021OhH){SbYUb?JJhVvyjO_=O!9SzJSr7p`)%p3ee#i#M@JWL}?M@`DqCi*ZE@Tjp F{|Bsk2y6fV literal 0 HcmV?d00001 diff --git a/docs/fonts/open-sans-v17-all-charsets-600italic.woff2 b/docs/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c99aabe80340fd88a6aeb5729251e76c9a6f35ec GIT binary patch literal 42120 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 E9}-z&tN;K2 literal 0 HcmV?d00001 diff --git a/docs/fonts/open-sans-v17-all-charsets-700.woff2 b/docs/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..421a1ab25fa88105ab776552d7201205f7899841 GIT binary patch literal 44988 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 literal 0 HcmV?d00001 diff --git a/docs/fonts/open-sans-v17-all-charsets-700italic.woff2 b/docs/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..12ce3d20d1ce2288206e8b4f31c20f76452efe37 GIT binary patch literal 40800 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%0DER>;wf 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%0Deo9y(?}8?riQx3p&>dOY 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

33OR1_N*!%ylDDa|3D1;gP8brBkv%FrMeyX$5% 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�*c5&zVhumMFXrgD>hBXFOLH8AyaTh+=%sw>z=`?O{`F;R^ z+Mmvw(4;1=FgYm8cJ~@72cgPcb&WrKMtnn+1J{Il0JuQy+B?ti&^VMd5U{WN27lX3 zhHX7o^4N&`&0VhL-82k}t^M*!wWQ=kzsH-w&+hA}?YTbYn9`|I^^Hwr9v%_A@tA+i zcfAizcr^6CTuQ7j3QsG^rK97PS&2$Lu*m@%`sG&qUtl83NF^(*81ZmsukwReu_YH-LV*DmdW=AdWjgc2 zAQlYk3||}8xmM3?pM_wFb8AA5MKU4Rg5gGkS{$}MAZym0v#zpW!N0;X+biG1cMgQn zoh=Vr?hk7&8MfGH#ez|smu&JcJ-n^wY=)L5Jc4=y>H&BPTC;^ zsG1dk0EVRkM%nS6P#d@q{LM-~Po{<-jLvyK7iu}Sz zuWZ#(81DKX+{Hg6GXu@6wv$t9MPA6^v7gcYPH1sXk{qLqU^{dt4%qb&d9y5ICwg{S zaaDhOF8*?=`hlDMV->zt9=o&Qv0--n=}}^ux$3AdE|r|}hPf3d?OCB9H2q6o%_KKQ zSDD~1j$|;n3q|mBhzU^7J-R6~su^w-hr2MyGkMpx%jy%|*ft1i>DFw;M+DOR`&MTe zp7ip$NQD;sgPUD2*M>Gt@i=~P$EYo`>JBUi!pmVt_ zC~kC0qjU&tqw@lOH898EWq@53anMI)1jHu*>(qUB1j4 zFHTRF4wpyK3*AFD_+Yb{#9%kRC;A_zQ#%(PS8lP;K^BI5XA_zGTNM&CGmDvZ#y(cI z(p(eO$$MKbzn|%<&X0B3duS?hyQMw;npaHM|9 zGonF=O-ggN4WcujI$$n=#_m}nS{bNw-^z`WP zLF@s)t7o{gKK?JjDte{W3#jWSG@uA#LR!GMx*RR?d5k@E^Ny(brr6^zw4DzB2BK}| z#+2_iTFhT9TbCIvG3+}e8=qa*ASJ-XC(jjWG;Y^8x8^_t1qWD9` zuA@kho#OheL)6e9GJZ?d3T|+B2yfuP454IVA-CImd0>!1qUxKPk>UQ~GE>>9Tpye_ zK1y(c!%uz}!hqxO-Z-H*<`$$$OJmg&h`9CsSC4Hit;KlJSy}>x5J|jo{9pkHF3HKO zDR;`s+YnX@4}~|=vPiYua_8*a4Z+ne(TFBm)@*KVMYb>4PD{N;&2&GX^z3Ko_{g~99}Y*#PllRx87 zb(+okvNa_9(TU5fnIr{xaK_|RIdw=u1k<|*Ed4noQ8YVPp^3Fk3Pm1;9kUEw`CBp- zZ0@DzF0Yy#2vJ_rEr|GFmA*A}2A-7zQT2CMzM~6hUA#m*4d&w+i zFRp4CX{+`zKD|7qx?>FGN0(i%XIzH|MjmXBvL=0*DRQpzfL3+6?Rl*lT;@~M!}?$! z?0@3O^gA}UXD#`q(PbO&4$MzDQE%rmmWIXzlHxjSM3$9mMcJ5w^h{4Dzv+Ti&Q|jw z0gse%7VgD$;U1ah3R!(hOK;UwaeY z!`yG7>)~)`dv0wois;O;vmj+@-k*0bX^udr0lIMTmlj)W(`|tnG}L*wyNeFt1A_gK zc2M7WDj#{Xkz-*c4P2fC>tpu8QVrLu|x7t>w}6 z@HeE~yri<|I>TT_-a>Nn!hCY_wd1(9kf$K}2JHu2!t<%}JXPYAs$`xo(H*hYm$|T7 zpA_gRiAyk}9LyMVj*ebY+m)1+(#3fJ37pv`KeJU{zg2npZ$FYZmrKZyi)vMdL!}M2 zV}x*me9tnIJkDJ|DnTNoD)@l~5(dOJWq z$CYf4H8Yy&(b0?5ehFk1KE;1yxZVwk0cV{)^mDBygBfMr8;p%Q24my4UK!Gb2W&)W zxQXPJ@5?I~+V4pD8;t@GcNa}yw>dBEx3{^PR7hF$`(ysXNt5k(l$~du=l)8kJbSIL zuMH6ZSXWUzuq?EyyDdo9(;iwe&^79hwnBPZq0u|Mkye%vl!2QkK25jlxag93Jtg^k zxQ|tW7@)#9LN~`)AmVN42HgKCbbb@4_xT$z5JMfSuEc^b_FXMQ2b`V6FK}I@ z@>b{Oyt4t9Z(j{cnTXZ(50Kcn(JAg-Ax>dc7M0ZpqyND^x=)l3^dBwY&vk0CPvb)b znGT&b=L5HFn0@NI$^@u)(O-|OC!qA5QdydTU3(+q){k9is)#6axu|xpY;X4hGCxON zS#V4g^RGQ|jSn#gRIi;(@cef_bL+j6YEN!YrTFf03l>U}`&OAd?)cTKPS-h?1(-Jm z{Oy?KC@M`JT5sn#_G@Ew0P*h6JMJ{w6$oWS-Ek_ z+jX4z8II>opCxJvm#>BxbxG3kZl*68*w{m{ju^`cZ2e8!!E$bgb+)p10+`N=z2|Vf zCkH>LbqRpFx%V3rZ!~Gb2L|*b_MrYzNxZQz3%ur(!EZygU-8{w{tfT)w5CMp@xte0 zKbSeFgNdVw51MX*8566lhq$s#O?KA3EUyI$8xe~yNO1OiyN^@^P=bDlbG#Z z5nj2*=v*XEoF#J*c#xrPW)G4)r#Hold+DdA9@>shg~j5+%5e#0xKJhz_BF(tw+haS z(%Pf6vQz%y^%^&;2=D(W^z4RdP+0k{lDp zO!>cOo5A0+gzvO7W1M62kg=8KdY>I^?pQKs;qV1AQ`G{PNZ0>8;|9K#LD|U_0;@m)G*5F*@CkUKl z^YsK*3Gbn$H9lNTW6iDabQSc34Hxwu?$PjB|W zb0H0aK7$6mdu@S+*f*RLKXfvp*|RZDoT|_u zNw>%FWDu(Qqs=YE4VgpLl3W_i70u*zTlFB%9eYO2ZN>yFUox@e_|3lR1@I$#+h+5g za7EskLB#08-ic^O z$Fnfzr+HeZbHqR%u=skZA{!yy;IlizpLm+qa1K!(3e# zhihAMy3;hnoiYY=80_&j1f=IfWAT16X6Tj*dU}paw3pW)VImxzI7Z)ZdkhAfoBIll z^C)?aR|9wQ{3Ce?zN5C;Q}jPsA~Wps-m1?}!%& zrJw>Q44AnOdFlP@(Uw%ff2KVSM+P#ygBg8KSwH)6c(nb=Y>zaZ=kJ&K!JVX`3mCFn zW-gkCHO&>Y;0O`JJAY&wv_Df6L&W6rT=GKIS(2Z|=d; z6+nTE&%_0VS_=JD_jN_Hoti-m42Nqgr6k`W@QYROwN2@s{AwQsZ3s*jHTp?@^Cx4R zwdhNs){sI2*ma%@LumTx- z`e0_}xfMHwdR9}Tmxc`z{zhiT*;{YVmkacO2SzlPdaN#TvL*!OBrrD@rt_m^(iMr0 za|s=3_RC;}-AQTeOMUN0f1*be8~1J`+$34nZ2_z$f4c^n5f_x9an4Y4GZL}eU0Uq+ zt2jRE{rAZ4AaCFAPmQ3Tr3p8Gxi#l+*EpxEx#=2cdR$O?B6hoLvo{@L(C%38j5h&&1#Ry0r7#r)3T2@6u9UJxxe@bsHCVb{>=a?MX|_DXGW4 zyAY8#j}^r94~|tw)WZe7LN=F07pmjJtR21|lhmQLezBgRVuwZ7nwVEX$85JlR%3x#Vu`!EFyM<@ zxk>C&oljO%kx6{9N0NZCU{!9SGL(iZu4JYqcq4KJqLixfsZYa8S4Y}(^aix)lwb|>iZFGwZ3#ObTvI)k)sVn??EN*OJ@{Zv-Ym1X`H5Ud2k3D5EZBpNjik`B3y#+NkU%-r}hTX!|qjhX48ZNlDq>KUu?{` zpqC~R($A>kii`HGLoT;)D_I>sN(t2 zJQvZ-8`KuJ&JRk6_wr`FX>(a1qB7|e5H0?lYwQ0DauHK!* zl{e+fm0zapRXv)`NawQ=tC z9DM+Xw0AiM{|3xp~$6n{OC znp0XP0&annkWIS2x@=_R^*@=mfm`Mtz6?j>w_K};y>(ah-UKK0`cc*N6Bb3m!NPF8 z1u}Bpf*)Dtz!!Oc%L(s(yu7=bKHY5HAC`9M86;lODhWAmSX>(A&#u?S8}E3)vs(7) zH~99%_I7_-*@GsHk{lH6j8K)>GBWniu3jl;;JD&Z5a89rPETHB;oOq~1&#?Nlj~ie zn`@KWqDlU&2^Eei5JAAAf;$2Y&3AjD3=yt5dg*YqsJkf>opB@@Z*T7%X1QdM3RLf&KhdPB0(`_TkCb!9EZ}o0(Z_(*+xa}{e+e5&C``j|rX*iDquLl-# zJPTNeMc8wCuof{pMa${+2uUWg*UffL-BLI->|UO#Y2V5Hx6s-R=Qv<}{odECkY@^< z@oNF0iVdK&mN9vQtUS}pe7rnGmFrwuU5A}3)}4)Q`Pn-&O9r>(1~`?n>ED?MMm>0j z8*C@{jx#2%;)@Ux&<#ShARLiBBE>4#4!&Mw3$(X=hnUn2*2*=&Q{~=5{hIPvjwLY` zQ9&X~@=-v%=v1TPOP)w6b>Y!h1(72hio*=9q56( zOlAPvPdQx}6}kZDMl~UZ7FZ8Z$%NXZu9nh@7#y@R5KWyrv|%s%^d1kL)DnavkGK!L zkhGBl@o20AP`RY#~gT&x)BR z6y9lwkPB=RPVxFJ_{;obLtsp(NWa0YfCJ}5^@LTA%V2!5_du?nR~EHg-&$8;AD@9w zz9!HgE}n;fOJCr=VpM`HU3a*|=;{0uV%<*^`~TVj=Q3`lPgP!Cxl2p2tzf<~aQbH4 z*^aAg540n9y^+lzR3q_=>9a@D?anQJG3fZzlmv(Dm`(G@{g@Qn&JPI}@ecxoDn{KB z(p}BuV2$UoLysoOiG=4~Hb==l9k}AB~|{TcZoFQ12I3pRV-(Y+als5Cz3GBws3hNBC?5>047gVQ9%#;)dI!WT~G1 z|7?wu%1JK+GnzZ1N;HF-jx2v@0^tA$F-Z9AI}{ShXW}mi-#DfDpB@#5KA>qLrk}R7 zF6S>42vpjR8{N25u@3*@?d5K&l?!Pqh$Z$Rr+{ z1|1ocJk003Kdid3$e3k3y+id~Fb9v#yO(!bIkZn1adur(qlV^$W>z_NLIrVZdriAQ z(B8K;HmJxvvpfE;`(oSqwj9~$lH{-ek%-NJhg^kxE!7&dYi7=#&i|3aa5gQ;GPrEzyO|8kWWcXI|SN+=k*KP9GXAYj7?gj#y-Rhc)V1tfr{672V!h@UFlO5n* zDkCT$Fp%$5=yOT0LcrhpbN0sRr(;_+6a9IqIMC-b^FQ z)fAGhUPwOL0Fz;-Y-0bPbOFn_rNcs!p~f+P+PQxE>Bx4;4ayB7b&oabKJPGjCARX%tn)6+Q4!wQ|dY)lU{`vR$&(9AowrBFf#2BV=3F z>?wGoUCdfKNSi7HF?d+YfPIWCK3Yr(j*hUs5};WZ7qfTn>DRms4HlBRxNmSe8`T zMg5NBh4Gwi`%L3QvM*u=a@ikZ`xjaLSi3BGvrEc1Jt+L2lyY;Z4KU9y$1-^}k;VeD z6Y+3QFRRKEVcm^RwXi0bG1}Q}^j_(F^L$nWtZkoOWI#z&wDbOHB-m?jBo~2oG6@=V zs?z1<6Qw9I%AF4ttadIdDZs>F{kM^^i147uyWQBqstql*Ap+Plp&RfdN%z^IO37u2 zc6k_OBX-9Xk3OGG$c-O&$RhSmxwV!QsFDerHB7amk1Otdx?hA&l3ibzn~}m`b_V+f zu<5Sd*a);JWsOU?M+OTHR!%LGu(IlamKE?g$Ve)wP-GMXFk}1R2u%8v_I5u_y@dV) zq7RopVl+ufd2p@Am1tFeU$)(5v&Ql*^nn-YG6y!>DR z#uN&>Jrv)avBMY0Um4bYQ)y}5FPNs{{ud^(C7zK!m#z=)3U)_`GD1DG#pb|X%YR!< z+a%? z$^IAKLGyH`xu~b-Xo}x>4my>!QbePN+dN31i&qE`v*s;ym*HDxCafvG)G;Cd=Q~O# zoL|rQQ5#6~6giaQkZ==IWrhRn;c!!8txKPpFvuj}6l&Gyr~VAb3s{y342WNgUL#DQ zZNWo(Pv5M+OY>1Sh*n9fCl#>3JL@G-822+dY(Rt$1O(h7Kf`eHC2Gsb|o7Ni!=b!&X=V z%U}hpgjKK_*25OH`O~&*uahV=?SbBHp))$Ym?LaT@a1<2P?3{2#kRP!?3T|``PQLkE3BnR?z*O{kPBz z7)ZZN$|)1l44>7YGJ}9!D;hYK92)2NQB3(!nEWt~?1o+n<1U7OMcq=dN$T(CO=LT5 z$RDsxmDJ#*8CIRrLsFQ@l(EBe?+J!?{yz!jP`mf~Zy&41W~5uhTr11BGl`#M5331$ zRg`SOf>tcH5=2M+B_pYa;t^h&-T!*j{}>-KWcz$XNjQ1mJJ;Kl><>F3DN?;8#=Dw0 z9$0tL()$1Rg^OtT!uT8E4HI4!T?~`!_Qgy3JFdJ^mwoK0)c4CQe1g@Q_A7#m$dfX> zBM_JSdZRG%)Z7$h3_VefMlb9M9UMVdiJIU(!li+8yfIuS5wBiPw~w(9XPIel-G+l_ z7*h~3EFkh{9ET0?L5k>2M_AH0%6cZa%N+iR&+#wevXF^uoSiQ_ihhTC+TZfmuL+uPD>n&*-lDQyG3!jxr+Kkl|bEYwOmyF(Lv#;@3iP`V4y0Mhg+2h0r-#T8ptC z!cwiR#lTsSZvkalba0J5Mi!T;L1pXhjB0dXYkPtTNzR%-?H7JZN zkh~VOl&J_P9xh$J#5CKZz0u&9M3Y+8m%>x6+#^Xub)hRj%d&NjM_hv6Yf57*&3gp89xjn>x*)+YQLSESr;I4 zP2)m4c}bJ{QeBEm@+)x=2e#@YV2{9gzyepCMyie+BdwQ0Jg@DeI2f;yWaj#dL!y;l zz-FZGCO#PWku&2npBM6cl zY1?7^cqFYd#?YDtX}vt|-QLlwHpLe3auR!LGqMtz0v!j0GuOt5)i&@vW7j%}gO!g3 zdbH5LtN(y1>zU$EQ%my~>q^@kn7!w=nB985+j;y1NA~PK^^97nQBskktj8c<%t^bx zjwF{l73Z$;5z;>7%;6LFcP|+E!WXMc-a7NIsoBQ{v+k^g!-y%e#5Qs*um!D#1@c5O{ie+hGh$N7;Z+=RXLNyc?ge;xJ89*2Lmhp(@zC$%@} z`NTBbXU?xv5dg+}80*utuIhOm3AnV1!W~xT%&YZv!ZIXR%4gSi){M~TJkd=MakTqC zEU2AV^dk_qu*T`QuOJOdCXuo3bX5o<5?_KcSA(&6j31-C#L zbZ^D5CpIv97#L0LARVcgElR7`YxxDptclX@qSRv-iShwu);S+9S&`||EA$#eS*sk$B!I2NiJgt43;vul?O zu4`P~d-G_{tKu~|Qxq#im%JZHT`V{Zty!aLPHq|H8haSVBk&4L?V!D5 zO%iR$nduIS_XEW~#`JS}Sl4`8$C`dn&KQYDf8w+uiO09%vu^m=&IRn@HueR$-ulbV zHErCIIwuU*2-abDP`{f*ggo~z%eHxlejA&$%MQeExyQqe}WGAG1SFMrJ!ityMT5D$DkYF5j;N+piXG4X6aU2jw zWSXvl!X&2%Zf~<`8X{1Vy8^%I)G;{oVfk8Ox} zh~4CBc|$GA%R0uLD`v0Zv3=6eHHWoS5h^0W6*sHp!_+Y~4cWkt10OqML<`cFj4P~IdG#}1(o9J1fB{AT+oj}= z4ZXO^Kk&mMRvZq4c{r5cI!F_L%7mv(#sB#CyAEl7HXRWf6Hol-f=mfYfxt?$fvMK* zPmrN_Abk%&bRGXrCxrhg5gO!>W}>}YuVZWH8fcR5H3Q)Ba(UG@X;;fQMWjE20$}B| zCW(5~b&G`!ZvF*#%V*sD021k&%$AJB_gojTioXA9NTz>|>0ZS1=OO=Eh#WAIty$|E z+sGt5ymH=4I1Eh#Uc-s68F|Z|j$V%boPSBq82oYnA4CZ}{Py&N4F3NRJF75qd?SsO z0obGc@@M;k%&!EN5tVW5UYh=~-CwBY>$NGKz+z2E*^*9i?B@8=TNZM6V zCwfOwD@qs>$kqTxeLg}UTq0j5TFIGcd%=+sWn46bYvPae|-`SXdoV`0lwoobbbbay;M9OB5C_2&1SP$M2Ful<%#;ns8dknF3A_0Dy@J;XzRa3ElRK7}Y!}LKoKC_KRd5~ZG zOv*!^f4p^w!Qq$kH2&k=hRm2$9W{bUX>^jJ1z>VJl09y)CH+T|&_FV-_z9P>d?6AQ zk|PG2=iV^KRLrb_UD(@<$M`J}28f7VX?6SneT{u*1s;tJCT}CHsIFgGtO@~7%d;Jn znTLt_)v=wfjiDZVyM&J_$O)!%DDNhg1qj_qC~D$?FD*&V@tptCuqGR<4K_KcOG|sH z=bWC&5$fmVoXUP{*VcX~RCVBR!dU}ij%y1iL#{fD(MAGY)eFuuzv9RZ3DAbx=to26 z@+wzX6&gPBR~*x%Rlv0gI-d@gi!81L8W_PVfKq^Elm*HRIyO0FiESBb##DjAoU|fu z2LGXuefj2(e>N*Hj*iWNDuRyf<{C1OVYA`N*h9*$^#}NnjlZpT0J-^gW7(Fr+1w7v zlqm?8gjkOO9-e^?y7mF^7_SK=T_^jgQK_k9zhK{@3mJdT$c3E;oBKK9>z!rYi@^f6HwQZ3T=3bXm)a0TCquZslz<}^9V^MixU zk*9{6&F;BPF~VQbM8oPjY*EJgLci7WZc-Wroy3dwVVH%58rhYlP-CLl+ScQKP1jt- z(XdzWxu-#+xELE+8{ExrR#<_@^>+;Im5A^#nfHtHiYOx9b)!3|VEi%=@Q(-@DMM9p z!*wxWqM_PoGu=(7NQQ<-jr0Yz{jQcbA%Mr@yVng&0`lHj;vGGPfd@YJu%e~xtUWw- zS2JnXIm@SRjioSV?pMUzhy*d>Y7k{X0BEL!s=DU^O&2JA3&Am*JphdtG5et_f)%IW zc#hI7E!Mw=K*O7Fjgux2eD)9m*RWhkyp&gzsF1_WZw~VcxULJ{OR36n)j78Ux|}{f zz6sS?^VO7nGgfw*@C;kO5^ol>;%8U8-AfB|ZmIbJ?v69x^TjuI-Ca2Ex@P&1yH zL^Hzk0!%>k>mMV`b$-Wh0#{P-cR52Kz|gEKaHM-Ibsk&GGuyyGqL{MR2Dzu6dYQ<+(Y+VraL}(ed&L?#QUvl^MvG!IV_YX^?~jJdS-5$DwhOi8*Zi8_@Ed;b-_K`x@bbJja#gKQs*>kDv0UX_ zxXR)|?Wjy3ym=SF3}fT33O4f%f6EvCwSTkFCw|HQfZzH*M*PF;zI1IKwfxg=X}j;h z9XXamr=JzHHiGNKqoGrUTxW4`fS!_a$I}T6JlJICPyc55(^oY2#s-qd7< z*Y3lu`+E?=-6tVSN9~QFZC;r~NYvy0`xBT0o z-t5VbxBmM}YtKtXu+H*$D3!bbrMOE(8BU|5@8)e|6hs|_Ikmm}Z17$*DL?{F1a_DI z9UyU6p2hP!e%Sup9J!-{2KXR%9oKIiuUr=M6kf9)t_45RflqwmYqM_VTVK0NnY$X? zU|Yu+_1N)_?Yd29PvwM>Y#v**t3S)6{enj7S_&_M>aKpy~nRN@yP;uuRK^Mn8{JQeocL$x zic4f^Fw9tNConmeF%PgI5qOr1gDX~xGvu5mph1_}3de{CG0y?YKjOkvV0j@hhzG%{ zhOyvAY7q7(Zi!M~tSKd98qbhfBA&E+)}?_2k}I*^Xw&MG4njLRJZxFM$(+HrYyQLV zeQjJ=t^DErE60p`xz`r3nD!P$4{%o^pneSpGPhZ*imY=AV>R<*sfWg9U_(XAtktp_ zov=2!pczRi7g`+8_KE@+v|-g5isqhi$Y{gte=NSTDCyiJ@<6`e4~x0t*x}#|Lpd0t zBaeK^;D^X2SA4*-p3{mMLQ3&W0<@=L?9r;qWCc}j2}NzzsvbQjROk9O;RtJ?T?P?b zf`*fg6>3)4-izj*E3wDcmRi1?y-}Y&^+8DiX%CSd7!S%nx>0 z1A_WoKA3PM@0aDH>^fj+Y(t%>gQR%~dFM)M5x`&bfJaojPtbf6B9AKz>``Gd*4isC zUFO*NI%}C%vpWk4RA--t5QU~%3&3-L8O zPIgTYY}qmOm5royYdqd)FgoRA-FI#rcILg%PHAuzg zXwG8JKedeWE2o&+_o4mt=+cF2*zyHSPu`DaIfcm;tQBYZ2{5lwCDuIPqOe>LO0^yJ zsXquoMxpkPKn+|h4dxqP8DAFCT6$)a-mzPnL{98&ec9z4y>M;Nzqkua<+M5|C2fTj1*ASf-PRSpyLBh~ zJepw~_9C_#xf<(bU;0?ZLTM@|<;YC0DE{>at!I8v3-p2@>_01k#nh}qIJ*u-y-#C+l*=1LeD8@Vsj!ndP(ubklCz?9c%ji9_Dnt(l^J3-&y1;|=Kbr@D}bB; znG)V7ZgFVm{#Hpl;QLRZ;KA?CK)jza#Ab9heis=YbOi>MLZ*As%5H^rG^>H*==Vm# z7QVCS!_B|c9WD-g^L1EGwf!fWbGglWNbi()C!WUe%;w`2P_V`J z-5sP1M5m)*IPNA@kohh+uv_#PI(f^wMOH~3>UGd^x1ROZlMlNN zo+M+6Wcx1X5PdMAKX1^k-=m{_WNEJ}=isH_18=-0T<8cMs#cV(4p6q}M|K_E=xxm{C`3&>3{v0+7`pIR@Ncj8#5B8NfeIlE6b)(rzyzIUQ{*Ppf%rO^oKvZ;m5Pz<^cQO#n}DzdUeN|CFj!#f|Yl zWd!$i!LFEmydrfo7iAI5OlvZkPJZN-rrNJXMRn>pXWton)ih-+5QeyOu-@!7wA^dU zW7YnYGH&-~lesFulL7s7q!67Tn4PS~R=!<*Wl$YJvn&wY-QC>+2iIW1_2BMKa1Fr; zaB%0K!QI{6U4y%OaC_YE$-VWe_SaPJ%x+E9{MhR4HfhazlezazPXI_A8mRv`(u(mzv2aM3vo-h-LU>5iF1PuE0BEke4c+TM)GI zPVKHe=R38R@?_35r}7%JA2>qtbngxb2y5tv>WkDhn(Cju#tP3}!z)!eTGMlii~eFS zLdi3eBtsfd;FX0%gKZ{X0oNslu1VRES)_5~^?zS34gPMSa;k7TH51^bqZHMV7Q2dQ za6Ot!Yjgh=lfnB77MaHEUzv8dr3nI%i54oRPe@W$YRiNALc&^o)Yho{pg8<`R3bwJ z2vI=YN5Ms8w>ULeY{ELwYPtH{&#R<#)e~^%@!;ipJ?u>cTqg}kKWGTHc&(&!Y#lAB5$gN1~Gml@M+nW zfT;!=kHoD~X<;}Ck-z$B6?XC`ec}#g=^%w}hVc73&iw(SfE1*+fc{O=?fv&!_hKXz zKtac}8x&7_Nn;~3PenZ!8(R~N4&%fGs3|I8OxN}LTJEfS(la$PA%+P8y4JN?9D{=z zQf_z<*6Vg0loPbfjEV8|1N+C0ts&#x=UXb_*G3xX7-O8gEw*Nv`%wC8gy&!epY~`} zlT_(OEd7kbwzh`DmkVHd5d_)Y7_$;Gmu*LeKuWu zT%`sxY&oct1_)_S5=%v7J^UYccdLHNklvP7dK8gK9Dw+|pHG@2h0kuS4<|6M3U6Sc z1i<}gj{1TLnUdek+?{u=t7Mg4N7kIkj;L(s5LK|*^N8^0> zLF^2MeNVRT9t8;6-nfx}$oe3xb?UnGKmY=5w2Na`99Thuh$=^q@cH|Rzt`+}N3gIv zxyfOrBvymXe5n466tMzy>nk9$OQY=o*KJ6`DrkOOSJDS^mocW1RjJ#!fQqO$q4W@J zkwt2DqY?6p6l+oFt?(<-G9J_3!h$a|{*=K?N0DM_?#Epswi+^i}B*QF|9lkkH)X;a;R zCi}AZmOsZ^B66S-|8aNaRIJ-s!6_obA84B*w3R;l z6TGJH$KSDhjJ0yptiTC&>oI3oQQZ}}9gkn!{NBjWu6ZJ+ILA&}ZqG8xdU(3LJi+o| zLZ0tWOjMAaK2^$eQU|WLEz=cReK~`ZA~-h*NoWdAQ_W`g3ijBz8laUn&ME%k6POw; zUOlh7SVG&0COsjn0b~6P(N3jTZL!sX5mPZapo}<7-G%|I@S=v~HirzUsN>0U2Ab8k zX^Dq2PVMntf&+k(TduZ={4{f_1;#bmMbRx*Ke$9_J*h4VYhwgtw{sEYTo3XEeDtxP z{0zj-c)vCD6&BVX-rqs!e7SF9+kD&g_)w*@eZ4@s-hRz{-4Wk(cwkl6{Z;W->FT_` zJ(kYfGnL3XUm7k~h8?!U)c42ByUNKRn=l!hq3=FZg3_kn^*~HEtAI<}>M3Nfew5my zyMcQvfj3Q?#lpuDH8UcB?&pa|YTMH{!u;WrAKN;4e%?t7m&uNe7x!m1HluRa9#`3| z) z*af(_91u3J6y2|H#L?kno14p-v&?HRz{vz^-OoJ4&urr|{Q>zANe|$88{QtUUt{lR zmA|?F{4ePtu$^ z+o&}yT8>sgQLJKtqm(%6(0~_3HeigBHYK0Z#OG+nrG8yS0+r_YIuw3KxjxSgMtI*o zHAMs?E~K(QaU*(4}D>^#%Da4lf%iG^7bR`ddTz;vFN8U8gIa}aX@{0HJTS;BgU-gQ+MvBb5TL60|tgvSC7rP(TCw!6KV5%7S z3P%q@+KT6~L+ZeNiW%S);?*)}HXVCs8hiWqZ`J^X7^h22EcbC82_OEkymDrm7WXBnV869!rd1;t_v<76%U0N!ALMB$rS-hxqE}g@UlE z9UDK1#(!fILZL~eWDZ=SQ3diMja>5P?#ZjHWpJ81fjuO(UCk7$4XI*;vi^nSTsT3Y zjXO*^kd-~C^S~Zq*ESRZn)bLrOhd}n=9(Jrt5IQiETuK7_54J+YQ-nB_}h?;N{Z1k zyutiNyxQFmDrhV4$DlQ_Mqxaw+TFM#d16*o29jEnr6RtU35~m?R@1sPj_A9PIBUDm z>5DF3qsx3POQ-e&UH-uVC@xp;LWEBbvKn!pZ|*b-4}wleKlknzwJHwqfa4e7#ql?3 zyugZS2wu?!`;K?rhYixqg@h%x5u~vHqnq4LnDcp(RJ-o*WFe)Yx+_i`&h$eSVU7y0e)B$TGKJ!$lf;eb{%rb z$AHt{=oNMNnd%f+!U4QNtUFU*G%(}^Ij{~a!w0QPa=4Ak4qHlCaI-cc)qXoq1aBht z3W-Ax$Uq}c*RiEp_x72oY0T&kRk@DvP_}9@yI7SkBw;uCWnTrIx)_DPf!6;V+z&L3 zJ4@p)W>VE6_^&9C^!^ar!to%uAc2z!UF5#*#o`*G!mK1)lFUZ9+^ zIH4qhz`gZyB<&OSQT1Dd7v6!L=TaSNrce?L_!1mN5oyV%d)?njssrsglY~!|rIQ+O z!TM=(265bTbloH9-^7C+M5H(jzRR_ucP1(wo&ismUmX6TEF{A48wUROMCl+uYG}ur z^aXDMlt&pNN;|{YJcM!QWK~THsd|0ms9hShM{$~(xb`TCR;?wa8-l|&t`VO$y#*xi zduf2dnLVJ7lBfWh71JRMNta^Hz&v0upL~z+djZ(-;dRo!{+fzsO2d)WpEfefAhzS| zE1I#QqbsYmc-RrAdgSC=F%zL+8{|eVre&6Sur#rRwunBr%i&2?oN2qrE{f;eQ?tX; zg9o-YpOo=RFylFEfo+Z3W9A883q^f>16e~gNA6yDXqI;tW0i~i*yC(&Pihv7wW`y) z=-gK)?%0ac%z~q4Dm2Tmb=-w?eITw@=MH z?qs?CbpzXyt>fe0rqjJZ%h`pYi!dFb`JP0LrjB}Bu6O;fOa@xeH{ZE*D@oR;yEel9 zId`G0KzDhAbV&(b(PkJE+I43d{MUVr_Mz$@p7YUTc9SF{?5Fa8}6bTfd_4rYpnPS&HRYUol=uO9*4B^ z7N3vSEwz%QC;pN}6Zgi8HeaJQt}QHieLe|0Ysv_O)71wX!9N3TQx>d;>(NGfy(4zD z)?ZA%q7oX%gO?s^TyTyztFvM_13Ee)IOjuya)@aD7$-9l;~H)XZR_pMH6!NFeG)J9 zJJd7FKa9h)Jz(v4ps6GiyV`D2T+aOy5Hrm;`=O6Ogk2NsN=CfCWbGBF9S^d1SBNe~ z(yL4%p1k32k`l*Iy??C0C%#k&9KSnBI-CmpJ9vYN=v0M?a)Ydn zd40k2Tm`P(jRg`E8LOmuh$Ax_Elr^9yMqIn*elh0TV=m-Cn}mwJ>q`#8l&43Y2 z7)-QnkL7@j*lR0Mjs3cOwbsJ& z|D06-D1NmEx9P03GUO#Pa0hktwNBEV!1tYdEFetihZLUJ1NT>hBJH9>>m+lrxu1~@r+Oo?qXlS^PMU%Osc;{*o$m8MoyUUj*j~sogvMnc$i>|qbTEvsA zjb{G&3opw(>mlfj4St%cpzyYP4sw}^?sfl+@o&hU6Im}(HMsj?wHX$v;SGl9$O&;o z@QMq<6Nc&x{%Z))S$mM3DDyXD2@c&DnMp~^_=5J=Gt@_lf!O_oa|85O7-#hJA@SlA!}$H+`bl4|J=DA| zH@}$)_pz$Ng+I6Xp91JIg57`YXDOy)86ZR_xy{P9nw>WWerz=kp<9O&NMM`va!ECf zEk)6+mZdP1k@~#KwYHJbXR#_pDBBBeJs0&G*nJXnFrEYr<&GeQ!8%{BL5wsLO0er>x9S?w^$UR!KI6jSSS(b4hxr zAhCwNHas{s!^Vq3Xjtq^Fa6aIJ#W%|c3qpxJ^45a4DNwN24)`}&v|$;{#2QzleY_V zn*sI}+0+n>ETbW_6EF8r@UIH=If=d*jlbkSJ77>D$b14Np@M1^niO3E5!W-)mOQOt zeh$_tlK*8CoU)@lg&=34O8u1NbakL_esC8O&id=v*@NHOhJz=4F`bZ4kyOU#SxK}6 z`%|KeBI~|{8gY#F^f}5MrlO@tL`)1Ys)+#922tir710s-n)7>8QYyA zc*<|cIVTr2495P(+FC8|P?BS5xT?2R^^Tok%Zs_GjczO#EYP)v-4GTHHy(_}cSC#rz zei~;i=ktX4GxIKqABFkFS#35N}2emgfxdcJ{2m)?3BBel<8^lq_m zUIY;6t4(FZM^e7$q_h6H_aZGDPObe{uBF|ECpd2Rw9ey@(Pk4yDA17sg`nGXEaU8l zp>icm!R>@W)MglwQ}jvHSCZV=`hd5gTZ=0g9O`&A4$wVI4C2AL@yDZu3DI|K@{P%t zkD#AYT6!WtHN_8dZZ9A%PNR_gxkE58+nQP(A6g%7lyH*<_q7#?6MHkn%+DEb5a5jG zP@(CeGLF2|Rt$tKpmU@I7?`ebG8O68%eHb|pp3Z2!xb_r7prn)j77ApmI5)M@&X)Z zi=LxOukvxvh;H-Ce1{@&P|3?Ic!ZvOLq6tRz1JA1i*&>ts}cD-M}2&5^D&rIZYMz{ z;nnKq!GzRFo5~#bheZ%wEXgTtA2^Z8ot$z2_~z4Px#8D?@Z4N#8jCp|}}kui24NYk$?OESlz%>1g+5gIa*K(g{n`5iC27e+#2d~#e; zf~K1-M;17ce}sz^g#xNKmdb-lGz0jfS;A4*fgcikhhDdmXMcif4gF3hJpH zcdh(Zra5BM-Sf^LDxl5R-MFb%`&<1*O9KJ0$D$&GDoct5u+@dtlcf(uQ@>8GP>I+f z%|$J_X~Q;!N|&`l@Cm@EoUdGiS>QUF=<`QBNp`_zf!9c;gCB)ZXte#-qP(QE#P%ox zC@e3h>oHGxguwrd@`v|(T|2#xpP?U8=$~sd{tUL{vIcd##{)f1j@u=_$d-PS=K2 zt;)rWa|eHX7wx7u-m12&hnIqcU*8dvq%55{wCx;Fm8SpC%|p)gFHO%p zPUM&K=hDGu)$3`uadOd@;b+gaSrd3;NqvAb`^Gk*6c!-SznNm3MZ&oXrLLeMjrIDW zxhLn2b+W0Ym)kdn(n6v_bAif3IAd%&>*OGlh7CK9m%eM)P}L%K1a0XmJg3imoY%jypy5%~Yzkg_|AwpFs|qT7A%Hj%8V zhr^ebAoQple8pJoiE3iD@c8oLbcfXB^X4qFU=?t_wn5_OiS$LH=KdS6*`z_mnZ^Rl zSl@PS5i-~k4@NN8lbJ&6rB|F~W*aSa_*+Sq2yh15&?e zWB;a6O(Ry;(q3KuyCT5L&-Y)|Ws?Z!tlYf8?D(JUJl;7u5PsYW;gU-#N_n_Cl`#|n zr5|zI&WuizWsl*j+$d{Y8tUl1#wDb%sy}C|lSz?L3Sk^zeowFHlpG}uKXA?Bu8Ms5y3}b z36bcG~tr<3bZz4sfI6p2~LZ&AUMyyqSJi^mwb2wy&d0QcBd6Iwbq+JxSDF(BbV?!<|U zultQ7i>w0bSk172A{zvMEDJq3FB1xcmslVJu^a=~om^S^9v(JtScScFv}*a$;?r;f zVCIQD?p}R3+(%WCF#?X-iD&UaA9XIq-{H)!1Ef=B15)AT@bJw!bwTuz);pb4dDoci8SObSTI9(y?f~ zG%Tr@hJGjKrQb}AYZ{v6hKJiHUnS8l9*~9QPvas*adVj$kt-g>G3q!gJUC6&b~wZE z>aEJ7PL*wDaUSeLZ!XKi1W}vfVZDW<=QVRlNrJf}It*?ycM?!-WXjs(k+OJa)9#f^ z8uMYW!YUWs01sJDkIc=?4#**nxz3Do?3T8C_e%N_r9lx%6qJ&Fn>nGK=RF&InEK|_ z7*$qUp+=uun26iXDruhHgMS)!o{0}=>I zdHP*(Mtfo&T}X6e@wEShftdeQItdV+Q2`aso*RW!QvYMkj$8CUlcoT)Yhn8dCBRd) z-rZY-{BMB%um6{L5lSLec`!u%FRw$J5X^taaiJuLI?42q{zqAq|C_6Mh44SX`N1D` zZvO*-N8TIE$(ld=8E%01oOSZq35829M4B;ws7dJ(-m15e zC5g$fU7JIyep&L55wFecF2LD~m3yD^gm?4)w)EcHdG`Jy_bUw2n_IP1f>C0O|HRZg znOkyUgRyo%#me9B& zXJ>B=sgk<3MJIJ@iI|NU;^S7Ffr6@uFD9crS>Ol*5r)X}?aA9i55HA)Ywa{D{{dk` m1l+D`T-(b--PwCk*h+wNwrKUml))AZ-%)c{&1xM4#Qy>;reb#h literal 0 HcmV?d00001 diff --git a/docs/fonts/open-sans-v17-all-charsets-italic.woff2 b/docs/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..398b68a0853fbf6368758deb1da49d347e3e7d89 GIT binary patch literal 41076 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

  • ~`;p}3;==ZtNy# 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 literal 0 HcmV?d00001 diff --git a/docs/fonts/open-sans-v17-all-charsets-regular.woff2 b/docs/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8383e94c65478622baf43553262e0e31b8725e2b GIT binary patch literal 43236 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⪚aqC6F-jh=?`}zBG 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/g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
    ":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:">>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/docs/images/fe.png b/docs/images/fe.png new file mode 100644 index 0000000000000000000000000000000000000000..070d2783b5427b251ae26617af9539a12a81ea51 GIT binary patch literal 86850 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
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +



    +
    Fe logo
    +

    What is Fe?

    +

    Fe is the next generation smart contract language for Ethereum.

    +

    Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun.

    +

    Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM). The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode.

    +

    Fe is one of these languages.

    +

    Why Fe?

    +

    Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun.

    +

    Fe shares similar syntax with the popular languages Rust and Python, easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees.

    +

    Fe is:

    +
      +
    • statically typed
    • +
    • expressive
    • +
    • compiled using Yul
    • +
    • built to a detailed language specification
    • +
    • able to limit dynamic behaviour
    • +
    • rapidly evolving!
    • +
    +

    Who is Fe for?

    +

    Fe is for anyone that develops using the EVM!

    +

    Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains.

    +

    Fe's syntax will feel familiar to Rust and Python developers.

    +

    Here's what a minimal contract looks like in Fe:

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +}
    +
    +

    What problems does Fe solve?

    +

    One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours.

    +

    The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability, Fe will provide an enhanced developer experience for everyone working with the EVM.

    +

    Get Started

    +

    You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide.

    +

    You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord. Learn more on our Contributing page.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/mark.min.js b/docs/mark.min.js new file mode 100644 index 0000000000..1636231883 --- /dev/null +++ b/docs/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +



    +
    Fe logo
    +

    What is Fe?

    +

    Fe is the next generation smart contract language for Ethereum.

    +

    Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun.

    +

    Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM). The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode.

    +

    Fe is one of these languages.

    +

    Why Fe?

    +

    Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun.

    +

    Fe shares similar syntax with the popular languages Rust and Python, easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees.

    +

    Fe is:

    +
      +
    • statically typed
    • +
    • expressive
    • +
    • compiled using Yul
    • +
    • built to a detailed language specification
    • +
    • able to limit dynamic behaviour
    • +
    • rapidly evolving!
    • +
    +

    Who is Fe for?

    +

    Fe is for anyone that develops using the EVM!

    +

    Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains.

    +

    Fe's syntax will feel familiar to Rust and Python developers.

    +

    Here's what a minimal contract looks like in Fe:

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +}
    +
    +

    What problems does Fe solve?

    +

    One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours.

    +

    The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability, Fe will provide an enhanced developer experience for everyone working with the EVM.

    +

    Get Started

    +

    You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide.

    +

    You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord. Learn more on our Contributing page.

    +

    Quickstart

    +

    Let's get started with Fe!

    +

    In this section you will learn how to write and deploy your first contract.

    + +

    Download and install Fe

    +

    Before you dive in, you need to download and install Fe. +For this quickstart you should simply download the binary from fe-lang.org.

    +

    Then change the name and file permissions:

    +
    mv fe_amd64 fe
    +chmod +x fe
    +
    +

    Now you are ready to do the quickstart tutorial!

    +

    For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.

    +

    Write your first Fe contract

    +

    Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address.

    +

    The code of the contract dictates how:

    +
      +
    • it manipulates its own state
    • +
    • interacts with other contracts
    • +
    • exposes external APIs to be called from other contracts or users
    • +
    +

    To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address.

    +
    +

    Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.

    +
    +

    Create a guest_book.fe file

    +

    Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +}
    +
    +

    Here we're using a map to associate messages with Ethereum addresses. +The messages will simply be a string of a maximum length of 100 written as String<100>. +The addresses are represented by the builtin address type.

    +

    Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output.

    +
    Compiled guest_book.fe. Outputs in `output`
    +
    +

    If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file.

    +
    ├── fe
    +├── guest_book.fe
    +└── output
    +    └── GuestBook
    +        ├── GuestBook_abi.json
    +        └── GuestBook.bin
    +
    +

    The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array.

    +

    The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters.

    +

    We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.

    +

    Add a method to sign the guest book

    +

    Let's focus on the functionality of our world changing application and add a method to sign the guestbook.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +}
    +
    +

    In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub.

    +

    Let's recompile the contract again and see what happens.

    +
    Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite.
    +
    +

    Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory.

    +

    Let's try it again with ./fe build guest_book.fe --overwrite.

    +

    This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting.

    +
    [
    +  {
    +    "name": "sign",
    +    "type": "function",
    +    "inputs": [
    +      {
    +        "name": "book_msg",
    +        "type": "bytes100"
    +      }
    +    ],
    +    "outputs": []
    +  }
    +]
    +
    +

    Since our contract now has a public sign method the corresponding ABI has changed accordingly.

    +

    Add a method to read a message

    +

    To make the guest book more useful we will also add a method get_msg to read entries from a given address.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +
    +  pub fn get_msg(self, addr: address) -> String<100> {
    +      return self.messages[addr]
    +  }
    +}
    +
    +

    However, we will hit another error as we try to recompile the current code.

    +
    Unable to compile guest_book.fe.
    +error: value must be copied to memory
    +  ┌─ guest_book.fe:10:14
    +  │
    +8 │       return self.messages[addr]
    +  │              ^^^^^^^^^^^^^^^^^^^ this value is in storage
    +  │
    +  = Hint: values located in storage can be copied to memory using the `to_mem` function.
    +  = Example: `self.my_array.to_mem()`
    +
    +

    When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function.

    +
    +

    Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics.

    +
    +

    The code should compile fine when we change it accordingly.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +
    +  pub fn get_msg(self, addr: address) -> String<100> {
    +      return self.messages[addr].to_mem()
    +  }
    +}
    +
    +

    Congratulations! You finished your first little Fe project. 👏 +In the next chapter we will learn how to deploy our code and tweak it a bit further.

    +

    Deploy your contract.

    +

    Prerequisites

    +

    You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. +If you don't have any of these components, please revisit Write your first contract.

    +

    Introduction

    +

    When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a "live" network, you are handling assets with real-world value!

    +

    In this guide, you will deploy your contract to a local blockchain. This will be an "ephemeral" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.

    +

    Your developer environment

    +

    Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process.

    +

    In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps.

    +
    +

    Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.

    +
    +

    Deploying to a local network

    +

    Foundry has its own local network called Anvil. You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command:

    +
    anvil 
    +
    +

    You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console (never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed.

    +
    +

    Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.

    +
    +

    Making the deployment transaction

    +

    In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +    self.messages[ctx.msg_sender()] = book_msg
    +  }
    +
    +  pub fn get_msg(self, addr: address) -> String<100> {
    +    return self.messages[addr].to_mem()
    +  }
    +}
    +
    +

    To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545).

    +

    The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil.

    +
    cast send --rpc-url localhost:8545 --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
    +
    +

    Here's what the response was at the time of writing this tutorial.

    +
    blockHash               0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702
    +blockNumber             1
    +contractAddress         0x5FbDB2315678afecb367f032d93F642f64180aa3
    +cumulativeGasUsed       196992
    +effectiveGasPrice       4000000000
    +gasUsed                 196992
    +logs                    []
    +logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    +root                    
    +status                  1
    +transactionHash         0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622
    +transactionIndex        0
    +type                    2
    +
    +

    This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract.

    +
    +

    Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.

    +
    +

    Signing the guest book

    +

    Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example).

    +

    The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message "We <3 Fe".

    +
    cast send --rpc-url http://localhost:8545 --private-key <your-private-key> <contract-address> "sign(string)" '"We <3 Fe"'
    +
    +

    The response will look approximately as follows:

    +
    blockHash               0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7
    +blockNumber             2
    +contractAddress         
    +cumulativeGasUsed       36278
    +effectiveGasPrice       3767596722
    +gasUsed                 36278
    +logs                    []
    +logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    +root                    
    +status                  1
    +transactionHash         0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c
    +transactionIndex        0
    +type                    2
    +
    +

    Reading the signatures

    +

    The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook.

    +

    Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying.

    +

    To do that run:

    +
    $ cast call --rpc-url http://localhost:8545 <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook>
    +
    +

    Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction.

    +

    The response arrives in the form of hex-encoded bytes padded with zeroes:

    +
    0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000
    +
    +

    Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows:

    +
    cast to_ascii "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000"
    +
    +

    or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command:

    +
    cast call --rpc-url https://rpc.sepolia.org <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook> | cast --to-ascii
    +
    +

    Either way, the response will be the message you passed to the sign(string) function.

    +
    "We <3 Fe"
    +
    +

    Congratulations! You've deployed real Fe code to a local blockchain! 🤖

    +

    Deploying to a public test network

    +

    Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token.

    +

    In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website.

    +
    +

    IMPORTANT: It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet.

    +
    +

    Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this:

    +
      +
    • If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport.
    • +
    • You can use an RPC provider such as Alchemy or Infura
    • +
    • You can use an open public node such as https://rpc.sepolia.org.
    • +
    +

    Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint:

    +
    cast send --rpc-url https://rpc.sepolia.org --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
    +
    +

    Now you have deployed the contract to a public network and anyone can interact with it.

    +

    To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past:

    +
    + + +
    addresslink
    deploy tx hash0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76etherscan
    contract address0x810cbd4365396165874C054d01B1Ede4cc249265etherscan
    +
    +

    Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database.

    +

    Congratulations! You've deployed real Fe code to a live network 🤖

    +

    Summary

    +

    Well done!

    +

    You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls.

    +

    Here's some ideas for what you could do next:

    +
      +
    • Experiment with different developer tooling
    • +
    • Get more comfortable with Foundry by exploring the documentation
    • +
    • Repeat the steps in this guide but for a more complex contract - be creative!
    • +
    • Continue to the Using Fe pages to explore Fe more deeply.
    • +
    +

    User guide

    +

    Welcome to the Fe user guide!

    +

    Here you can find information about how to use Fe to develop smart contracts.

    +

    Read more about:

    + +

    We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!

    +

    Installation

    +

    At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL.

    +
    +

    Note: If you happen to be a Windows developer, consider getting involved +and help us to support the Windows platform natively. Here would be a good place to start.

    +
    +

    On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable.

    +
    /usr/sbin/softwareupdate --install-rosetta --agree-to-license
    +
    +

    Package managers

    +

    Fe can be installed from Homebrew. Homebrew is available for Mac, Linux and Windows (via WSL). The following command installs Fe and exposes it as fe without any further configuration necessary:

    +
    brew install fe-lang/tap/fe
    +
    +

    Download the compiler

    +

    Fe is distributed via a single executable file linked from the home page. In the future we will make sure it can be installed through a variety of popular package managers such as apt.

    +

    Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac.

    +
    +

    Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.

    +
    +

    Add permission to execute

    +

    In order to be able to execute the Fe compiler we will have to make the file executable. This can be done by navigating to the directory where the file is located and executing chmod + x <filename> (e.g. chmod +x fe).

    +

    After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to:

    +
    fe 0.21.0-alpha
    +The Fe Developers <snakecharmers@ethereum.org>
    +An implementation of the Fe smart contract language
    +
    +USAGE:
    +    fe_amd64_latest <SUBCOMMAND>
    +
    +OPTIONS:
    +    -h, --help       Print help information
    +    -V, --version    Print version information
    +
    +SUBCOMMANDS:
    +    build    Build the current project
    +    check    Analyze the current project and report errors, but don't build artifacts
    +    help     Print this message or the help of the given subcommand(s)
    +    new      Create new fe project
    +
    +

    Building from source

    +

    You can also build Fe from the source code provided in our Github repository. To do this you will need to have Rust installed. Then, clone the github repository using:

    +
    git clone https://github.com/ethereum/fe.git
    +
    +

    Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system:

    +
    sudo apt-get update &&\
    + apt-get install libboost-all-dev &&\
    + apt-get install libclang-dev &&\
    + apt-get install cmake
    +
    +

    Navigate to the folder containing the Fe source code.

    +
    cd fe
    +
    +

    Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend.

    +
    cargo build -r --feature solc-backend
    +
    +

    You will now find your Fe binary in /target/release. Check the build with:

    +
    ./target/release/fe --version
    +
    +

    If everything worked, you should see the Fe version printed to the terminal:

    +
    fe 0.24.0
    +
    +

    You can run the built-in tests using:

    +
    cargo test --workspace --features solc-backend
    +
    +

    Editor support & Syntax highlighting

    +

    Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension.

    +

    In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then "Install Extension") and search for fe-lang.code-ve. Click on the extension and then click on the Install button.

    +

    We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.

    +

    Fe projects

    +

    A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.

    +

    Creating a project

    +

    You can start a project using the new subcommand:

    +

    $ fe new <my_project>

    +

    This will generate a template project containing the following:

    +
      +
    • A src directory containing two .fe files.
    • +
    • A fe.toml manifest with basic project info and some local project imports.
    • +
    +

    Manifest

    +

    The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run.

    +

    For example:

    +
    name="my-project"
    +version = "1.0"
    +
    +[dependencies]
    +dependency_1 = "../lib"
    +
    +

    You can also specify which version of a particular dependency you want to use, using curly braces:

    +
    name="my-project"
    +version = "1.0"
    +
    +[dependencies]
    +dependency_1 = {path = "../lib", version = "1.0"}
    +
    +

    Project modes

    +

    There are two project modes: main and lib.

    +

    Main projects can import libraries and have code output.

    +

    Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects.

    +

    The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.

    +

    Importing

    +

    You can import code from external files with the following syntax:

    +
    #![allow(unused)]
    +fn main() {
    +use utils::get_42
    +}
    +

    This will import the get_42 function from the file utils.fe.

    +

    You can also import using a custom name/alias:

    +
    #![allow(unused)]
    +fn main() {
    +use utils::get_42 as get_42
    +}
    +

    Tests

    +

    The templates created using fe new include a simple test demonstrating the test syntax.

    +

    To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value.

    +

    For example, to test the say_hello function on Contract which is expected to return the string "hello":

    +
    #![allow(unused)]
    +fn main() {
    +fn test_contract(mut ctx: Context) {
    +    let contract: Contract = Contract.create(ctx, 0)
    +    assert main.say_hello() == "hello"
    +}
    +}
    +

    You can run all the tests in a project by running the following command:

    +
    fe test <project-root>
    +
    +

    You will receive test results directly to the console.

    +

    Running your project

    +

    Once you have created a project, you can run the usual Fe CLI subcommands against the project path.

    +

    Tutorials

    +

    Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here!

    +

    For now, you can get started with:

    + +

    Watch this space for more tutorials coming soon!

    +

    Auction contract

    +

    This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts.

    +

    An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.

    +

    The auction rules

    +

    To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.

    +

    Get Started

    +

    To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page.

    +

    With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe.

    +

    Now you are ready to start coding in Fe!

    +

    You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.

    +

    Writing the Contract

    +

    You can see the entire contract here. You can refer back to this at any time to check implementation details.

    +

    Defining the Contract and initializing variables

    +

    A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows:

    +
    #![allow(unused)]
    +fn main() {
    +contract Auction {
    +    pub fn __init__() {}
    +}
    +}
    +

    To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. +You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice:

    +
    auction_end_time: u256
    +beneficiary: address
    +highest_bidder: address
    +highest_bid: u256
    +pending_returns: Map<address, u256>
    +ended: bool
    +
    +

    Notice that variables are named using snake case (lower case, underscore separated, like_this). +Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification.

    +

    The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length.

    +

    The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false.

    +

    The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map<address, u256>. Keys can be any numeric type, address, boolean or unit.

    +

    Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments.

    +

    The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256.

    +

    When you have implemented all this, your contract should look like this:

    +
    contract Auction {
    +    // states
    +    auction_end_time: u256
    +    beneficiary: address
    +    highest_bidder: address
    +    highest_bid: u256
    +    pending_returns: Map<address, u256>
    +    ended: bool
    +
    +    // constructor
    +    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
    +        self.beneficiary = beneficiary_addr
    +        self.auction_end_time = ctx.block_timestamp() + bidding_time
    +    }
    +}
    +
    +

    Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables.

    +

    The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context.

    +

    self

    +

    self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript.

    +

    Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is "mutable". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains.

    +

    Context

    +

    Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed.

    +

    Read more on Context in Fe

    +

    In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.

    +

    Bidding

    +

    Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable.

    +

    This logic can be implemented as follows:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn bid(mut self, mut ctx: Context) {
    +    if ctx.block_timestamp() > self.auction_end_time {
    +        revert AuctionAlreadyEnded()
    +    }
    +    if ctx.msg_value() <= self.highest_bid {
    +        revert BidNotHighEnough(highest_bid: self.highest_bid)
    +    }
    +    if self.highest_bid != 0 {
    +        self.pending_returns[self.highest_bidder] += self.highest_bid
    +    }
    +    self.highest_bidder = ctx.msg_sender()
    +    self.highest_bid = ctx.msg_value()
    +
    +    ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
    +}
    +}
    +

    The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data. Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition:

    +
    struct AuctionAlreadyEnded {
    +}
    +
    +

    The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe:

    +
    struct BidNotHighEnough {
    +    pub highest_bid: u256
    +}
    +
    +
    +

    Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data.

    +
    +

    Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value.

    +

    Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event:

    +
    struct HighestBidIncreased {
    +    #indexed
    +    pub bidder: address
    +    pub amount: u256
    +}
    +
    +

    You have now implemented all the logic to handle a bid!

    +

    Withdrawing

    +

    A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times).

    +

    Add the following to the contract to implement the withdraw method:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn withdraw(mut self, mut ctx: Context) -> bool {
    +    let amount: u256 = self.pending_returns[ctx.msg_sender()]
    +
    +    if amount > 0 {
    +        self.pending_returns[ctx.msg_sender()] = 0
    +        ctx.send_value(to: ctx.msg_sender(), wei: amount)
    +    }
    +    return true
    +}
    +}
    +
    +

    Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).

    +
    +

    End the auction

    +

    Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event.

    +

    First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows:

    +
    struct AuctionNotYetEnded {
    +}
    +
    +

    You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct:

    +
    struct AuctionEndAlreadyCalled {}
    +
    +

    If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. +Your method can look as follows:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn action_end(mut self, mut ctx: Context) {
    +    if ctx.block_timestamp() <= self.auction_end_time {
    +        revert AuctionNotYetEnded()
    +    }
    +    if self.ended {
    +        revert AuctionEndAlreadyCalled()
    +    }
    +    self.ended = true
    +    ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
    +
    +    ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
    +}
    +}
    +

    Congratulations! You just wrote an open auction contract in Fe!

    +

    View functions

    +

    To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data.

    +

    You can add the following functions to the contract:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn check_highest_bidder(self) -> address {
    +    return self.highest_bidder;
    +}
    +
    +pub fn check_highest_bid(self) -> u256 {
    +    return self.highest_bid;
    +}
    +
    +pub fn check_ended(self) -> bool {
    +    return self.ended;
    +}
    +}
    +

    Build and deploy the contract

    +

    Your contract is now ready to use! Compile it using

    +
    fe build auction.fe
    +
    +

    You will find the contract ABI and bytecode in the newly created outputs directory.

    +

    Start a local blockchain to deploy your contract to:

    +
    anvil
    +
    +

    There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode.

    +

    First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10:

    +
    cast --to_hex(10)
    +
    +>> 0xa // this is 10 in hex
    +
    +

    Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments.

    +
    cast send --from <your-address> --private-key <your-private-key> --create $(cat output/Auction/Auction.bin) $(cast abi-encode "__init__(uint256,address)" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720)
    +
    +

    You will see the contract address reported in your terminal.

    +

    Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35:

    +
    cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "bid()" --value "100ether" --private-key <your-private-key> --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
    +
    +

    You can check whether this was successful by calling the check_highest_bidder() function:

    +
    cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bidder()"
    +
    +

    You will see a response looking similar to:

    +
    0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720
    +
    +

    The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address).

    +

    You can do the same to check the highest bid:

    +
    cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bid()"
    +
    +

    This returns:

    +
    0x0000000000000000000000000000000000000000000000056bc75e2d63100000
    +
    +

    Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH):

    +
    cast --to-dec 56bc75e2d63100000
    +
    +>> 100000000000000000000 // 100 ETH in wei
    +
    +

    Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using:

    +
    cast balance <address>
    +
    +

    And check whether the auction open time has expired using

    +
    cast <contract-address> "check_ended()"
    +
    +

    Summary

    +

    Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain!

    +

    If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war!

    +

    By following this tutorial, you learned:

    +
      +
    • basic Fe types, such as bool, address, map and u256
    • +
    • basic Fe styles, such as snake case for variable names
    • +
    • how to create a contract with a constructor
    • +
    • how to revert
    • +
    • how to handle state variables
    • +
    • how to avoid reentrancy
    • +
    • how to use ctx to handle transaction data
    • +
    • how to emit events using ctx.emit
    • +
    • how to deploy a contract with constructor arguments using Foundry
    • +
    • how to interact with your contract
    • +
    +

    Example Contracts

    + +
    // errors
    +struct AuctionAlreadyEnded {
    +}
    +
    +struct AuctionNotYetEnded {
    +}
    +
    +struct AuctionEndAlreadyCalled {}
    +
    +struct BidNotHighEnough {
    +    pub highest_bid: u256
    +}
    +
    +// events
    +struct HighestBidIncreased {
    +    #indexed
    +    pub bidder: address
    +    pub amount: u256
    +}
    +
    +struct AuctionEnded {
    +    #indexed
    +    pub winner: address
    +    pub amount: u256
    +}
    +
    +contract Auction {
    +    // states
    +    auction_end_time: u256
    +    beneficiary: address
    +
    +    highest_bidder: address
    +    highest_bid: u256
    +
    +    pending_returns: Map<address, u256>
    +
    +    ended: bool
    +
    +    // constructor
    +    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
    +        self.beneficiary = beneficiary_addr
    +        self.auction_end_time = ctx.block_timestamp() + bidding_time
    +    }
    +
    +    //method
    +    pub fn bid(mut self, mut ctx: Context) {
    +        if ctx.block_timestamp() > self.auction_end_time {
    +            revert AuctionAlreadyEnded()
    +        }
    +        if ctx.msg_value() <= self.highest_bid {
    +            revert BidNotHighEnough(highest_bid: self.highest_bid)
    +        }
    +        if self.highest_bid != 0 {
    +            self.pending_returns[self.highest_bidder] += self.highest_bid
    +        }
    +        self.highest_bidder = ctx.msg_sender()
    +        self.highest_bid = ctx.msg_value()
    +
    +        ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
    +    }
    +
    +    pub fn withdraw(mut self, mut ctx: Context) -> bool {
    +        let amount: u256 = self.pending_returns[ctx.msg_sender()]
    +
    +        if amount > 0 {
    +            self.pending_returns[ctx.msg_sender()] = 0
    +            ctx.send_value(to: ctx.msg_sender(), wei: amount)
    +        }
    +        return true
    +    }
    +
    +    pub fn auction_end(mut self, mut ctx: Context) {
    +        if ctx.block_timestamp() <= self.auction_end_time {
    +            revert AuctionNotYetEnded()
    +        }
    +        if self.ended {
    +            revert AuctionEndAlreadyCalled()
    +        }
    +        self.ended = true
    +        ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
    +
    +        ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
    +    }
    +
    +    pub fn check_highest_bidder(self) -> address {
    +        return self.highest_bidder;
    +    }
    +
    +    pub fn check_highest_bid(self) -> u256 {
    +        return self.highest_bid;
    +    }
    +
    +    pub fn check_ended(self) -> bool {
    +        return self.ended;
    +    }
    +}
    +
    +

    Useful external links

    +

    There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.

    +

    Tools

    + +

    Projects

    +
      +
    • Bountiful - Bug bounty platform written in Fe, live on Mainnet
    • +
    • Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism
    • +
    +

    Hackathon projects

    +

    These are community projects written in Fe at various hackathons.

    +
      +
    • +

      Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis.

      +
    • +
    • +

      p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe.

      +
    • +
    • +

      Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses.

      +
    • +
    • +

      Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend.

      +
    • +
    • +

      Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a "chain": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift!

      +
    • +
    • +

      Go do it - A commitment device to help you achieve your goals.

      +
    • +
    • +

      Powerbald - On chain lottery written in Fe

      +
    • +
    • +

      sspc-flutter-fe - Stupid Simple Payment Channel written in Fe

      +
    • +
    +

    Others

    + +

    Blog posts

    + +

    Videos

    + +

    Development

    +

    Read how to become a Fe developer.

    + +

    Build and test

    +

    Please make sure Rust is installed.

    +

    Basic

    +

    The following commands only build the Fe -> Yul compiler components.

    +
      +
    • build the CLI: cargo build
    • +
    • test: cargo test --workspace
    • +
    +

    Full

    +

    The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system:

    +
      +
    • cmake
    • +
    • boost(1.65+)
    • +
    • libclang
    • +
    +
        brew install boost
    +
    +

    Once these have been installed, you may run the full build. This is enabled using the solc-backend feature.

    +
      +
    • build the CLI: cargo build --features solc-backend
    • +
    • test: cargo test --workspace --features solc-backend
    • +
    +

    Release

    +

    Versioning

    +

    Make sure that version follows semver rules e.g (0.23.0).

    +

    Generate Release Notes

    +

    Prerequisite: Release notes are generated with towncrier. Ensure to have towncrier installed and the command is available.

    +

    Run make notes version=<version> where <version> is the version we are generating the release notes for e.g. 0.23.0.

    +

    Example:

    +
    make notes version=0.23.0
    +
    +

    Examine the generated release notes and if needed perform and commit any manual changes.

    +

    Generate the release

    +

    Run make release version=<version>.

    +

    Example:

    +
    make release version=0.23.0
    +
    +

    This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.

    +

    Tag and push the release

    +

    Prerequisite: Make sure the central repository is configured as upstream, not origin.

    +

    After the tests are adjusted run make push-tag to create the tag and push it to Github.

    +

    Manually edit the release on GitHub

    +

    Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.

    +

    Updating Docs & Website

    +

    A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions (See GitHub issue #543).

    +

    Preview the sites locally

    +

    Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.

    +

    Deploy website & docs

    +

    Prerequisite: Make sure the central repository is configured as upstream, not origin.

    +

    Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).

    +

    Fe Standard Library

    +

    The standard library includes commonly used algorithms and data structures that come bundled as part of the language.

    + +

    Precompiles

    +

    Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork.

    +

    The nine precompiles available in the Fe standard library are:

    + +

    These precompiles are imported as follows:

    +
    use std::precompiles
    +
    +

    ec_recover

    +

    ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.

    +

    Parameters

    +
      +
    • hash: the hash of the signed message, u256
    • +
    • v: the recovery identifier, a number in the range 27-30, u256
    • +
    • r: elliptic curve parameter, u256
    • +
    • s: elliptic curve parameter, u256
    • +
    +

    Returns

    +

    ec_recover returns an address.

    +

    Function signature

    +
    pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address
    +
    +

    Example

    +
    let result: address = precompiles::ec_recover(
    +    hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
    +    v: 28,
    +    r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
    +    s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
    +)
    +
    +

    SHA2_256

    +

    SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.

    +

    Parameters

    +
      +
    • buf: a sequence of bytes to hash, MemoryBuffer
    • +
    +

    Returns

    +

    SHA2_256 returns a hash as a u256

    +

    Function signature

    +
    pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256
    +
    +

    Example

    +
    let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
    +let result: u256 = precompiles::sha2_256(buf)
    +
    +

    ripemd_160

    +

    ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.

    +

    Parameters

    +
      +
    • input_buf: a sequence of bytes to hash, MemoryBuffer
    • +
    +

    Returns

    +

    ripemd_160 returns a hash as a u256

    +

    Function signature

    +
    pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256
    +
    +
    +

    Example

    +
    let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
    +let result: u256 = precompiles::ripemd_160(buf)
    +
    +

    identity

    +

    identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.

    +

    Parameters

    +
      +
    • input_buf: a sequence of bytes to hash, MemoryBuffer
    • +
    +

    Returns

    +

    identity returns a sequence of bytes, MemoryBuffer

    +

    Function signature

    +
    pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer
    +
    +
    +

    Example

    +
    let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)
    +let mut result: MemoryBufferReader = precompiles::identity(buf).reader()
    +
    +

    mod_exp

    +

    mod_exp is a modular exponentiation function required for elliptic curve operations.

    +

    Parameters

    +
      +
    • b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer
    • +
    • e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer
    • +
    • m: MemoryBuffer: the modulus, MemoryBuffer
    • +
    • b_size: u256: the length of b in bytes, u256
    • +
    • e_size: u256: the length of e in bytes, u256
    • +
    • m_size: u256: then length of m in bytes, u256
    • +
    +

    Returns

    +

    mod_exp returns a sequence of bytes, MemoryBuffer

    +

    Function signature

    +
    pub fn mod_exp(
    +    b_size: u256,
    +    e_size: u256,
    +    m_size: u256,
    +    b: MemoryBuffer,
    +    e: MemoryBuffer,
    +    m: MemoryBuffer,
    +) -> MemoryBuffer
    +
    +
    +

    Example

    +
    let mut result: MemoryBufferReader = precompiles::mod_exp(
    +    b_size: 1,
    +    e_size: 1,
    +    m_size: 1,
    +    b: MemoryBuffer::from_u8(value: 8),
    +    e: MemoryBuffer::from_u8(value: 9),
    +    m: MemoryBuffer::from_u8(value: 10),
    +).reader()
    +
    +

    ec_add

    +

    ec_add does point addition on elliptic curves.

    +

    Parameters

    +
      +
    • x1: x-coordinate 1, u256
    • +
    • y1: y coordinate 1, u256
    • +
    • x2: x coordinate 2, u256
    • +
    • y2: y coordinate 2, u256
    • +
    +

    Function signature

    +
    pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)
    +
    +

    Returns

    +

    ec_add returns a tuple of u256, (u256, u256).

    +

    Example

    +
    let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)
    +
    +

    ec_mul

    +

    ec_mul is for multiplying elliptic curve points.

    +

    Parameters

    +
      +
    • x: x-coordinate, u256
    • +
    • y: y coordinate, u256
    • +
    • s: multiplier, u256
    • +
    +

    Function signature

    +
    pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)
    +
    +

    Returns

    +

    ec_mul returns a tuple of u256, (u256, u256).

    +

    Example

    +
    let (x, y): (u256, u256) = precompiles::ec_mul(
    +    x: 1,
    +    y: 2,
    +    s: 2
    +)
    +
    +

    ec_pairing

    +

    ec_pairing does elliptic curve pairing - a form of encrypted multiplication.

    +

    Parameters

    +
      +
    • input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer
    • +
    +

    Returns

    +

    ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).

    +

    Example

    +
        let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384)
    +    let mut writer: MemoryBufferWriter = buf.writer()
    +
    +    writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da)
    +    writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6)
    +    writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc)
    +    writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9)
    +    writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90)
    +    writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e)
    +    writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001)
    +    writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45)
    +    writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4)
    +    writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7)
    +    writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2)
    +    writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc)
    +
    +    assert precompiles::ec_pairing(buf)
    +}
    +
    +

    blake_2f

    +

    blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.

    +

    Parameters

    +
      +
    • h: the state vector, Array<u64, 8>
    • +
    • m: message block vector, Array<u64, 16>
    • +
    • t: offset counter, Array<u64, 2>
    • +
    • f: bool
    • +
    • rounds: number of rounds of mixing, u32
    • +
    +

    Returns

    +

    blake_2f returns a modified state vector, Array<u64, 8>

    +

    Function signature

    +
    pub fn blake_2f(rounds: u32, h: Array<u64, 8>, m: Array<u64, 16>, t: Array<u64, 2>, f: bool) ->  Array<u64, 8>
    +
    +

    Example

    +
    let result: Array<u64, 8> = precompiles::blake_2f(
    +    rounds: 12,
    +    h: [
    +        0x48c9bdf267e6096a,
    +        0x3ba7ca8485ae67bb,
    +        0x2bf894fe72f36e3c,
    +        0xf1361d5f3af54fa5,
    +        0xd182e6ad7f520e51,
    +        0x1f6c3e2b8c68059b,
    +        0x6bbd41fbabd9831f,
    +        0x79217e1319cde05b,
    +    ],
    +    m: [
    +        0x6162630000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +    ],
    +    t: [
    +        0x0300000000000000,
    +        0x0000000000000000,
    +    ],
    +    f: true
    +)
    +
    +

    Fe Language Specification

    +
    + Warning: This is a work in progress document. It is incomplete and specifications aren't stable yet. +
    + +

    Notation

    +

    Grammar

    +

    The following notations are used by the Lexer and Syntax grammar snippets:

    +
    + + + + + + + + + + + + + + +
    NotationExamplesMeaning
    CAPITALKW_IFA token produced by the lexer
    ItalicCamelCaseItemA syntactical production
    stringx, while, *The exact character(s)
    \x\n, \r, \t, \0The character represented by this escape
    x?pub?An optional item
    x*OuterAttribute*0 or more of x
    x+MacroMatch+1 or more of x
    xa..bHEX_DIGIT1..6a to b repetitions of x
    |u8 | u16, Block | ItemEither one or another
    [ ][b B]Any of the characters listed
    [ - ][a-z]Any of the characters in the range
    ~[ ]~[b B]Any characters, except those listed
    ~string~\n, ~*/Any characters, except this sequence
    ( )(, Parameter)Groups items
    +

    Lexical Structure

    + +

    Keywords

    +

    Fe divides keywords into two categories:

    + +

    Strict keywords

    +

    These keywords can only be used in their correct contexts. They cannot +be used as the identifiers.

    +
    +

    Lexer:
    +KW_AS : as
    +KW_BREAK : break
    +KW_CONST : const
    +KW_CONTINUE : continue
    +KW_CONST : contract
    +KW_FN : fn
    +KW_ELSE : else
    +KW_ENUM : enum
    +KW_EVENT : event
    +KW_FALSE : false
    +KW_FOR : for
    +KW_IDX : idx
    +KW_IF : if
    +KW_IN : in
    +KW_LET : let
    +KW_MATCH : match
    +KW_MUT : mut
    +KW_NONPAYABLE : nonpayable
    +KW_PAYABLE : payable
    +KW_PUB : pub
    +KW_RETURN : return
    +KW_REVERT : revert
    +KW_SELFVALUE : self
    +KW_STRUCT : struct
    +KW_TRUE : true
    +KW_USE : use
    +KW_WHILE : while
    +KW_ADDRESS : address

    +
    +

    Reserved keywords

    +

    These keywords aren't used yet, but they are reserved for future use. They have +the same restrictions as strict keywords. The reasoning behind this is to make +current programs forward compatible with future versions of Fe by forbidding +them to use these keywords.

    +
    +

    Lexer:
    +KW_ABSTRACT : abstract
    +KW_ASYNC : async
    +KW_AWAIT : await
    +KW_DO : do
    +KW_EXTERNAL : external
    +KW_FINAL : final
    +KW_IMPL : impl
    +KW_MACRO : macro
    +KW_OVERRIDE : override
    +KW_PURE : pure
    +KW_SELFTYPE : Self
    +KW_STATIC : static
    +KW_SUPER : super
    +KW_TRAIT : trait
    +KW_TYPE : type
    +KW_TYPEOF : typeof
    +KW_VIEW : view
    +KW_VIRTUAL : virtual
    +KW_WHERE : where
    +KW_YIELD : yield

    +
    +

    Identifiers

    +
    +

    Lexer:
    +IDENTIFIER_OR_KEYWORD :
    +      [a-z A-Z] [a-z A-Z 0-9 _]*
    +   | _ [a-z A-Z 0-9 _]+ +Except a strict or reserved keyword

    +
    +

    An identifier is any nonempty ASCII string of the following form:

    +

    Either

    +
      +
    • The first character is a letter.
    • +
    • The remaining characters are alphanumeric or _.
    • +
    +

    Or

    +
      +
    • The first character is _.
    • +
    • The identifier is more than one character. _ alone is not an identifier.
    • +
    • The remaining characters are alphanumeric or _.
    • +
    +

    Tokens

    +

    NEWLINE

    +

    A token that represents a new line.

    +

    Literals

    +

    A literal is an expression consisting of a single token, rather than a sequence +of tokens, that immediately and directly denotes the value it evaluates to, +rather than referring to it by name or some other evaluation rule. A literal is +a form of constant expression, so is evaluated (primarily) at compile time.

    +

    Examples

    +

    Strings

    +
    + +
    ExampleCharactersEscapes
    String"hello"ASCII subsetQuote & ASCII
    +
    +

    ASCII escapes

    +
    + + + + +
    Name
    \nNewline
    \rCarriage return
    \tTab
    \\Backslash
    +
    +

    Quote escapes

    +
    + +
    Name
    \"Double quote
    +
    +

    Numbers

    +
    + + + + +
    Number literals*Example
    Decimal integer98_222
    Hex integer0xff
    Octal integer0o77
    Binary integer0b1111_0000
    +
    +

    * All number literals allow _ as a visual separator: 1_234

    +

    Boolean literals

    +
    +

    Lexer
    +BOOLEAN_LITERAL :
    +   true | false

    +
    +

    String literals

    +
    +

    Lexer
    +STRING_LITERAL :
    +   " (
    +      PRINTABLE_ASCII_CHAR
    +      | QUOTE_ESCAPE
    +      | ASCII_ESCAPE
    +   )* "

    +

    PRINTABLE_ASCII_CHAR :
    +   Any ASCII character between 0x1F and 0x7E

    +

    QUOTE_ESCAPE :
    +   \"

    +

    ASCII_ESCAPE :
    +   | \n | \r | \t | \\

    +
    +

    A string literal is a sequence of any characters that are in the set of +printable ASCII characters as well as a set of defined escape sequences.

    +

    Line breaks are allowed in string literals.

    +

    Integer literals

    +
    +

    Lexer
    +INTEGER_LITERAL :
    +   ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL )

    +

    DEC_LITERAL :
    +   DEC_DIGIT (DEC_DIGIT|_)*

    +

    BIN_LITERAL :
    +   0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)*

    +

    OCT_LITERAL :
    +   0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)*

    +

    HEX_LITERAL :
    +   0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)*

    +

    BIN_DIGIT : [0-1]

    +

    OCT_DIGIT : [0-7]

    +

    DEC_DIGIT : [0-9]

    +

    HEX_DIGIT : [0-9 a-f A-F]

    +
    +

    An integer literal has one of four forms:

    +
      +
    • A decimal literal starts with a decimal digit and continues with any +mixture of decimal digits and underscores.
    • +
    • A hex literal starts with the character sequence U+0030 U+0078 +(0x) and continues as any mixture (with at least one digit) of hex digits +and underscores.
    • +
    • An octal literal starts with the character sequence U+0030 U+006F +(0o) and continues as any mixture (with at least one digit) of octal digits +and underscores.
    • +
    • A binary literal starts with the character sequence U+0030 U+0062 +(0b) and continues as any mixture (with at least one digit) of binary digits +and underscores.
    • +
    +

    Examples of integer literals of various forms:

    +
    123                      // type u256
    +0xff                     // type u256
    +0o70                     // type u256
    +0b1111_1111_1001_0000    // type u256
    +0b1111_1111_1001_0000i64 // type u256
    +
    +

    Comments

    +
    +

    Lexer
    +LINE_COMMENT :
    +      // *

    +
    +

    Items

    + +

    Visibility and Privacy

    +

    These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question "Can this item be used at this location?"

    +

    Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified.

    +

    Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions.

    +

    Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility.

    +

    For example, this is a function that can be called externally from a transaction:

    +
    pub fn answer_to_life_the_universe_and_everything() -> u256 {
    +    return 42
    +}
    +
    +

    Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition.

    +

    For example, given an Ingot with the following structure:

    +
    example_ingot
    +└── src
    +    ├── ding
    +    │   └── dong.fe
    +    └── main.fe
    +
    +

    With ding/dong.fe having the following contents:

    +
    pub struct Dang {
    +    pub my_address: address
    +    pub my_u256: u256
    +    pub my_i8: i8
    +}
    +
    +

    Then main.fe can use the Dang struct since it is pub-qualified:

    +
    use ding::dong::Dang
    +
    +contract Foo {
    +    pub fn hot_dang() -> Dang {
    +        return Dang(
    +            my_address: 8,
    +            my_u256: 42,
    +            my_i8: -1
    +        )
    +    }
    +}
    +
    +

    Structs

    +
    +

    Syntax
    +Struct :
    +   struct IDENTIFIER {
    +      StructField*
    +      StructMethod*
    +   }

    +

    StructField :
    +   pub? IDENTIFIER : Type

    +

    StructMethod :
    +   Function

    +
    +

    A struct is a nominal struct type defined with the keyword struct.

    +

    An example of a struct item and its use:

    +
    struct Point {
    +    pub x: u256
    +    pub y: u256
    +}
    +
    +fn pointy_stuff() {
    +    let mut p: Point = Point(x: 10, y: 11)
    +    let px: u256 = p.x
    +    p.x = 100
    +}
    +
    +

    Builtin functions:

    +
      +
    • abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.
    • +
    +

    Traits

    +
    +

    Syntax
    +Trait :
    +   trait IDENTIFIER {
    +      TraitMethod*
    +   }

    +

    TraitMethod :
    +   fn IDENTIFIER
    +      ( FunctionParameters? )
    +      FunctionReturnType? ;

    +
    +

    A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function.

    +

    All traits define an implicit type parameter Self that refers to "the type that is implementing this interface".

    +

    Example of the Min trait from Fe's standard library:

    +
    pub trait Min {
    +  fn min() -> Self;
    +}
    +
    +

    Example of the i8 type implementing the Min trait:

    +
    impl Min for i8 {
    +  fn min() -> Self {
    +    return -128
    +  }
    +}
    +
    +

    Example of a function restricting a generic parameter to types implementing the Compute trait:

    +
    pub trait Compute {
    +  fn compute(self) -> u256;
    +}
    +
    +struct Example {
    +  fn do_something<T: Compute>(val: T) -> u256 {
    +    return val.compute()
    +  }
    +}
    +
    +

    Enum

    +
    +

    Syntax
    +Enumeration :
    +   enum IDENTIFIER {
    +      EnumField*
    +      EnumMethod*
    +   }

    +

    EnumField :
    +   IDENTIFIER | IDENTIFIER(TupleElements?)

    +

    EnumMethod :
    +   Function

    +

    TupleElements :
    +   Type ( , Type )*

    +
    +

    An enum, also referred to as enumeration is a simultaneous definition of a +nominal Enum type, that can be used to create or pattern-match values of the corresponding type.

    +

    Enumerations are declared with the keyword enum.

    +

    An example of an enum item and its use:

    +
    enum Animal {
    +    Dog
    +    Cat
    +    Bird(BirdType)
    +    
    +    pub fn bark(self) -> String<10> {
    +        match self {
    +            Animal::Dog => {
    +                return "bow"
    +            }
    +
    +            Animal::Cat => {
    +                return "meow"
    +            }
    +            
    +            Animal::Bird(BirdType::Duck) => {
    +                return "quack"
    +            }
    +            
    +            Animal::Bird(BirdType::Owl) => {
    +                return "hoot"
    +            }
    +        }
    +    }
    +}
    +
    +enum BirdType {
    +    Duck
    +    Owl
    +}
    +
    +fn f() {
    +    let barker: Animal = Animal::Dog
    +    barker.bark()
    +}
    +
    +

    Type aliases

    +
    +

    Syntax
    +TypeAlias :
    +   type IDENTIFIER = Type

    +
    +

    A type alias defines a new name for an existing type. Type aliases are +declared with the keyword type.

    +

    For example, the following defines the type BookMsg as a synonym for the type +u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe.

    +
    type BookMsg = Array<u8, 100>
    +
    +

    Contracts

    +
    +

    Syntax
    +Contract :
    +   contract IDENTIFIER {
    +  ContractMember*
    +  _}

    +

    ContractMember:
    +   Visibility?
    +   (
    +         ContractField
    +      | Function
    +      | Struct
    +      | Enum
    +   )

    +

    Visibility :
    +   pub?

    +

    ContractField :
    +   IDENTIFIER : Type

    +
    +

    A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain.

    +

    Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data).

    +

    In Fe, contracts are defined in files with .fe extensions and compiled using fe build.

    +

    A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods.

    +

    An example of a contract:

    +
    struct Signed {
    +    pub book_msg: String<100>
    +}
    +
    +contract GuestBook {
    +    messages: Map<address, String<100>>
    +
    +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
    +        self.messages[ctx.msg_sender()] = book_msg
    +        ctx.emit(Signed(book_msg: book_msg))
    +    }
    +
    +    pub fn get_msg(self, addr: address) -> String<100> {
    +        return self.messages[addr].to_mem()
    +    }
    +}
    +
    +

    Multiple contracts can be compiled from a single .fe contract file.

    +

    pragma

    +

    An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it.

    +

    Read more on pragma

    +

    State variables

    +

    State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function.

    +
    pub contract Example {
    +    some_number: u256
    +    _some_string: String<100>
    +}
    +
    +

    Contract functions

    +

    Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well.

    +

    Individual functions can be called internally or externally depending upon their visibility (either private or public).

    +

    Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument.

    +

    Read more on functions.

    +

    The __init__() function

    +

    The __init__ function is a special contract function that can only be called at contract deployment time. It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function.

    +
    pub contract Example {
    +
    +    _some_number: u256
    +    _some_string: String<100>
    +
    +    pub fn __init__(mut self, number: u256, string: String<100>)  {
    +        self._some_number=number;
    +        self._some_string=string;
    +    }
    +}
    +
    +

    It is not possible to call __init__ at runtime.

    +

    Structs

    +

    Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error.

    +

    Read more on structs.

    +

    Functions

    +

    Constant size values stored on the stack or in memory can be passed into and returned by functions.

    +
    +

    Syntax
    +Function :
    +   FunctionQualifiers fn IDENTIFIER
    +      ( FunctionParameters? )
    +      FunctionReturnType?
    +      {
    +      FunctionStatements*
    +      }

    +

    FunctionQualifiers :
    +   pub?

    +

    FunctionStatements :
    +         ReturnStatement
    +      | VariableDeclarationStatement
    +      | AssignStatement
    +      | AugmentedAssignStatement
    +      | ForStatement
    +      | WhileStatement
    +      | IfStatement
    +      | AssertStatement
    +      | BreakStatement
    +      | ContinueStatement
    +      | RevertStatement
    +      | Expression

    +

    FunctionParameters :
    +   self? | self,? FunctionParam (, FunctionParam)* ,?

    +

    FunctionParam :
    +   FunctionParamLabel? IDENTIFIER : Types

    +

    FunctionParamLabel :
    +   _ | IDENTIFIER

    +

    FunctionReturnType :
    +   -> Types

    +
    +

    A function definition consists of name and code block along with an optional +list of parameters and return value. Functions are declared with the +keyword fn. Functions may declare a set of input parameters, +through which the caller passes arguments into the function, and +the output type of the value the function will return to its caller +on completion.

    +

    When referred to, a function yields a first-class value of the +corresponding zero-sized function type, which +when called evaluates to a direct call to the function.

    +

    A function header prepends a set or curly brackets {...} which contain the function body.

    +

    For example, this is a simple function:

    +
    fn add(x: u256, y: u256) -> u256 {
    +    return x + y
    +}
    +
    +

    Functions can be defined inside of a contract, inside of a struct, or at the +"top level" of a module (that is, not nested within another item).

    +

    Example:

    +
    fn add(_ x: u256, _ y: u256) -> u256 {
    +    return x + y
    +}
    +
    +contract CoolCoin {
    +    balance: Map<address, u256>
    +
    +    fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool {
    +        if self.balance[sender] < value {
    +            return false
    +        }
    +        self.balance[sender] -= value
    +        self.balance[recipient] += value
    +        return true
    +    }
    +    pub fn demo(mut self) {
    +        let ann: address = 0xaa
    +        let bob: address = 0xbb
    +        self.balance[ann] = 100
    +
    +        let bonus: u256 = 2
    +        let value: u256 = add(10, bonus)
    +        let ok: bool = self.transfer(from: ann, to: bob, value)
    +    }
    +}
    +
    +

    Function parameters have optional labels. When a function is called, the +arguments must be labeled and provided in the order specified in the +function definition.

    +

    The label of a parameter defaults to the parameter name; a different label +can be specified by adding an explicit label prior to the parameter name. +For example:

    +
    fn encrypt(msg cleartext: u256, key: u256) -> u256 {
    +    return cleartext ^ key
    +}
    +
    +fn demo() {
    +    let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)
    +}
    +
    +

    Here, the first parameter of the encrypt function has the label msg, +which is used when calling the function, while the parameter name is +cleartext, which is used inside the function body. The parameter name +is an implementation detail of the function, and can be changed without +modifying any function calls, as long as the label remains the same.

    +

    When calling a function, a label can be omitted when the argument is +a variable with a name that matches the parameter label. Example:

    +
    let msg: u256 = 0xdecafbad
    +let cyf: u256 = encrypt(msg, key: 0x1234)
    +
    +

    A parameter can also be specified to have no label, by using _ in place of a +label in the function definition. In this case, when calling the function, the +corresponding argument must not be labeled. Example:

    +
    fn add(_ x: u256, _ y: u256) -> u256 {
    +    return x + y
    +}
    +fn demo() {
    +    let sum: u256 = add(16, 32)
    +}
    +
    +

    Functions defined inside of a contract or struct may take self as a +parameter. This gives the function the ability to read and write contract +storage or struct fields, respectively. If a function takes self +as a parameter, the function must be called via self. For example:

    +
    let ok: bool = self.transfer(from, to, value)
    +
    +

    self is expected to come first parameter in the function's parameter list.

    +

    Functions can also take a Context object which gives access to EVM features that read or write +blockchain and transaction data. Context is expected to be first in the function's parameter list +unless the function takes self, in which case Context should come second.

    +

    Context

    +

    Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.

    +

    Rationale

    +

    Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses.

    +

    To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone.

    +

    For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log).

    +
    pub fn looks_pure_but_isnt() {
    +  // COMPILE ERROR
    +  block_number()
    +}
    +
    +

    Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows:

    +
    pub fn uses_context(ctx: Context) -> u256 {
    +    return ctx.block_number()
    +}
    +
    +

    The Context object

    +

    The Context object gates access to features such as:

    +
      +
    • emitting logs
    • +
    • creating contracts
    • +
    • transferring ether
    • +
    • reading message info
    • +
    • reading block info
    • +
    +

    The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error.

    +

    The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g.

    +
    // The context object is automatically injected when this is called externally
    +pub fn multiply_block_number(ctx: Context) -> u256 {
    +  // but it has to be passed along in this function call
    +  return retrieves_blocknumber(ctx) * 1000
    +}
    +
    +fn retrieves_blocknumber(ctx: Context) -> u256 {
    +  return ctx.block_number()
    +}
    +
    +

    Context mutability

    +

    All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.:

    +
    struct SomeEvent{
    +}
    +
    +pub fn mutable(mut ctx: Context) {
    +    ctx.emit(SomeEvent())
    +}
    +
    +

    ABI conformity

    +

    The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self. The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types.

    +
    + + + + + + + + + +
    CategoryCharacteristicsFe SyntaxABI
    PureCan only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impurefoo(val: u256)pure
    Read ContractReading information from the contract instance (broad definition includes reading constants from contract code)foo(self)view
    Storage WritingWriting to contract storage (own or that of other contracts)foo(mut self)payable or nonpayable
    Context ReadingReading contextual information from the blockchain (msg, block etc)foo(ctx: Context)view
    Context ModifyingEmitting logs, transferring ether, creating contractsfoo(ctx: mut Context)payable or nonpayable
    Read Contract & ContextReading information from the contract instance and Contextfoo(self, ctx:Context)view
    Read Contract & write ContextReading information from the contract instance and modify Contextfoo(self, ctx: mut Context)view
    Storage Writing & read ContextWriting to contract storage and read from Contextfoo(mut self, ctx: Context)payable or nonpayable
    Storage Writing & write ContextWriting to contract storage and Contextfoo(mut self, ctx: mut Context)payable or nonpayable
    +
    +

    This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.

    +

    Examples

    +

    msg_sender and msg_value

    +

    Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the +transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable.

    +
    #![allow(unused)]
    +fn main() {
    +// assumes existence of state variable named 'ledger' with type Map<address, u256>
    +pub fn add_to_ledger(mut self, ctx: Context) {
    +    self.ledger[ctx.msg_sender()] = ctx.msg_value();
    +}
    +}
    +

    Transferring ether

    +

    Transferring ether modifies the blockchain state, so it requires access to a mutable Context object.

    +
    pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) {
    +    ctx.send_value(to: _addr, wei: amount)
    +}
    +
    +

    create/create2

    +

    Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn creates_contract(ctx: mut Context):
    +  ctx.create2(...)
    +}
    +

    block number

    +

    Reading block chain information such as the current block number requires Context (but does not require it to be mutable).

    +
    pub fn retrieves_blocknumber(ctx: Context) {
    +  ctx.block_number()
    +}
    +
    +

    Self

    +

    self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage.

    +
    +

    Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs.

    +
    +

    If a function takes self as a parameter, the function must be called via self. For example:

    +
    #![allow(unused)]
    +fn main() {
    +let ok: bool = self.transfer(from, to, value)
    +}
    +

    Mutability

    +

    self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.

    +

    Examples

    +

    Reading contract storage

    +
    contract example {
    +
    +    value: u256;
    +
    +    pub fn check_value(self) -> u256 {
    +        return self.value;
    +    }
    +}
    +
    +

    Writing contract storage

    +
    contract example {
    +
    +    value: u256;
    +
    +    pub fn update_value(mut self) {
    +        self.value += 1;
    +    }
    +}
    +
    +

    Statements

    + +

    pragma statement

    +
    +

    Syntax
    +PragmaStatement :
    +   pragma VersionRequirement

    +

    VersionRequirement :Following the semver implementation by cargo

    +
    +

    The pragma statement is denoted with the keyword pragma. Evaluating a pragma +statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement.

    +

    An example of a pragma statement:

    +
    pragma ^0.1.0
    +
    +

    The version requirement syntax is identical to the one that is used by cargo (more info).

    +

    const statement

    +
    +

    Syntax
    +ConstStatement :
    +   const IDENTIFIER: Type = Expression

    +
    +

    A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type.

    +

    Example:

    +
    const TEN: u256 = 10
    +const HUNDO: u256 = TEN * TEN
    +
    +contract Foo {
    +  pub fn bar() -> u256 {
    +    return HUNDO
    +  }
    +}
    +
    +

    let statement

    +
    +

    Syntax
    +LetStatement :
    +   let IDENTIFIER | TupleTarget : Type = Expression

    +

    TupleTarget :
    +   ( TupleTargetItem (, TupleTargetItem) + )

    +

    TupleTargetItem :
    +   IDENTIFIER | TupleTarget

    +
    +

    A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope.

    +
    +

    Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue.

    +
    +

    Example:

    +
    contract Foo {
    +
    +  pub fn bar() {
    +    let val1: u256 = 1
    +    let (val2):(u256) = (1,)
    +    let (val3, val4):(u256, bool) = (1, false)
    +    let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4))
    +  }
    +}
    +
    +

    Assignment statement

    +
    +

    Syntax
    +AssignmentStatement :
    +   Expression = Expression

    +
    +

    An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression.

    +

    Example:

    +
    contract Foo {
    +  some_array: Array<u256, 10>
    +
    +
    +  pub fn bar(mut self) {
    +    let mut val1: u256 = 10
    +    // Assignment of stack variable
    +    val1 = 10
    +
    +    let mut values: (u256, u256) = (1, 2)
    +    // Assignment of tuple item
    +    values.item0 = 3
    +
    +    // Assignment of storage array slot
    +    self.some_array[5] = 1000
    +  }
    +}
    +
    +

    Augmenting Assignment statement

    +
    +

    Syntax
    +AssignmentStatement :
    +      Expression = Expression
    +   | Expression += Expression
    +   | Expression -= Expression
    +   | Expression %= Expression
    +   | Expression **= Expression
    +   | Expression <<= Expression
    +   | Expression >>= Expression
    +   | Expression |= Expression
    +   | Expression ^= Expression
    +   | Expression &= Expression

    +
    +

    Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements.

    +

    An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression.

    +

    Example:

    +
    fn example() -> u8 {
    +    let mut a: u8 = 1
    +    let b: u8 = 2
    +    a += b
    +    a -= b
    +    a *= b
    +    a /= b
    +    a %= b
    +    a **= b
    +    a <<= b
    +    a >>= b
    +    a |= b
    +    a ^= b
    +    a &= b
    +    return a
    +}
    +
    +

    revert statement

    +
    +

    Syntax
    +RevertStatement :
    +   revert Expression?

    +
    +

    The revert statement is denoted with the keyword revert. Evaluating a revert +statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838.

    +

    An example of a revert statement without revert data:

    +
    contract Foo {
    +    fn transfer(self, to: address, value: u256) {
    +        if not self.in_whitelist(addr: to) {
    +            revert
    +        }
    +        // more logic here
    +    }
    +
    +    fn in_whitelist(self, addr: address) -> bool {
    +        return false
    +    }
    +}
    +
    +

    An example of a revert statement with revert data:

    +
    struct ApplicationError {
    +    pub code: u8
    +}
    +
    +contract Foo {
    +    pub fn transfer(self, to: address, value: u256) {
    +        if not self.in_whitelist(addr: to) {
    +            revert ApplicationError(code: 5)
    +        }
    +        // more logic here
    +    }
    +
    +    fn in_whitelist(self, addr: address) -> bool {
    +        return false
    +    }
    +}
    +
    +

    return statement

    +
    +

    Syntax
    +ReturnStatement :
    +   return Expression?

    +
    +

    The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly.

    +

    An example of a return statement without explicit use of an expression:

    +
    contract Foo {
    +    fn transfer(self, to: address, value: u256) {
    +        if not self.in_whitelist(to) {
    +            return
    +        }
    +    }
    +
    +    fn in_whitelist(self, to: address) -> bool {
    +        // revert used as placeholder for actual logic
    +        revert
    +    }
    +}
    +
    +

    The above can also be written in a slightly more verbose form:

    +
    contract Foo {
    +    fn transfer(self, to: address, value: u256) -> () {
    +        if not self.in_whitelist(to) {
    +            return ()
    +        }
    +    }
    +
    +    fn in_whitelist(self, to: address) -> bool {
    +        // revert used as placeholder for actual logic
    +        revert
    +    }
    +}
    +
    +

    if statement

    +
    +

    Syntax
    +IfStatement :
    +   if Expression{ +   (Statement | Expression)+
    +   }
    +   (else {
    +   (Statement | Expression)+
    +   })?

    +
    +

    Example:

    +
    contract Foo {
    +    pub fn bar(val: u256) -> u256 {
    +        if val > 5 {
    +            return 1
    +        } else {
    +            return 2
    +        }
    +    }
    +}
    +
    +

    The if statement is used for conditional execution.

    +

    for statement

    +
    +

    Syntax
    +ForStatement :
    +   for IDENTIFIER in Expression {
    +   (Statement | Expression)+
    +   }

    +
    +

    A for statement is a syntactic construct for looping over elements provided by an array type.

    +

    An example of a for loop over the contents of an array:

    +

    Example:

    +
    contract Foo {
    +
    +    pub fn bar(values: Array<u256, 10>) -> u256 {
    +        let mut sum: u256 = 0
    +        for i in values {
    +            sum = sum + i
    +        }
    +        return sum
    +    }
    +}
    +
    +

    while statement

    +
    +

    Syntax
    +WhileStatement :
    +   while Expression {
    +   (Statement | Expression)+
    +   }

    +
    +

    A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes.

    +

    Example:

    +
    contract Foo {
    +
    +    pub fn bar() -> u256 {
    +        let mut sum: u256 = 0
    +        while sum < 10 {
    +            sum += 1
    +        }
    +        return sum
    +    }
    +}
    +
    +

    break statement

    +
    +

    Syntax
    +BreakStatement :
    +   break

    +
    +

    The break statement can only be used within a for or while loop and causes the immediate termination of the loop.

    +

    If used within nested loops the break statement is associated with the innermost enclosing loop.

    +

    An example of a break statement used within a while loop.

    +
    contract Foo {
    +
    +    pub fn bar() -> u256 {
    +        let mut sum: u256 = 0
    +        while sum < 10 {
    +            sum += 1
    +
    +            if some_abort_condition() {
    +                break
    +            }
    +        }
    +        return sum
    +    }
    +
    +    fn some_abort_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    +

    An example of a break statement used within a for loop.

    +
    contract Foo {
    +
    +    pub fn bar(values: Array<u256, 10>) -> u256 {
    +        let mut sum: u256 = 0
    +        for i in values {
    +            sum = sum + i
    +
    +            if some_abort_condition() {
    +                break
    +            }
    +        }
    +        return sum
    +    }
    +
    +    fn some_abort_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    +

    continue statement

    +
    +

    Syntax
    +ContinueStatement :
    +   continue

    +
    +

    The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head.

    +

    If used within nested loops the continue statement is associated with the innermost enclosing loop.

    +

    An example of a continue statement used within a while loop.

    +
    contract Foo {
    +
    +    pub fn bar() -> u256 {
    +        let mut sum: u256 = 0
    +        while sum < 10 {
    +            sum += 1
    +
    +            if some_skip_condition() {
    +                continue
    +            }
    +        }
    +
    +        return sum
    +    }
    +
    +    fn some_skip_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    +

    An example of a continue statement used within a for loop.

    +
    contract Foo {
    +
    +    pub fn bar(values: Array<u256, 10>) -> u256 {
    +        let mut sum: u256 = 0
    +        for i in values {
    +            sum = sum + i
    +
    +            if some_skip_condition() {
    +                continue
    +            }
    +        }
    +        return sum
    +    }
    +
    +    fn some_skip_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    +

    match statement

    +
    +

    Syntax
    +MatchStatement :
    +   match Expression {
    +      ( Pattern => { Statement* } )+
    +   }

    +

    Pattern :
    +   PatternElem ( | PatternElem )*

    +

    PatternElem :
    +   IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path |
    +   Path( TuplePatterns? ) |( TuplePatterns? ) |
    +   Path{ StructPatterns? }

    +

    TuplePatterns :
    +   Pattern ( , Pattern )*

    +

    StructPatterns :
    +   Field ( , Field)*(, ..)?

    +

    Field :
    +   IDENTIFIER : Pattern

    +
    +

    A match statements compares expression with patterns, then executes body of the matched arm.

    +

    Example:

    +
    enum MyEnum {
    +    Unit
    +    Tuple(u32, u256, bool)
    +}
    +
    +contract Foo {
    +    pub fn bar(self) -> u256 {
    +        let val: MyEnum = MyEnum::Tuple(1, 10, false)
    +        return self.eval(val)
    +    }
    +    
    +    fn eval(self, val: MyEnum) -> u256 {
    +        match val {
    +            MyEnum::Unit => {
    +                return 0
    +            }
    +            
    +            MyEnum::Tuple(.., false) => {
    +                return 1
    +            }
    +            
    +            MyEnum::Tuple(a, b, true) => {
    +                return u256(a) + b
    +            }
    +        }
    +    }
    +}
    +
    +

    assert statement

    +
    +

    Syntax
    +AssertStatement :
    +   assert Expression (, Expression)?

    +
    +

    The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression.

    +

    If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code.

    +
    +

    Warning: +The current implementation of assert is under active discussion and likely to change.

    +
    +

    An example of a assert statement without the optional message:

    +
    contract Foo {
    +    fn bar(val: u256) {
    +        assert val > 5
    +    }
    +}
    +
    +

    An example of a assert statement with an error message:

    +
    contract Foo {
    +
    +    fn bar(val: u256) {
    +        assert val > 5, "Must be greater than five"
    +    }
    +}
    +
    +

    Expressions

    + +

    Call expressions

    +
    +

    Syntax
    +CallExpression :
    +   Expression GenericArgs? ( CallParams? )

    +

    GenericArgs :
    +   < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL)* >

    +

    CallParams :
    +   CallArg ( , CallArg )* ,?

    +

    CallArg :
    +   (CallArgLabel =)? Expression

    +

    CallArgLabel :
    +   IDENTIFIERLabel must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal.

    +
    +

    A call expression calls a function. The syntax of a call expression is an expression, followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition. If the function eventually returns, then the expression completes.

    +

    Example:

    +
    contract Foo {
    +
    +    pub fn demo(self) {
    +        let ann: address = 0xaa
    +        let bob: address = 0xbb
    +        self.transfer(from: ann, to: bob, 25)
    +    }
    +
    +    pub fn transfer(self, from: address, to: address, _ val: u256) {}
    +}
    +
    +

    Tuple expressions

    +
    +

    Syntax
    +TupleExpression :
    +   ( TupleElements? )

    +

    TupleElements :
    +   ( Expression , )+ Expression?

    +
    +

    A tuple expression constructs tuple values.

    +

    The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands. The number of tuple initializer operands is the arity of the constructed tuple.

    +

    1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression.

    +

    Tuple expressions without any tuple initializer operands produce the unit tuple.

    +

    For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field.

    +

    For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2.

    +

    Examples of tuple expressions and their types:

    +
    + + + + +
    ExpressionType
    ()() (unit)
    (0, 4)(u256, u256)
    (true, )(bool, )
    (true, -1, 1)(bool, i256, u256)
    +
    +

    A tuple field can be accessed via an attribute expression.

    +

    Example:

    +
    contract Foo {
    +    pub fn bar() {
    +        // Creating a tuple via a tuple expression
    +        let some_tuple: (u256, bool) = (1, false)
    +
    +        // Accessing the first tuple field via the `item0` field
    +        baz(input: some_tuple.item0)
    +    }
    +    pub fn baz(input: u256) {}
    +}
    +
    +

    List expressions

    +
    +

    Syntax
    +ListExpression :
    +   [ ListElements? ]

    +

    ListElements :
    +   Expression (, Expression)* ,?

    +
    +

    A list expression constructs array values.

    +

    The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands. The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array.

    +

    Examples of tuple expressions and their types:

    +
    + + +
    ExpressionType
    [1, self.get_number()]u256[2]
    [true, false, false]bool[3]
    +
    +

    An array item can be accessed via an index expression.

    +

    Example:

    +
    contract Foo {
    +
    +    fn get_val3() -> u256 {
    +        return 3
    +    }
    +
    +    pub fn baz() {
    +        let val1: u256 = 2
    +        // A list expression
    +        let foo: Array<u256, 3> = [1, val1, get_val3()]
    +    }
    +}
    +
    +

    Struct expressions

    +

    TBW

    +

    Index expressions

    +
    +

    Syntax
    +IndexExpression :
    +   Expression [ Expression ]

    +
    +

    Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map.

    +

    Example:

    +
    contract Foo {
    +
    +    balances: Map<address, u256>
    +
    +
    +    pub fn baz(mut self, mut values: Array<u256, 10>) {
    +        // Assign value at slot 5
    +        values[5] = 1000
    +        // Read value at slot 5
    +        let val1: u256 = values[5]
    +
    +        // Assign value for address zero
    +        self.balances[address(0)] = 10000
    +
    +        // Read balance of address zero
    +        let bal: u256 = self.balances[address(0)]
    +    }
    +}
    +
    +

    Attribute expressions

    +
    +

    Syntax
    +AttributeExpression :
    +   Expression . IDENTIFIER

    +
    +

    An attribute expression evaluates to the location of an attribute of a struct, tuple or contract.

    +

    The syntax for an attribute expression is an expression, then a . and finally an identifier.

    +

    Examples:

    +
    struct Point {
    +    pub x: u256
    +    pub y: u256
    +}
    +
    +contract Foo {
    +    some_point: Point
    +    some_tuple: (bool, u256)
    +
    +    fn get_point() -> Point {
    +        return Point(x: 100, y: 500)
    +    }
    +
    +    pub fn baz(some_point: Point, some_tuple: (bool, u256)) {
    +        // Different examples of attribute expressions
    +        let bool_1: bool = some_tuple.item0
    +        let x1: u256 = some_point.x
    +        let point1: u256 = get_point().x
    +        let point2: u256 = some_point.x
    +    }
    +}
    +
    +

    Name expressions

    +
    +

    Syntax
    +NameExpression :
    +   IDENTIFIER

    +
    +

    A name expression resolves to a local variable.

    +

    Example:

    +
    contract Foo {
    +    pub fn baz(foo: u256) {
    +        // name expression resolving to the value of `foo`
    +        foo
    +    }
    +}
    +
    +

    Path expressions

    +
    +

    Syntax
    +PathExpression :
    +   IDENTIFIER ( :: IDENTIFIER )*

    +
    +

    A name expression resolves to a local variable.

    +

    Example:

    +
    contract Foo {
    +    pub fn baz() {
    +        // CONST_VALUE is defined in another module `my_mod`.
    +        let foo: u32 = my_mod::CONST_VALUE
    +    }
    +}
    +
    +

    Literal expressions

    +
    +

    Syntax
    +LiteralExpression :
    +   | STRING_LITERAL
    +   | INTEGER_LITERAL
    +   | BOOLEAN_LITERAL

    +
    +

    A literal expression consists of one of the literal forms described earlier. +It directly describes a number, string or boolean value.

    +
    "hello"   // string type
    +5         // integer type
    +true      // boolean type
    +
    +

    Arithmetic Operators

    +
    +

    Syntax
    +ArithmeticExpression :
    +     Expression + Expression
    +   | Expression - Expression
    +   | Expression * Expression
    +   | Expression / Expression
    +   | Expression % Expression
    +   | Expression ** Expression
    +   | Expression & Expression
    +   | Expression | Expression
    +   | Expression ^ Expression
    +   | Expression << Expression
    +   | Expression >> Expression

    +
    +

    Binary operators expressions are all written with infix notation. +This table summarizes the behavior of arithmetic and logical binary operators on +primitive types.

    +
    + + + + + + + + + + + +
    SymbolInteger
    +Addition
    -Subtraction
    *Multiplication
    /Division*
    %Remainder
    **Exponentiation
    &Bitwise AND
    |Bitwise OR
    ^Bitwise XOR
    <<Left Shift
    >>Right Shift
    +
    +

    * Integer division rounds towards zero.

    +

    Here are examples of these operators being used.

    +
    3 + 6 == 9
    +6 - 3 == 3
    +2 * 3 == 6
    +6 / 3 == 2
    +5 % 4 == 1
    +2 ** 4 == 16
    +12 & 25 == 8
    +12 | 25 == 29
    +12 ^ 25 == 21
    +212 << 1 == 424
    +212 >> 1 == 106
    +
    +

    Comparison Operators

    +
    +

    Syntax
    +ComparisonExpression :
    +      Expression == Expression
    +   | Expression != Expression
    +   | Expression > Expression
    +   | Expression < Expression
    +   | Expression >= Expression
    +   | Expression <= Expression

    +
    +
    + + + + + + +
    SymbolMeaning
    ==Equal
    !=Not equal
    >Greater than
    <Less than
    >=Greater than or equal to
    <=Less than or equal to
    +
    +

    Here are examples of the comparison operators being used.

    +
    123 == 123
    +23 != -12
    +12 > 11
    +11 >= 11
    +11 < 12
    +11 <= 11
    +
    +

    Boolean Operators

    +
    +

    Syntax
    +BooleanExpression :
    +     Expression or Expression
    +   | Expression and Expression

    +
    +

    The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'.

    +

    Example:

    +
    const x: bool = false or true // true
    +
    +

    Unary Operators

    +
    +

    Syntax
    +UnaryExpression :
    +     not Expression
    +   | - Expression
    +   | ~ Expression

    +
    +

    The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument.

    +

    Example:

    +
    fn f() {
    +  let x: bool = not true  // false
    +  let y: i256 = -1
    +  let z: i256 = i256(~1)  // -2
    +}
    +
    +

    Type System

    +

    Types

    +

    Every variable, item, and value in a Fe program has a type. The _ of a +value defines the interpretation of the memory holding it and the operations +that may be performed on the value.

    +

    Built-in types are tightly integrated into the language, in nontrivial ways +that are not possible to emulate in user-defined types. User-defined types have +limited capabilities.

    +

    The list of types is:

    + +

    Boolean type

    +

    The bool type is a data type which can be either true or false.

    +

    Example:

    +
    let x: bool = true
    +
    +

    Contract types

    +

    An contract type is the type denoted by the name of an contract item.

    +

    A value of a given contract type carries the contract's public interface as +attribute functions. A new contract value can be created by either casting +an address to a contract type or by creating a new contract using the type +attribute functions create or create2.

    +

    Example:

    +
    contract Foo {
    +    pub fn get_my_num() -> u256 {
    +        return 42
    +    }
    +}
    +
    +contract FooFactory {
    +    pub fn create2_foo(mut ctx: Context) -> address {
    +        // `0` is the value being sent and `52` is the address salt
    +        let foo: Foo = Foo.create2(ctx, 0, 52)
    +        return address(foo)
    +    }
    +}
    +
    +

    Numeric types

    +

    The unsigned integer types consist of:

    +
    + + + + + + +
    TypeMinimumMaximum
    u8028-1
    u160216-1
    u320232-1
    u640264-1
    u12802128-1
    u25602256-1
    +
    +

    The signed two's complement integer types consist of:

    +
    + + + + + + +
    TypeMinimumMaximum
    i8-(27)27-1
    i16-(215)215-1
    i32-(231)231-1
    i64-(263)263-1
    i128-(2127)2127-1
    i256-(2255)2255-1
    +

    Tuple Types

    +
    +

    Syntax
    +TupleType :
    +      ( )
    +   | ( ( Type , )+ Type? )

    +
    +

    Tuple types are a family of structural types1 for heterogeneous lists of other types.

    +

    The syntax for a tuple type is a parenthesized, comma-separated list of types.

    +

    A tuple type has a number of fields equal to the length of the list of types. +This number of fields determines the arity of the tuple. +A tuple with n fields is called an n-ary tuple. +For example, a tuple with 2 fields is a 2-ary tuple.

    +

    Fields of tuples are named using increasing numeric names matching their position in the list of types. +The first field is item0. +The second field is item1. +And so on. +The type of each field is the type of the same position in the tuple's list of types.

    +

    For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type. +Its one value is also called unit or the unit value.

    +

    Some examples of tuple types:

    +
      +
    • () (also known as the unit or zero-sized type)
    • +
    • (u8, u8)
    • +
    • (bool, i32)
    • +
    • (i32, bool) (different type from the previous example)
    • +
    +

    Values of this type are constructed using a tuple expression. +Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. +Tuple fields can be accessed via an attribute expression.

    +
    1 +

    Structural types are always equivalent if their internal types are equivalent.

    +
    +

    Array types

    +
    +

    Syntax
    +ArrayType :
    +   Array<Type, INTEGER_LITERAL>

    +
    +

    An array is a fixed-size sequence of N elements of type T. The array type +is written as Array<T, N>. The size is an integer literal.

    +

    Arrays are either stored in storage or memory but are never stored directly on the stack.

    +

    Examples:

    +
    contract Foo {
    +  // An array in storage
    +  bar: Array<u8, 10>
    +
    +  fn do_something() {
    +    // An array in memory
    +    let values: Array<u256, 3> = [10, 100, 100]
    +  }
    +}
    +
    +

    All elements of arrays are always initialized, and access to an array is +always bounds-checked in safe methods and operators.

    +

    Struct types

    +

    A struct type is the type denoted by the name of an struct item. +A struct type is a heterogeneous product of other types, called the +fields of the type.

    +

    New instances of a struct can be constructed with a struct expression.

    +

    Struct types are either stored in storage or memory but are never stored directly on the stack.

    +

    Examples:

    +
    struct Rectangle {
    +  pub width: u256
    +  pub length: u256
    +}
    +
    +contract Example {
    +  // A Rectangle in storage
    +  area: Rectangle
    +
    +  fn do_something() {
    +    let length: u256 = 20
    +    // A rectangle in memory
    +    let square: Rectangle = Rectangle(width: 10, length)
    +  }
    +}
    +
    +

    All fields of struct types are always initialized.

    +

    The data layout of a struct is not part of its external API and may be changed in any release.

    +

    The fields of a struct may be qualified by visibility modifiers, to allow +access to data in a struct outside a module.

    +

    Enum types

    +

    An enum type is the type denoted by the name of an enum item.

    +

    Address Type

    +

    The address type represents a 20 byte Ethereum address.

    +

    Example:

    +
    contract Example {
    +  // An address in storage
    +  someone: address
    +
    +  fn do_something() {
    +    // A plain address (not part of a tuple, struct etc) remains on the stack
    +    let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f
    +  }
    +}
    +
    +

    Map type

    +

    The type Map<K, V> is used to associate key values with data.

    +

    The following types can be used as key:

    + +

    The values can be of any type including other maps, structs, tuples or arrays.

    +

    Example:

    +
    contract Foo {
    +    bar: Map<address, Map<address, u256>>
    +    baz: Map<address, Map<u256, bool>>
    +
    +    pub fn read_bar(self, a: address, b: address) -> u256 {
    +        return self.bar[a][b]
    +    }
    +
    +    pub fn write_bar(mut self, a: address, b: address, value: u256) {
    +        self.bar[a][b] = value
    +    }
    +
    +    pub fn read_baz(self, a: address, b: u256) -> bool {
    +        return self.baz[a][b]
    +    }
    +
    +    pub fn write_baz(mut self, a: address, b: u256, value: bool) {
    +        self.baz[a][b] = value
    +    }
    +}
    +
    +

    String Type

    +

    A value of type String<N> represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8.

    +

    The String<N> type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters.

    +

    Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as "fox" but it can not hold a full sentence such as "The brown fox jumps over the white fence".

    +

    Example:

    +
    contract Foo {
    +
    +  fn bar() {
    +    let single_byte_string: String<1> = "a"
    +    let longer_string: String<100> = "foo"
    +  }
    +}
    +
    +

    Unit type

    +

    TBW

    +

    Function Types

    +

    TBW

    +

    Data Layout

    +

    There are three places where data can be stored on the EVM:

    +
      +
    • stack: 256-bit values placed on the stack that are loaded using DUP operations.
    • +
    • storage: 256-bit address space where 256-bit values can be stored. Accessing higher +storage slots does not increase gas cost.
    • +
    • memory: 256-bit address space where 256-bit values can be stored. Accessing higher +memory slots increases gas cost.
    • +
    +

    Each data type can be stored in these locations. How data is stored is +described in this section.

    +

    Stack

    +

    The following can be stored on the stack:

    +
      +
    • base type values
    • +
    • pointers to reference type values
    • +
    +

    The size of each value stored on the stack must not exceed 256 bits. Since all base types are less +than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack.

    +

    Example:

    +
    fn f() {
    +    let foo: u256 = 42 // foo is stored on the stack
    +    let bar: Array<u256, 100> = [0; 100] // bar is a memory pointer stored on the stack
    +}
    +
    +

    Storage

    +

    All data types can be stored in storage.

    +

    Constant size values in storage

    +

    Storage pointers for constant size values are determined at compile time.

    +

    Example:

    +
    contract Cats {
    +   population: u256 // assigned a static location by the compiler
    +}
    +
    +

    The value of a base type in storage is found by simply loading the value from storage at the +given pointer.

    +

    To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

    +

    Maps in storage

    +

    Maps are not assigned pointers, because they do not have a location in storage. They are instead +assigned a nonce that is used to derive the location of keyed values during runtime.

    +

    Example:

    +
    contract Foo {
    +  bar: Map<address, u256> // bar is assigned a static nonce by the compiler
    +  baz: Map<address, Map<address, u256>> // baz is assigned a static nonce by the compiler
    +}
    +
    +

    The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value +.i.e. keccak256(<bar nonce>, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to +a nested hash i.e. keccak256(keccak256(<baz nonce>, 0x00), 0x01).

    +

    The to_mem function

    +

    Reference type values can be copied from storage and into memory using the to_mem function.

    +

    Example:

    +
    let my_array_var: Array<u256, 10> = self.my_array_field.to_mem()
    +
    +

    Memory

    +

    Only sequence types can be stored in memory.

    +

    The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly +allocated segments begin at the value given by this slot. When more memory has been allocated, +the value stored in 0x00 is increased.

    +

    We do not free memory after it is allocated.

    +

    Sequence types in memory

    +

    Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and +reference them using pointers kept on the stack.

    +

    Example:

    +
    fn f() {
    +    let foo: Array<u256, 100> = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.
    +}
    +
    +

    To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

    +

    Contributing

    +

    You can contribute to Fe!

    +

    Ways to contribute:

    +

    1. Reporting or fixing issues.

    +

    If you find problems with Fe you can report them to the development team on the project Github. +You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.

    +

    2. Improving the docs.

    +

    We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide.

    +

    To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.

    +

    3. Developing Fe

    +

    You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling.

    +

    It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board.

    +
    +

    Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master.

    +

    To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.

    +
    +

    4. Community engagement

    +

    We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter.

    +
    +

    Please note that this project has a Code of Conduct. By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.

    +
    +

    Processes

    +

    Reporting issues

    +

    To report an issue, please use the Github issue board. When reporting issues, please mention the following details:

    +
      +
    • Fe version.
    • +
    • your operating system.
    • +
    • the steps required to reproduce the issue
    • +
    • actual vs expected behaviour
    • +
    • any error messages or relevant logs
    • +
    • the specific source code where the issue originates
    • +
    +

    The appropriate place for technical discussions about the language itself is the Fe Discord.

    +

    Rasing Pull Requests

    +

    Please fork the Fe repository and raise pull requests against the master branch.

    +

    Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge.

    +

    New features should be accompanied by appropriate tests.

    +

    Finally, please make sure you respect the coding style for this project.

    +

    Thank you for contributing to Fe!

    +

    Release Notes

    +

    🖥️ Download Binaries +📄 Draft Spec +ℹ️ Getting Started

    +

    Fe is moving fast. Read up on all the latest improvements.

    +

    0.26.0 "Zircon" (2023-11-03)

    +

    Features

    +
      +
    • +

      Give option to produce runtime bytecode as compilation artifact

      +

      Previously, the compiler could only produce the bytecode that is used +for the deployment of the contract. Now it can also produce the runtime +bytecode which is the bytecode that is saved to storage.

      +

      Being able to obtain the runtime bytecode is useful for contract +verification.

      +

      To obtain the runtime bytecode use the runtime-bytecode option +of the --emit flag (multiple options allowed).

      +

      Example Output:

      +
        +
      • mycontract.bin (bytecode for deployment)
      • +
      • mycontract.runtime.bin (runtime bytecode) (#947)
      • +
      +
    • +
    • +

      New verify command to verify onchain contracts against local source code.

      +

      People need to be able to verify that a deployed contract matches the source code +that the author claims was used to deploy it. Previously, there was no simple +way to achieve this.

      +

      These are the steps to verify a contract with the verify command:

      +
        +
      1. Obtain the project's source code locally.
      2. +
      3. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag)
      4. +
      5. From the project directory run fe verify <contract-address> <json-rpc-url>
      6. +
      +

      Example:

      +
      $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com
      +It's a match!✨
      +
      +Onchain contract:
      +Address: 0xf0adbb9ed4135d1509ad039505bada942d18755f
      +Bytecode: 0x60008..76b90
      +
      +Local contract:
      +Contract name: SimpleDAO
      +Source file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe
      +Bytecode: 0x60008..76b90
      +
      +Hint: Run with --verbose to see the contract's source code.
      +
      +

      (#948)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Added a new page on EVM precompiles (#944)
    • +
    +

    0.25.0 "Yoshiokaite" (2023-10-26)

    +

    Features

    +
      +
    • +

      Use the project root as default path for fe test

      +

      Just run fe test from any directory of the project. (#913)

      +
    • +
    • +

      Completed std::buf::MemoryBuffer refactor. (#917)

      +
    • +
    • +

      Allow filtering tests to run via fe test --filter <some-filter

      +

      E.g. Running fe test --filter foo will run all tests that contain foo in their name. (#919)

      +
    • +
    • +

      Logs for successfully ran tests can be printed with the --logs parameter.

      +

      example:

      +
      // test_log.fe
      +
      +use std::evm::log0
      +use std::buf::MemoryBuffer
      +
      +struct MyEvent {
      +  pub foo: u256
      +  pub baz: bool
      +  pub bar: u256
      +}
      +
      +#test
      +fn test_log(mut ctx: Context) {
      +  ctx.emit(MyEvent(foo: 42, baz: false, bar: 26))
      +  unsafe { log0(buf: MemoryBuffer::new(len: 42)) }
      +}
      +
      +
      +
      $ fe test --logs test_log.fe
      +executing 1 test in test_log:
      +  test_log ... passed
      +
      +test_log produced the following logs:
      +  MyEvent emitted by 0x0000…002a with the following parameters [foo: 2a, baz: false, bar: 1a]
      +  Log { address: 0x000000000000000000000000000000000000002a, topics: [], data: b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\0\0\0" }
      +
      +
      +1 test passed; 0 tests failed; 1 test executed
      +
      +

      Note: Logs are not collected for failing tests. (#933)

      +
    • +
    • +

      Adds 'functions' section to docs with information on self and Context. (#937)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Yul codegen was failing to include string literals used in test assertions. This resulted in a compiler error.

      +

      Example:

      +
      #test
      +fn foo() {
      +    assert false, "oops"
      +}
      +
      +

      The example code above was failing to compile, but now it compiles and executes as expected. (#926)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Added a new tutorial: Open Auction (#930)
    • +
    +

    0.24.0 "Xenotime" (2023-08-10)

    +

    Features

    +
      +
    • +

      Added support for project manifests and project dependencies.

      +

      Example:

      +
      my_project
      +├── fe.toml
      +└── src
      +    └── main.fe
      +
      +
      # fe.toml
      +name = "my_project"
      +version = "1.0"
      +
      +[dependencies]
      +my_lib = { path = "../path/to/my_lib", version = "1.0" }
      +my_other_lib = "../path/to/my_other_lib"
      +
      +

      Note: The current implementation supports circular dependencies. (#908)

      +
    • +
    +

    Performance improvements

    +
      +
    • MemoryBuffer now allocates an extra 31 bytes. This removes the need for runtime checks and bitshifting needed to ensure safe writing to a MemoryBuffer's region. (#898)
    • +
    +

    Improved Documentation

    +
      +
    • Link to vs-code extension in Quickstart Guide (#910)
    • +
    +

    0.23.0 "Wiluite" (2023-06-01)

    +

    Features

    +
      +
    • +

      Fixed an issue where generic parameters that were mut could not be satisfied at callsite.

      +

      For instance, the following code would previously cause a compile error but now works as expected:

      +
      #![allow(unused)]
      +fn main() {
      +struct Runner {
      +  pub fn run<T: Computable>(self, mut _ val: T) -> u256 {
      +    return val.compute(val: 1000)
      +  }
      +}
      +
      +contract Example {
      +  pub fn run_test(self) {
      +    let runner: Runner = Runner();
      +    let mut mac: Mac = Mac();
      +
      +    assert runner.run(mac) == 1001
      +  }
      +}
      +}
      +

      (#865)

      +
    • +
    • +

      The ctx parameter can now be passed into test functions.

      +

      example:

      +
      #test
      +fn my_test(ctx: Context) {
      +    assert ctx.block_number() == 0
      +}
      +
      +

      (#880)

      +
    • +
    • +

      The following has been added to the standard library:

      +

      Memory buffer abstraction

      +

      example:

      +
      use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
      +use std::traits::Max
      +
      +#test
      +fn test_buf_rw() {
      +    let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) 
      +    let mut writer: MemoryBufferWriter = buf.writer()
      +    let mut reader: MemoryBufferReader = buf.reader()
      +
      +    writer.write(value: 42)
      +    writer.write(value: 42)
      +    writer.write(value: 26)
      +    writer.write(value: u8(26))
      +    writer.write(value: u256::max())
      +    writer.write(value: u128::max())
      +    writer.write(value: u64::max())
      +    writer.write(value: u32::max())
      +    writer.write(value: u16::max())
      +    writer.write(value: u8::max())
      +    writer.write(value: u8(0))
      +
      +    assert reader.read_u256() == 42
      +    assert reader.read_u256() == 42
      +    assert reader.read_u256() == 26
      +    assert reader.read_u8() == 26
      +    assert reader.read_u256() == u256::max()
      +    assert reader.read_u128() == u128::max()
      +    assert reader.read_u64() == u64::max()
      +    assert reader.read_u32() == u32::max()
      +    assert reader.read_u16() == u16::max()
      +    assert reader.read_u8() == u8::max()
      +    assert reader.read_u8() == 0
      +}
      +
      +

      Precompiles

      +

      example:

      +
      use std::precompiles
      +use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
      +
      +#test
      +fn test_ec_recover() {
      +    let result: address = precompiles::ec_recover(
      +        hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
      +        v: 28,
      +        r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
      +        s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
      +    )
      +
      +    assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)
      +}
      +
      +

      ctx.raw_call()

      +

      example:

      +
      use std::buf::{
      +    RawCallBuffer,
      +    MemoryBufferReader, 
      +    MemoryBufferWriter
      +}
      +use std::evm
      +
      +contract Foo {
      +    pub unsafe fn __call__() {
      +        if evm::call_data_load(offset: 0) == 42 {
      +            evm::mstore(offset: 0, value: 26)
      +            evm::return_mem(offset: 0, len: 32)
      +        } else if evm::call_data_load(offset: 0) == 26 {
      +            revert
      +        }
      +    }
      +}
      +
      +#test
      +fn test_raw_call(mut ctx: Context) {
      +    let foo: Foo = Foo.create(ctx, 0)
      +
      +    let mut buf: RawCallBuffer = RawCallBuffer::new(
      +        input_len: 32, 
      +        output_len: 32
      +    )
      +    let mut writer: MemoryBufferWriter = buf.writer()
      +
      +    writer.write(value: 42)
      +    assert ctx.raw_call(addr: address(foo), value: 0, buf)
      +  
      +    let mut reader: MemoryBufferReader = buf.reader()
      +    assert reader.read_u256() == 26
      +
      +    assert not ctx.raw_call(addr: address(foo), value: 0, buf)
      +}
      +
      +

      (#885)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed an ICE when using aggregate types with aggregate type fields in public functions

      +

      This code would previously cause an ICE:

      +
      struct Tx {
      +  pub data: Array<u8, 320>
      +}
      +
      +contract Foo {
      +  pub fn bar(mut tx: Tx) {}
      +}
      +
      +

      (#867)

      +
    • +
    • +

      Fixed a regression where the compiler would not reject a method call on a struct in storage.

      +

      E.g. the follwing code should be rejected as it is missing a to_mem() call:

      +
      struct Bar {
      +    pub x: u256
      +
      +    pub fn get_x(self) -> u256{
      +        return self.x
      +    }
      +}
      +
      +contract Foo {
      +    bar: Bar
      +
      +    pub fn __init__(mut self) {
      +        self.bar = Bar( x: 2 )
      +    }
      +    fn yay(self) {
      +        self.bar.get_x()
      +    }
      +}
      +
      +

      The compiler will now reject the code and suggest a to_mem() before callingget_x(). (#881)

      +
    • +
    +

    0.22.0 "Vulcanite" (2023-04-05)

    +

    This is the first non-alpha release of Fe. Read our announcement for more details.

    +

    Features

    +
      +
    • +

      Support for tests.

      +

      example:

      +
      #test
      +fn my_test() {
      +    assert 26 + 16 == 42
      +}
      +
      +

      Tests can be executed using the test subcommand.

      +

      example:

      +

      $ fe test foo.fe (#807)

      +
    • +
    • +

      Fixed broken trait orphan rule

      +

      Fe has an orphan rule for Traits similar to Rust's that requires +that either the trait or the type that we are implementing the trait for +are located in the same ingot as the impl. This rule was implemented +incorrectly so that instead of requiring them to be in the same ingot, +they were required to be in the same module. This change fixes this +so that the orphan rule is enforced correctly. +(#863)

      +
    • +
    • +

      address values can now be specified with a number literal, with no explicit +cast. So instead of let t: address = address(0xfe), one can now write +let t: address = 0xfe. This also means that it's possible to define const +addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe +(#864)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed resolving of generic arguments to associated functions.

      +

      For example, this code would previously crash the compiler:

      +
      #![allow(unused)]
      +fn main() {
      +...
      +  // This function doesn't take self
      +  pub fn run_static<T: Computable>(_ val: T) -> u256 {
      +    return val.compute(val: 1000)
      +  }
      +...
      +
      +// Invoking it would previously crash the compiler
      +Runner::run_static(Mac())
      +...
      +}
      +

      (#861)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Changed the Deployment tutorial to use foundry and the Sepolia network (#853)
    • +
    +

    0.21.0-alpha (2023-02-28)

    +

    Features

    +
      +
    • +

      Support for Self type

      +

      With this change Self (with capital S) can be used to refer +to the enclosing type in contracts, structs, impls and traits.

      +

      E.g.

      +
      trait Min {
      +  fn min() -> Self;
      +}
      +
      +impl Min for u8 {
      +  fn min() -> u8 { // Both `u8` or `Self` are valid here
      +    return 0
      +  }
      +}
      +
      +

      Usage: u8::min() (#803)

      +
    • +
    • +

      Added Min and Max traits to the std library. +The std library implements the traits for all numeric types.

      +

      Example

      +
      use std::traits::{Min, Max}
      +...
      +
      +assert u8::min() < u8::max()
      +``` ([#836](https://github.com/ethereum/fe/issues/836))
      +
      +
      +
    • +
    • +

      Upgraded underlying solc compiler to version 0.8.18

      +
    • +
    +

    Bugfixes

    +
      +
    • the release contains minor bugfixes
    • +
    +

    0.20.0-alpha (2022-12-05)

    +

    Features

    +
      +
    • +

      Removed the event type as well as the emit keyword. +Instead the struct type now automatically implements +the Emittable trait and can be emitted via ctx.emit(..).

      +

      Indexed fields can be annotated via the #indexed attribute.

      +

      E.g.

      +
      struct Signed {
      +    book_msg: String<100>
      +}
      +
      +contract GuestBook {
      +    messages: Map<address, String<100>>
      +
      +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
      +        self.messages[ctx.msg_sender()] = book_msg
      +        ctx.emit(Signed(book_msg))
      +    }
      +}
      +
      +

      (#717)

      +
    • +
    • +

      Allow to call trait methods on types when trait is in scope

      +

      So far traits were only useful as bounds for generic functions. +With this change traits can also be used as illustrated with +the following example:

      +
      trait Double {
      +  fn double(self) -> u256;
      +}
      +
      +impl Double for (u256, u256) {
      +  fn double(self) -> u256 {
      +    return (self.item0 + self.item1) * 2
      +  }
      +}
      +
      +contract Example {
      +
      +  pub fn run_test(self) {
      +    assert (0, 1).double() == 2
      +  }
      +}
      +
      +

      If a call turns out to be ambigious the compiler currently asks the +user to disambiguate via renaming. In the future we will likely +introduce a syntax to allow to disambiguate at the callsite. (#757)

      +
    • +
    • +

      Allow contract associated functions to be called via ContractName::function_name() syntax. (#767)

      +
    • +
    • +

      Add enum types and match statement.

      +

      enum can now be defined, e.g.,

      +
      pub enum MyEnum {
      +    Unit
      +    Tuple(u32, u256, bool)
      +  
      +    fn unit() -> MyEnum {
      +        return MyEnum::Unit
      +    }
      +}
      +
      +

      Also, match statement is introduced, e.g.,

      +
      pub fn eval_enum()  -> u256{
      +    match MyEnum {
      +        MyEnum::Unit => { 
      +            return 0
      +        }
      +      
      +        MyEnum::Tuple(a, _, false) => {
      +            return u256(a)
      +        }
      +      
      +        MyEnum::Tuple(.., true) => {
      +            return u256(1)
      +        }
      +    }
      +}
      +
      +

      For now, available patterns are restricted to

      +
        +
      • Wildcard(_), which matches all patterns: _
      • +
      • Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c)
      • +
      • Boolean literal(true and false)
      • +
      • Enum variant. e.g., MyEnum::Tuple(a, b, c)
      • +
      • Tuple pattern. e.g., (a, b, c)
      • +
      • Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true}
      • +
      • Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true)
      • +
      • Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true)
      • +
      +

      Fe compiler performs the exhaustiveness and usefulness checks for match statement.
      +So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. (#770)

      +
    • +
    • +

      Changed comments to use // instead of # (#776)

      +
    • +
    • +

      Added the mut keyword, to mark things as mutable. Any variable or function parameter +not marked mut is now immutable.

      +
      contract Counter {
      +    count: u256
      +
      +    pub fn increment(mut self) -> u256 {
      +        // `self` is mutable, so storage can be modified
      +        self.count += 1
      +        return self.count
      +    }
      +}
      +
      +struct Point {
      +    pub x: u32
      +    pub y: u32
      +
      +    pub fn add(mut self, _ other: Point) {
      +        self.x += other.x
      +        self.y += other.y
      +
      +        // other.x = 1000 // ERROR: `other` is not mutable
      +    }
      +}
      +
      +fn pointless() {
      +    let origin: Point = Point(x: 0, y: 0)
      +    // origin.x = 10 // ERROR: origin is not mutable
      +
      +    let x: u32 = 10
      +    // x_coord = 100 // ERROR: `x_coord` is not mutable
      +    let mut y: u32 = 0
      +    y = 10 // OK
      +
      +    let mut p: Point = origin // copies `origin`
      +    p.x = 10 // OK, doesn't modify `origin`
      +
      +    let mut q: Point = p // copies `p`
      +    q.x = 100            // doesn't modify `p`
      +
      +    p.add(q)
      +    assert p.x == 110
      +}
      +
      +

      Note that, in this release, primitive type function parameters +can't be mut. This restriction might be lifted in a future release.

      +

      For example:

      +
      fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut
      +    x += 1
      +}
      +
      +

      (#777)

      +
    • +
    • +

      The contents of the std::prelude module (currently just the Context struct) +are now automatically used by every module, so use std::context::Context is +no longer required. (#779)

      +
    • +
    • +

      When the Fe compiler generates a JSON ABI file for a contract, the +"stateMutability" field for each function now reflects whether the function can +read or modify chain or contract state, based on the presence or absence of the +self and ctx parameters, and whether those parameters are mutable.

      +

      If a function doesn't take self or ctx, it's "pure". +If a function takes self or ctx immutably, it can read state but not mutate +state, so it's a "view" +If a function takes mut self or mut ctx, it can mutate state, and is thus +marked "payable".

      +

      Note that we're following the convention set by Solidity for this field, which +isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently +distinguish between "payable" and "nonpayable" functions; if you want a function +to revert when Eth is sent, you need to do it manually +(eg assert ctx.msg_value() == 0). (#783)

      +
    • +
    • +

      Trait associated functions

      +

      This change allows trait functions that do not take a self parameter. +The following demonstrates a possible trait associated function and its usage:

      +
      trait Max {
      +  fn max(self) -> u8;
      +}
      +
      +impl Max for u8 {
      +  fn max() -> u8 {
      +    return u8(255)
      +  }
      +}
      +
      +contract Example {
      +
      +  pub fn run_test(self) {
      +    assert u8::max() == 255
      +  }
      +}
      +
      +

      (#805)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fix issue where calls to assiciated functions did not enforce visibility rules.

      +

      E.g the following code should be rejected but previously wasn't:

      +
      struct Foo {
      +    fn do_private_things() {
      +    }
      +}
      +
      +contract Bar {
      +    fn test() {
      +        Foo::do_private_things()
      +    }
      +}
      +
      +

      With this change, the above code is now rejected because do_private_things is not pub. (#767)

      +
    • +
    • +

      Padding on bytes and string ABI types is zeroed out. (#769)

      +
    • +
    • +

      Ensure traits from other modules or even ingots can be implemented (#773)

      +
    • +
    • +

      Certain cases where the compiler would not reject pure functions +being called on instances are now properly rejected. (#775)

      +
    • +
    • +

      Reject calling to_mem() on primitive types in storage (#801)

      +
    • +
    • +

      Disallow importing private type via use

      +

      The following was previously allowed but will now error:

      +

      use foo::PrivateStruct (#815)

      +
    • +
    +

    0.19.1-alpha "Sunstone" (2022-07-06)

    +

    Features

    +
      +
    • +

      Support returning nested struct.

      +

      Example:

      +
      pub struct InnerStruct {
      +    pub inner_s: String<10>
      +    pub inner_x: i256
      +}
      +
      +pub struct NestedStruct {
      +    pub inner: InnerStruct
      +    pub outer_x: i256
      +}
      +
      +contract Foo {
      +    pub fn return_nested_struct() -> NestedStruct {
      +        ...
      +    }
      +}
      +
      +

      (#635)

      +
    • +
    • +

      Made some small changes to how the Context object is used.

      +
        +
      • ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0))
      • +
      • ctx is required when calling an external contract function that requires ctx
      • +
      +

      Example:

      +
      use std::context::Context // see issue #679
      +
      +contract Foo {
      +  pub fn emit_stuff(ctx: Context) {
      +    emit Stuff(ctx)  # will be `ctx.emit(Stuff{})` someday
      +  }
      +}
      +contract Bar {
      +  pub fn call_foo_emit_stuff(ctx: Context) {
      +    Foo(address(0)).emit_stuff(ctx)
      +  }
      +}
      +event Stuff {}
      +
      +

      (#703)

      +
    • +
    • +

      Braces! Fe has abandoned python-style significant whitespace in favor of the +trusty curly brace.

      +

      In addition, elif is now spelled else if, and the pass +statement no longer exists.

      +

      Example:

      +
      pub struct SomeError {}
      +
      +contract Foo {
      +  x: u8
      +  y: u16
      +
      +  pub fn f(a: u8) -> u8 {
      +    if a > 10 {
      +      let x: u8 = 5
      +      return a + x
      +    } else if a == 0 {
      +      revert SomeError()
      +    } else {
      +      return a * 10
      +    }
      +  }
      +
      +  pub fn noop() {}
      +}
      +
      +

      (#707)

      +
    • +
    • +

      traits and generic function parameter

      +

      Traits can now be defined, e.g:

      +
      trait Computable {
      +  fn compute(self, val: u256) -> u256;
      +}
      +
      +

      The mechanism to implement a trait is via an impl block e.g:

      +
      struct Linux {
      +  pub counter: u256
      +  pub fn get_counter(self) -> u256 {
      +    return self.counter
      +  }
      +  pub fn something_static() -> u256 {
      +    return 5
      +  }
      +}
      +
      +impl Computable for Linux {
      +  fn compute(self, val: u256) -> u256 {
      +    return val + Linux::something_static() + self.get_counter()
      +  }
      +}
      +
      +

      Traits can only appear as bounds for generic functions e.g.:

      +
      struct Runner {
      +
      +  pub fn run<T: Computable>(self, _ val: T) -> u256 {
      +    return val.compute(val: 1000)
      +  }
      +}
      +
      +

      Only struct functions (not contract functions) can have generic parameters. +The run method of Runner can be called with any type that implements Computable e.g.

      +
      contract Example {
      +
      +  pub fn generic_compute(self) {
      +    let runner: Runner = Runner();
      +    assert runner.run(Mac()) == 1001
      +    assert runner.run(Linux(counter: 10)) == 1015
      +  }
      +}
      +
      +

      (#710)

      +
    • +
    • +

      Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe (#726)

      +
    • +
    • +

      Allow using complex type as array element type.

      +

      Example:

      +
      contract Foo {
      +    pub fn bar() -> i256 {
      +        let my_array: Array<Pair, 3> = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)]
      +
      +        let sum: i256 = 0
      +        for pair in my_array {
      +            sum += pair.x
      +        }
      +
      +        return sum
      +    }
      +}
      +
      +struct Pair {
      +    pub x: i256
      +    pub y: i256
      +
      +    pub fn new(_ x: i256, _ y: i256) -> Pair {
      +        return Pair(x, y)
      +    }
      +}
      +
      +

      (#730)

      +
    • +
    • +

      The fe CLI now has subcommands:

      +

      fe new myproject - creates a new project structure +fe check . - analyzes fe source code and prints errors +fe build . - builds a fe project (#732)

      +
    • +
    • +

      Support passing nested struct types to public functions.

      +

      Example:

      +
      pub struct InnerStruct {
      +    pub inner_s: String<10>
      +    pub inner_x: i256
      +}
      +
      +pub struct NestedStruct {
      +    pub inner: InnerStruct
      +    pub outer_x: i256
      +}
      +
      +contract Foo {
      +    pub fn f(arg: NestedStruct) {
      +        ...
      +    }
      +}
      +
      +

      (#733)

      +
    • +
    • +

      Added support for repeat expressions ([VALUE; LENGTH]).

      +

      e.g.

      +
      let my_array: Array<bool, 42> = [bool; 42]
      +
      +

      Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. (#747)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. (#734)

      +
    • +
    • +

      Fix issue where a negative constant leads to an ICE

      +

      E.g. the following code would previously crash the compiler but shouldn't:

      +
      const INIT_VAL: i8 = -1
      +contract Foo {
      +  pub fn init_bar() {
      +    let x: i8 = INIT_VAL
      +  }
      +}
      +
      +

      (#745)

      +
    • +
    • +

      Fix a bug that causes ICE when nested if-statement has multiple exit point.

      +

      E.g. the following code would previously crash the compiler but shouldn't:

      +
       pub fn foo(self) {
      +    if true {
      +        if self.something {
      +            return
      +        }
      +    }
      +    if true {
      +        if self.something {
      +            return
      +        }
      +    }
      +}
      +
      +

      (#749)

      +
    • +
    +

    0.18.0-alpha "Ruby" (2022-05-27)

    +

    Features

    +
      +
    • Added support for parsing of attribute calls with generic arguments (e.g. foo.bar<Baz>()). (#719)
    • +
    +

    Bugfixes

    +
      +
    • Fix a regression where the stateMutability field would not be included in the generated ABI (#722)
    • +
    • Fix two regressions introduced in 0.17.0 +
        +
      • Properly lower right shift operation to yul's sar if operand is signed type
      • +
      • Properly lower negate operation to call safe_sub (#723)
      • +
      +
    • +
    +

    0.17.0-alpha "Quartz" (2022-05-26)

    +

    Features

    +
      +
    • +

      Support for underscores in numbers to improve readability e.g. 100_000.

      +

      Example

      +
          let num: u256 = 1000_000_000_000
      +
      +

      (#149)

      +
    • +
    • +

      Optimized access of struct fields in storage (#249)

      +
    • +
    • +

      Unit type () is now ABI encodable (#442)

      +
    • +
    • +

      Temporary default stateMutability to payable in ABI

      +

      The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction.

      +

      As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. (#705)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a crash caused by certain memory to memory assignments.

      +

      E.g. the following code would previously lead to a compiler crash:

      +
      my_struct.x = my_struct.y
      +
      +

      (#590)

      +
    • +
    • +

      Reject unary minus operation if the target type is an unsigned integer number.

      +

      Code below should be reject by fe compiler:

      +
      contract Foo:
      +    pub fn bar(self) -> u32:
      +        let unsigned: u32 = 1
      +        return -unsigned
      +
      +    pub fn foo():
      +        let a: i32 = 1
      +        let b: u32 = -a
      +
      +

      (#651)

      +
    • +
    • +

      Fixed crash when passing a struct that contains an array

      +

      E.g. the following would previously result in a compiler crash:

      +
      struct MyArray:
      +    pub x: Array<i32, 2>
      +
      +
      +contract Foo:
      +    pub fn bar(my_arr: MyArray):
      +        pass
      +
      +

      (#681)

      +
    • +
    • +

      reject infinite size struct definitions.

      +

      Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. (#682)

      +
    • +
    • +

      Return instead of revert when contract is called without data.

      +

      If a contract is called without data so that no function is invoked, +we would previously revert but that would leave us without a +way to send ETH to a contract so instead it will cause a return now. (#694)

      +
    • +
    • +

      Resolve compiler crash when using certain reserved YUL words as struct field names.

      +

      E.g. the following would previously lead to a compiler crash because numer is +a reserved keyword in YUL.

      +
      struct Foo:
      +  pub number: u256
      +
      +contract Meh:
      +
      +  pub fn yay() -> Foo:
      +    return Foo(number:2)
      +
      +

      (#709)

      +
    • +
    +

    0.16.0-alpha (2022-05-05)

    +

    Features

    +
      +
    • Change static function call syntax from Bar.foo() to Bar::foo() (#241)
    • +
    • Added support for retrieving the base fee via ctx.base_fee() (#503)
    • +
    +

    Bugfixes

    +
      +
    • Resolve functions on structs via path (e.g. bi::ba::bums()) (#241)
    • +
    +

    0.15.0-alpha (2022-04-04)

    +

    Features

    +
      +
    • +

      Labels are now required on function arguments. Labels can be omitted if the +argument is a variable with a name that matches the label, or if the function +definition specifies that an argument should have no label. Functions often take +several arguments of the same type; compiler-checked labels can help prevent +accidentally providing arguments in the wrong order.

      +

      Example:

      +
      contract CoolCoin:
      +  balance: Map<address, i256>
      +  loans: Map<(address, address), i256>
      +
      +  pub fn demo(self, ann: address, bob: address):
      +    let is_loan: bool = false
      +    self.give(from: ann, to: bob, 100, is_loan)
      +
      +  fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool):
      +    self.cred[sender] -= val
      +    self.cred[recipient] += val
      +    if is_loan:
      +      self.loans[(sender, recipient)] += val
      +
      +

      Note that arguments must be provided in the order specified in the function +definition.

      +

      A parameter's label defaults to the parameter name, but can be changed by +specifying a different label to the left of the parameter name. Labels should be +clear and convenient for the caller, while parameter names are only used in the +function body, and can thus be longer and more descriptive. +In the example above, we choose to use sender and recipient as identifiers +in the body of fn transfer, but use labels from: and to:.

      +

      In cases where it's ideal to not have labels, e.g. if a function takes a single +argument, or if types are sufficient to differentiate between arguments, use _ +to specify that a given parameter has no label. It's also fine to require labels +for some arguments, but not others.

      +

      Example:

      +
      fn add(_ x: u256, _ y: u256) -> u256:
      +  return x + y
      +
      +contract Foo:
      +  fn transfer(self, _ to: address, wei: u256):
      +    pass
      +
      +  pub fn demo(self):
      +    transfer(address(0), wei: add(1000, 42))
      +
      +

      (#397)

      +
    • +
    +

    Bugfixes

    +
      +
    • The region of memory used to compute the slot of a storage map value was not being allocated. (#684)
    • +
    +

    0.14.0-alpha (2022-03-02)

    +

    Features

    +
      +
    • +

      Events can now be defined outside of contracts.

      +

      Example:

      +
      event Transfer:
      +    idx sender: address
      +    idx receiver: address
      +    value: u256
      +
      +contract Foo:
      +    fn transferFoo(to: address, value: u256):
      +        emit Transfer(sender: msg.sender, receiver: to, value)
      +
      +contract Bar:
      +    fn transferBar(to: address, value: u256):
      +        emit Transfer(sender: msg.sender, receiver: to, value)
      +
      +

      (#80)

      +
    • +
    • +

      The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. +Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block.

      +

      Example:

      +
      use std::evm::{mstore, mload}
      +
      +fn memory_shenanigans():
      +  unsafe:
      +    mstore(0x20, 42)
      +    let x: u256 = mload(0x20)
      +    assert x == 42
      +
      +

      The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. +The global function send_value has been ported to Fe, and is now available +as std::send_value. +(#629)

      +
    • +
    • +

      Support structs that have non-base type fields in storage.

      +

      Example:

      +
      struct Point:
      +    pub x: u256
      +    pub y: u256
      +
      +struct Bar:
      +    pub name: String<3>
      +    pub numbers: Array<u256, 2>
      +    pub point: Point
      +    pub something: (u256, bool)
      +
      +
      +contract Foo:
      +    my_bar: Bar
      +
      +    pub fn complex_struct_in_storage(self) -> String<3>:
      +        self.my_bar = Bar(
      +            name: "foo",
      +            numbers: [1, 2],
      +            point: Point(x: 100, y: 200),
      +            something: (1, true),
      +        )
      +
      +        # Asserting the values as they were set initially
      +        assert self.my_bar.numbers[0] == 1
      +        assert self.my_bar.numbers[1] == 2
      +        assert self.my_bar.point.x == 100
      +        assert self.my_bar.point.y == 200
      +        assert self.my_bar.something.item0 == 1
      +        assert self.my_bar.something.item1
      +
      +        # We can change the values of the array
      +        self.my_bar.numbers[0] = 10
      +        self.my_bar.numbers[1] = 20
      +        assert self.my_bar.numbers[0] == 10
      +        assert self.my_bar.numbers[1] == 20
      +        # We can set the array itself
      +        self.my_bar.numbers = [1, 2]
      +        assert self.my_bar.numbers[0] == 1
      +        assert self.my_bar.numbers[1] == 2
      +
      +        # We can change the values of the Point
      +        self.my_bar.point.x = 1000
      +        self.my_bar.point.y = 2000
      +        assert self.my_bar.point.x == 1000
      +        assert self.my_bar.point.y == 2000
      +        # We can set the point itself
      +        self.my_bar.point = Point(x=100, y=200)
      +        assert self.my_bar.point.x == 100
      +        assert self.my_bar.point.y == 200
      +
      +        # We can change the value of the tuple
      +        self.my_bar.something.item0 = 10
      +        self.my_bar.something.item1 = false
      +        assert self.my_bar.something.item0 == 10
      +        assert not self.my_bar.something.item1
      +        # We can set the tuple itself
      +        self.my_bar.something = (1, true)
      +        assert self.my_bar.something.item0 == 1
      +        assert self.my_bar.something.item1
      +
      +        return self.my_bar.name.to_mem()
      +
      +

      (#636)

      +
    • +
    • +

      Features that read and modify state outside of contracts are now implemented on a struct +named "Context". Context is included in the standard library and can be imported with +use std::context::Context. Instances of Context are created by calls to public functions +that declare it in the signature or by unsafe code.

      +

      Basic example:

      +
      use std::context::Context
      +
      +contract Foo:
      +    my_num: u256
      +
      +    pub fn baz(ctx: Context) -> u256:
      +        return ctx.block_number()
      +
      +    pub fn bing(self, new_num: u256) -> u256:
      +        self.my_num = new_num
      +        return self.my_num
      +
      +
      +contract Bar:
      +
      +    pub fn call_baz(ctx: Context, foo_addr: address) -> u256:
      +        # future syntax: `let foo = ctx.load<Foo>(foo_addr)`
      +        let foo: Foo = Foo(ctx, foo_addr)
      +        return foo.baz()
      +
      +    pub fn call_bing(ctx: Context) -> u256:
      +        # future syntax: `let foo = ctx.create<Foo>(0)`
      +        let foo: Foo = Foo.create(ctx, 0)
      +        return foo.bing(42)
      +
      +

      Example with __call__ and unsafe block:

      +
      use std::context::Context
      +use std::evm
      +
      +contract Foo:
      +
      +    pub fn __call__():
      +        unsafe:
      +            # creating an instance of `Context` is unsafe
      +            let ctx: Context = Context()
      +            let value: u256 = u256(bar(ctx))
      +
      +            # return `value`
      +            evm::mstore(0, value)
      +            evm::return_mem(0, 32)
      +
      +    fn bar(ctx: Context) -> address:
      +        return ctx.self_address()
      +
      +

      (#638)

      +
    • +
    • +

      Features

      +

      Support local constant

      +

      Example:

      +
      contract Foo:
      +    pub fn bar():
      +        const LOCAL_CONST: i32 = 1
      +
      +

      Support constant expression

      +

      Example:

      +
      const GLOBAL: i32 = 8
      +
      +contract Foo:
      +    pub fn bar():
      +        const LOCAL: i32 = GLOBAL * 8
      +
      +

      Support constant generics expression

      +

      Example:

      +
      const GLOBAL: u256= 8
      +const USE_GLOBAL: bool = false
      +type MY_ARRAY = Array<i32, { GLOBAL / 4 }>
      +
      +contract Foo:
      +    pub fn bar():
      +        let my_array: Array<i32, { GLOBAL if USE_GLOBAL else 4 }>
      +
      +

      Bug fixes

      +

      Fix ICE when constant type is mismatch

      +

      Example:

      +
      const GLOBAL: i32 = "FOO"
      +
      +contract Foo:
      +    pub fn bar():
      +        let FOO: i32 = GLOBAL
      +
      +

      Fix ICE when assigning value to constant twice

      +

      Example:

      +
      const BAR: i32 = 1
      +
      +contract FOO:
      +    pub fn bar():
      +        BAR = 10
      +
      +

      (#649)

      +
    • +
    • +

      Argument label syntax now uses : instead of =. Example:

      +
      struct Foo:
      +  x: u256
      +  y: u256
      +
      +let x: MyStruct = MyStruct(x: 10, y: 11)
      +# previously:     MyStruct(x = 10, y = 11)
      +
      +

      (#665)

      +
    • +
    • +

      Support module-level pub modifier, now default visibility of items in a module is private.

      +

      Example:

      +
      # This constant can be used outside of the module.
      +pub const PUBLIC:i32 = 1
      +
      +# This constant can NOT be used outside of the module.
      +const PRIVATE: i32 = 1
      +
      +

      (#677)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +
        +
      • Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed.
      • +
      • An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun.
      • +
      • Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file.
      • +
      • parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax.
      • +
      • ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. (#628)
      • +
      +
    • +
    +

    0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)

    +

    Features

    +
      +
    • +

      Support private fields on structs

      +

      Public fields now need to be declared with the pub modifier, otherwise they default to private fields. +If a struct contains private fields it can not be constructed directly except from within the +struct itself. The recommended way is to implement a method new(...) as demonstrated in the +following example.

      +
      struct House:
      +    pub price: u256
      +    pub size: u256
      +    vacant: bool
      +
      +    pub fn new(price: u256, size: u256) -> House
      +      return House(price=price, size=size, vacant=true)
      +
      +contract Manager:
      +
      +  house: House
      +
      +  pub fn create_house(price: u256, size: u256):
      +    self.house = House::new(price, size)
      +    let can_access_price: u256 = self.house.price
      +    # can not access `self.house.vacant` because the field is private
      +
      +

      (#214)

      +
    • +
    • +

      Support non-base type fields in structs

      +

      Support is currently limited in two ways:

      +
        +
      • Structs with complex fields can not be returned from public functions
      • +
      • Structs with complex fields can not be stored in storage (#343)
      • +
      +
    • +
    • +

      Addresses can now be explicitly cast to u256. For example:

      +
      fn f(addr: address) -> u256:
      +  return u256(addr)
      +
      +

      (#621)

      +
    • +
    • +

      A special function named __call__ can now be defined in contracts.

      +

      The body of this function will execute in place of the standard dispatcher when the contract is called.

      +

      example (with intrinsics):

      +
      contract Foo:
      +    pub fn __call__(self):
      +        unsafe:
      +            if __calldataload(0) == 1:
      +                __revert(0, 0)
      +            else:
      +                __return(0, 0)
      +
      +

      (#622)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a crash that happend when using a certain unprintable ASCII char (#551)

      +
    • +
    • +

      The argument to revert wasn't being lowered by the compiler, +meaning that some revert calls would cause a compiler panic +in later stages. For example:

      +
      const BAD_MOJO: u256 = 0xdeaddead
      +
      +struct Error:
      +  code: u256
      +
      +fn fail():
      +  revert Error(code = BAD_MOJO)
      +
      +

      (#619)

      +
    • +
    • +

      Fixed a regression where an empty list expression ([]) would lead to a compiler crash. (#623)

      +
    • +
    • +

      Fixed a bug where int array elements were not sign extended in their ABI encodings. (#633)

      +
    • +
    +

    0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)

    +

    Features

    +
      +
    • +

      Added unsafe low-level "intrinsic" functions, that perform raw evm operations. +For example:

      +
      fn foo():
      +  unsafe:
      +    __mtore(0, 5000)
      +    assert __mload(0) == 5000
      +
      +

      The functions available are exactly those defined in yul's "evm dialect": +https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect +but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct.

      +

      These are intended to be used for implementing basic standard library functionality, +and shouldn't typically be needed in normal contract code.

      +

      Note: some intrinsic functions don't return a value (eg __log0); using these +functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) +will currently result in a compiler panic in the yul compilation phase. (#603)

      +
    • +
    • +

      Added an out of bounds check for accessing array items. +If an array index is retrieved at an index that is not within +the bounds of the array it now reverts with Panic(0x32). (#606)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Ensure ternary expression short circuit.

      +

      Example:

      +
      contract Foo:
      +
      +    pub fn bar(input: u256) -> u256:
      +        return 1 if input > 5 else revert_me()
      +
      +    fn revert_me() -> u256:
      +        revert
      +        return 0
      +
      +

      Previous to this change, the code above would always revert no matter +which branch of the ternary expressions it would resolve to. That is because +both sides were evaluated and then one side was discarded. With this change, +only the branch that doesn't get picked won't get evaluated at all.

      +

      The same is true for the boolean operations and and or. (#488)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      Added a globally available dummy std lib.

      +

      This library contains a single get_42 function, which can be called using std::get_42(). Once +low-level intrinsics have been added to the language, we can delete get_42 and start adding +useful code. (#601)

      +
    • +
    +

    0.11.0-alpha "Karlite" (2021-12-02)

    +

    Features

    +
      +
    • +

      Added support for multi-file inputs.

      +

      Implementation details:

      +

      Mostly copied Rust's crate system, but use the term ingot instead of crate.

      +

      Below is an example of an ingot's file tree, as supported by the current implementation.

      +
      `-- basic_ingot
      +    `-- src
      +        |-- bar
      +        |   `-- baz.fe
      +        |-- bing.fe
      +        |-- ding
      +        |   |-- dang.fe
      +        |   `-- dong.fe
      +        `-- main.fe
      +
      +

      There are still a few features that will be worked on over the coming months:

      +
        +
      • source files accompanying each directory module (e.g. my_mod.fe)
      • +
      • configuration files and the ability to create library ingots
      • +
      • test directories
      • +
      • module-level pub modifier (all items in a module are public)
      • +
      • mod statements (all fe files in the input tree are public modules)
      • +
      +

      These things will be implemented in order of importance over the next few months. (#562)

      +
    • +
    • +

      The syntax for array types has changed to match other generic types. +For example, u8[4] is now written Array<u8, 4>. (#571)

      +
    • +
    • +

      Functions can now be defined on struct types. Example:

      +
      struct Point:
      +  x: u64
      +  y: u64
      +
      +  # Doesn't take `self`. Callable as `Point.origin()`.
      +  # Note that the syntax for this will soon be changed to `Point::origin()`.
      +  pub fn origin() -> Point:
      +    return Point(x=0, y=0)
      +
      +  # Takes `self`. Callable on a value of type `Point`.
      +  pub fn translate(self, x: u64, y: u64):
      +    self.x += x
      +    self.y += y
      +
      +  pub fn add(self, other: Point) -> Point:
      +    let x: u64 = self.x + other.x
      +    let y: u64 = self.y + other.y
      +    return Point(x, y)
      +
      +  pub fn hash(self) -> u256:
      +    return keccak256(self.abi_encode())
      +
      +pub fn do_pointy_things():
      +  let p1: Point = Point.origin()
      +  p1.translate(5, 10)
      +
      +  let p2: Point = Point(x=1, y=2)
      +  let p3: Point = p1.add(p2)
      +
      +  assert p3.x == 6 and p3.y == 12
      +
      +

      (#577)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a rare compiler crash.

      +

      Example:

      +
      let my_array: i256[1] = [-1 << 1]
      +
      +

      Previous to this fix, the given example would lead to an ICE. (#550)

      +
    • +
    • +

      Contracts can now create an instance of a contract defined later in a file. +This issue was caused by a weakness in the way we generated yul. (#596)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      File IDs are now attached to Spans. (#587)

      +
    • +
    • +

      The fe analyzer now builds a dependency graph of source code "items" (functions, contracts, structs, etc). +This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) +output. Note that the yul output is still cluttered with utility functions that may or may not be needed by +a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency +graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many +of these utility functions into fe; when this happens they'll become part of the dependency graph and will only +be included in the yul output when needed.

      +

      The dependency graph will also enable future analyzer warnings about unused code. (#596)

      +
    • +
    +

    0.10.0-alpha (2021-10-31)

    +

    Features

    +
      +
    • +

      Support for module level constants for base types

      +

      Example:

      +
      const TEN = 10
      +
      +contract
      +
      +  pub fn do_moon_math(self) -> u256:
      +    return 4711 * TEN
      +
      +

      The values of base type constants are always inlined. (#192)

      +
    • +
    • +

      Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) (#492)

      +
    • +
    • +

      Replaced import statements with use statements.

      +

      Example:

      +
      use foo::{bar::*, baz as baz26}
      +
      +

      Note: this only adds support for parsing use statements. (#547)

      +
    • +
    • +

      Functions can no be defined outside of contracts. Example:

      +
      fn add_bonus(x: u256) -> u256:
      +    return x + 10
      +
      +contract PointTracker:
      +    points: Map<address, u256>
      +
      +    pub fn add_points(self, user: address, val: u256):
      +        self.points[user] += add_bonus(val)
      +
      +

      (#566)

      +
    • +
    • +

      Implemented a send_value(to: address, value_in_wei: u256) function.

      +

      The function is similar to the sendValue function by OpenZeppelin with the differences being that:

      +
        +
      1. +

        It reverts with Error(0x100) instead of Error("Address: insufficient balance") to +safe more gas.

        +
      2. +
      3. +

        It uses selfbalance() instead of balance(address()) to safe more gas

        +
      4. +
      5. +

        It reverts with Error(0x101) instead of Error("Address: unable to send value, recipient may have reverted") also to safe more gas. (#567)

        +
      6. +
      +
    • +
    • +

      Added support for unsafe functions and unsafe blocks within functions. +Note that there's currently no functionality within Fe that requires the use +of unsafe, but we plan to add built-in unsafe functions that perform raw +evm operations which will only callable within an unsafe block or function. (#569)

      +
    • +
    • +

      Added balance() and balance_of(account: address) methods. (#572)

      +
    • +
    • +

      Added support for explicit casting between numeric types.

      +

      Example:

      +
      let a: i8 = i8(-1)
      +let a1: i16 = i16(a)
      +let a2: u16 = u16(a1)
      +
      +assert a2 == u16(65535)
      +
      +let b: i8 = i8(-1)
      +let b1: u8 = u8(b)
      +let b2: u16 = u16(b1)
      +
      +assert b2 == u16(255)
      +
      +

      Notice that Fe allows casting between any two numeric types but does not allow +to change both the sign and the size of the type in one step as that would leave +room for ambiguity as the example above demonstrates. (#576)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Adjust numeric values loaded from memory or storage

      +

      Previous to this fix numeric values that were loaded from either memory or storage +were not properly loaded on the stack which could result in numeric values not +treated as intended.

      +

      Example:

      +
      contract Foo:
      +
      +    pub fn bar() -> i8:
      +        let in_memory: i8[1] = [-3]
      +        return in_memory[0]
      +
      +

      In the example above bar() would not return -3 but 253 instead. (#524)

      +
    • +
    • +

      Propagate reverts from external contract calls.

      +

      Before this fix the following code to should_revert() or should_revert2() +would succeed even though it clearly should not.

      +
      contract A:
      +  contract_b: B
      +  pub fn __init__(contract_b: address):
      +    self.contract_b = B(contract_b)
      +
      +  pub fn should_revert():
      +    self.contract_b.fail()
      +
      +  pub fn should_revert2():
      +    self.contract_b.fail_with_custom_error()
      +
      +struct SomeError:
      +  pass
      +
      +contract B:
      +
      +  pub fn fail():
      +    revert
      +
      +  pub fn fail_with_custom_error():
      +    revert SomeError()
      +
      +

      With this fix the revert errors are properly passed upwards the call hierachy. (#574)

      +
    • +
    • +

      Fixed bug in left shift operation.

      +

      Example:

      +

      Let's consider the value 1 as an u8 which is represented as +the following 256 bit item on the EVM stack 00..|00000001|. +A left shift of 8 bits (val << 8) turns that into 00..01|00000000|.

      +

      Previous to this fix this resulted in the compiler taking 256 as the +value for the u8 when clearly 256 is not even in the range of u8 +anymore. With this fix the left shift operations was fixed to properly +"clean up" the result of the shift so that 00..01|00000000| turns into +00..00|00000000|. (#575)

      +
    • +
    • +

      Ensure negation is checked and reverts with over/underflow if needed.

      +

      Example:

      +

      The minimum value for an i8 is -128 but the maximum value of an i8 +is 127 which means that negating -128 should lead to an overflow since +128 does not fit into an i8. Before this fix, negation operations where +not checked for over/underflow resulting in returning the oversized value. (#578)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      In the analysis stage, all name resolution (of variable names, function names, +type names, etc used in code) now happens via a single resolve_name pathway, +so we can catch more cases of name collisions and log more helpful error messages. (#555)

      +
    • +
    • +

      Added a new category of tests: differential contract testing.

      +

      Each of these tests is pased on a pair of contracts where one implementation +is written in Fe and the other one is written in Solidity. The implementations +should have the same public APIs and are assumed to always return identical +results given equal inputs. The inputs are randomly generated using proptest +and hence are expected to discover unknown bugs. (#578)

      +
    • +
    +

    0.9.0-alpha (2021-09-29)

    +

    Features

    +
      +
    • +

      The self variable is no longer implicitly defined in code blocks. It must now be declared +as the first parameter in a function signature.

      +

      Example:

      +
      contract Foo:
      +    my_stored_num: u256
      +
      +    pub fn bar(self, my_num: u256):
      +        self.my_stored_num = my_num
      +
      +    pub fn baz(self):
      +        self.bar(my_pure_func())
      +
      +    pub fn my_pure_func() -> u256:
      +        return 42 + 26
      +
      +

      (#520)

      +
    • +
    • +

      The analyzer now disallows defining a type, variable, or function whose +name conflicts with a built-in type, function, or object.

      +

      Example:

      +
      error: type name conflicts with built-in type
      +┌─ compile_errors/shadow_builtin_type.fe:1:6
      +│
      +1 │ type u256 = u8
      +│      ^^^^ `u256` is a built-in type
      +
      +

      (#539)

      +
    • +
    +

    Bugfixes

    +
      +
    • Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. (#534)
    • +
    • Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) +are no longer ignored if the semantic analysis stage succeeds. (#535)
    • +
    • Fixed issue #531 by adding a $ to the front of lowered tuple names. (#546)
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Implemented pretty printing of Fe AST. (#540)
    • +
    +

    0.8.0-alpha "Haxonite" (2021-08-31)

    +

    Features

    +
      +
    • +

      Support quotes, tabs and carriage returns in string literals and otherwise +restrict string literals to the printable subset of the ASCII table. (#329)

      +
    • +
    • +

      The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation.

      +
        +
      • Types can now refer to other types defined later in the file. +Example:
      • +
      +
      type Posts = Map<PostId, PostBody>
      +type PostId = u256
      +type PostBody = String<140>
      +
      +
        +
      • Duplicate definition errors now show the location of the original definition.
      • +
      • The analysis of each function, type definition, etc happens independently, so an error in one +doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. (#468)
      • +
      +
    • +
    • +

      Function definitions are now denoted with the keyword fn instead of def. (#496)

      +
    • +
    • +

      Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. (#509)

      +
    • +
    • +

      Implemented support for numeric unary invert operator (~) (#526)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. (#468)

      +
    • +
    • +

      Fixed an issue where certain expressions were not being moved to the correct location. (#493)

      +
    • +
    • +

      Fixed an issue with a missing return statement not properly detected.

      +

      Previous to this fix, the following code compiles but it should not:

      +
      contract Foo:
      +    pub fn bar(val: u256) -> u256:
      +        if val > 1:
      +            return 5
      +
      +

      With this change, the compiler rightfully detects that the code is missing +a return or revert statement after the if statement since it is not +guaranteed that the path of execution always follows the arm of the if statement. (#497)

      +
    • +
    • +

      Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, +resulting in an internal compiler error in a later pass. Example: my_tuple.item001. +These are now rejected with an error message. (#510)

      +
    • +
    • +

      Check call argument labels for function calls.

      +

      Previously the compiler would not check any labels that were used +when making function calls on self or external contracts.

      +

      This can be especially problematic if gives developers the impression +that they could apply function arguments in any order as long as they +are named which is not the case.

      +
      contract Foo:
      +
      +    pub fn baz():
      +        self.bar(val2=1, doesnt_even_exist=2)
      +
      +    pub fn bar(val1: u256, val2: u256):
      +        pass
      +
      +

      Code as the one above is now rightfully rejected by the compiler. (#517)

      +
    • +
    +

    Improved Documentation

    +
      +
    • +

      Various improvements and bug fixes to both the content and layout of the specification. (#489)

      +
    • +
    • +

      Document all remaining statements and expressions in the spec.

      +

      Also added a CI check to ensure code examples in the documentation +are validated against the latest compiler. (#514)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Separated Fe type traits between crates. (#485)
    • +
    +

    0.7.0-alpha "Galaxite" (2021-07-27)

    +

    Features

    +
      +
    • +

      Enable the optimizer by default. The optimizer can still be disabled +by supplying --optimize=false as an argument. (#439)

      +
    • +
    • +

      The following checks are now performed while decoding data:

      +
        +
      • The size of the encoded data fits within the size range known at compile-time.
      • +
      • Values are correctly padded. +
          +
        • unsigned integers, addresses, and bools are checked to have correct left zero padding
        • +
        • the size of signed integers are checked
        • +
        • bytes and strings are checked to have correct right padding
        • +
        +
      • +
      • Data section offsets are consistent with the size of preceding values in the data section.
      • +
      • The dynamic size of strings does not exceed their maximum size.
      • +
      • The dynamic size of byte arrays (u8[n]) is equal to the size of the array. (#440)
      • +
      +
    • +
    • +

      Type aliases can now include tuples. Example:

      +
      type InternetPoints = (address, u256)
      +
      +

      (#459)

      +
    • +
    • +

      Revert with custom errors

      +

      Example:

      +
      struct PlatformError:
      +  code: u256
      +
      +pub fn do_something():
      +  revert PlatformError(code=4711)
      +
      +

      Error encoding follows Solidity which is based on EIP-838. This means that custom errors returned from Fe are fully compatible with Solidity. (#464)

      +
    • +
    • +
        +
      • The builtin value msg.sig now has type u256.
      • +
      • Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. (#472)
      • +
      +
    • +
    • +

      Encode certain reverts as panics.

      +

      With this change, the following reverts are encoded as Panic(uint256) with +the following panic codes:

      +
        +
      • 0x01: An assertion that failed and did not specify an error message
      • +
      • 0x11: An arithmetic expression resulted in an over- or underflow
      • +
      • 0x12: An arithmetic expression divided or modulo by zero
      • +
      +

      The panic codes are aligned with the panic codes that Solidity uses. (#476)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a crash when trying to access an invalid attribute on a string.

      +

      Example:

      +
      contract Foo:
      +
      +  pub fn foo():
      +    "".does_not_exist
      +
      +

      The above now yields a proper user error. (#444)

      +
    • +
    • +

      Ensure String<N> type is capitalized in error messages (#445)

      +
    • +
    • +

      Fixed ICE when using a static string that spans over multiple lines.

      +

      Previous to this fix, the following code would lead to a compiler crash:

      +
      contract Foo:
      +    pub fn return_with_newline() -> String<16>:
      +        return "foo
      +        balu"
      +
      +

      The above code now works as intended. (#448)

      +
    • +
    • +

      Fixed ICE when using a tuple declaration and specifying a non-tuple type. +Fixed a second ICE when using a tuple declaration where the number of +target items doesn't match the number of items in the declared type. (#469)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +
        +
      • Cleaned up ABI encoding internals.
      • +
      • Improved yulc panic formatting. (#472)
      • +
      +
    • +
    +

    0.6.0-alpha "Feldspar" (2021-06-10)

    +

    Features

    +
      +
    • +

      Support for pragma statement

      +

      Example: pragma ^0.1.0 (#361)

      +
    • +
    • +

      Add support for tuple destructuring

      +

      Example:

      +
      my_tuple: (u256, bool) = (42, true)
      +(x, y): (u256, bool) = my_tuple
      +
      +

      (#376)

      +
    • +
    • +
        +
      1. Call expression can now accept generic arguments
      2. +
      3. Replace stringN to String<N>
      4. +
      +

      Example:

      +
      s: String<10> = String<10>("HI")
      +
      +

      (#379)

      +
    • +
    • +
        +
      • Many analyzer errors now include helpful messages and underlined code.
      • +
      • Event and struct constructor arguments must now be labeled and in the order specified in the definition.
      • +
      • The analyzer now verifies that the left-hand side of an assignment is actually assignable. (#398)
      • +
      +
    • +
    • +

      Types of integer literal are now inferred, rather than defaulting to u256.

      +
      contract C:
      +
      +  fn f(x: u8) -> u16:
      +    y: u8 = 100   # had to use u8(100) before
      +    z: i8 = -129  # "literal out of range" error
      +
      +    return 1000   # had to use `return u16(1000)` before
      +
      +  fn g():
      +    self.f(50)
      +
      +

      Similar inference is done for empty array literals. Previously, empty array +literals caused a compiler crash, because the array element type couldn't +be determined.

      +
      contract C:
      +  fn f(xs: u8[10]):
      +    pass
      +
      +  fn g():
      +    self.f([])
      +
      +

      (Note that array length mismatch is still a type error, so this code won't +actually compile.) (#429)

      +
    • +
    • +

      The Map type name is now capitalized. Example:

      +
      contract GuestBook:
      +    guests: Map<address, String<100>>
      +
      +

      (#431)

      +
    • +
    • +

      Convert all remaining errors to use the new advanced error reporting system (#432)

      +
    • +
    • +

      Analyzer throws an error if __init__ is not public. (#435)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Refactored front-end "not implemented" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. (#437)
    • +
    +

    0.5.0-alpha (2021-05-27)

    +

    Features

    +
      +
    • +

      Add support for hexadecimal/octal/binary numeric literals.

      +

      Example:

      +
      value_hex: u256 = 0xff
      +value_octal: u256 = 0o77
      +value_binary: u256 = 0b11
      +
      +

      (#333)

      +
    • +
    • +

      Added support for list expressions.

      +

      Example:

      +
      values: u256[3] = [10, 20, 30]
      +
      +# or anywhere else where expressions can be used such as in a call
      +
      +sum: u256 = self.sum([10, 20, 30])
      +
      +

      (#388)

      +
    • +
    • +

      Contracts, events, and structs can now be empty.

      +

      e.g.

      +
      event MyEvent:
      +    pass
      +
      +...
      +
      +contract MyContract:
      +    pass
      +
      +...
      +
      +struct MyStruct:
      +    pass
      +
      +

      (#406)

      +
    • +
    • +

      External calls can now handle dynamically-sized return types. (#415)

      +
    • +
    +

    Bugfixes

    +
      +
    • The analyzer will return an error if a tuple attribute is not of the form item<index>. (#401)
    • +
    +

    Improved Documentation

    +
      +
    • Created a landing page for Fe at https://fe-lang.org (#394)
    • +
    • Provide a Quickstart chapter in Fe Guide (#403)
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      Using insta to validate Analyzer outputs. (#387)

      +
    • +
    • +

      Analyzer now disallows using context.add_ methods to update attributes. (#392)

      +
    • +
    • +

      () now represents a distinct type internally called the unit type, instead of an empty tuple.

      +

      The lowering pass now does the following: Valueless return statements are given a () value and +functions without a return value are given explicit () returns. (#406)

      +
    • +
    • +

      Add CI check to ensure fragment files always end with a new line (#4711)

      +
    • +
    +

    0.4.0-alpha (2021-04-28)

    +

    Features

    +
      +
    • +

      Support for revert messages in assert statements

      +

      E.g

      +
      assert a == b, "my revert statement"
      +
      +

      The provided string is abi-encoded as if it were a call +to a function Error(string). For example, the revert string "Not enough Ether provided." returns the following hexadecimal as error return data:

      +
      0x08c379a0                                                         // Function selector for Error(string)
      +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
      +0x000000000000000000000000000000000000000000000000000000000000001a // String length
      +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data
      +
      +

      (#288)

      +
    • +
    • +

      Added support for augmented assignments.

      +

      e.g.

      +
      contract Foo:
      +    pub fn add(a: u256, b: u256) -> u256:
      +        a += b
      +        return a
      +
      +    pub fn sub(a: u256, b: u256) -> u256:
      +        a -= b
      +        return a
      +
      +    pub fn mul(a: u256, b: u256) -> u256:
      +        a *= b
      +        return a
      +
      +    pub fn div(a: u256, b: u256) -> u256:
      +        a /= b
      +        return a
      +
      +    pub fn mod(a: u256, b: u256) -> u256:
      +        a %= b
      +        return a
      +
      +    pub fn pow(a: u256, b: u256) -> u256:
      +        a **= b
      +        return a
      +
      +    pub fn lshift(a: u8, b: u8) -> u8:
      +        a <<= b
      +        return a
      +
      +    pub fn rshift(a: u8, b: u8) -> u8:
      +        a >>= b
      +        return a
      +
      +    pub fn bit_or(a: u8, b: u8) -> u8:
      +        a |= b
      +        return a
      +
      +    pub fn bit_xor(a: u8, b: u8) -> u8:
      +        a ^= b
      +        return a
      +
      +    pub fn bit_and(a: u8, b: u8) -> u8:
      +        a &= b
      +        return a
      +
      +

      (#338)

      +
    • +
    • +

      A new parser implementation, which provides more helpful error messages +with fancy underlines and code context. (#346)

      +
    • +
    • +

      Added support for tuples with base type items.

      +

      e.g.

      +
      contract Foo:
      +    my_num: u256
      +
      +    pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool):
      +        my_tuple: (u256, bool) = (my_num, my_bool)
      +        self.my_num = my_tuple.item0
      +        return my_tuple
      +
      +

      (#352)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Properly reject invalid emit (#211)

      +
    • +
    • +

      Properly tokenize numeric literals when they start with 0 (#331)

      +
    • +
    • +

      Reject non-string assert reasons as type error (#335)

      +
    • +
    • +

      Properly reject code that creates a circular dependency when using create or create2.

      +

      Example, the following code is now rightfully rejected because it tries to create an +instance of Foo from within the Foo contract itself.

      +
      contract Foo:
      +  pub fn bar()->address:
      +    foo:Foo=Foo.create(0)
      +
      +    return address(foo)
      +
      +

      (#362)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. (#332)
    • +
    • Added support for running tests against solidity fixtures. +Also added tests that cover how solidity encodes revert reason strings. (#342)
    • +
    • Refactoring of binary operation type checking. (#347)
    • +
    +

    0.3.0-alpha "Calamine" (2021-03-24)

    +

    Features

    +
      +
    • +

      Add over/underflow checks for multiplications of all integers (#271)

      +
    • +
    • +

      Add full support for empty Tuples. (#276)

      +

      All functions in Fe implicitly return an empty Tuple if they have no other return value. +However, before this change one was not able to use the empty Tuple syntax () explicitly.

      +

      With this change, all of these are treated equally:

      +
      contract Foo:
      +
      +  pub fn explicit_return_a1():
      +    return
      +
      +  pub fn explicit_return_a2():
      +    return ()
      +
      +  pub fn explicit_return_b1() ->():
      +    return
      +
      +  pub fn explicit_return_b2() ->():
      +    return ()
      +
      +  pub fn implicit_a1():
      +    pass
      +
      +  pub fn implicit_a2() ->():
      +    pass
      +
      +
    • +
    • +

      The JSON ABI builder now supports structs as both input and output. (#296)

      +
    • +
    • +

      Make subsequently defined contracts visible.

      +

      Before this change:

      +
      # can't see Bar
      +contract Foo:
      +   ...
      +# can see Foo
      +contract Bar:
      +   ...
      +
      +

      With this change the restriction is lifted and the following becomes possible. (#298)

      +
      contract Foo:
      +    bar: Bar
      +    pub fn external_bar() -> u256:
      +        return self.bar.bar()
      +contract Bar:
      +    foo: Foo
      +    pub fn external_foo() -> u256:
      +        return self.foo.foo()
      +
      +
    • +
    • +

      Perform checks for divison operations on integers (#308)

      +
    • +
    • +

      Support for msg.sig to read the function identifier. (#311)

      +
    • +
    • +

      Perform checks for modulo operations on integers (#312)

      +
    • +
    • +

      Perform over/underflow checks for exponentiation operations on integers (#313)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Properly reject emit not followed by an event invocation (#212)

      +
    • +
    • +

      Properly reject octal number literals (#222)

      +
    • +
    • +

      Properly reject code that tries to emit a non-existing event. (#250)

      +

      Example that now produces a compile time error:

      +
      emit DoesNotExist()
      +
      +
    • +
    • +

      Contracts that create other contracts can now include __init__ functions.

      +

      See https://github.com/ethereum/fe/issues/284 (#304)

      +
    • +
    • +

      Prevent multiple types with same name in one module. (#317)

      +

      Examples that now produce compile time errors:

      +
      type bar = u8
      +type bar = u16
      +
      +

      or

      +
      struct SomeStruct:
      +    some_field: u8
      +
      +struct SomeStruct:
      +    other: u8
      +
      +

      or

      +
      contract SomeContract:
      +    some_field: u8
      +
      +contract SomeContract:
      +    other: u8
      +
      +

      Prevent multiple fields with same name in one struct.

      +

      Example that now produces a compile time error:

      +
      struct SomeStruct:
      +    some_field: u8
      +    some_field: u8
      +
      +

      Prevent variable definition in child scope when name already taken in parent scope.

      +

      Example that now produces a compile time error:

      +
      pub fn bar():
      +    my_array: u256[3]
      +    sum: u256 = 0
      +    for i in my_array:
      +        sum: u256 = 0
      +
      +
    • +
    • +

      The CLI was using the overwrite flag to enable Yul optimization.

      +

      i.e.

      +
      # Would both overwrite output files and run the Yul optimizer.
      +$ fe my_contract.fe --overwrite
      +
      +

      Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. (#320)

      +
    • +
    • +

      Ensure analyzer rejects code that uses return values for __init__ functions. (#323)

      +

      An example that now produces a compile time error:

      +
      contract C:
      +    pub fn __init__() -> i32:
      +        return 0
      +
      +
    • +
    • +

      Properly reject calling an undefined function on an external contract (#324)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. (#179)
    • +
    • IDs added to AST nodes. (#315)
    • +
    • Failures in the Yul generation phase now panic; any failure is a bug. (#327)
    • +
    +

    0.2.0-alpha "Borax" (2021-02-27)

    +

    Features

    +
      +
    • +

      Add support for string literals.

      +

      Example:

      +
      fn get_ticker_symbol() -> string3:
      +    return "ETH"
      +
      +

      String literals are stored in and loaded from the compiled bytecode. (#186)

      +
    • +
    • +

      The CLI now compiles every contract in a module, not just the first one. (#197)

      +

      Sample compiler output with all targets enabled:

      +
      output
      +|-- Bar
      +|   |-- Bar.bin
      +|   |-- Bar_abi.json
      +|   `-- Bar_ir.yul
      +|-- Foo
      +|   |-- Foo.bin
      +|   |-- Foo_abi.json
      +|   `-- Foo_ir.yul
      +|-- module.ast
      +`-- module.tokens
      +
      +
    • +
    • +

      Add support for string type casts (#201)

      +

      Example:

      +
      val: string100 = string100("foo")
      +
      +
    • +
    • +

      Add basic support for structs. (#203)

      +

      Example:

      +
      struct House:
      +    price: u256
      +    size: u256
      +    vacant: bool
      +
      +contract City:
      +
      +    pub fn get_price() -> u256:
      +        building: House = House(300, 500, true)
      +
      +        assert building.size == 500
      +        assert building.price == 300
      +        assert building.vacant
      +
      +        return building.price
      +
      +
    • +
    • +

      Added support for external contract calls. Contract definitions now +add a type to the module scope, which may be used to create contract +values with the contract's public functions as callable attributes. (#204)

      +

      Example:

      +
      contract Foo:
      +    pub fn build_array(a: u256, b: u256) -> u256[3]:
      +        my_array: u256[3]
      +        my_array[0] = a
      +        my_array[1] = a * b
      +        my_array[2] = b
      +        return my_array
      +
      +contract FooProxy:
      +    pub fn call_build_array(
      +        foo_address: address,
      +        a: u256,
      +        b: u256,
      +    ) -> u256[3]:
      +        foo: Foo = Foo(foo_address)
      +        return foo.build_array(a, b)
      +
      +
    • +
    • +

      Add support for block, msg, chain, and tx properties: (#208)

      +
      block.coinbase: address
      +block.difficulty: u256
      +block.number: u256
      +block.timestamp: u256
      +chain.id: u256
      +msg.value: u256
      +tx.gas_price: u256
      +tx.origin: address
      +
      +

      (Note that msg.sender: address was added previously.)

      +

      Example:

      +
      fn post_fork() -> bool:
      +    return block.number > 2675000
      +
      +
    • +
    • +

      The CLI now panics if an error is encountered during Yul compilation. (#218)

      +
    • +
    • +

      Support for contract creations.

      +

      Example of create2, which takes a value and address salt as parameters.

      +
      contract Foo:
      +    pub fn get_my_num() -> u256:
      +        return 42
      +
      +contract FooFactory:
      +    pub fn create2_foo() -> address:
      +        # value and salt
      +        foo: Foo = Foo.create2(0, 52)
      +        return address(foo)
      +
      +

      Example of create, which just takes a value parameter.

      +
      contract Foo:
      +    pub fn get_my_num() -> u256:
      +        return 42
      +
      +contract FooFactory:
      +    pub fn create_foo() -> address:
      +        # value and salt
      +        foo: Foo = Foo.create(0)
      +        return address(foo)
      +
      +

      Note: We do not yet support init parameters. (#239)

      +
    • +
    • +

      Support updating individual struct fields in storage. (#246)

      +

      Example:

      +
       pub fn update_house_price(price: u256):
      +        self.my_house.price = price
      +
      +
    • +
    • +

      Implement global keccak256 method. The method expects one parameter of bytes[n] +and returns the hash as an u256. In a future version keccak256 will most likely +be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). (#255)

      +

      Example:

      +
      pub fn hash_single_byte(val: bytes[1]) -> u256:
      +    return keccak256(val)
      +
      +
    • +
    • +

      Require structs to be initialized using keyword arguments.

      +

      Example:

      +
      struct House:
      +    vacant: bool
      +    price: u256
      +
      +

      Previously, House could be instantiated as House(true, 1000000). +With this change it is required to be instantiated like House(vacant=true, price=1000000)

      +

      This ensures property assignment is less prone to get mixed up. It also makes struct +initialization visually stand out more from function calls. (#260)

      +
    • +
    • +

      Implement support for boolean not operator. (#264)

      +

      Example:

      +
      if not covid_test.is_positive(person):
      +    allow_boarding(person)
      +
      +
    • +
    • +

      Do over/underflow checks for additions (SafeMath).

      +

      With this change all additions (e.g x + y) for signed and unsigned +integers check for over- and underflows and revert if necessary. (#265)

      +
    • +
    • +

      Added a builtin function abi_encode() that can be used to encode structs. The return type is a +fixed-size array of bytes that is equal in size to the encoding. The type system does not support +dynamically-sized arrays yet, which is why we used fixed. (#266)

      +

      Example:

      +
      struct House:
      +    price: u256
      +    size: u256
      +    rooms: u8
      +    vacant: bool
      +
      +contract Foo:
      +    pub fn hashed_house() -> u256:
      +        house: House = House(
      +            price=300,
      +            size=500,
      +            rooms=u8(20),
      +            vacant=true
      +        )
      +        return keccak256(house.abi_encode())
      +
      +
    • +
    • +

      Perform over/underflow checks for subtractions (SafeMath). (#267)

      +

      With this change all subtractions (e.g x - y) for signed and unsigned +integers check for over- and underflows and revert if necessary.

      +
    • +
    • +

      Support for the boolean operations and and or. (#270)

      +

      Examples:

      +
      contract Foo:
      +    pub fn bar(x: bool, y: bool) -> bool:
      +        return x and y
      +
      +
      contract Foo:
      +    pub fn bar(x: bool, y: bool) -> bool:
      +        return x or y
      +
      +

      Support for self.address.

      +

      This expression returns the address of the current contract.

      +

      Example:

      +
      contract Foo:
      +    pub fn bar() -> address:
      +        return self.address
      +
      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Perform type checking when calling event constructors

      +

      Previously, the following would not raise an error even though it should:

      +
      contract Foo:
      +    event MyEvent:
      +        val_1: string100
      +        val_2: u8
      +
      +    pub fn foo():
      +        emit MyEvent("foo", 1000)
      +
      +
      +

      Wit this change, the code fails with a type error as expected. (#202)

      +
    • +
    • +

      Fix bug where compilation of contracts without public functions would result in illegal YUL. (#219)

      +

      E.g without this change, the following doesn't compile to proper YUL

      +
      contract Empty:
      +  lonely: u256
      +
      +
    • +
    • +

      Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a +non user friendly error at the YUL compilation stage. With this change it is caught +at the analyzer stage and presented to the user as a regular error. (#225)

      +
    • +
    • +

      Fix crash when return is used without value.

      +

      These two methods should both be treated as returning ()

      +
        pub fn explicit_return():
      +    return
      +
      +  pub fn implicit():
      +    pass
      +
      +

      Without this change, the explicit_return crashes the compiler. (#261)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Renamed the fe-semantics library to fe-analyzer. (#207)
    • +
    • Runtime testing utilities. (#243)
    • +
    • Values are stored more efficiently in storage. (#251)
    • +
    +

    0.1.0-alpha "Amethyst" (2021-01-20)

    +

    WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead.

    +

    This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.

    +

    Features

    +
      +
    • +

      Added support for for loop, allows iteration over static arrays. (#134)

      +
    • +
    • +

      Enforce bounds on numeric literals in type constructors.

      +

      For instance calling u8(1000) or i8(-250) will give an error because +the literals 1000 and -250 do not fit into u8 or i8. (#145)

      +
    • +
    • +

      Added builtin copying methods clone() and to_mem() to reference types. (#155)

      +

      usage:

      +
      # copy a segment of storage into memory and assign the new pointer
      +my_mem_array = self.my_sto_array.to_mem()
      +
      +# copy a segment of memory into another segment of memory and assign the new pointer
      +my_other_mem_array = my_mem_array.clone()
      +
      +
    • +
    • +

      Support emitting JSON ABI via --emit abi. +The default value of --emit is now abi,bytecode. (#160)

      +
    • +
    • +

      Ensure integer type constructor reject all expressions that aren't a numeric literal. +For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16.

      +
      pub fn bar(val: u8) -> u16:
      +        return u16(val)
      +
      +

      Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. (#163)

      +
    • +
    • +

      Support for ABI decoding of all array type. (#172)

      +
    • +
    • +

      Support for value assignments in declaration.

      +

      Previously, this code would fail:

      +
      another_reference: u256[10] = my_array
      +
      +

      As a workaround declaration and assignment could be split apart.

      +
      another_reference: u256[10]
      +another_reference = my_array
      +
      +

      With this change, the shorter declaration with assignment syntax is supported. (#173)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Point to examples in the README (#162)
    • +
    • Overhaul README page to better reflect the current state of the project. (#177)
    • +
    • Added descriptions of the to_mem and clone functions to the spec. (#195)
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Updated the Solidity backend to v0.8.0. (#169)
    • +
    • Run CI tests on Mac and support creating Mac binaries for releases. (#178)
    • +
    +

    Contributor Covenant Code of Conduct

    +

    Our Pledge

    +

    We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation.

    +

    We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community.

    +

    Our Standards

    +

    Examples of behavior that contributes to a positive environment for our +community include:

    +
      +
    • Demonstrating empathy and kindness toward other people
    • +
    • Being respectful of differing opinions, viewpoints, and experiences
    • +
    • Giving and gracefully accepting constructive feedback
    • +
    • Accepting responsibility and apologizing to those affected by our mistakes, +and learning from the experience
    • +
    • Focusing on what is best not just for us as individuals, but for the +overall community
    • +
    +

    Examples of unacceptable behavior include:

    +
      +
    • The use of sexualized language or imagery, and sexual attention or +advances of any kind
    • +
    • Trolling, insulting or derogatory comments, and personal or political attacks
    • +
    • Public or private harassment
    • +
    • Publishing others' private information, such as a physical or email +address, without their explicit permission
    • +
    • Other conduct which could reasonably be considered inappropriate in a +professional setting
    • +
    +

    Enforcement Responsibilities

    +

    Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful.

    +

    Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate.

    +

    Scope

    +

    This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event.

    +

    Enforcement

    +

    Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +piper@pipermerriam.com. +All complaints will be reviewed and investigated promptly and fairly.

    +

    All community leaders are obligated to respect the privacy and security of the +reporter of any incident.

    +

    Enforcement Guidelines

    +

    Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct:

    +

    1. Correction

    +

    Community Impact: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community.

    +

    Consequence: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested.

    +

    2. Warning

    +

    Community Impact: A violation through a single incident or series +of actions.

    +

    Consequence: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban.

    +

    3. Temporary Ban

    +

    Community Impact: A serious violation of community standards, including +sustained inappropriate behavior.

    +

    Consequence: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban.

    +

    4. Permanent Ban

    +

    Community Impact: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals.

    +

    Consequence: A permanent ban from any sort of public interaction within +the community.

    +

    Attribution

    +

    This Code of Conduct is adapted from the Contributor Covenant, +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

    +

    Community Impact Guidelines were inspired by +Mozilla's code of conduct enforcement ladder.

    +

    For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available +at https://www.contributor-covenant.org/translations.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/quickstart/deploy_contract.html b/docs/quickstart/deploy_contract.html new file mode 100644 index 0000000000..10c7b01fbf --- /dev/null +++ b/docs/quickstart/deploy_contract.html @@ -0,0 +1,359 @@ + + + + + + Deploying a contract to a testnet - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Deploy your contract.

    +

    Prerequisites

    +

    You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. +If you don't have any of these components, please revisit Write your first contract.

    +

    Introduction

    +

    When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a "live" network, you are handling assets with real-world value!

    +

    In this guide, you will deploy your contract to a local blockchain. This will be an "ephemeral" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.

    +

    Your developer environment

    +

    Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process.

    +

    In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps.

    +
    +

    Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.

    +
    +

    Deploying to a local network

    +

    Foundry has its own local network called Anvil. You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command:

    +
    anvil 
    +
    +

    You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console (never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed.

    +
    +

    Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.

    +
    +

    Making the deployment transaction

    +

    In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +    self.messages[ctx.msg_sender()] = book_msg
    +  }
    +
    +  pub fn get_msg(self, addr: address) -> String<100> {
    +    return self.messages[addr].to_mem()
    +  }
    +}
    +
    +

    To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545).

    +

    The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil.

    +
    cast send --rpc-url localhost:8545 --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
    +
    +

    Here's what the response was at the time of writing this tutorial.

    +
    blockHash               0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702
    +blockNumber             1
    +contractAddress         0x5FbDB2315678afecb367f032d93F642f64180aa3
    +cumulativeGasUsed       196992
    +effectiveGasPrice       4000000000
    +gasUsed                 196992
    +logs                    []
    +logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    +root                    
    +status                  1
    +transactionHash         0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622
    +transactionIndex        0
    +type                    2
    +
    +

    This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract.

    +
    +

    Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.

    +
    +

    Signing the guest book

    +

    Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example).

    +

    The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message "We <3 Fe".

    +
    cast send --rpc-url http://localhost:8545 --private-key <your-private-key> <contract-address> "sign(string)" '"We <3 Fe"'
    +
    +

    The response will look approximately as follows:

    +
    blockHash               0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7
    +blockNumber             2
    +contractAddress         
    +cumulativeGasUsed       36278
    +effectiveGasPrice       3767596722
    +gasUsed                 36278
    +logs                    []
    +logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    +root                    
    +status                  1
    +transactionHash         0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c
    +transactionIndex        0
    +type                    2
    +
    +

    Reading the signatures

    +

    The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook.

    +

    Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying.

    +

    To do that run:

    +
    $ cast call --rpc-url http://localhost:8545 <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook>
    +
    +

    Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction.

    +

    The response arrives in the form of hex-encoded bytes padded with zeroes:

    +
    0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000
    +
    +

    Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows:

    +
    cast to_ascii "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000"
    +
    +

    or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command:

    +
    cast call --rpc-url https://rpc.sepolia.org <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook> | cast --to-ascii
    +
    +

    Either way, the response will be the message you passed to the sign(string) function.

    +
    "We <3 Fe"
    +
    +

    Congratulations! You've deployed real Fe code to a local blockchain! 🤖

    +

    Deploying to a public test network

    +

    Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token.

    +

    In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website.

    +
    +

    IMPORTANT: It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet.

    +
    +

    Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this:

    +
      +
    • If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport.
    • +
    • You can use an RPC provider such as Alchemy or Infura
    • +
    • You can use an open public node such as https://rpc.sepolia.org.
    • +
    +

    Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint:

    +
    cast send --rpc-url https://rpc.sepolia.org --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
    +
    +

    Now you have deployed the contract to a public network and anyone can interact with it.

    +

    To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past:

    +
    + + +
    addresslink
    deploy tx hash0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76etherscan
    contract address0x810cbd4365396165874C054d01B1Ede4cc249265etherscan
    +
    +

    Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database.

    +

    Congratulations! You've deployed real Fe code to a live network 🤖

    +

    Summary

    +

    Well done!

    +

    You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls.

    +

    Here's some ideas for what you could do next:

    +
      +
    • Experiment with different developer tooling
    • +
    • Get more comfortable with Foundry by exploring the documentation
    • +
    • Repeat the steps in this guide but for a more complex contract - be creative!
    • +
    • Continue to the Using Fe pages to explore Fe more deeply.
    • +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/quickstart/first_contract.html b/docs/quickstart/first_contract.html new file mode 100644 index 0000000000..905cc85c6a --- /dev/null +++ b/docs/quickstart/first_contract.html @@ -0,0 +1,338 @@ + + + + + + Write your first contract - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Write your first Fe contract

    +

    Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address.

    +

    The code of the contract dictates how:

    +
      +
    • it manipulates its own state
    • +
    • interacts with other contracts
    • +
    • exposes external APIs to be called from other contracts or users
    • +
    +

    To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address.

    +
    +

    Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.

    +
    +

    Create a guest_book.fe file

    +

    Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +}
    +
    +

    Here we're using a map to associate messages with Ethereum addresses. +The messages will simply be a string of a maximum length of 100 written as String<100>. +The addresses are represented by the builtin address type.

    +

    Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output.

    +
    Compiled guest_book.fe. Outputs in `output`
    +
    +

    If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file.

    +
    ├── fe
    +├── guest_book.fe
    +└── output
    +    └── GuestBook
    +        ├── GuestBook_abi.json
    +        └── GuestBook.bin
    +
    +

    The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array.

    +

    The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters.

    +

    We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.

    +

    Add a method to sign the guest book

    +

    Let's focus on the functionality of our world changing application and add a method to sign the guestbook.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +}
    +
    +

    In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub.

    +

    Let's recompile the contract again and see what happens.

    +
    Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite.
    +
    +

    Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory.

    +

    Let's try it again with ./fe build guest_book.fe --overwrite.

    +

    This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting.

    +
    [
    +  {
    +    "name": "sign",
    +    "type": "function",
    +    "inputs": [
    +      {
    +        "name": "book_msg",
    +        "type": "bytes100"
    +      }
    +    ],
    +    "outputs": []
    +  }
    +]
    +
    +

    Since our contract now has a public sign method the corresponding ABI has changed accordingly.

    +

    Add a method to read a message

    +

    To make the guest book more useful we will also add a method get_msg to read entries from a given address.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +
    +  pub fn get_msg(self, addr: address) -> String<100> {
    +      return self.messages[addr]
    +  }
    +}
    +
    +

    However, we will hit another error as we try to recompile the current code.

    +
    Unable to compile guest_book.fe.
    +error: value must be copied to memory
    +  ┌─ guest_book.fe:10:14
    +  │
    +8 │       return self.messages[addr]
    +  │              ^^^^^^^^^^^^^^^^^^^ this value is in storage
    +  │
    +  = Hint: values located in storage can be copied to memory using the `to_mem` function.
    +  = Example: `self.my_array.to_mem()`
    +
    +

    When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function.

    +
    +

    Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics.

    +
    +

    The code should compile fine when we change it accordingly.

    +
    contract GuestBook {
    +  messages: Map<address, String<100>>
    +
    +  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
    +      self.messages[ctx.msg_sender()] = book_msg
    +  }
    +
    +  pub fn get_msg(self, addr: address) -> String<100> {
    +      return self.messages[addr].to_mem()
    +  }
    +}
    +
    +

    Congratulations! You finished your first little Fe project. 👏 +In the next chapter we will learn how to deploy our code and tweak it a bit further.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html new file mode 100644 index 0000000000..f3df80ed42 --- /dev/null +++ b/docs/quickstart/index.html @@ -0,0 +1,243 @@ + + + + + + Quickstart - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Quickstart

    +

    Let's get started with Fe!

    +

    In this section you will learn how to write and deploy your first contract.

    + +

    Download and install Fe

    +

    Before you dive in, you need to download and install Fe. +For this quickstart you should simply download the binary from fe-lang.org.

    +

    Then change the name and file permissions:

    +
    mv fe_amd64 fe
    +chmod +x fe
    +
    +

    Now you are ready to do the quickstart tutorial!

    +

    For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/release_notes.html b/docs/release_notes.html new file mode 100644 index 0000000000..3d726842f0 --- /dev/null +++ b/docs/release_notes.html @@ -0,0 +1,2870 @@ + + + + + + Release Notes - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Release Notes

    +

    🖥️ Download Binaries +📄 Draft Spec +ℹ️ Getting Started

    +

    Fe is moving fast. Read up on all the latest improvements.

    +

    0.26.0 "Zircon" (2023-11-03)

    +

    Features

    +
      +
    • +

      Give option to produce runtime bytecode as compilation artifact

      +

      Previously, the compiler could only produce the bytecode that is used +for the deployment of the contract. Now it can also produce the runtime +bytecode which is the bytecode that is saved to storage.

      +

      Being able to obtain the runtime bytecode is useful for contract +verification.

      +

      To obtain the runtime bytecode use the runtime-bytecode option +of the --emit flag (multiple options allowed).

      +

      Example Output:

      +
        +
      • mycontract.bin (bytecode for deployment)
      • +
      • mycontract.runtime.bin (runtime bytecode) (#947)
      • +
      +
    • +
    • +

      New verify command to verify onchain contracts against local source code.

      +

      People need to be able to verify that a deployed contract matches the source code +that the author claims was used to deploy it. Previously, there was no simple +way to achieve this.

      +

      These are the steps to verify a contract with the verify command:

      +
        +
      1. Obtain the project's source code locally.
      2. +
      3. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag)
      4. +
      5. From the project directory run fe verify <contract-address> <json-rpc-url>
      6. +
      +

      Example:

      +
      $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com
      +It's a match!✨
      +
      +Onchain contract:
      +Address: 0xf0adbb9ed4135d1509ad039505bada942d18755f
      +Bytecode: 0x60008..76b90
      +
      +Local contract:
      +Contract name: SimpleDAO
      +Source file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe
      +Bytecode: 0x60008..76b90
      +
      +Hint: Run with --verbose to see the contract's source code.
      +
      +

      (#948)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Added a new page on EVM precompiles (#944)
    • +
    +

    0.25.0 "Yoshiokaite" (2023-10-26)

    +

    Features

    +
      +
    • +

      Use the project root as default path for fe test

      +

      Just run fe test from any directory of the project. (#913)

      +
    • +
    • +

      Completed std::buf::MemoryBuffer refactor. (#917)

      +
    • +
    • +

      Allow filtering tests to run via fe test --filter <some-filter

      +

      E.g. Running fe test --filter foo will run all tests that contain foo in their name. (#919)

      +
    • +
    • +

      Logs for successfully ran tests can be printed with the --logs parameter.

      +

      example:

      +
      // test_log.fe
      +
      +use std::evm::log0
      +use std::buf::MemoryBuffer
      +
      +struct MyEvent {
      +  pub foo: u256
      +  pub baz: bool
      +  pub bar: u256
      +}
      +
      +#test
      +fn test_log(mut ctx: Context) {
      +  ctx.emit(MyEvent(foo: 42, baz: false, bar: 26))
      +  unsafe { log0(buf: MemoryBuffer::new(len: 42)) }
      +}
      +
      +
      +
      $ fe test --logs test_log.fe
      +executing 1 test in test_log:
      +  test_log ... passed
      +
      +test_log produced the following logs:
      +  MyEvent emitted by 0x0000…002a with the following parameters [foo: 2a, baz: false, bar: 1a]
      +  Log { address: 0x000000000000000000000000000000000000002a, topics: [], data: b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\0\0\0" }
      +
      +
      +1 test passed; 0 tests failed; 1 test executed
      +
      +

      Note: Logs are not collected for failing tests. (#933)

      +
    • +
    • +

      Adds 'functions' section to docs with information on self and Context. (#937)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Yul codegen was failing to include string literals used in test assertions. This resulted in a compiler error.

      +

      Example:

      +
      #test
      +fn foo() {
      +    assert false, "oops"
      +}
      +
      +

      The example code above was failing to compile, but now it compiles and executes as expected. (#926)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Added a new tutorial: Open Auction (#930)
    • +
    +

    0.24.0 "Xenotime" (2023-08-10)

    +

    Features

    +
      +
    • +

      Added support for project manifests and project dependencies.

      +

      Example:

      +
      my_project
      +├── fe.toml
      +└── src
      +    └── main.fe
      +
      +
      # fe.toml
      +name = "my_project"
      +version = "1.0"
      +
      +[dependencies]
      +my_lib = { path = "../path/to/my_lib", version = "1.0" }
      +my_other_lib = "../path/to/my_other_lib"
      +
      +

      Note: The current implementation supports circular dependencies. (#908)

      +
    • +
    +

    Performance improvements

    +
      +
    • MemoryBuffer now allocates an extra 31 bytes. This removes the need for runtime checks and bitshifting needed to ensure safe writing to a MemoryBuffer's region. (#898)
    • +
    +

    Improved Documentation

    +
      +
    • Link to vs-code extension in Quickstart Guide (#910)
    • +
    +

    0.23.0 "Wiluite" (2023-06-01)

    +

    Features

    +
      +
    • +

      Fixed an issue where generic parameters that were mut could not be satisfied at callsite.

      +

      For instance, the following code would previously cause a compile error but now works as expected:

      +
      #![allow(unused)]
      +fn main() {
      +struct Runner {
      +  pub fn run<T: Computable>(self, mut _ val: T) -> u256 {
      +    return val.compute(val: 1000)
      +  }
      +}
      +
      +contract Example {
      +  pub fn run_test(self) {
      +    let runner: Runner = Runner();
      +    let mut mac: Mac = Mac();
      +
      +    assert runner.run(mac) == 1001
      +  }
      +}
      +}
      +

      (#865)

      +
    • +
    • +

      The ctx parameter can now be passed into test functions.

      +

      example:

      +
      #test
      +fn my_test(ctx: Context) {
      +    assert ctx.block_number() == 0
      +}
      +
      +

      (#880)

      +
    • +
    • +

      The following has been added to the standard library:

      +

      Memory buffer abstraction

      +

      example:

      +
      use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
      +use std::traits::Max
      +
      +#test
      +fn test_buf_rw() {
      +    let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) 
      +    let mut writer: MemoryBufferWriter = buf.writer()
      +    let mut reader: MemoryBufferReader = buf.reader()
      +
      +    writer.write(value: 42)
      +    writer.write(value: 42)
      +    writer.write(value: 26)
      +    writer.write(value: u8(26))
      +    writer.write(value: u256::max())
      +    writer.write(value: u128::max())
      +    writer.write(value: u64::max())
      +    writer.write(value: u32::max())
      +    writer.write(value: u16::max())
      +    writer.write(value: u8::max())
      +    writer.write(value: u8(0))
      +
      +    assert reader.read_u256() == 42
      +    assert reader.read_u256() == 42
      +    assert reader.read_u256() == 26
      +    assert reader.read_u8() == 26
      +    assert reader.read_u256() == u256::max()
      +    assert reader.read_u128() == u128::max()
      +    assert reader.read_u64() == u64::max()
      +    assert reader.read_u32() == u32::max()
      +    assert reader.read_u16() == u16::max()
      +    assert reader.read_u8() == u8::max()
      +    assert reader.read_u8() == 0
      +}
      +
      +

      Precompiles

      +

      example:

      +
      use std::precompiles
      +use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
      +
      +#test
      +fn test_ec_recover() {
      +    let result: address = precompiles::ec_recover(
      +        hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
      +        v: 28,
      +        r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
      +        s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
      +    )
      +
      +    assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)
      +}
      +
      +

      ctx.raw_call()

      +

      example:

      +
      use std::buf::{
      +    RawCallBuffer,
      +    MemoryBufferReader, 
      +    MemoryBufferWriter
      +}
      +use std::evm
      +
      +contract Foo {
      +    pub unsafe fn __call__() {
      +        if evm::call_data_load(offset: 0) == 42 {
      +            evm::mstore(offset: 0, value: 26)
      +            evm::return_mem(offset: 0, len: 32)
      +        } else if evm::call_data_load(offset: 0) == 26 {
      +            revert
      +        }
      +    }
      +}
      +
      +#test
      +fn test_raw_call(mut ctx: Context) {
      +    let foo: Foo = Foo.create(ctx, 0)
      +
      +    let mut buf: RawCallBuffer = RawCallBuffer::new(
      +        input_len: 32, 
      +        output_len: 32
      +    )
      +    let mut writer: MemoryBufferWriter = buf.writer()
      +
      +    writer.write(value: 42)
      +    assert ctx.raw_call(addr: address(foo), value: 0, buf)
      +  
      +    let mut reader: MemoryBufferReader = buf.reader()
      +    assert reader.read_u256() == 26
      +
      +    assert not ctx.raw_call(addr: address(foo), value: 0, buf)
      +}
      +
      +

      (#885)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed an ICE when using aggregate types with aggregate type fields in public functions

      +

      This code would previously cause an ICE:

      +
      struct Tx {
      +  pub data: Array<u8, 320>
      +}
      +
      +contract Foo {
      +  pub fn bar(mut tx: Tx) {}
      +}
      +
      +

      (#867)

      +
    • +
    • +

      Fixed a regression where the compiler would not reject a method call on a struct in storage.

      +

      E.g. the follwing code should be rejected as it is missing a to_mem() call:

      +
      struct Bar {
      +    pub x: u256
      +
      +    pub fn get_x(self) -> u256{
      +        return self.x
      +    }
      +}
      +
      +contract Foo {
      +    bar: Bar
      +
      +    pub fn __init__(mut self) {
      +        self.bar = Bar( x: 2 )
      +    }
      +    fn yay(self) {
      +        self.bar.get_x()
      +    }
      +}
      +
      +

      The compiler will now reject the code and suggest a to_mem() before callingget_x(). (#881)

      +
    • +
    +

    0.22.0 "Vulcanite" (2023-04-05)

    +

    This is the first non-alpha release of Fe. Read our announcement for more details.

    +

    Features

    +
      +
    • +

      Support for tests.

      +

      example:

      +
      #test
      +fn my_test() {
      +    assert 26 + 16 == 42
      +}
      +
      +

      Tests can be executed using the test subcommand.

      +

      example:

      +

      $ fe test foo.fe (#807)

      +
    • +
    • +

      Fixed broken trait orphan rule

      +

      Fe has an orphan rule for Traits similar to Rust's that requires +that either the trait or the type that we are implementing the trait for +are located in the same ingot as the impl. This rule was implemented +incorrectly so that instead of requiring them to be in the same ingot, +they were required to be in the same module. This change fixes this +so that the orphan rule is enforced correctly. +(#863)

      +
    • +
    • +

      address values can now be specified with a number literal, with no explicit +cast. So instead of let t: address = address(0xfe), one can now write +let t: address = 0xfe. This also means that it's possible to define const +addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe +(#864)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed resolving of generic arguments to associated functions.

      +

      For example, this code would previously crash the compiler:

      +
      #![allow(unused)]
      +fn main() {
      +...
      +  // This function doesn't take self
      +  pub fn run_static<T: Computable>(_ val: T) -> u256 {
      +    return val.compute(val: 1000)
      +  }
      +...
      +
      +// Invoking it would previously crash the compiler
      +Runner::run_static(Mac())
      +...
      +}
      +

      (#861)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Changed the Deployment tutorial to use foundry and the Sepolia network (#853)
    • +
    +

    0.21.0-alpha (2023-02-28)

    +

    Features

    +
      +
    • +

      Support for Self type

      +

      With this change Self (with capital S) can be used to refer +to the enclosing type in contracts, structs, impls and traits.

      +

      E.g.

      +
      trait Min {
      +  fn min() -> Self;
      +}
      +
      +impl Min for u8 {
      +  fn min() -> u8 { // Both `u8` or `Self` are valid here
      +    return 0
      +  }
      +}
      +
      +

      Usage: u8::min() (#803)

      +
    • +
    • +

      Added Min and Max traits to the std library. +The std library implements the traits for all numeric types.

      +

      Example

      +
      use std::traits::{Min, Max}
      +...
      +
      +assert u8::min() < u8::max()
      +``` ([#836](https://github.com/ethereum/fe/issues/836))
      +
      +
      +
    • +
    • +

      Upgraded underlying solc compiler to version 0.8.18

      +
    • +
    +

    Bugfixes

    +
      +
    • the release contains minor bugfixes
    • +
    +

    0.20.0-alpha (2022-12-05)

    +

    Features

    +
      +
    • +

      Removed the event type as well as the emit keyword. +Instead the struct type now automatically implements +the Emittable trait and can be emitted via ctx.emit(..).

      +

      Indexed fields can be annotated via the #indexed attribute.

      +

      E.g.

      +
      struct Signed {
      +    book_msg: String<100>
      +}
      +
      +contract GuestBook {
      +    messages: Map<address, String<100>>
      +
      +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
      +        self.messages[ctx.msg_sender()] = book_msg
      +        ctx.emit(Signed(book_msg))
      +    }
      +}
      +
      +

      (#717)

      +
    • +
    • +

      Allow to call trait methods on types when trait is in scope

      +

      So far traits were only useful as bounds for generic functions. +With this change traits can also be used as illustrated with +the following example:

      +
      trait Double {
      +  fn double(self) -> u256;
      +}
      +
      +impl Double for (u256, u256) {
      +  fn double(self) -> u256 {
      +    return (self.item0 + self.item1) * 2
      +  }
      +}
      +
      +contract Example {
      +
      +  pub fn run_test(self) {
      +    assert (0, 1).double() == 2
      +  }
      +}
      +
      +

      If a call turns out to be ambigious the compiler currently asks the +user to disambiguate via renaming. In the future we will likely +introduce a syntax to allow to disambiguate at the callsite. (#757)

      +
    • +
    • +

      Allow contract associated functions to be called via ContractName::function_name() syntax. (#767)

      +
    • +
    • +

      Add enum types and match statement.

      +

      enum can now be defined, e.g.,

      +
      pub enum MyEnum {
      +    Unit
      +    Tuple(u32, u256, bool)
      +  
      +    fn unit() -> MyEnum {
      +        return MyEnum::Unit
      +    }
      +}
      +
      +

      Also, match statement is introduced, e.g.,

      +
      pub fn eval_enum()  -> u256{
      +    match MyEnum {
      +        MyEnum::Unit => { 
      +            return 0
      +        }
      +      
      +        MyEnum::Tuple(a, _, false) => {
      +            return u256(a)
      +        }
      +      
      +        MyEnum::Tuple(.., true) => {
      +            return u256(1)
      +        }
      +    }
      +}
      +
      +

      For now, available patterns are restricted to

      +
        +
      • Wildcard(_), which matches all patterns: _
      • +
      • Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c)
      • +
      • Boolean literal(true and false)
      • +
      • Enum variant. e.g., MyEnum::Tuple(a, b, c)
      • +
      • Tuple pattern. e.g., (a, b, c)
      • +
      • Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true}
      • +
      • Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true)
      • +
      • Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true)
      • +
      +

      Fe compiler performs the exhaustiveness and usefulness checks for match statement.
      +So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. (#770)

      +
    • +
    • +

      Changed comments to use // instead of # (#776)

      +
    • +
    • +

      Added the mut keyword, to mark things as mutable. Any variable or function parameter +not marked mut is now immutable.

      +
      contract Counter {
      +    count: u256
      +
      +    pub fn increment(mut self) -> u256 {
      +        // `self` is mutable, so storage can be modified
      +        self.count += 1
      +        return self.count
      +    }
      +}
      +
      +struct Point {
      +    pub x: u32
      +    pub y: u32
      +
      +    pub fn add(mut self, _ other: Point) {
      +        self.x += other.x
      +        self.y += other.y
      +
      +        // other.x = 1000 // ERROR: `other` is not mutable
      +    }
      +}
      +
      +fn pointless() {
      +    let origin: Point = Point(x: 0, y: 0)
      +    // origin.x = 10 // ERROR: origin is not mutable
      +
      +    let x: u32 = 10
      +    // x_coord = 100 // ERROR: `x_coord` is not mutable
      +    let mut y: u32 = 0
      +    y = 10 // OK
      +
      +    let mut p: Point = origin // copies `origin`
      +    p.x = 10 // OK, doesn't modify `origin`
      +
      +    let mut q: Point = p // copies `p`
      +    q.x = 100            // doesn't modify `p`
      +
      +    p.add(q)
      +    assert p.x == 110
      +}
      +
      +

      Note that, in this release, primitive type function parameters +can't be mut. This restriction might be lifted in a future release.

      +

      For example:

      +
      fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut
      +    x += 1
      +}
      +
      +

      (#777)

      +
    • +
    • +

      The contents of the std::prelude module (currently just the Context struct) +are now automatically used by every module, so use std::context::Context is +no longer required. (#779)

      +
    • +
    • +

      When the Fe compiler generates a JSON ABI file for a contract, the +"stateMutability" field for each function now reflects whether the function can +read or modify chain or contract state, based on the presence or absence of the +self and ctx parameters, and whether those parameters are mutable.

      +

      If a function doesn't take self or ctx, it's "pure". +If a function takes self or ctx immutably, it can read state but not mutate +state, so it's a "view" +If a function takes mut self or mut ctx, it can mutate state, and is thus +marked "payable".

      +

      Note that we're following the convention set by Solidity for this field, which +isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently +distinguish between "payable" and "nonpayable" functions; if you want a function +to revert when Eth is sent, you need to do it manually +(eg assert ctx.msg_value() == 0). (#783)

      +
    • +
    • +

      Trait associated functions

      +

      This change allows trait functions that do not take a self parameter. +The following demonstrates a possible trait associated function and its usage:

      +
      trait Max {
      +  fn max(self) -> u8;
      +}
      +
      +impl Max for u8 {
      +  fn max() -> u8 {
      +    return u8(255)
      +  }
      +}
      +
      +contract Example {
      +
      +  pub fn run_test(self) {
      +    assert u8::max() == 255
      +  }
      +}
      +
      +

      (#805)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fix issue where calls to assiciated functions did not enforce visibility rules.

      +

      E.g the following code should be rejected but previously wasn't:

      +
      struct Foo {
      +    fn do_private_things() {
      +    }
      +}
      +
      +contract Bar {
      +    fn test() {
      +        Foo::do_private_things()
      +    }
      +}
      +
      +

      With this change, the above code is now rejected because do_private_things is not pub. (#767)

      +
    • +
    • +

      Padding on bytes and string ABI types is zeroed out. (#769)

      +
    • +
    • +

      Ensure traits from other modules or even ingots can be implemented (#773)

      +
    • +
    • +

      Certain cases where the compiler would not reject pure functions +being called on instances are now properly rejected. (#775)

      +
    • +
    • +

      Reject calling to_mem() on primitive types in storage (#801)

      +
    • +
    • +

      Disallow importing private type via use

      +

      The following was previously allowed but will now error:

      +

      use foo::PrivateStruct (#815)

      +
    • +
    +

    0.19.1-alpha "Sunstone" (2022-07-06)

    +

    Features

    +
      +
    • +

      Support returning nested struct.

      +

      Example:

      +
      pub struct InnerStruct {
      +    pub inner_s: String<10>
      +    pub inner_x: i256
      +}
      +
      +pub struct NestedStruct {
      +    pub inner: InnerStruct
      +    pub outer_x: i256
      +}
      +
      +contract Foo {
      +    pub fn return_nested_struct() -> NestedStruct {
      +        ...
      +    }
      +}
      +
      +

      (#635)

      +
    • +
    • +

      Made some small changes to how the Context object is used.

      +
        +
      • ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0))
      • +
      • ctx is required when calling an external contract function that requires ctx
      • +
      +

      Example:

      +
      use std::context::Context // see issue #679
      +
      +contract Foo {
      +  pub fn emit_stuff(ctx: Context) {
      +    emit Stuff(ctx)  # will be `ctx.emit(Stuff{})` someday
      +  }
      +}
      +contract Bar {
      +  pub fn call_foo_emit_stuff(ctx: Context) {
      +    Foo(address(0)).emit_stuff(ctx)
      +  }
      +}
      +event Stuff {}
      +
      +

      (#703)

      +
    • +
    • +

      Braces! Fe has abandoned python-style significant whitespace in favor of the +trusty curly brace.

      +

      In addition, elif is now spelled else if, and the pass +statement no longer exists.

      +

      Example:

      +
      pub struct SomeError {}
      +
      +contract Foo {
      +  x: u8
      +  y: u16
      +
      +  pub fn f(a: u8) -> u8 {
      +    if a > 10 {
      +      let x: u8 = 5
      +      return a + x
      +    } else if a == 0 {
      +      revert SomeError()
      +    } else {
      +      return a * 10
      +    }
      +  }
      +
      +  pub fn noop() {}
      +}
      +
      +

      (#707)

      +
    • +
    • +

      traits and generic function parameter

      +

      Traits can now be defined, e.g:

      +
      trait Computable {
      +  fn compute(self, val: u256) -> u256;
      +}
      +
      +

      The mechanism to implement a trait is via an impl block e.g:

      +
      struct Linux {
      +  pub counter: u256
      +  pub fn get_counter(self) -> u256 {
      +    return self.counter
      +  }
      +  pub fn something_static() -> u256 {
      +    return 5
      +  }
      +}
      +
      +impl Computable for Linux {
      +  fn compute(self, val: u256) -> u256 {
      +    return val + Linux::something_static() + self.get_counter()
      +  }
      +}
      +
      +

      Traits can only appear as bounds for generic functions e.g.:

      +
      struct Runner {
      +
      +  pub fn run<T: Computable>(self, _ val: T) -> u256 {
      +    return val.compute(val: 1000)
      +  }
      +}
      +
      +

      Only struct functions (not contract functions) can have generic parameters. +The run method of Runner can be called with any type that implements Computable e.g.

      +
      contract Example {
      +
      +  pub fn generic_compute(self) {
      +    let runner: Runner = Runner();
      +    assert runner.run(Mac()) == 1001
      +    assert runner.run(Linux(counter: 10)) == 1015
      +  }
      +}
      +
      +

      (#710)

      +
    • +
    • +

      Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe (#726)

      +
    • +
    • +

      Allow using complex type as array element type.

      +

      Example:

      +
      contract Foo {
      +    pub fn bar() -> i256 {
      +        let my_array: Array<Pair, 3> = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)]
      +
      +        let sum: i256 = 0
      +        for pair in my_array {
      +            sum += pair.x
      +        }
      +
      +        return sum
      +    }
      +}
      +
      +struct Pair {
      +    pub x: i256
      +    pub y: i256
      +
      +    pub fn new(_ x: i256, _ y: i256) -> Pair {
      +        return Pair(x, y)
      +    }
      +}
      +
      +

      (#730)

      +
    • +
    • +

      The fe CLI now has subcommands:

      +

      fe new myproject - creates a new project structure +fe check . - analyzes fe source code and prints errors +fe build . - builds a fe project (#732)

      +
    • +
    • +

      Support passing nested struct types to public functions.

      +

      Example:

      +
      pub struct InnerStruct {
      +    pub inner_s: String<10>
      +    pub inner_x: i256
      +}
      +
      +pub struct NestedStruct {
      +    pub inner: InnerStruct
      +    pub outer_x: i256
      +}
      +
      +contract Foo {
      +    pub fn f(arg: NestedStruct) {
      +        ...
      +    }
      +}
      +
      +

      (#733)

      +
    • +
    • +

      Added support for repeat expressions ([VALUE; LENGTH]).

      +

      e.g.

      +
      let my_array: Array<bool, 42> = [bool; 42]
      +
      +

      Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. (#747)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. (#734)

      +
    • +
    • +

      Fix issue where a negative constant leads to an ICE

      +

      E.g. the following code would previously crash the compiler but shouldn't:

      +
      const INIT_VAL: i8 = -1
      +contract Foo {
      +  pub fn init_bar() {
      +    let x: i8 = INIT_VAL
      +  }
      +}
      +
      +

      (#745)

      +
    • +
    • +

      Fix a bug that causes ICE when nested if-statement has multiple exit point.

      +

      E.g. the following code would previously crash the compiler but shouldn't:

      +
       pub fn foo(self) {
      +    if true {
      +        if self.something {
      +            return
      +        }
      +    }
      +    if true {
      +        if self.something {
      +            return
      +        }
      +    }
      +}
      +
      +

      (#749)

      +
    • +
    +

    0.18.0-alpha "Ruby" (2022-05-27)

    +

    Features

    +
      +
    • Added support for parsing of attribute calls with generic arguments (e.g. foo.bar<Baz>()). (#719)
    • +
    +

    Bugfixes

    +
      +
    • Fix a regression where the stateMutability field would not be included in the generated ABI (#722)
    • +
    • Fix two regressions introduced in 0.17.0 +
        +
      • Properly lower right shift operation to yul's sar if operand is signed type
      • +
      • Properly lower negate operation to call safe_sub (#723)
      • +
      +
    • +
    +

    0.17.0-alpha "Quartz" (2022-05-26)

    +

    Features

    +
      +
    • +

      Support for underscores in numbers to improve readability e.g. 100_000.

      +

      Example

      +
          let num: u256 = 1000_000_000_000
      +
      +

      (#149)

      +
    • +
    • +

      Optimized access of struct fields in storage (#249)

      +
    • +
    • +

      Unit type () is now ABI encodable (#442)

      +
    • +
    • +

      Temporary default stateMutability to payable in ABI

      +

      The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction.

      +

      As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. (#705)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a crash caused by certain memory to memory assignments.

      +

      E.g. the following code would previously lead to a compiler crash:

      +
      my_struct.x = my_struct.y
      +
      +

      (#590)

      +
    • +
    • +

      Reject unary minus operation if the target type is an unsigned integer number.

      +

      Code below should be reject by fe compiler:

      +
      contract Foo:
      +    pub fn bar(self) -> u32:
      +        let unsigned: u32 = 1
      +        return -unsigned
      +
      +    pub fn foo():
      +        let a: i32 = 1
      +        let b: u32 = -a
      +
      +

      (#651)

      +
    • +
    • +

      Fixed crash when passing a struct that contains an array

      +

      E.g. the following would previously result in a compiler crash:

      +
      struct MyArray:
      +    pub x: Array<i32, 2>
      +
      +
      +contract Foo:
      +    pub fn bar(my_arr: MyArray):
      +        pass
      +
      +

      (#681)

      +
    • +
    • +

      reject infinite size struct definitions.

      +

      Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. (#682)

      +
    • +
    • +

      Return instead of revert when contract is called without data.

      +

      If a contract is called without data so that no function is invoked, +we would previously revert but that would leave us without a +way to send ETH to a contract so instead it will cause a return now. (#694)

      +
    • +
    • +

      Resolve compiler crash when using certain reserved YUL words as struct field names.

      +

      E.g. the following would previously lead to a compiler crash because numer is +a reserved keyword in YUL.

      +
      struct Foo:
      +  pub number: u256
      +
      +contract Meh:
      +
      +  pub fn yay() -> Foo:
      +    return Foo(number:2)
      +
      +

      (#709)

      +
    • +
    +

    0.16.0-alpha (2022-05-05)

    +

    Features

    +
      +
    • Change static function call syntax from Bar.foo() to Bar::foo() (#241)
    • +
    • Added support for retrieving the base fee via ctx.base_fee() (#503)
    • +
    +

    Bugfixes

    +
      +
    • Resolve functions on structs via path (e.g. bi::ba::bums()) (#241)
    • +
    +

    0.15.0-alpha (2022-04-04)

    +

    Features

    +
      +
    • +

      Labels are now required on function arguments. Labels can be omitted if the +argument is a variable with a name that matches the label, or if the function +definition specifies that an argument should have no label. Functions often take +several arguments of the same type; compiler-checked labels can help prevent +accidentally providing arguments in the wrong order.

      +

      Example:

      +
      contract CoolCoin:
      +  balance: Map<address, i256>
      +  loans: Map<(address, address), i256>
      +
      +  pub fn demo(self, ann: address, bob: address):
      +    let is_loan: bool = false
      +    self.give(from: ann, to: bob, 100, is_loan)
      +
      +  fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool):
      +    self.cred[sender] -= val
      +    self.cred[recipient] += val
      +    if is_loan:
      +      self.loans[(sender, recipient)] += val
      +
      +

      Note that arguments must be provided in the order specified in the function +definition.

      +

      A parameter's label defaults to the parameter name, but can be changed by +specifying a different label to the left of the parameter name. Labels should be +clear and convenient for the caller, while parameter names are only used in the +function body, and can thus be longer and more descriptive. +In the example above, we choose to use sender and recipient as identifiers +in the body of fn transfer, but use labels from: and to:.

      +

      In cases where it's ideal to not have labels, e.g. if a function takes a single +argument, or if types are sufficient to differentiate between arguments, use _ +to specify that a given parameter has no label. It's also fine to require labels +for some arguments, but not others.

      +

      Example:

      +
      fn add(_ x: u256, _ y: u256) -> u256:
      +  return x + y
      +
      +contract Foo:
      +  fn transfer(self, _ to: address, wei: u256):
      +    pass
      +
      +  pub fn demo(self):
      +    transfer(address(0), wei: add(1000, 42))
      +
      +

      (#397)

      +
    • +
    +

    Bugfixes

    +
      +
    • The region of memory used to compute the slot of a storage map value was not being allocated. (#684)
    • +
    +

    0.14.0-alpha (2022-03-02)

    +

    Features

    +
      +
    • +

      Events can now be defined outside of contracts.

      +

      Example:

      +
      event Transfer:
      +    idx sender: address
      +    idx receiver: address
      +    value: u256
      +
      +contract Foo:
      +    fn transferFoo(to: address, value: u256):
      +        emit Transfer(sender: msg.sender, receiver: to, value)
      +
      +contract Bar:
      +    fn transferBar(to: address, value: u256):
      +        emit Transfer(sender: msg.sender, receiver: to, value)
      +
      +

      (#80)

      +
    • +
    • +

      The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. +Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block.

      +

      Example:

      +
      use std::evm::{mstore, mload}
      +
      +fn memory_shenanigans():
      +  unsafe:
      +    mstore(0x20, 42)
      +    let x: u256 = mload(0x20)
      +    assert x == 42
      +
      +

      The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. +The global function send_value has been ported to Fe, and is now available +as std::send_value. +(#629)

      +
    • +
    • +

      Support structs that have non-base type fields in storage.

      +

      Example:

      +
      struct Point:
      +    pub x: u256
      +    pub y: u256
      +
      +struct Bar:
      +    pub name: String<3>
      +    pub numbers: Array<u256, 2>
      +    pub point: Point
      +    pub something: (u256, bool)
      +
      +
      +contract Foo:
      +    my_bar: Bar
      +
      +    pub fn complex_struct_in_storage(self) -> String<3>:
      +        self.my_bar = Bar(
      +            name: "foo",
      +            numbers: [1, 2],
      +            point: Point(x: 100, y: 200),
      +            something: (1, true),
      +        )
      +
      +        # Asserting the values as they were set initially
      +        assert self.my_bar.numbers[0] == 1
      +        assert self.my_bar.numbers[1] == 2
      +        assert self.my_bar.point.x == 100
      +        assert self.my_bar.point.y == 200
      +        assert self.my_bar.something.item0 == 1
      +        assert self.my_bar.something.item1
      +
      +        # We can change the values of the array
      +        self.my_bar.numbers[0] = 10
      +        self.my_bar.numbers[1] = 20
      +        assert self.my_bar.numbers[0] == 10
      +        assert self.my_bar.numbers[1] == 20
      +        # We can set the array itself
      +        self.my_bar.numbers = [1, 2]
      +        assert self.my_bar.numbers[0] == 1
      +        assert self.my_bar.numbers[1] == 2
      +
      +        # We can change the values of the Point
      +        self.my_bar.point.x = 1000
      +        self.my_bar.point.y = 2000
      +        assert self.my_bar.point.x == 1000
      +        assert self.my_bar.point.y == 2000
      +        # We can set the point itself
      +        self.my_bar.point = Point(x=100, y=200)
      +        assert self.my_bar.point.x == 100
      +        assert self.my_bar.point.y == 200
      +
      +        # We can change the value of the tuple
      +        self.my_bar.something.item0 = 10
      +        self.my_bar.something.item1 = false
      +        assert self.my_bar.something.item0 == 10
      +        assert not self.my_bar.something.item1
      +        # We can set the tuple itself
      +        self.my_bar.something = (1, true)
      +        assert self.my_bar.something.item0 == 1
      +        assert self.my_bar.something.item1
      +
      +        return self.my_bar.name.to_mem()
      +
      +

      (#636)

      +
    • +
    • +

      Features that read and modify state outside of contracts are now implemented on a struct +named "Context". Context is included in the standard library and can be imported with +use std::context::Context. Instances of Context are created by calls to public functions +that declare it in the signature or by unsafe code.

      +

      Basic example:

      +
      use std::context::Context
      +
      +contract Foo:
      +    my_num: u256
      +
      +    pub fn baz(ctx: Context) -> u256:
      +        return ctx.block_number()
      +
      +    pub fn bing(self, new_num: u256) -> u256:
      +        self.my_num = new_num
      +        return self.my_num
      +
      +
      +contract Bar:
      +
      +    pub fn call_baz(ctx: Context, foo_addr: address) -> u256:
      +        # future syntax: `let foo = ctx.load<Foo>(foo_addr)`
      +        let foo: Foo = Foo(ctx, foo_addr)
      +        return foo.baz()
      +
      +    pub fn call_bing(ctx: Context) -> u256:
      +        # future syntax: `let foo = ctx.create<Foo>(0)`
      +        let foo: Foo = Foo.create(ctx, 0)
      +        return foo.bing(42)
      +
      +

      Example with __call__ and unsafe block:

      +
      use std::context::Context
      +use std::evm
      +
      +contract Foo:
      +
      +    pub fn __call__():
      +        unsafe:
      +            # creating an instance of `Context` is unsafe
      +            let ctx: Context = Context()
      +            let value: u256 = u256(bar(ctx))
      +
      +            # return `value`
      +            evm::mstore(0, value)
      +            evm::return_mem(0, 32)
      +
      +    fn bar(ctx: Context) -> address:
      +        return ctx.self_address()
      +
      +

      (#638)

      +
    • +
    • +

      Features

      +

      Support local constant

      +

      Example:

      +
      contract Foo:
      +    pub fn bar():
      +        const LOCAL_CONST: i32 = 1
      +
      +

      Support constant expression

      +

      Example:

      +
      const GLOBAL: i32 = 8
      +
      +contract Foo:
      +    pub fn bar():
      +        const LOCAL: i32 = GLOBAL * 8
      +
      +

      Support constant generics expression

      +

      Example:

      +
      const GLOBAL: u256= 8
      +const USE_GLOBAL: bool = false
      +type MY_ARRAY = Array<i32, { GLOBAL / 4 }>
      +
      +contract Foo:
      +    pub fn bar():
      +        let my_array: Array<i32, { GLOBAL if USE_GLOBAL else 4 }>
      +
      +

      Bug fixes

      +

      Fix ICE when constant type is mismatch

      +

      Example:

      +
      const GLOBAL: i32 = "FOO"
      +
      +contract Foo:
      +    pub fn bar():
      +        let FOO: i32 = GLOBAL
      +
      +

      Fix ICE when assigning value to constant twice

      +

      Example:

      +
      const BAR: i32 = 1
      +
      +contract FOO:
      +    pub fn bar():
      +        BAR = 10
      +
      +

      (#649)

      +
    • +
    • +

      Argument label syntax now uses : instead of =. Example:

      +
      struct Foo:
      +  x: u256
      +  y: u256
      +
      +let x: MyStruct = MyStruct(x: 10, y: 11)
      +# previously:     MyStruct(x = 10, y = 11)
      +
      +

      (#665)

      +
    • +
    • +

      Support module-level pub modifier, now default visibility of items in a module is private.

      +

      Example:

      +
      # This constant can be used outside of the module.
      +pub const PUBLIC:i32 = 1
      +
      +# This constant can NOT be used outside of the module.
      +const PRIVATE: i32 = 1
      +
      +

      (#677)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +
        +
      • Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed.
      • +
      • An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun.
      • +
      • Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file.
      • +
      • parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax.
      • +
      • ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. (#628)
      • +
      +
    • +
    +

    0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)

    +

    Features

    +
      +
    • +

      Support private fields on structs

      +

      Public fields now need to be declared with the pub modifier, otherwise they default to private fields. +If a struct contains private fields it can not be constructed directly except from within the +struct itself. The recommended way is to implement a method new(...) as demonstrated in the +following example.

      +
      struct House:
      +    pub price: u256
      +    pub size: u256
      +    vacant: bool
      +
      +    pub fn new(price: u256, size: u256) -> House
      +      return House(price=price, size=size, vacant=true)
      +
      +contract Manager:
      +
      +  house: House
      +
      +  pub fn create_house(price: u256, size: u256):
      +    self.house = House::new(price, size)
      +    let can_access_price: u256 = self.house.price
      +    # can not access `self.house.vacant` because the field is private
      +
      +

      (#214)

      +
    • +
    • +

      Support non-base type fields in structs

      +

      Support is currently limited in two ways:

      +
        +
      • Structs with complex fields can not be returned from public functions
      • +
      • Structs with complex fields can not be stored in storage (#343)
      • +
      +
    • +
    • +

      Addresses can now be explicitly cast to u256. For example:

      +
      fn f(addr: address) -> u256:
      +  return u256(addr)
      +
      +

      (#621)

      +
    • +
    • +

      A special function named __call__ can now be defined in contracts.

      +

      The body of this function will execute in place of the standard dispatcher when the contract is called.

      +

      example (with intrinsics):

      +
      contract Foo:
      +    pub fn __call__(self):
      +        unsafe:
      +            if __calldataload(0) == 1:
      +                __revert(0, 0)
      +            else:
      +                __return(0, 0)
      +
      +

      (#622)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a crash that happend when using a certain unprintable ASCII char (#551)

      +
    • +
    • +

      The argument to revert wasn't being lowered by the compiler, +meaning that some revert calls would cause a compiler panic +in later stages. For example:

      +
      const BAD_MOJO: u256 = 0xdeaddead
      +
      +struct Error:
      +  code: u256
      +
      +fn fail():
      +  revert Error(code = BAD_MOJO)
      +
      +

      (#619)

      +
    • +
    • +

      Fixed a regression where an empty list expression ([]) would lead to a compiler crash. (#623)

      +
    • +
    • +

      Fixed a bug where int array elements were not sign extended in their ABI encodings. (#633)

      +
    • +
    +

    0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)

    +

    Features

    +
      +
    • +

      Added unsafe low-level "intrinsic" functions, that perform raw evm operations. +For example:

      +
      fn foo():
      +  unsafe:
      +    __mtore(0, 5000)
      +    assert __mload(0) == 5000
      +
      +

      The functions available are exactly those defined in yul's "evm dialect": +https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect +but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct.

      +

      These are intended to be used for implementing basic standard library functionality, +and shouldn't typically be needed in normal contract code.

      +

      Note: some intrinsic functions don't return a value (eg __log0); using these +functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) +will currently result in a compiler panic in the yul compilation phase. (#603)

      +
    • +
    • +

      Added an out of bounds check for accessing array items. +If an array index is retrieved at an index that is not within +the bounds of the array it now reverts with Panic(0x32). (#606)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Ensure ternary expression short circuit.

      +

      Example:

      +
      contract Foo:
      +
      +    pub fn bar(input: u256) -> u256:
      +        return 1 if input > 5 else revert_me()
      +
      +    fn revert_me() -> u256:
      +        revert
      +        return 0
      +
      +

      Previous to this change, the code above would always revert no matter +which branch of the ternary expressions it would resolve to. That is because +both sides were evaluated and then one side was discarded. With this change, +only the branch that doesn't get picked won't get evaluated at all.

      +

      The same is true for the boolean operations and and or. (#488)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      Added a globally available dummy std lib.

      +

      This library contains a single get_42 function, which can be called using std::get_42(). Once +low-level intrinsics have been added to the language, we can delete get_42 and start adding +useful code. (#601)

      +
    • +
    +

    0.11.0-alpha "Karlite" (2021-12-02)

    +

    Features

    +
      +
    • +

      Added support for multi-file inputs.

      +

      Implementation details:

      +

      Mostly copied Rust's crate system, but use the term ingot instead of crate.

      +

      Below is an example of an ingot's file tree, as supported by the current implementation.

      +
      `-- basic_ingot
      +    `-- src
      +        |-- bar
      +        |   `-- baz.fe
      +        |-- bing.fe
      +        |-- ding
      +        |   |-- dang.fe
      +        |   `-- dong.fe
      +        `-- main.fe
      +
      +

      There are still a few features that will be worked on over the coming months:

      +
        +
      • source files accompanying each directory module (e.g. my_mod.fe)
      • +
      • configuration files and the ability to create library ingots
      • +
      • test directories
      • +
      • module-level pub modifier (all items in a module are public)
      • +
      • mod statements (all fe files in the input tree are public modules)
      • +
      +

      These things will be implemented in order of importance over the next few months. (#562)

      +
    • +
    • +

      The syntax for array types has changed to match other generic types. +For example, u8[4] is now written Array<u8, 4>. (#571)

      +
    • +
    • +

      Functions can now be defined on struct types. Example:

      +
      struct Point:
      +  x: u64
      +  y: u64
      +
      +  # Doesn't take `self`. Callable as `Point.origin()`.
      +  # Note that the syntax for this will soon be changed to `Point::origin()`.
      +  pub fn origin() -> Point:
      +    return Point(x=0, y=0)
      +
      +  # Takes `self`. Callable on a value of type `Point`.
      +  pub fn translate(self, x: u64, y: u64):
      +    self.x += x
      +    self.y += y
      +
      +  pub fn add(self, other: Point) -> Point:
      +    let x: u64 = self.x + other.x
      +    let y: u64 = self.y + other.y
      +    return Point(x, y)
      +
      +  pub fn hash(self) -> u256:
      +    return keccak256(self.abi_encode())
      +
      +pub fn do_pointy_things():
      +  let p1: Point = Point.origin()
      +  p1.translate(5, 10)
      +
      +  let p2: Point = Point(x=1, y=2)
      +  let p3: Point = p1.add(p2)
      +
      +  assert p3.x == 6 and p3.y == 12
      +
      +

      (#577)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a rare compiler crash.

      +

      Example:

      +
      let my_array: i256[1] = [-1 << 1]
      +
      +

      Previous to this fix, the given example would lead to an ICE. (#550)

      +
    • +
    • +

      Contracts can now create an instance of a contract defined later in a file. +This issue was caused by a weakness in the way we generated yul. (#596)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      File IDs are now attached to Spans. (#587)

      +
    • +
    • +

      The fe analyzer now builds a dependency graph of source code "items" (functions, contracts, structs, etc). +This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) +output. Note that the yul output is still cluttered with utility functions that may or may not be needed by +a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency +graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many +of these utility functions into fe; when this happens they'll become part of the dependency graph and will only +be included in the yul output when needed.

      +

      The dependency graph will also enable future analyzer warnings about unused code. (#596)

      +
    • +
    +

    0.10.0-alpha (2021-10-31)

    +

    Features

    +
      +
    • +

      Support for module level constants for base types

      +

      Example:

      +
      const TEN = 10
      +
      +contract
      +
      +  pub fn do_moon_math(self) -> u256:
      +    return 4711 * TEN
      +
      +

      The values of base type constants are always inlined. (#192)

      +
    • +
    • +

      Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) (#492)

      +
    • +
    • +

      Replaced import statements with use statements.

      +

      Example:

      +
      use foo::{bar::*, baz as baz26}
      +
      +

      Note: this only adds support for parsing use statements. (#547)

      +
    • +
    • +

      Functions can no be defined outside of contracts. Example:

      +
      fn add_bonus(x: u256) -> u256:
      +    return x + 10
      +
      +contract PointTracker:
      +    points: Map<address, u256>
      +
      +    pub fn add_points(self, user: address, val: u256):
      +        self.points[user] += add_bonus(val)
      +
      +

      (#566)

      +
    • +
    • +

      Implemented a send_value(to: address, value_in_wei: u256) function.

      +

      The function is similar to the sendValue function by OpenZeppelin with the differences being that:

      +
        +
      1. +

        It reverts with Error(0x100) instead of Error("Address: insufficient balance") to +safe more gas.

        +
      2. +
      3. +

        It uses selfbalance() instead of balance(address()) to safe more gas

        +
      4. +
      5. +

        It reverts with Error(0x101) instead of Error("Address: unable to send value, recipient may have reverted") also to safe more gas. (#567)

        +
      6. +
      +
    • +
    • +

      Added support for unsafe functions and unsafe blocks within functions. +Note that there's currently no functionality within Fe that requires the use +of unsafe, but we plan to add built-in unsafe functions that perform raw +evm operations which will only callable within an unsafe block or function. (#569)

      +
    • +
    • +

      Added balance() and balance_of(account: address) methods. (#572)

      +
    • +
    • +

      Added support for explicit casting between numeric types.

      +

      Example:

      +
      let a: i8 = i8(-1)
      +let a1: i16 = i16(a)
      +let a2: u16 = u16(a1)
      +
      +assert a2 == u16(65535)
      +
      +let b: i8 = i8(-1)
      +let b1: u8 = u8(b)
      +let b2: u16 = u16(b1)
      +
      +assert b2 == u16(255)
      +
      +

      Notice that Fe allows casting between any two numeric types but does not allow +to change both the sign and the size of the type in one step as that would leave +room for ambiguity as the example above demonstrates. (#576)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Adjust numeric values loaded from memory or storage

      +

      Previous to this fix numeric values that were loaded from either memory or storage +were not properly loaded on the stack which could result in numeric values not +treated as intended.

      +

      Example:

      +
      contract Foo:
      +
      +    pub fn bar() -> i8:
      +        let in_memory: i8[1] = [-3]
      +        return in_memory[0]
      +
      +

      In the example above bar() would not return -3 but 253 instead. (#524)

      +
    • +
    • +

      Propagate reverts from external contract calls.

      +

      Before this fix the following code to should_revert() or should_revert2() +would succeed even though it clearly should not.

      +
      contract A:
      +  contract_b: B
      +  pub fn __init__(contract_b: address):
      +    self.contract_b = B(contract_b)
      +
      +  pub fn should_revert():
      +    self.contract_b.fail()
      +
      +  pub fn should_revert2():
      +    self.contract_b.fail_with_custom_error()
      +
      +struct SomeError:
      +  pass
      +
      +contract B:
      +
      +  pub fn fail():
      +    revert
      +
      +  pub fn fail_with_custom_error():
      +    revert SomeError()
      +
      +

      With this fix the revert errors are properly passed upwards the call hierachy. (#574)

      +
    • +
    • +

      Fixed bug in left shift operation.

      +

      Example:

      +

      Let's consider the value 1 as an u8 which is represented as +the following 256 bit item on the EVM stack 00..|00000001|. +A left shift of 8 bits (val << 8) turns that into 00..01|00000000|.

      +

      Previous to this fix this resulted in the compiler taking 256 as the +value for the u8 when clearly 256 is not even in the range of u8 +anymore. With this fix the left shift operations was fixed to properly +"clean up" the result of the shift so that 00..01|00000000| turns into +00..00|00000000|. (#575)

      +
    • +
    • +

      Ensure negation is checked and reverts with over/underflow if needed.

      +

      Example:

      +

      The minimum value for an i8 is -128 but the maximum value of an i8 +is 127 which means that negating -128 should lead to an overflow since +128 does not fit into an i8. Before this fix, negation operations where +not checked for over/underflow resulting in returning the oversized value. (#578)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      In the analysis stage, all name resolution (of variable names, function names, +type names, etc used in code) now happens via a single resolve_name pathway, +so we can catch more cases of name collisions and log more helpful error messages. (#555)

      +
    • +
    • +

      Added a new category of tests: differential contract testing.

      +

      Each of these tests is pased on a pair of contracts where one implementation +is written in Fe and the other one is written in Solidity. The implementations +should have the same public APIs and are assumed to always return identical +results given equal inputs. The inputs are randomly generated using proptest +and hence are expected to discover unknown bugs. (#578)

      +
    • +
    +

    0.9.0-alpha (2021-09-29)

    +

    Features

    +
      +
    • +

      The self variable is no longer implicitly defined in code blocks. It must now be declared +as the first parameter in a function signature.

      +

      Example:

      +
      contract Foo:
      +    my_stored_num: u256
      +
      +    pub fn bar(self, my_num: u256):
      +        self.my_stored_num = my_num
      +
      +    pub fn baz(self):
      +        self.bar(my_pure_func())
      +
      +    pub fn my_pure_func() -> u256:
      +        return 42 + 26
      +
      +

      (#520)

      +
    • +
    • +

      The analyzer now disallows defining a type, variable, or function whose +name conflicts with a built-in type, function, or object.

      +

      Example:

      +
      error: type name conflicts with built-in type
      +┌─ compile_errors/shadow_builtin_type.fe:1:6
      +│
      +1 │ type u256 = u8
      +│      ^^^^ `u256` is a built-in type
      +
      +

      (#539)

      +
    • +
    +

    Bugfixes

    +
      +
    • Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. (#534)
    • +
    • Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) +are no longer ignored if the semantic analysis stage succeeds. (#535)
    • +
    • Fixed issue #531 by adding a $ to the front of lowered tuple names. (#546)
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Implemented pretty printing of Fe AST. (#540)
    • +
    +

    0.8.0-alpha "Haxonite" (2021-08-31)

    +

    Features

    +
      +
    • +

      Support quotes, tabs and carriage returns in string literals and otherwise +restrict string literals to the printable subset of the ASCII table. (#329)

      +
    • +
    • +

      The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation.

      +
        +
      • Types can now refer to other types defined later in the file. +Example:
      • +
      +
      type Posts = Map<PostId, PostBody>
      +type PostId = u256
      +type PostBody = String<140>
      +
      +
        +
      • Duplicate definition errors now show the location of the original definition.
      • +
      • The analysis of each function, type definition, etc happens independently, so an error in one +doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. (#468)
      • +
      +
    • +
    • +

      Function definitions are now denoted with the keyword fn instead of def. (#496)

      +
    • +
    • +

      Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. (#509)

      +
    • +
    • +

      Implemented support for numeric unary invert operator (~) (#526)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. (#468)

      +
    • +
    • +

      Fixed an issue where certain expressions were not being moved to the correct location. (#493)

      +
    • +
    • +

      Fixed an issue with a missing return statement not properly detected.

      +

      Previous to this fix, the following code compiles but it should not:

      +
      contract Foo:
      +    pub fn bar(val: u256) -> u256:
      +        if val > 1:
      +            return 5
      +
      +

      With this change, the compiler rightfully detects that the code is missing +a return or revert statement after the if statement since it is not +guaranteed that the path of execution always follows the arm of the if statement. (#497)

      +
    • +
    • +

      Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, +resulting in an internal compiler error in a later pass. Example: my_tuple.item001. +These are now rejected with an error message. (#510)

      +
    • +
    • +

      Check call argument labels for function calls.

      +

      Previously the compiler would not check any labels that were used +when making function calls on self or external contracts.

      +

      This can be especially problematic if gives developers the impression +that they could apply function arguments in any order as long as they +are named which is not the case.

      +
      contract Foo:
      +
      +    pub fn baz():
      +        self.bar(val2=1, doesnt_even_exist=2)
      +
      +    pub fn bar(val1: u256, val2: u256):
      +        pass
      +
      +

      Code as the one above is now rightfully rejected by the compiler. (#517)

      +
    • +
    +

    Improved Documentation

    +
      +
    • +

      Various improvements and bug fixes to both the content and layout of the specification. (#489)

      +
    • +
    • +

      Document all remaining statements and expressions in the spec.

      +

      Also added a CI check to ensure code examples in the documentation +are validated against the latest compiler. (#514)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Separated Fe type traits between crates. (#485)
    • +
    +

    0.7.0-alpha "Galaxite" (2021-07-27)

    +

    Features

    +
      +
    • +

      Enable the optimizer by default. The optimizer can still be disabled +by supplying --optimize=false as an argument. (#439)

      +
    • +
    • +

      The following checks are now performed while decoding data:

      +
        +
      • The size of the encoded data fits within the size range known at compile-time.
      • +
      • Values are correctly padded. +
          +
        • unsigned integers, addresses, and bools are checked to have correct left zero padding
        • +
        • the size of signed integers are checked
        • +
        • bytes and strings are checked to have correct right padding
        • +
        +
      • +
      • Data section offsets are consistent with the size of preceding values in the data section.
      • +
      • The dynamic size of strings does not exceed their maximum size.
      • +
      • The dynamic size of byte arrays (u8[n]) is equal to the size of the array. (#440)
      • +
      +
    • +
    • +

      Type aliases can now include tuples. Example:

      +
      type InternetPoints = (address, u256)
      +
      +

      (#459)

      +
    • +
    • +

      Revert with custom errors

      +

      Example:

      +
      struct PlatformError:
      +  code: u256
      +
      +pub fn do_something():
      +  revert PlatformError(code=4711)
      +
      +

      Error encoding follows Solidity which is based on EIP-838. This means that custom errors returned from Fe are fully compatible with Solidity. (#464)

      +
    • +
    • +
        +
      • The builtin value msg.sig now has type u256.
      • +
      • Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. (#472)
      • +
      +
    • +
    • +

      Encode certain reverts as panics.

      +

      With this change, the following reverts are encoded as Panic(uint256) with +the following panic codes:

      +
        +
      • 0x01: An assertion that failed and did not specify an error message
      • +
      • 0x11: An arithmetic expression resulted in an over- or underflow
      • +
      • 0x12: An arithmetic expression divided or modulo by zero
      • +
      +

      The panic codes are aligned with the panic codes that Solidity uses. (#476)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Fixed a crash when trying to access an invalid attribute on a string.

      +

      Example:

      +
      contract Foo:
      +
      +  pub fn foo():
      +    "".does_not_exist
      +
      +

      The above now yields a proper user error. (#444)

      +
    • +
    • +

      Ensure String<N> type is capitalized in error messages (#445)

      +
    • +
    • +

      Fixed ICE when using a static string that spans over multiple lines.

      +

      Previous to this fix, the following code would lead to a compiler crash:

      +
      contract Foo:
      +    pub fn return_with_newline() -> String<16>:
      +        return "foo
      +        balu"
      +
      +

      The above code now works as intended. (#448)

      +
    • +
    • +

      Fixed ICE when using a tuple declaration and specifying a non-tuple type. +Fixed a second ICE when using a tuple declaration where the number of +target items doesn't match the number of items in the declared type. (#469)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +
        +
      • Cleaned up ABI encoding internals.
      • +
      • Improved yulc panic formatting. (#472)
      • +
      +
    • +
    +

    0.6.0-alpha "Feldspar" (2021-06-10)

    +

    Features

    +
      +
    • +

      Support for pragma statement

      +

      Example: pragma ^0.1.0 (#361)

      +
    • +
    • +

      Add support for tuple destructuring

      +

      Example:

      +
      my_tuple: (u256, bool) = (42, true)
      +(x, y): (u256, bool) = my_tuple
      +
      +

      (#376)

      +
    • +
    • +
        +
      1. Call expression can now accept generic arguments
      2. +
      3. Replace stringN to String<N>
      4. +
      +

      Example:

      +
      s: String<10> = String<10>("HI")
      +
      +

      (#379)

      +
    • +
    • +
        +
      • Many analyzer errors now include helpful messages and underlined code.
      • +
      • Event and struct constructor arguments must now be labeled and in the order specified in the definition.
      • +
      • The analyzer now verifies that the left-hand side of an assignment is actually assignable. (#398)
      • +
      +
    • +
    • +

      Types of integer literal are now inferred, rather than defaulting to u256.

      +
      contract C:
      +
      +  fn f(x: u8) -> u16:
      +    y: u8 = 100   # had to use u8(100) before
      +    z: i8 = -129  # "literal out of range" error
      +
      +    return 1000   # had to use `return u16(1000)` before
      +
      +  fn g():
      +    self.f(50)
      +
      +

      Similar inference is done for empty array literals. Previously, empty array +literals caused a compiler crash, because the array element type couldn't +be determined.

      +
      contract C:
      +  fn f(xs: u8[10]):
      +    pass
      +
      +  fn g():
      +    self.f([])
      +
      +

      (Note that array length mismatch is still a type error, so this code won't +actually compile.) (#429)

      +
    • +
    • +

      The Map type name is now capitalized. Example:

      +
      contract GuestBook:
      +    guests: Map<address, String<100>>
      +
      +

      (#431)

      +
    • +
    • +

      Convert all remaining errors to use the new advanced error reporting system (#432)

      +
    • +
    • +

      Analyzer throws an error if __init__ is not public. (#435)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Refactored front-end "not implemented" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. (#437)
    • +
    +

    0.5.0-alpha (2021-05-27)

    +

    Features

    +
      +
    • +

      Add support for hexadecimal/octal/binary numeric literals.

      +

      Example:

      +
      value_hex: u256 = 0xff
      +value_octal: u256 = 0o77
      +value_binary: u256 = 0b11
      +
      +

      (#333)

      +
    • +
    • +

      Added support for list expressions.

      +

      Example:

      +
      values: u256[3] = [10, 20, 30]
      +
      +# or anywhere else where expressions can be used such as in a call
      +
      +sum: u256 = self.sum([10, 20, 30])
      +
      +

      (#388)

      +
    • +
    • +

      Contracts, events, and structs can now be empty.

      +

      e.g.

      +
      event MyEvent:
      +    pass
      +
      +...
      +
      +contract MyContract:
      +    pass
      +
      +...
      +
      +struct MyStruct:
      +    pass
      +
      +

      (#406)

      +
    • +
    • +

      External calls can now handle dynamically-sized return types. (#415)

      +
    • +
    +

    Bugfixes

    +
      +
    • The analyzer will return an error if a tuple attribute is not of the form item<index>. (#401)
    • +
    +

    Improved Documentation

    +
      +
    • Created a landing page for Fe at https://fe-lang.org (#394)
    • +
    • Provide a Quickstart chapter in Fe Guide (#403)
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • +

      Using insta to validate Analyzer outputs. (#387)

      +
    • +
    • +

      Analyzer now disallows using context.add_ methods to update attributes. (#392)

      +
    • +
    • +

      () now represents a distinct type internally called the unit type, instead of an empty tuple.

      +

      The lowering pass now does the following: Valueless return statements are given a () value and +functions without a return value are given explicit () returns. (#406)

      +
    • +
    • +

      Add CI check to ensure fragment files always end with a new line (#4711)

      +
    • +
    +

    0.4.0-alpha (2021-04-28)

    +

    Features

    +
      +
    • +

      Support for revert messages in assert statements

      +

      E.g

      +
      assert a == b, "my revert statement"
      +
      +

      The provided string is abi-encoded as if it were a call +to a function Error(string). For example, the revert string "Not enough Ether provided." returns the following hexadecimal as error return data:

      +
      0x08c379a0                                                         // Function selector for Error(string)
      +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
      +0x000000000000000000000000000000000000000000000000000000000000001a // String length
      +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data
      +
      +

      (#288)

      +
    • +
    • +

      Added support for augmented assignments.

      +

      e.g.

      +
      contract Foo:
      +    pub fn add(a: u256, b: u256) -> u256:
      +        a += b
      +        return a
      +
      +    pub fn sub(a: u256, b: u256) -> u256:
      +        a -= b
      +        return a
      +
      +    pub fn mul(a: u256, b: u256) -> u256:
      +        a *= b
      +        return a
      +
      +    pub fn div(a: u256, b: u256) -> u256:
      +        a /= b
      +        return a
      +
      +    pub fn mod(a: u256, b: u256) -> u256:
      +        a %= b
      +        return a
      +
      +    pub fn pow(a: u256, b: u256) -> u256:
      +        a **= b
      +        return a
      +
      +    pub fn lshift(a: u8, b: u8) -> u8:
      +        a <<= b
      +        return a
      +
      +    pub fn rshift(a: u8, b: u8) -> u8:
      +        a >>= b
      +        return a
      +
      +    pub fn bit_or(a: u8, b: u8) -> u8:
      +        a |= b
      +        return a
      +
      +    pub fn bit_xor(a: u8, b: u8) -> u8:
      +        a ^= b
      +        return a
      +
      +    pub fn bit_and(a: u8, b: u8) -> u8:
      +        a &= b
      +        return a
      +
      +

      (#338)

      +
    • +
    • +

      A new parser implementation, which provides more helpful error messages +with fancy underlines and code context. (#346)

      +
    • +
    • +

      Added support for tuples with base type items.

      +

      e.g.

      +
      contract Foo:
      +    my_num: u256
      +
      +    pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool):
      +        my_tuple: (u256, bool) = (my_num, my_bool)
      +        self.my_num = my_tuple.item0
      +        return my_tuple
      +
      +

      (#352)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Properly reject invalid emit (#211)

      +
    • +
    • +

      Properly tokenize numeric literals when they start with 0 (#331)

      +
    • +
    • +

      Reject non-string assert reasons as type error (#335)

      +
    • +
    • +

      Properly reject code that creates a circular dependency when using create or create2.

      +

      Example, the following code is now rightfully rejected because it tries to create an +instance of Foo from within the Foo contract itself.

      +
      contract Foo:
      +  pub fn bar()->address:
      +    foo:Foo=Foo.create(0)
      +
      +    return address(foo)
      +
      +

      (#362)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. (#332)
    • +
    • Added support for running tests against solidity fixtures. +Also added tests that cover how solidity encodes revert reason strings. (#342)
    • +
    • Refactoring of binary operation type checking. (#347)
    • +
    +

    0.3.0-alpha "Calamine" (2021-03-24)

    +

    Features

    +
      +
    • +

      Add over/underflow checks for multiplications of all integers (#271)

      +
    • +
    • +

      Add full support for empty Tuples. (#276)

      +

      All functions in Fe implicitly return an empty Tuple if they have no other return value. +However, before this change one was not able to use the empty Tuple syntax () explicitly.

      +

      With this change, all of these are treated equally:

      +
      contract Foo:
      +
      +  pub fn explicit_return_a1():
      +    return
      +
      +  pub fn explicit_return_a2():
      +    return ()
      +
      +  pub fn explicit_return_b1() ->():
      +    return
      +
      +  pub fn explicit_return_b2() ->():
      +    return ()
      +
      +  pub fn implicit_a1():
      +    pass
      +
      +  pub fn implicit_a2() ->():
      +    pass
      +
      +
    • +
    • +

      The JSON ABI builder now supports structs as both input and output. (#296)

      +
    • +
    • +

      Make subsequently defined contracts visible.

      +

      Before this change:

      +
      # can't see Bar
      +contract Foo:
      +   ...
      +# can see Foo
      +contract Bar:
      +   ...
      +
      +

      With this change the restriction is lifted and the following becomes possible. (#298)

      +
      contract Foo:
      +    bar: Bar
      +    pub fn external_bar() -> u256:
      +        return self.bar.bar()
      +contract Bar:
      +    foo: Foo
      +    pub fn external_foo() -> u256:
      +        return self.foo.foo()
      +
      +
    • +
    • +

      Perform checks for divison operations on integers (#308)

      +
    • +
    • +

      Support for msg.sig to read the function identifier. (#311)

      +
    • +
    • +

      Perform checks for modulo operations on integers (#312)

      +
    • +
    • +

      Perform over/underflow checks for exponentiation operations on integers (#313)

      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Properly reject emit not followed by an event invocation (#212)

      +
    • +
    • +

      Properly reject octal number literals (#222)

      +
    • +
    • +

      Properly reject code that tries to emit a non-existing event. (#250)

      +

      Example that now produces a compile time error:

      +
      emit DoesNotExist()
      +
      +
    • +
    • +

      Contracts that create other contracts can now include __init__ functions.

      +

      See https://github.com/ethereum/fe/issues/284 (#304)

      +
    • +
    • +

      Prevent multiple types with same name in one module. (#317)

      +

      Examples that now produce compile time errors:

      +
      type bar = u8
      +type bar = u16
      +
      +

      or

      +
      struct SomeStruct:
      +    some_field: u8
      +
      +struct SomeStruct:
      +    other: u8
      +
      +

      or

      +
      contract SomeContract:
      +    some_field: u8
      +
      +contract SomeContract:
      +    other: u8
      +
      +

      Prevent multiple fields with same name in one struct.

      +

      Example that now produces a compile time error:

      +
      struct SomeStruct:
      +    some_field: u8
      +    some_field: u8
      +
      +

      Prevent variable definition in child scope when name already taken in parent scope.

      +

      Example that now produces a compile time error:

      +
      pub fn bar():
      +    my_array: u256[3]
      +    sum: u256 = 0
      +    for i in my_array:
      +        sum: u256 = 0
      +
      +
    • +
    • +

      The CLI was using the overwrite flag to enable Yul optimization.

      +

      i.e.

      +
      # Would both overwrite output files and run the Yul optimizer.
      +$ fe my_contract.fe --overwrite
      +
      +

      Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. (#320)

      +
    • +
    • +

      Ensure analyzer rejects code that uses return values for __init__ functions. (#323)

      +

      An example that now produces a compile time error:

      +
      contract C:
      +    pub fn __init__() -> i32:
      +        return 0
      +
      +
    • +
    • +

      Properly reject calling an undefined function on an external contract (#324)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. (#179)
    • +
    • IDs added to AST nodes. (#315)
    • +
    • Failures in the Yul generation phase now panic; any failure is a bug. (#327)
    • +
    +

    0.2.0-alpha "Borax" (2021-02-27)

    +

    Features

    +
      +
    • +

      Add support for string literals.

      +

      Example:

      +
      fn get_ticker_symbol() -> string3:
      +    return "ETH"
      +
      +

      String literals are stored in and loaded from the compiled bytecode. (#186)

      +
    • +
    • +

      The CLI now compiles every contract in a module, not just the first one. (#197)

      +

      Sample compiler output with all targets enabled:

      +
      output
      +|-- Bar
      +|   |-- Bar.bin
      +|   |-- Bar_abi.json
      +|   `-- Bar_ir.yul
      +|-- Foo
      +|   |-- Foo.bin
      +|   |-- Foo_abi.json
      +|   `-- Foo_ir.yul
      +|-- module.ast
      +`-- module.tokens
      +
      +
    • +
    • +

      Add support for string type casts (#201)

      +

      Example:

      +
      val: string100 = string100("foo")
      +
      +
    • +
    • +

      Add basic support for structs. (#203)

      +

      Example:

      +
      struct House:
      +    price: u256
      +    size: u256
      +    vacant: bool
      +
      +contract City:
      +
      +    pub fn get_price() -> u256:
      +        building: House = House(300, 500, true)
      +
      +        assert building.size == 500
      +        assert building.price == 300
      +        assert building.vacant
      +
      +        return building.price
      +
      +
    • +
    • +

      Added support for external contract calls. Contract definitions now +add a type to the module scope, which may be used to create contract +values with the contract's public functions as callable attributes. (#204)

      +

      Example:

      +
      contract Foo:
      +    pub fn build_array(a: u256, b: u256) -> u256[3]:
      +        my_array: u256[3]
      +        my_array[0] = a
      +        my_array[1] = a * b
      +        my_array[2] = b
      +        return my_array
      +
      +contract FooProxy:
      +    pub fn call_build_array(
      +        foo_address: address,
      +        a: u256,
      +        b: u256,
      +    ) -> u256[3]:
      +        foo: Foo = Foo(foo_address)
      +        return foo.build_array(a, b)
      +
      +
    • +
    • +

      Add support for block, msg, chain, and tx properties: (#208)

      +
      block.coinbase: address
      +block.difficulty: u256
      +block.number: u256
      +block.timestamp: u256
      +chain.id: u256
      +msg.value: u256
      +tx.gas_price: u256
      +tx.origin: address
      +
      +

      (Note that msg.sender: address was added previously.)

      +

      Example:

      +
      fn post_fork() -> bool:
      +    return block.number > 2675000
      +
      +
    • +
    • +

      The CLI now panics if an error is encountered during Yul compilation. (#218)

      +
    • +
    • +

      Support for contract creations.

      +

      Example of create2, which takes a value and address salt as parameters.

      +
      contract Foo:
      +    pub fn get_my_num() -> u256:
      +        return 42
      +
      +contract FooFactory:
      +    pub fn create2_foo() -> address:
      +        # value and salt
      +        foo: Foo = Foo.create2(0, 52)
      +        return address(foo)
      +
      +

      Example of create, which just takes a value parameter.

      +
      contract Foo:
      +    pub fn get_my_num() -> u256:
      +        return 42
      +
      +contract FooFactory:
      +    pub fn create_foo() -> address:
      +        # value and salt
      +        foo: Foo = Foo.create(0)
      +        return address(foo)
      +
      +

      Note: We do not yet support init parameters. (#239)

      +
    • +
    • +

      Support updating individual struct fields in storage. (#246)

      +

      Example:

      +
       pub fn update_house_price(price: u256):
      +        self.my_house.price = price
      +
      +
    • +
    • +

      Implement global keccak256 method. The method expects one parameter of bytes[n] +and returns the hash as an u256. In a future version keccak256 will most likely +be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). (#255)

      +

      Example:

      +
      pub fn hash_single_byte(val: bytes[1]) -> u256:
      +    return keccak256(val)
      +
      +
    • +
    • +

      Require structs to be initialized using keyword arguments.

      +

      Example:

      +
      struct House:
      +    vacant: bool
      +    price: u256
      +
      +

      Previously, House could be instantiated as House(true, 1000000). +With this change it is required to be instantiated like House(vacant=true, price=1000000)

      +

      This ensures property assignment is less prone to get mixed up. It also makes struct +initialization visually stand out more from function calls. (#260)

      +
    • +
    • +

      Implement support for boolean not operator. (#264)

      +

      Example:

      +
      if not covid_test.is_positive(person):
      +    allow_boarding(person)
      +
      +
    • +
    • +

      Do over/underflow checks for additions (SafeMath).

      +

      With this change all additions (e.g x + y) for signed and unsigned +integers check for over- and underflows and revert if necessary. (#265)

      +
    • +
    • +

      Added a builtin function abi_encode() that can be used to encode structs. The return type is a +fixed-size array of bytes that is equal in size to the encoding. The type system does not support +dynamically-sized arrays yet, which is why we used fixed. (#266)

      +

      Example:

      +
      struct House:
      +    price: u256
      +    size: u256
      +    rooms: u8
      +    vacant: bool
      +
      +contract Foo:
      +    pub fn hashed_house() -> u256:
      +        house: House = House(
      +            price=300,
      +            size=500,
      +            rooms=u8(20),
      +            vacant=true
      +        )
      +        return keccak256(house.abi_encode())
      +
      +
    • +
    • +

      Perform over/underflow checks for subtractions (SafeMath). (#267)

      +

      With this change all subtractions (e.g x - y) for signed and unsigned +integers check for over- and underflows and revert if necessary.

      +
    • +
    • +

      Support for the boolean operations and and or. (#270)

      +

      Examples:

      +
      contract Foo:
      +    pub fn bar(x: bool, y: bool) -> bool:
      +        return x and y
      +
      +
      contract Foo:
      +    pub fn bar(x: bool, y: bool) -> bool:
      +        return x or y
      +
      +

      Support for self.address.

      +

      This expression returns the address of the current contract.

      +

      Example:

      +
      contract Foo:
      +    pub fn bar() -> address:
      +        return self.address
      +
      +
    • +
    +

    Bugfixes

    +
      +
    • +

      Perform type checking when calling event constructors

      +

      Previously, the following would not raise an error even though it should:

      +
      contract Foo:
      +    event MyEvent:
      +        val_1: string100
      +        val_2: u8
      +
      +    pub fn foo():
      +        emit MyEvent("foo", 1000)
      +
      +
      +

      Wit this change, the code fails with a type error as expected. (#202)

      +
    • +
    • +

      Fix bug where compilation of contracts without public functions would result in illegal YUL. (#219)

      +

      E.g without this change, the following doesn't compile to proper YUL

      +
      contract Empty:
      +  lonely: u256
      +
      +
    • +
    • +

      Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a +non user friendly error at the YUL compilation stage. With this change it is caught +at the analyzer stage and presented to the user as a regular error. (#225)

      +
    • +
    • +

      Fix crash when return is used without value.

      +

      These two methods should both be treated as returning ()

      +
        pub fn explicit_return():
      +    return
      +
      +  pub fn implicit():
      +    pass
      +
      +

      Without this change, the explicit_return crashes the compiler. (#261)

      +
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Renamed the fe-semantics library to fe-analyzer. (#207)
    • +
    • Runtime testing utilities. (#243)
    • +
    • Values are stored more efficiently in storage. (#251)
    • +
    +

    0.1.0-alpha "Amethyst" (2021-01-20)

    +

    WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead.

    +

    This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.

    +

    Features

    +
      +
    • +

      Added support for for loop, allows iteration over static arrays. (#134)

      +
    • +
    • +

      Enforce bounds on numeric literals in type constructors.

      +

      For instance calling u8(1000) or i8(-250) will give an error because +the literals 1000 and -250 do not fit into u8 or i8. (#145)

      +
    • +
    • +

      Added builtin copying methods clone() and to_mem() to reference types. (#155)

      +

      usage:

      +
      # copy a segment of storage into memory and assign the new pointer
      +my_mem_array = self.my_sto_array.to_mem()
      +
      +# copy a segment of memory into another segment of memory and assign the new pointer
      +my_other_mem_array = my_mem_array.clone()
      +
      +
    • +
    • +

      Support emitting JSON ABI via --emit abi. +The default value of --emit is now abi,bytecode. (#160)

      +
    • +
    • +

      Ensure integer type constructor reject all expressions that aren't a numeric literal. +For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16.

      +
      pub fn bar(val: u8) -> u16:
      +        return u16(val)
      +
      +

      Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. (#163)

      +
    • +
    • +

      Support for ABI decoding of all array type. (#172)

      +
    • +
    • +

      Support for value assignments in declaration.

      +

      Previously, this code would fail:

      +
      another_reference: u256[10] = my_array
      +
      +

      As a workaround declaration and assignment could be split apart.

      +
      another_reference: u256[10]
      +another_reference = my_array
      +
      +

      With this change, the shorter declaration with assignment syntax is supported. (#173)

      +
    • +
    +

    Improved Documentation

    +
      +
    • Point to examples in the README (#162)
    • +
    • Overhaul README page to better reflect the current state of the project. (#177)
    • +
    • Added descriptions of the to_mem and clone functions to the spec. (#195)
    • +
    +

    Internal Changes - for Fe Contributors

    +
      +
    • Updated the Solidity backend to v0.8.0. (#169)
    • +
    • Run CI tests on Mac and support creating Mac binaries for releases. (#178)
    • +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/searcher.js b/docs/searcher.js new file mode 100644 index 0000000000..d2b0aeed38 --- /dev/null +++ b/docs/searcher.js @@ -0,0 +1,483 @@ +"use strict"; +window.search = window.search || {}; +(function search(search) { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + var search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchbar_outer = document.getElementById('searchbar-outer'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + searchindex = null, + doc_urls = [], + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + search_options = { + bool: "AND", + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0} + } + }, + mark_exclude = [], + marker = new Mark(content), + current_searchterm = "", + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight', + teaser_count = 0, + + SEARCH_HOTKEY_KEYCODE = 83, + ESCAPE_KEYCODE = 27, + DOWN_KEYCODE = 40, + UP_KEYCODE = 38, + SELECT_KEYCODE = 13; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + params: (function(){ + var ret = {}; + var seg = a.search.replace(/^\?/,'').split('&'); + var len = seg.length, i = 0, s; + for (;i': '>', + '"': '"', + "'": ''' + }; + var repl = function(c) { return MAP[c]; }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count == 1) { + return count + " search result for '" + searchterm + "':"; + } else if (count == 0) { + return "No search results for '" + searchterm + "'."; + } else { + return count + " search results for '" + searchterm + "':"; + } + } + + function formatSearchResult(result, searchterms) { + var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + var url = doc_urls[result.ref].split("#"); + if (url.length == 1) { // no anchor found + url.push(""); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); + + return '' + result.doc.breadcrumbs + '' + + '' + + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + var stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var searchterm_weight = 40; + var weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + var sentences = body.toLowerCase().split('. '); + var index = 0; + var value = 0; + var searchterm_found = false; + for (var sentenceindex in sentences) { + var words = sentences[sentenceindex].split(' '); + value = 8; + for (var wordindex in words) { + var word = words[wordindex]; + if (word.length > 0) { + for (var searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { + value = searchterm_weight; + searchterm_found = true; + } + }; + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + }; + index += 1; // because we split at a two-char boundary '. ' + }; + + if (weighted.length == 0) { + return body; + } + + var window_weight = []; + var window_size = Math.min(weighted.length, results_options.teaser_word_count); + + var cur_sum = 0; + for (var wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + }; + window_weight.push(cur_sum); + for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + }; + + if (searchterm_found) { + var max_sum = 0; + var max_sum_window_index = 0; + // backwards + for (var i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + }; + } else { + max_sum_window_index = 0; + } + + // add around searchterms + var teaser_split = []; + var index = weighted[max_sum_window_index][2]; + for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { + var word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + }; + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + searchbar_outer = config.searchbar_outer; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); + searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); + document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', function(e) { e.preventDefault(); }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + var tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + var url = parseURL(window.location.href); + if (url.params.hasOwnProperty(URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] != "") { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (url.params.hasOwnProperty(URL_MARK_PARAM)) { + var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude + }); + + var markers = document.querySelectorAll("mark"); + function hide() { + for (var i = 0; i < markers.length; i++) { + markers[i].classList.add("fade-out"); + window.setTimeout(function(e) { marker.unmark(); }, 300); + } + } + for (var i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text') { return; } + + if (e.keyCode === ESCAPE_KEYCODE) { + e.preventDefault(); + searchbar.classList.remove("active"); + setSearchUrlParameters("", + (searchbar.value.trim() !== "") ? "push" : "replace"); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { + e.preventDefault(); + unfocusSearchbar(); + searchresults.firstElementChild.classList.add("focus"); + } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE + || e.keyCode === UP_KEYCODE + || e.keyCode === SELECT_KEYCODE)) { + // not `:focus` because browser does annoying scrolling + var focused = searchresults.querySelector("li.focus"); + if (!focused) return; + e.preventDefault(); + if (e.keyCode === DOWN_KEYCODE) { + var next = focused.nextElementSibling; + if (next) { + focused.classList.remove("focus"); + next.classList.add("focus"); + } + } else if (e.keyCode === UP_KEYCODE) { + focused.classList.remove("focus"); + var prev = focused.previousElementSibling; + if (prev) { + prev.classList.add("focus"); + } else { + searchbar.select(); + } + } else { // SELECT_KEYCODE + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + var results = searchresults.children; + for (var i = 0; i < results.length; i++) { + results[i].classList.remove("focus"); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + var searchterm = searchbar.value.trim(); + if (searchterm != "") { + searchbar.classList.add("active"); + doSearch(searchterm); + } else { + searchbar.classList.remove("active"); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor . + // `action` can be one of "push", "replace", "push_if_new_search_else_replace" + // and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + var url = parseURL(window.location.href); + var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); + if (searchterm != "" || action == "push_if_new_search_else_replace") { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ""; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + + // Don't search the same twice + if (current_searchterm == searchterm) { return; } + else { current_searchterm = searchterm; } + + if (searchindex == null) { return; } + + // Do the actual search + var results = searchindex.search(searchterm, search_options); + var resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + var searchterms = searchterm.split(' '); + removeChildren(searchresults); + for(var i = 0; i < resultcount ; i++){ + var resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + fetch(path_to_root + 'searchindex.json') + .then(response => response.json()) + .then(json => init(json)) + .catch(error => { // Try to load searchindex.js if fetch failed + var script = document.createElement('script'); + script.src = path_to_root + 'searchindex.js'; + script.onload = () => init(window.search); + document.head.appendChild(script); + }); + + // Exported functions + search.hasFocus = hasFocus; +})(window.search); diff --git a/docs/searchindex.js b/docs/searchindex.js new file mode 100644 index 0000000000..a301c65782 --- /dev/null +++ b/docs/searchindex.js @@ -0,0 +1 @@ +Object.assign(window.search, {"doc_urls":["index.html#what-is-fe","index.html#why-fe","index.html#who-is-fe-for","index.html#what-problems-does-fe-solve","index.html#get-started","quickstart/index.html#quickstart","quickstart/index.html#download-and-install-fe","quickstart/first_contract.html#write-your-first-fe-contract","quickstart/first_contract.html#create-a-guest_bookfe-file","quickstart/first_contract.html#add-a-method-to-sign-the-guest-book","quickstart/first_contract.html#add-a-method-to-read-a-message","quickstart/deploy_contract.html#deploy-your-contract","quickstart/deploy_contract.html#prerequisites","quickstart/deploy_contract.html#introduction","quickstart/deploy_contract.html#your-developer-environment","quickstart/deploy_contract.html#deploying-to-a-local-network","quickstart/deploy_contract.html#making-the-deployment-transaction","quickstart/deploy_contract.html#signing-the-guest-book","quickstart/deploy_contract.html#reading-the-signatures","quickstart/deploy_contract.html#deploying-to-a-public-test-network","quickstart/deploy_contract.html#summary","user-guide/index.html#user-guide","user-guide/installation.html#installation","user-guide/installation.html#package-managers","user-guide/installation.html#download-the-compiler","user-guide/installation.html#add-permission-to-execute","user-guide/installation.html#building-from-source","user-guide/installation.html#editor-support--syntax-highlighting","user-guide/projects.html#fe-projects","user-guide/projects.html#creating-a-project","user-guide/projects.html#manifest","user-guide/projects.html#project-modes","user-guide/projects.html#importing","user-guide/projects.html#tests","user-guide/projects.html#running-your-project","user-guide/tutorials/index.html#tutorials","user-guide/tutorials/auction.html#auction-contract","user-guide/tutorials/auction.html#the-auction-rules","user-guide/tutorials/auction.html#get-started","user-guide/tutorials/auction.html#writing-the-contract","user-guide/tutorials/auction.html#defining-the-contract-and-initializing-variables","user-guide/tutorials/auction.html#bidding","user-guide/tutorials/auction.html#withdrawing","user-guide/tutorials/auction.html#end-the-auction","user-guide/tutorials/auction.html#view-functions","user-guide/tutorials/auction.html#build-and-deploy-the-contract","user-guide/tutorials/auction.html#summary","user-guide/example_contracts/index.html#example-contracts","user-guide/example_contracts/auction_contract.html","user-guide/external_links.html#useful-external-links","user-guide/external_links.html#tools","user-guide/external_links.html#projects","user-guide/external_links.html#hackathon-projects","user-guide/external_links.html#others","user-guide/external_links.html#blog-posts","user-guide/external_links.html#videos","development/index.html#development","development/build.html#build-and-test","development/release.html#release","development/release.html#versioning","development/release.html#generate-release-notes","development/release.html#generate-the-release","development/release.html#tag-and-push-the-release","development/release.html#manually-edit-the-release-on-github","development/release.html#updating-docs--website","development/release.html#preview-the-sites-locally","development/release.html#deploy-website--docs","std/index.html#fe-standard-library","std/precompiles.html#precompiles","std/precompiles.html#ec_recover","std/precompiles.html#parameters","std/precompiles.html#returns","std/precompiles.html#function-signature","std/precompiles.html#example","std/precompiles.html#sha2_256","std/precompiles.html#parameters-1","std/precompiles.html#returns-1","std/precompiles.html#function-signature-1","std/precompiles.html#example-1","std/precompiles.html#ripemd_160","std/precompiles.html#parameters-2","std/precompiles.html#returns-2","std/precompiles.html#function-signature-2","std/precompiles.html#example-2","std/precompiles.html#identity","std/precompiles.html#parameters-3","std/precompiles.html#returns-3","std/precompiles.html#function-signature-3","std/precompiles.html#example-3","std/precompiles.html#mod_exp","std/precompiles.html#parameters-4","std/precompiles.html#returns-4","std/precompiles.html#function-signature-4","std/precompiles.html#example-4","std/precompiles.html#ec_add","std/precompiles.html#parameters-5","std/precompiles.html#function-signature-5","std/precompiles.html#returns-5","std/precompiles.html#example-5","std/precompiles.html#ec_mul","std/precompiles.html#parameters-6","std/precompiles.html#function-signature-6","std/precompiles.html#returns-6","std/precompiles.html#example-6","std/precompiles.html#ec_pairing","std/precompiles.html#parameters-7","std/precompiles.html#returns-7","std/precompiles.html#example-7","std/precompiles.html#blake_2f","std/precompiles.html#parameters-8","std/precompiles.html#returns-8","std/precompiles.html#function-signature-7","std/precompiles.html#example-8","spec/index.html#fe-language-specification","spec/notation.html#notation","spec/notation.html#grammar","spec/lexical_structure/index.html#lexical-structure","spec/lexical_structure/keywords.html#keywords","spec/lexical_structure/keywords.html#strict-keywords","spec/lexical_structure/keywords.html#reserved-keywords","spec/lexical_structure/identifiers.html#identifiers","spec/lexical_structure/tokens.html#tokens","spec/lexical_structure/tokens.html#newline","spec/lexical_structure/tokens.html#literals","spec/lexical_structure/tokens.html#examples","spec/lexical_structure/tokens.html#boolean-literals","spec/lexical_structure/tokens.html#string-literals","spec/lexical_structure/tokens.html#integer-literals","spec/comments.html#comments","spec/items/index.html#items","spec/items/visibility_and_privacy.html#visibility-and-privacy","spec/items/structs.html#structs","spec/items/traits.html#traits","spec/items/enums.html#enum","spec/items/type_aliases.html#type-aliases","spec/items/contracts.html#contracts","spec/items/contracts.html#pragma","spec/items/contracts.html#state-variables","spec/items/contracts.html#contract-functions","spec/items/contracts.html#the-__init__-function","spec/items/contracts.html#structs","spec/items/functions/index.html#functions","spec/items/functions/context.html#context","spec/items/functions/context.html#rationale","spec/items/functions/context.html#the-context-object","spec/items/functions/context.html#context-mutability","spec/items/functions/context.html#abi-conformity","spec/items/functions/context.html#examples","spec/items/functions/context.html#msg_sender-and-msg_value","spec/items/functions/context.html#transferring-ether","spec/items/functions/context.html#createcreate2","spec/items/functions/context.html#block-number","spec/items/functions/self.html#self","spec/items/functions/self.html#mutability","spec/items/functions/self.html#examples","spec/items/functions/self.html#reading-contract-storage","spec/items/functions/self.html#writing-contract-storage","spec/statements/index.html#statements","spec/statements/pragma.html#pragma-statement","spec/statements/const.html#const-statement","spec/statements/let.html#let-statement","spec/statements/assign.html#assignment-statement","spec/statements/augassign.html#augmenting-assignment-statement","spec/statements/revert.html#revert-statement","spec/statements/return.html#return-statement","spec/statements/if.html#if-statement","spec/statements/for.html#for-statement","spec/statements/while.html#while-statement","spec/statements/break.html#break-statement","spec/statements/continue.html#continue-statement","spec/statements/match.html#match-statement","spec/statements/assert.html#assert-statement","spec/expressions/index.html#expressions","spec/expressions/call.html#call-expressions","spec/expressions/tuple.html#tuple-expressions","spec/expressions/list.html#list-expressions","spec/expressions/struct.html#struct-expressions","spec/expressions/indexing.html#index-expressions","spec/expressions/attribute.html#attribute-expressions","spec/expressions/name.html#name-expressions","spec/expressions/path.html#path-expressions","spec/expressions/literal.html#literal-expressions","spec/expressions/arithmetic_operators.html#arithmetic-operators","spec/expressions/comparison_operators.html#comparison-operators","spec/expressions/boolean_operators.html#boolean-operators","spec/expressions/unary_operators.html#unary-operators","spec/type_system/index.html#type-system","spec/type_system/types/index.html#types","spec/type_system/types/boolean.html#boolean-type","spec/type_system/types/contract.html#contract-types","spec/type_system/types/numeric.html#numeric-types","spec/type_system/types/tuple.html#tuple-types","spec/type_system/types/array.html#array-types","spec/type_system/types/struct.html#struct-types","spec/type_system/types/enum.html#enum-types","spec/type_system/types/address.html#address-type","spec/type_system/types/map.html#map-type","spec/type_system/types/string.html#string-type","spec/type_system/types/unit.html#unit-type","spec/type_system/types/function.html#function-types","spec/data_layout/index.html#data-layout","spec/data_layout/stack.html#stack","spec/data_layout/storage/index.html#storage","spec/data_layout/storage/constant_size_values_in_storage.html#constant-size-values-in-storage","spec/data_layout/storage/maps_in_storage.html#maps-in-storage","spec/data_layout/storage/to_mem_function.html#the-to_mem-function","spec/data_layout/memory/index.html#memory","spec/data_layout/memory/sequence_types_in_memory.html#sequence-types-in-memory","contributing.html#contributing","contributing.html#ways-to-contribute","contributing.html#1-reporting-or-fixing-issues","contributing.html#2-improving-the-docs","contributing.html#3-developing-fe","contributing.html#4-community-engagement","contributing.html#processes","contributing.html#reporting-issues","contributing.html#rasing-pull-requests","release_notes.html#release-notes","release_notes.html#0260-zircon-2023-11-03","release_notes.html#features","release_notes.html#improved-documentation","release_notes.html#0250-yoshiokaite-2023-10-26","release_notes.html#features-1","release_notes.html#bugfixes","release_notes.html#improved-documentation-1","release_notes.html#0240-xenotime-2023-08-10","release_notes.html#features-2","release_notes.html#performance-improvements","release_notes.html#improved-documentation-2","release_notes.html#0230-wiluite-2023-06-01","release_notes.html#features-3","release_notes.html#bugfixes-1","release_notes.html#0220-vulcanite-2023-04-05","release_notes.html#features-4","release_notes.html#bugfixes-2","release_notes.html#improved-documentation-3","release_notes.html#0210-alpha-2023-02-28","release_notes.html#features-5","release_notes.html#bugfixes-3","release_notes.html#0200-alpha-2022-12-05","release_notes.html#features-6","release_notes.html#bugfixes-4","release_notes.html#0191-alpha-sunstone-2022-07-06","release_notes.html#features-7","release_notes.html#bugfixes-5","release_notes.html#0180-alpha-ruby-2022-05-27","release_notes.html#features-8","release_notes.html#bugfixes-6","release_notes.html#0170-alpha-quartz-2022-05-26","release_notes.html#features-9","release_notes.html#bugfixes-7","release_notes.html#0160-alpha-2022-05-05","release_notes.html#features-10","release_notes.html#bugfixes-8","release_notes.html#0150-alpha-2022-04-04","release_notes.html#features-11","release_notes.html#bugfixes-9","release_notes.html#0140-alpha-2022-03-02","release_notes.html#features-12","release_notes.html#features-13","release_notes.html#support-local-constant","release_notes.html#support-constant-expression","release_notes.html#support-constant-generics-expression","release_notes.html#bug-fixes","release_notes.html#fix-ice-when-constant-type-is-mismatch","release_notes.html#fix-ice-when-assigning-value-to-constant-twice","release_notes.html#internal-changes---for-fe-contributors","release_notes.html#0130-alpha-2022-01-31-0130-alpha-2022-01-31","release_notes.html#features-14","release_notes.html#bugfixes-10","release_notes.html#0120-alpha-2021-12-31-0120-alpha-2021-12-31","release_notes.html#features-15","release_notes.html#bugfixes-11","release_notes.html#internal-changes---for-fe-contributors-1","release_notes.html#0110-alpha-karlite-2021-12-02","release_notes.html#features-16","release_notes.html#bugfixes-12","release_notes.html#internal-changes---for-fe-contributors-2","release_notes.html#0100-alpha-2021-10-31","release_notes.html#features-17","release_notes.html#bugfixes-13","release_notes.html#internal-changes---for-fe-contributors-3","release_notes.html#090-alpha-2021-09-29","release_notes.html#features-18","release_notes.html#bugfixes-14","release_notes.html#internal-changes---for-fe-contributors-4","release_notes.html#080-alpha-haxonite-2021-08-31","release_notes.html#features-19","release_notes.html#bugfixes-15","release_notes.html#improved-documentation-4","release_notes.html#internal-changes---for-fe-contributors-5","release_notes.html#070-alpha-galaxite-2021-07-27","release_notes.html#features-20","release_notes.html#bugfixes-16","release_notes.html#internal-changes---for-fe-contributors-6","release_notes.html#060-alpha-feldspar-2021-06-10","release_notes.html#features-21","release_notes.html#internal-changes---for-fe-contributors-7","release_notes.html#050-alpha-2021-05-27","release_notes.html#features-22","release_notes.html#bugfixes-17","release_notes.html#improved-documentation-5","release_notes.html#internal-changes---for-fe-contributors-8","release_notes.html#040-alpha-2021-04-28","release_notes.html#features-23","release_notes.html#bugfixes-18","release_notes.html#internal-changes---for-fe-contributors-9","release_notes.html#030-alpha-calamine-2021-03-24","release_notes.html#features-24","release_notes.html#bugfixes-19","release_notes.html#internal-changes---for-fe-contributors-10","release_notes.html#020-alpha-borax-2021-02-27","release_notes.html#features-25","release_notes.html#bugfixes-20","release_notes.html#internal-changes---for-fe-contributors-11","release_notes.html#010-alpha-amethyst-2021-01-20","release_notes.html#features-26","release_notes.html#improved-documentation-6","release_notes.html#internal-changes---for-fe-contributors-12","code_of_conduct.html#contributor-covenant-code-of-conduct","code_of_conduct.html#our-pledge","code_of_conduct.html#our-standards","code_of_conduct.html#enforcement-responsibilities","code_of_conduct.html#scope","code_of_conduct.html#enforcement","code_of_conduct.html#enforcement-guidelines","code_of_conduct.html#1-correction","code_of_conduct.html#2-warning","code_of_conduct.html#3-temporary-ban","code_of_conduct.html#4-permanent-ban","code_of_conduct.html#attribution"],"index":{"documentStore":{"docInfo":{"0":{"body":53,"breadcrumbs":2,"title":1},"1":{"body":65,"breadcrumbs":2,"title":1},"10":{"body":131,"breadcrumbs":8,"title":4},"100":{"body":11,"breadcrumbs":4,"title":1},"101":{"body":9,"breadcrumbs":5,"title":2},"102":{"body":6,"breadcrumbs":4,"title":1},"103":{"body":11,"breadcrumbs":4,"title":1},"104":{"body":7,"breadcrumbs":4,"title":1},"105":{"body":12,"breadcrumbs":4,"title":1},"106":{"body":9,"breadcrumbs":4,"title":1},"107":{"body":35,"breadcrumbs":4,"title":1},"108":{"body":34,"breadcrumbs":4,"title":1},"109":{"body":23,"breadcrumbs":4,"title":1},"11":{"body":0,"breadcrumbs":6,"title":2},"110":{"body":7,"breadcrumbs":4,"title":1},"111":{"body":17,"breadcrumbs":5,"title":2},"112":{"body":37,"breadcrumbs":4,"title":1},"113":{"body":113,"breadcrumbs":5,"title":3},"114":{"body":0,"breadcrumbs":4,"title":1},"115":{"body":77,"breadcrumbs":4,"title":1},"116":{"body":3,"breadcrumbs":6,"title":2},"117":{"body":7,"breadcrumbs":6,"title":1},"118":{"body":56,"breadcrumbs":7,"title":2},"119":{"body":62,"breadcrumbs":7,"title":2},"12":{"body":16,"breadcrumbs":5,"title":1},"120":{"body":46,"breadcrumbs":6,"title":1},"121":{"body":0,"breadcrumbs":6,"title":1},"122":{"body":4,"breadcrumbs":6,"title":1},"123":{"body":24,"breadcrumbs":6,"title":1},"124":{"body":49,"breadcrumbs":6,"title":1},"125":{"body":4,"breadcrumbs":7,"title":2},"126":{"body":34,"breadcrumbs":7,"title":2},"127":{"body":118,"breadcrumbs":7,"title":2},"128":{"body":2,"breadcrumbs":4,"title":1},"129":{"body":7,"breadcrumbs":4,"title":1},"13":{"body":102,"breadcrumbs":5,"title":1},"130":{"body":132,"breadcrumbs":7,"title":2},"131":{"body":62,"breadcrumbs":5,"title":1},"132":{"body":102,"breadcrumbs":5,"title":1},"133":{"body":71,"breadcrumbs":5,"title":1},"134":{"body":37,"breadcrumbs":7,"title":2},"135":{"body":132,"breadcrumbs":5,"title":1},"136":{"body":26,"breadcrumbs":5,"title":1},"137":{"body":25,"breadcrumbs":6,"title":2},"138":{"body":61,"breadcrumbs":6,"title":2},"139":{"body":45,"breadcrumbs":6,"title":2},"14":{"body":65,"breadcrumbs":6,"title":2},"140":{"body":27,"breadcrumbs":5,"title":1},"141":{"body":386,"breadcrumbs":5,"title":1},"142":{"body":14,"breadcrumbs":6,"title":1},"143":{"body":119,"breadcrumbs":6,"title":1},"144":{"body":85,"breadcrumbs":7,"title":2},"145":{"body":42,"breadcrumbs":7,"title":2},"146":{"body":174,"breadcrumbs":7,"title":2},"147":{"body":0,"breadcrumbs":6,"title":1},"148":{"body":40,"breadcrumbs":7,"title":2},"149":{"body":23,"breadcrumbs":7,"title":2},"15":{"body":90,"breadcrumbs":7,"title":3},"150":{"body":19,"breadcrumbs":6,"title":1},"151":{"body":17,"breadcrumbs":7,"title":2},"152":{"body":67,"breadcrumbs":6,"title":1},"153":{"body":24,"breadcrumbs":6,"title":1},"154":{"body":0,"breadcrumbs":6,"title":1},"155":{"body":10,"breadcrumbs":8,"title":3},"156":{"body":10,"breadcrumbs":8,"title":3},"157":{"body":25,"breadcrumbs":4,"title":1},"158":{"body":41,"breadcrumbs":7,"title":2},"159":{"body":40,"breadcrumbs":7,"title":2},"16":{"body":169,"breadcrumbs":7,"title":3},"160":{"body":66,"breadcrumbs":5,"title":1},"161":{"body":58,"breadcrumbs":7,"title":2},"162":{"body":73,"breadcrumbs":9,"title":3},"163":{"body":93,"breadcrumbs":7,"title":2},"164":{"body":78,"breadcrumbs":7,"title":2},"165":{"body":25,"breadcrumbs":5,"title":1},"166":{"body":38,"breadcrumbs":5,"title":1},"167":{"body":50,"breadcrumbs":5,"title":1},"168":{"body":85,"breadcrumbs":7,"title":2},"169":{"body":90,"breadcrumbs":7,"title":2},"17":{"body":84,"breadcrumbs":7,"title":3},"170":{"body":77,"breadcrumbs":7,"title":2},"171":{"body":81,"breadcrumbs":7,"title":2},"172":{"body":26,"breadcrumbs":4,"title":1},"173":{"body":87,"breadcrumbs":7,"title":2},"174":{"body":138,"breadcrumbs":7,"title":2},"175":{"body":80,"breadcrumbs":7,"title":2},"176":{"body":1,"breadcrumbs":7,"title":2},"177":{"body":65,"breadcrumbs":7,"title":2},"178":{"body":65,"breadcrumbs":7,"title":2},"179":{"body":21,"breadcrumbs":7,"title":2},"18":{"body":122,"breadcrumbs":6,"title":2},"180":{"body":23,"breadcrumbs":7,"title":2},"181":{"body":28,"breadcrumbs":7,"title":2},"182":{"body":98,"breadcrumbs":7,"title":2},"183":{"body":42,"breadcrumbs":7,"title":2},"184":{"body":24,"breadcrumbs":7,"title":2},"185":{"body":45,"breadcrumbs":7,"title":2},"186":{"body":0,"breadcrumbs":6,"title":2},"187":{"body":60,"breadcrumbs":6,"title":1},"188":{"body":10,"breadcrumbs":9,"title":2},"189":{"body":65,"breadcrumbs":9,"title":2},"19":{"body":213,"breadcrumbs":8,"title":4},"190":{"body":64,"breadcrumbs":9,"title":2},"191":{"body":136,"breadcrumbs":9,"title":2},"192":{"body":59,"breadcrumbs":9,"title":2},"193":{"body":81,"breadcrumbs":9,"title":2},"194":{"body":7,"breadcrumbs":9,"title":2},"195":{"body":27,"breadcrumbs":9,"title":2},"196":{"body":78,"breadcrumbs":9,"title":2},"197":{"body":69,"breadcrumbs":9,"title":2},"198":{"body":1,"breadcrumbs":9,"title":2},"199":{"body":1,"breadcrumbs":9,"title":2},"2":{"body":43,"breadcrumbs":2,"title":1},"20":{"body":49,"breadcrumbs":5,"title":1},"200":{"body":56,"breadcrumbs":6,"title":2},"201":{"body":53,"breadcrumbs":6,"title":1},"202":{"body":4,"breadcrumbs":6,"title":1},"203":{"body":39,"breadcrumbs":13,"title":4},"204":{"body":59,"breadcrumbs":9,"title":2},"205":{"body":14,"breadcrumbs":9,"title":2},"206":{"body":32,"breadcrumbs":6,"title":1},"207":{"body":42,"breadcrumbs":11,"title":3},"208":{"body":2,"breadcrumbs":2,"title":1},"209":{"body":0,"breadcrumbs":3,"title":2},"21":{"body":36,"breadcrumbs":4,"title":2},"210":{"body":20,"breadcrumbs":5,"title":4},"211":{"body":41,"breadcrumbs":4,"title":3},"212":{"body":82,"breadcrumbs":4,"title":3},"213":{"body":25,"breadcrumbs":4,"title":3},"214":{"body":0,"breadcrumbs":2,"title":1},"215":{"body":42,"breadcrumbs":3,"title":2},"216":{"body":55,"breadcrumbs":4,"title":3},"217":{"body":13,"breadcrumbs":4,"title":2},"218":{"body":0,"breadcrumbs":7,"title":5},"219":{"body":141,"breadcrumbs":3,"title":1},"22":{"body":44,"breadcrumbs":4,"title":1},"220":{"body":6,"breadcrumbs":4,"title":2},"221":{"body":0,"breadcrumbs":7,"title":5},"222":{"body":130,"breadcrumbs":3,"title":1},"223":{"body":29,"breadcrumbs":3,"title":1},"224":{"body":6,"breadcrumbs":4,"title":2},"225":{"body":0,"breadcrumbs":7,"title":5},"226":{"body":31,"breadcrumbs":3,"title":1},"227":{"body":18,"breadcrumbs":4,"title":2},"228":{"body":7,"breadcrumbs":4,"title":2},"229":{"body":0,"breadcrumbs":7,"title":5},"23":{"body":24,"breadcrumbs":5,"title":2},"230":{"body":245,"breadcrumbs":3,"title":1},"231":{"body":78,"breadcrumbs":3,"title":1},"232":{"body":9,"breadcrumbs":7,"title":5},"233":{"body":86,"breadcrumbs":3,"title":1},"234":{"body":31,"breadcrumbs":3,"title":1},"235":{"body":8,"breadcrumbs":4,"title":2},"236":{"body":0,"breadcrumbs":7,"title":5},"237":{"body":63,"breadcrumbs":3,"title":1},"238":{"body":4,"breadcrumbs":3,"title":1},"239":{"body":0,"breadcrumbs":7,"title":5},"24":{"body":47,"breadcrumbs":5,"title":2},"240":{"body":522,"breadcrumbs":3,"title":1},"241":{"body":80,"breadcrumbs":3,"title":1},"242":{"body":0,"breadcrumbs":8,"title":6},"243":{"body":375,"breadcrumbs":3,"title":1},"244":{"body":63,"breadcrumbs":3,"title":1},"245":{"body":0,"breadcrumbs":8,"title":6},"246":{"body":10,"breadcrumbs":3,"title":1},"247":{"body":30,"breadcrumbs":3,"title":1},"248":{"body":0,"breadcrumbs":8,"title":6},"249":{"body":66,"breadcrumbs":3,"title":1},"25":{"body":78,"breadcrumbs":6,"title":3},"250":{"body":175,"breadcrumbs":3,"title":1},"251":{"body":0,"breadcrumbs":7,"title":5},"252":{"body":16,"breadcrumbs":3,"title":1},"253":{"body":8,"breadcrumbs":3,"title":1},"254":{"body":0,"breadcrumbs":7,"title":5},"255":{"body":176,"breadcrumbs":3,"title":1},"256":{"body":11,"breadcrumbs":3,"title":1},"257":{"body":0,"breadcrumbs":7,"title":5},"258":{"body":374,"breadcrumbs":3,"title":1},"259":{"body":0,"breadcrumbs":3,"title":1},"26":{"body":104,"breadcrumbs":5,"title":2},"260":{"body":10,"breadcrumbs":5,"title":3},"261":{"body":15,"breadcrumbs":5,"title":3},"262":{"body":24,"breadcrumbs":6,"title":4},"263":{"body":0,"breadcrumbs":4,"title":2},"264":{"body":13,"breadcrumbs":7,"title":5},"265":{"body":67,"breadcrumbs":8,"title":6},"266":{"body":133,"breadcrumbs":6,"title":4},"267":{"body":0,"breadcrumbs":12,"title":10},"268":{"body":141,"breadcrumbs":3,"title":1},"269":{"body":57,"breadcrumbs":3,"title":1},"27":{"body":60,"breadcrumbs":7,"title":4},"270":{"body":0,"breadcrumbs":12,"title":10},"271":{"body":94,"breadcrumbs":3,"title":1},"272":{"body":52,"breadcrumbs":3,"title":1},"273":{"body":27,"breadcrumbs":6,"title":4},"274":{"body":0,"breadcrumbs":8,"title":6},"275":{"body":184,"breadcrumbs":3,"title":1},"276":{"body":31,"breadcrumbs":3,"title":1},"277":{"body":80,"breadcrumbs":6,"title":4},"278":{"body":0,"breadcrumbs":7,"title":5},"279":{"body":213,"breadcrumbs":3,"title":1},"28":{"body":36,"breadcrumbs":6,"title":2},"280":{"body":185,"breadcrumbs":3,"title":1},"281":{"body":72,"breadcrumbs":6,"title":4},"282":{"body":0,"breadcrumbs":7,"title":5},"283":{"body":67,"breadcrumbs":3,"title":1},"284":{"body":41,"breadcrumbs":3,"title":1},"285":{"body":6,"breadcrumbs":6,"title":4},"286":{"body":0,"breadcrumbs":8,"title":6},"287":{"body":102,"breadcrumbs":3,"title":1},"288":{"body":136,"breadcrumbs":3,"title":1},"289":{"body":26,"breadcrumbs":4,"title":2},"29":{"body":27,"breadcrumbs":6,"title":2},"290":{"body":7,"breadcrumbs":6,"title":4},"291":{"body":0,"breadcrumbs":8,"title":6},"292":{"body":170,"breadcrumbs":3,"title":1},"293":{"body":84,"breadcrumbs":3,"title":1},"294":{"body":10,"breadcrumbs":6,"title":4},"295":{"body":0,"breadcrumbs":8,"title":6},"296":{"body":167,"breadcrumbs":3,"title":1},"297":{"body":15,"breadcrumbs":6,"title":4},"298":{"body":0,"breadcrumbs":7,"title":5},"299":{"body":62,"breadcrumbs":3,"title":1},"3":{"body":50,"breadcrumbs":4,"title":3},"30":{"body":61,"breadcrumbs":5,"title":1},"300":{"body":8,"breadcrumbs":3,"title":1},"301":{"body":13,"breadcrumbs":4,"title":2},"302":{"body":54,"breadcrumbs":6,"title":4},"303":{"body":0,"breadcrumbs":7,"title":5},"304":{"body":192,"breadcrumbs":3,"title":1},"305":{"body":53,"breadcrumbs":3,"title":1},"306":{"body":34,"breadcrumbs":6,"title":4},"307":{"body":0,"breadcrumbs":8,"title":6},"308":{"body":135,"breadcrumbs":3,"title":1},"309":{"body":181,"breadcrumbs":3,"title":1},"31":{"body":28,"breadcrumbs":6,"title":2},"310":{"body":23,"breadcrumbs":6,"title":4},"311":{"body":0,"breadcrumbs":8,"title":6},"312":{"body":479,"breadcrumbs":3,"title":1},"313":{"body":108,"breadcrumbs":3,"title":1},"314":{"body":17,"breadcrumbs":6,"title":4},"315":{"body":44,"breadcrumbs":8,"title":6},"316":{"body":146,"breadcrumbs":3,"title":1},"317":{"body":20,"breadcrumbs":4,"title":2},"318":{"body":15,"breadcrumbs":6,"title":4},"319":{"body":0,"breadcrumbs":6,"title":4},"32":{"body":20,"breadcrumbs":5,"title":1},"320":{"body":51,"breadcrumbs":3,"title":1},"321":{"body":75,"breadcrumbs":3,"title":1},"322":{"body":42,"breadcrumbs":4,"title":2},"323":{"body":34,"breadcrumbs":3,"title":1},"324":{"body":25,"breadcrumbs":3,"title":1},"325":{"body":13,"breadcrumbs":4,"title":2},"326":{"body":27,"breadcrumbs":4,"title":2},"327":{"body":42,"breadcrumbs":4,"title":2},"328":{"body":41,"breadcrumbs":5,"title":3},"329":{"body":26,"breadcrumbs":5,"title":3},"33":{"body":70,"breadcrumbs":5,"title":1},"330":{"body":32,"breadcrumbs":3,"title":1},"34":{"body":11,"breadcrumbs":6,"title":2},"35":{"body":20,"breadcrumbs":4,"title":1},"36":{"body":30,"breadcrumbs":7,"title":2},"37":{"body":34,"breadcrumbs":7,"title":2},"38":{"body":43,"breadcrumbs":6,"title":1},"39":{"body":10,"breadcrumbs":7,"title":2},"4":{"body":26,"breadcrumbs":2,"title":1},"40":{"body":446,"breadcrumbs":9,"title":4},"41":{"body":264,"breadcrumbs":6,"title":1},"42":{"body":97,"breadcrumbs":6,"title":1},"43":{"body":118,"breadcrumbs":7,"title":2},"44":{"body":64,"breadcrumbs":7,"title":2},"45":{"body":228,"breadcrumbs":8,"title":3},"46":{"body":68,"breadcrumbs":6,"title":1},"47":{"body":3,"breadcrumbs":6,"title":2},"48":{"body":155,"breadcrumbs":6,"title":2},"49":{"body":13,"breadcrumbs":8,"title":3},"5":{"body":15,"breadcrumbs":2,"title":1},"50":{"body":6,"breadcrumbs":6,"title":1},"51":{"body":17,"breadcrumbs":6,"title":1},"52":{"body":109,"breadcrumbs":7,"title":2},"53":{"body":19,"breadcrumbs":6,"title":1},"54":{"body":5,"breadcrumbs":7,"title":2},"55":{"body":14,"breadcrumbs":6,"title":1},"56":{"body":7,"breadcrumbs":2,"title":1},"57":{"body":74,"breadcrumbs":5,"title":2},"58":{"body":0,"breadcrumbs":3,"title":1},"59":{"body":8,"breadcrumbs":3,"title":1},"6":{"body":37,"breadcrumbs":4,"title":3},"60":{"body":34,"breadcrumbs":5,"title":3},"61":{"body":18,"breadcrumbs":4,"title":2},"62":{"body":18,"breadcrumbs":5,"title":3},"63":{"body":21,"breadcrumbs":6,"title":4},"64":{"body":58,"breadcrumbs":5,"title":3},"65":{"body":19,"breadcrumbs":5,"title":3},"66":{"body":22,"breadcrumbs":5,"title":3},"67":{"body":13,"breadcrumbs":5,"title":3},"68":{"body":66,"breadcrumbs":4,"title":1},"69":{"body":49,"breadcrumbs":4,"title":1},"7":{"body":55,"breadcrumbs":8,"title":4},"70":{"body":23,"breadcrumbs":4,"title":1},"71":{"body":3,"breadcrumbs":4,"title":1},"72":{"body":11,"breadcrumbs":5,"title":2},"73":{"body":11,"breadcrumbs":4,"title":1},"74":{"body":14,"breadcrumbs":4,"title":1},"75":{"body":5,"breadcrumbs":4,"title":1},"76":{"body":4,"breadcrumbs":4,"title":1},"77":{"body":6,"breadcrumbs":5,"title":2},"78":{"body":7,"breadcrumbs":4,"title":1},"79":{"body":13,"breadcrumbs":4,"title":1},"8":{"body":124,"breadcrumbs":7,"title":3},"80":{"body":5,"breadcrumbs":4,"title":1},"81":{"body":4,"breadcrumbs":4,"title":1},"82":{"body":6,"breadcrumbs":5,"title":2},"83":{"body":7,"breadcrumbs":4,"title":1},"84":{"body":11,"breadcrumbs":4,"title":1},"85":{"body":5,"breadcrumbs":4,"title":1},"86":{"body":5,"breadcrumbs":4,"title":1},"87":{"body":6,"breadcrumbs":5,"title":2},"88":{"body":8,"breadcrumbs":4,"title":1},"89":{"body":8,"breadcrumbs":4,"title":1},"9":{"body":117,"breadcrumbs":9,"title":5},"90":{"body":39,"breadcrumbs":4,"title":1},"91":{"body":5,"breadcrumbs":4,"title":1},"92":{"body":16,"breadcrumbs":5,"title":2},"93":{"body":20,"breadcrumbs":4,"title":1},"94":{"body":5,"breadcrumbs":4,"title":1},"95":{"body":20,"breadcrumbs":4,"title":1},"96":{"body":11,"breadcrumbs":5,"title":2},"97":{"body":6,"breadcrumbs":4,"title":1},"98":{"body":12,"breadcrumbs":4,"title":1},"99":{"body":5,"breadcrumbs":4,"title":1}},"docs":{"0":{"body":"Fe is the next generation smart contract language for Ethereum . Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun . Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM) . The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode. Fe is one of these languages.","breadcrumbs":"Introduction » What is Fe?","id":"0","title":"What is Fe?"},"1":{"body":"Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun. Fe shares similar syntax with the popular languages Rust and Python , easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees. Fe is: statically typed expressive compiled using Yul built to a detailed language specification able to limit dynamic behaviour rapidly evolving!","breadcrumbs":"Introduction » Why Fe?","id":"1","title":"Why Fe?"},"10":{"body":"To make the guest book more useful we will also add a method get_msg to read entries from a given address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr] }\n} However, we will hit another error as we try to recompile the current code. Unable to compile guest_book.fe.\nerror: value must be copied to memory ┌─ guest_book.fe:10:14 │\n8 │ return self.messages[addr] │ ^^^^^^^^^^^^^^^^^^^ this value is in storage │ = Hint: values located in storage can be copied to memory using the `to_mem` function. = Example: `self.my_array.to_mem()` When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function. Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics. The code should compile fine when we change it accordingly. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Congratulations! You finished your first little Fe project. 👏 In the next chapter we will learn how to deploy our code and tweak it a bit further.","breadcrumbs":"Quickstart » Write your first contract » Add a method to read a message","id":"10","title":"Add a method to read a message"},"100":{"body":"x: x-coordinate, u256 y: y coordinate, u256 s: multiplier, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"100","title":"Parameters"},"101":{"body":"pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"101","title":"Function signature"},"102":{"body":"ec_mul returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"102","title":"Returns"},"103":{"body":"let (x, y): (u256, u256) = precompiles::ec_mul( x: 1, y: 2, s: 2\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"103","title":"Example"},"104":{"body":"ec_pairing does elliptic curve pairing - a form of encrypted multiplication.","breadcrumbs":"Standard Library » Precompiles » ec_pairing","id":"104","title":"ec_pairing"},"105":{"body":"input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"105","title":"Parameters"},"106":{"body":"ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"106","title":"Returns"},"107":{"body":"let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da) writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6) writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc) writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9) writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90) writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e) writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001) writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45) writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4) writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7) writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2) writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc) assert precompiles::ec_pairing(buf)\n}","breadcrumbs":"Standard Library » Precompiles » Example","id":"107","title":"Example"},"108":{"body":"blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.","breadcrumbs":"Standard Library » Precompiles » blake_2f","id":"108","title":"blake_2f"},"109":{"body":"h: the state vector, Array m: message block vector, Array t: offset counter, Array f: bool rounds: number of rounds of mixing, u32","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"109","title":"Parameters"},"11":{"body":"","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploy your contract.","id":"11","title":"Deploy your contract."},"110":{"body":"blake_2f returns a modified state vector, Array","breadcrumbs":"Standard Library » Precompiles » Returns","id":"110","title":"Returns"},"111":{"body":"pub fn blake_2f(rounds: u32, h: Array, m: Array, t: Array, f: bool) -> Array","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"111","title":"Function signature"},"112":{"body":"let result: Array = precompiles::blake_2f( rounds: 12, h: [ 0x48c9bdf267e6096a, 0x3ba7ca8485ae67bb, 0x2bf894fe72f36e3c, 0xf1361d5f3af54fa5, 0xd182e6ad7f520e51, 0x1f6c3e2b8c68059b, 0x6bbd41fbabd9831f, 0x79217e1319cde05b, ], m: [ 0x6162630000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], t: [ 0x0300000000000000, 0x0000000000000000, ], f: true\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"112","title":"Example"},"113":{"body":"Warning: This is a work in progress document. It is incomplete and specifications aren't stable yet. Notation Lexical Structure Keywords Identifiers Tokens Comments Items Visibility and Privacy Structs Traits Enums Type Aliases Contracts Functions Context Self Statements pragma Statement Assignment Statement Augmenting Assignment Statement const Statement let Statement revert Statement return Statement if Statement for Statement while Statement break Statement continue Statement assert Statement Expressions Call expressions Tuple expressions List expressions Index expressions Attribute expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators Type System Types Boolean Type Contract Type Numeric Types Tuple Types Array Types Struct Types Enum Types Address Type Map Type String Type Data Layout Stack Storage Constant size values in storage Maps in storage to_mem() function Memory Sequence types in memory","breadcrumbs":"Specification (WIP) » Fe Language Specification","id":"113","title":"Fe Language Specification"},"114":{"body":"","breadcrumbs":"Specification (WIP) » Notation » Notation","id":"114","title":"Notation"},"115":{"body":"The following notations are used by the Lexer and Syntax grammar snippets: Notation Examples Meaning CAPITAL KW_IF A token produced by the lexer ItalicCamelCase Item A syntactical production string x, while, * The exact character(s) \\x \\n, \\r, \\t, \\0 The character represented by this escape x? pub? An optional item x* OuterAttribute * 0 or more of x x+ MacroMatch + 1 or more of x xa..b HEX_DIGIT1..6 a to b repetitions of x | u8 | u16, Block | Item Either one or another [ ] [b B] Any of the characters listed [ - ] [a-z] Any of the characters in the range ~[ ] ~[b B] Any characters, except those listed ~string ~\\n, ~*/ Any characters, except this sequence ( ) (, Parameter ) Groups items","breadcrumbs":"Specification (WIP) » Notation » Grammar","id":"115","title":"Grammar"},"116":{"body":"Keywords Identifiers Tokens","breadcrumbs":"Specification (WIP) » Lexical Structure » Lexical Structure","id":"116","title":"Lexical Structure"},"117":{"body":"Fe divides keywords into two categories: strict reserved","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Keywords","id":"117","title":"Keywords"},"118":{"body":"These keywords can only be used in their correct contexts. They cannot be used as the identifiers . Lexer: KW_AS : as KW_BREAK : break KW_CONST : const KW_CONTINUE : continue KW_CONST : contract KW_FN : fn KW_ELSE : else KW_ENUM : enum KW_EVENT : event KW_FALSE : false KW_FOR : for KW_IDX : idx KW_IF : if KW_IN : in KW_LET : let KW_MATCH : match KW_MUT : mut KW_NONPAYABLE : nonpayable KW_PAYABLE : payable KW_PUB : pub KW_RETURN : return KW_REVERT : revert KW_SELFVALUE : self KW_STRUCT : struct KW_TRUE : true KW_USE : use KW_WHILE : while KW_ADDRESS : address","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Strict keywords","id":"118","title":"Strict keywords"},"119":{"body":"These keywords aren't used yet, but they are reserved for future use. They have the same restrictions as strict keywords. The reasoning behind this is to make current programs forward compatible with future versions of Fe by forbidding them to use these keywords. Lexer: KW_ABSTRACT : abstract KW_ASYNC : async KW_AWAIT : await KW_DO : do KW_EXTERNAL : external KW_FINAL : final KW_IMPL : impl KW_MACRO : macro KW_OVERRIDE : override KW_PURE : pure KW_SELFTYPE : Self KW_STATIC : static KW_SUPER : super KW_TRAIT : trait KW_TYPE : type KW_TYPEOF : typeof KW_VIEW : view KW_VIRTUAL : virtual KW_WHERE : where KW_YIELD : yield","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Reserved keywords","id":"119","title":"Reserved keywords"},"12":{"body":"You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. If you don't have any of these components, please revisit Write your first contract .","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Prerequisites","id":"12","title":"Prerequisites"},"120":{"body":"Lexer: IDENTIFIER_OR_KEYWORD : [a-z A-Z] [a-z A-Z 0-9 _]* | _ [a-z A-Z 0-9 _]+ Except a strict or reserved keyword An identifier is any nonempty ASCII string of the following form: Either The first character is a letter. The remaining characters are alphanumeric or _. Or The first character is _. The identifier is more than one character. _ alone is not an identifier. The remaining characters are alphanumeric or _.","breadcrumbs":"Specification (WIP) » Lexical Structure » Identifiers » Identifiers","id":"120","title":"Identifiers"},"121":{"body":"","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Tokens","id":"121","title":"Tokens"},"122":{"body":"A token that represents a new line.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » NEWLINE","id":"122","title":"NEWLINE"},"123":{"body":"A literal is an expression consisting of a single token, rather than a sequence of tokens, that immediately and directly denotes the value it evaluates to, rather than referring to it by name or some other evaluation rule. A literal is a form of constant expression, so is evaluated (primarily) at compile time.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Literals","id":"123","title":"Literals"},"124":{"body":"Strings Example Characters Escapes String \"hello\" ASCII subset Quote & ASCII ASCII escapes Name \\n Newline \\r Carriage return \\t Tab \\\\ Backslash Quote escapes Name \\\" Double quote Numbers Number literals * Example Decimal integer 98_222 Hex integer 0xff Octal integer 0o77 Binary integer 0b1111_0000 * All number literals allow _ as a visual separator: 1_234","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Examples","id":"124","title":"Examples"},"125":{"body":"Lexer BOOLEAN_LITERAL : true | false","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Boolean literals","id":"125","title":"Boolean literals"},"126":{"body":"Lexer STRING_LITERAL : \" ( PRINTABLE_ASCII_CHAR | QUOTE_ESCAPE | ASCII_ESCAPE )* \" PRINTABLE_ASCII_CHAR : Any ASCII character between 0x1F and 0x7E QUOTE_ESCAPE : \\\" ASCII_ESCAPE : | \\n | \\r | \\t | \\\\ A string literal is a sequence of any characters that are in the set of printable ASCII characters as well as a set of defined escape sequences. Line breaks are allowed in string literals.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » String literals","id":"126","title":"String literals"},"127":{"body":"Lexer INTEGER_LITERAL : ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL ) DEC_LITERAL : DEC_DIGIT (DEC_DIGIT|_)* BIN_LITERAL : 0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)* OCT_LITERAL : 0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)* HEX_LITERAL : 0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)* BIN_DIGIT : [0-1] OCT_DIGIT : [0-7] DEC_DIGIT : [0-9] HEX_DIGIT : [0-9 a-f A-F] An integer literal has one of four forms: A decimal literal starts with a decimal digit and continues with any mixture of decimal digits and underscores . A hex literal starts with the character sequence U+0030 U+0078 (0x) and continues as any mixture (with at least one digit) of hex digits and underscores. An octal literal starts with the character sequence U+0030 U+006F (0o) and continues as any mixture (with at least one digit) of octal digits and underscores. A binary literal starts with the character sequence U+0030 U+0062 (0b) and continues as any mixture (with at least one digit) of binary digits and underscores. Examples of integer literals of various forms: 123 // type u256\n0xff // type u256\n0o70 // type u256\n0b1111_1111_1001_0000 // type u256\n0b1111_1111_1001_0000i64 // type u256","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Integer literals","id":"127","title":"Integer literals"},"128":{"body":"Lexer LINE_COMMENT : // *","breadcrumbs":"Specification (WIP) » Comments » Comments","id":"128","title":"Comments"},"129":{"body":"Visibility and Privacy Structs Enums Type Aliases Contracts","breadcrumbs":"Specification (WIP) » Items » Items","id":"129","title":"Items"},"13":{"body":"When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a \"live\" network, you are handling assets with real-world value! In this guide, you will deploy your contract to a local blockchain . This will be an \"ephemeral\" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Introduction","id":"13","title":"Introduction"},"130":{"body":"These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question \"Can this item be used at this location?\" Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified. Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions. Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility. For example, this is a function that can be called externally from a transaction: pub fn answer_to_life_the_universe_and_everything() -> u256 { return 42\n} Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition. For example, given an Ingot with the following structure: example_ingot\n└── src ├── ding │ └── dong.fe └── main.fe With ding/dong.fe having the following contents: pub struct Dang { pub my_address: address pub my_u256: u256 pub my_i8: i8\n} Then main.fe can use the Dang struct since it is pub-qualified: use ding::dong::Dang contract Foo { pub fn hot_dang() -> Dang { return Dang( my_address: 8, my_u256: 42, my_i8: -1 ) }\n}","breadcrumbs":"Specification (WIP) » Items » Visibility and Privacy » Visibility and Privacy","id":"130","title":"Visibility and Privacy"},"131":{"body":"Syntax Struct : struct IDENTIFIER { StructField * StructMethod * } StructField : pub? IDENTIFIER : Type StructMethod : Function A struct is a nominal struct type defined with the keyword struct. An example of a struct item and its use: struct Point { pub x: u256 pub y: u256\n} fn pointy_stuff() { let mut p: Point = Point(x: 10, y: 11) let px: u256 = p.x p.x = 100\n} Builtin functions: abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.","breadcrumbs":"Specification (WIP) » Items » Structs » Structs","id":"131","title":"Structs"},"132":{"body":"Syntax Trait : trait IDENTIFIER { TraitMethod * } TraitMethod : fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? ; A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function. All traits define an implicit type parameter Self that refers to \"the type that is implementing this interface\". Example of the Min trait from Fe's standard library: pub trait Min { fn min() -> Self;\n} Example of the i8 type implementing the Min trait: impl Min for i8 { fn min() -> Self { return -128 }\n} Example of a function restricting a generic parameter to types implementing the Compute trait: pub trait Compute { fn compute(self) -> u256;\n} struct Example { fn do_something(val: T) -> u256 { return val.compute() }\n}","breadcrumbs":"Specification (WIP) » Items » Traits » Traits","id":"132","title":"Traits"},"133":{"body":"Syntax Enumeration : enum IDENTIFIER { EnumField * EnumMethod * } EnumField : IDENTIFIER | IDENTIFIER ( TupleElements ?) EnumMethod : Function TupleElements : Type ( , Type )* An enum , also referred to as enumeration is a simultaneous definition of a nominal Enum type , that can be used to create or pattern-match values of the corresponding type. Enumerations are declared with the keyword enum. An example of an enum item and its use: enum Animal { Dog Cat Bird(BirdType) pub fn bark(self) -> String<10> { match self { Animal::Dog => { return \"bow\" } Animal::Cat => { return \"meow\" } Animal::Bird(BirdType::Duck) => { return \"quack\" } Animal::Bird(BirdType::Owl) => { return \"hoot\" } } }\n} enum BirdType { Duck Owl\n} fn f() { let barker: Animal = Animal::Dog barker.bark()\n}","breadcrumbs":"Specification (WIP) » Items » Enums » Enum","id":"133","title":"Enum"},"134":{"body":"Syntax TypeAlias : type IDENTIFIER = Type A type alias defines a new name for an existing type . Type aliases are declared with the keyword type. For example, the following defines the type BookMsg as a synonym for the type u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe. type BookMsg = Array","breadcrumbs":"Specification (WIP) » Items » Type Aliases » Type aliases","id":"134","title":"Type aliases"},"135":{"body":"Syntax Contract : contract IDENTIFIER { ContractMember * _} ContractMember : Visibility ? ( ContractField | Function | Struct | Enum ) Visibility : pub? ContractField : IDENTIFIER : Type A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain. Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data). In Fe, contracts are defined in files with .fe extensions and compiled using fe build. A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods. An example of a contract: struct Signed { pub book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg: book_msg)) } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Multiple contracts can be compiled from a single .fe contract file.","breadcrumbs":"Specification (WIP) » Items » Contracts » Contracts","id":"135","title":"Contracts"},"136":{"body":"An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it. Read more on pragma","breadcrumbs":"Specification (WIP) » Items » Contracts » pragma","id":"136","title":"pragma"},"137":{"body":"State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function. pub contract Example { some_number: u256 _some_string: String<100>\n}","breadcrumbs":"Specification (WIP) » Items » Contracts » State variables","id":"137","title":"State variables"},"138":{"body":"Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well. Individual functions can be called internally or externally depending upon their visibility (either private or public). Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument. Read more on functions .","breadcrumbs":"Specification (WIP) » Items » Contracts » Contract functions","id":"138","title":"Contract functions"},"139":{"body":"The __init__ function is a special contract function that can only be called at contract deployment time . It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function. pub contract Example { _some_number: u256 _some_string: String<100> pub fn __init__(mut self, number: u256, string: String<100>) { self._some_number=number; self._some_string=string; }\n} It is not possible to call __init__ at runtime.","breadcrumbs":"Specification (WIP) » Items » Contracts » The __init__() function","id":"139","title":"The __init__() function"},"14":{"body":"Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process. In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps. Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Your developer environment","id":"14","title":"Your developer environment"},"140":{"body":"Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error. Read more on structs .","breadcrumbs":"Specification (WIP) » Items » Contracts » Structs","id":"140","title":"Structs"},"141":{"body":"Constant size values stored on the stack or in memory can be passed into and returned by functions. Syntax Function : FunctionQualifiers fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? { FunctionStatements * } FunctionQualifiers : pub? FunctionStatements : ReturnStatement | VariableDeclarationStatement | AssignStatement | AugmentedAssignStatement | ForStatement | WhileStatement | IfStatement | AssertStatement | BreakStatement | ContinueStatement | RevertStatement | Expression FunctionParameters : self? | self,? FunctionParam (, FunctionParam )* ,? FunctionParam : FunctionParamLabel ? IDENTIFIER : Types FunctionParamLabel : _ | IDENTIFIER FunctionReturnType : -> Types A function definition consists of name and code block along with an optional list of parameters and return value. Functions are declared with the keyword fn. Functions may declare a set of input parameters, through which the caller passes arguments into the function, and the output type of the value the function will return to its caller on completion. When referred to, a function yields a first-class value of the corresponding zero-sized function type , which when called evaluates to a direct call to the function. A function header prepends a set or curly brackets {...} which contain the function body. For example, this is a simple function: fn add(x: u256, y: u256) -> u256 { return x + y\n} Functions can be defined inside of a contract, inside of a struct, or at the \"top level\" of a module (that is, not nested within another item). Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n} contract CoolCoin { balance: Map fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool { if self.balance[sender] < value { return false } self.balance[sender] -= value self.balance[recipient] += value return true } pub fn demo(mut self) { let ann: address = 0xaa let bob: address = 0xbb self.balance[ann] = 100 let bonus: u256 = 2 let value: u256 = add(10, bonus) let ok: bool = self.transfer(from: ann, to: bob, value) }\n} Function parameters have optional labels. When a function is called, the arguments must be labeled and provided in the order specified in the function definition. The label of a parameter defaults to the parameter name; a different label can be specified by adding an explicit label prior to the parameter name. For example: fn encrypt(msg cleartext: u256, key: u256) -> u256 { return cleartext ^ key\n} fn demo() { let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)\n} Here, the first parameter of the encrypt function has the label msg, which is used when calling the function, while the parameter name is cleartext, which is used inside the function body. The parameter name is an implementation detail of the function, and can be changed without modifying any function calls, as long as the label remains the same. When calling a function, a label can be omitted when the argument is a variable with a name that matches the parameter label. Example: let msg: u256 = 0xdecafbad\nlet cyf: u256 = encrypt(msg, key: 0x1234) A parameter can also be specified to have no label, by using _ in place of a label in the function definition. In this case, when calling the function, the corresponding argument must not be labeled. Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n}\nfn demo() { let sum: u256 = add(16, 32)\n} Functions defined inside of a contract or struct may take self as a parameter. This gives the function the ability to read and write contract storage or struct fields, respectively. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value) self is expected to come first parameter in the function's parameter list. Functions can also take a Context object which gives access to EVM features that read or write blockchain and transaction data. Context is expected to be first in the function's parameter list unless the function takes self, in which case Context should come second.","breadcrumbs":"Specification (WIP) » Items » Functions » Functions","id":"141","title":"Functions"},"142":{"body":"Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context","id":"142","title":"Context"},"143":{"body":"Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses. To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone. For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log). pub fn looks_pure_but_isnt() { // COMPILE ERROR block_number()\n} Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows: pub fn uses_context(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Rationale","id":"143","title":"Rationale"},"144":{"body":"The Context object gates access to features such as: emitting logs creating contracts transferring ether reading message info reading block info The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error. The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g. // The context object is automatically injected when this is called externally\npub fn multiply_block_number(ctx: Context) -> u256 { // but it has to be passed along in this function call return retrieves_blocknumber(ctx) * 1000\n} fn retrieves_blocknumber(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » The Context object","id":"144","title":"The Context object"},"145":{"body":"All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.: struct SomeEvent{\n} pub fn mutable(mut ctx: Context) { ctx.emit(SomeEvent())\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context mutability","id":"145","title":"Context mutability"},"146":{"body":"The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self . The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types. Category Characteristics Fe Syntax ABI Pure Can only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impure foo(val: u256) pure Read Contract Reading information from the contract instance (broad definition includes reading constants from contract code) foo(self) view Storage Writing Writing to contract storage (own or that of other contracts) foo(mut self) payable or nonpayable Context Reading Reading contextual information from the blockchain (msg, block etc) foo(ctx: Context) view Context Modifying Emitting logs, transferring ether, creating contracts foo(ctx: mut Context) payable or nonpayable Read Contract & Context Reading information from the contract instance and Context foo(self, ctx:Context) view Read Contract & write Context Reading information from the contract instance and modify Context foo(self, ctx: mut Context) view Storage Writing & read Context Writing to contract storage and read from Context foo(mut self, ctx: Context) payable or nonpayable Storage Writing & write Context Writing to contract storage and Context foo(mut self, ctx: mut Context) payable or nonpayable This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » ABI conformity","id":"146","title":"ABI conformity"},"147":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Examples","id":"147","title":"Examples"},"148":{"body":"Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable. // assumes existence of state variable named 'ledger' with type Map\npub fn add_to_ledger(mut self, ctx: Context) { self.ledger[ctx.msg_sender()] = ctx.msg_value();\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » msg_sender and msg_value","id":"148","title":"msg_sender and msg_value"},"149":{"body":"Transferring ether modifies the blockchain state, so it requires access to a mutable Context object. pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) { ctx.send_value(to: _addr, wei: amount)\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Transferring ether","id":"149","title":"Transferring ether"},"15":{"body":"Foundry has its own local network called Anvil . You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command: anvil You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console ( never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed. Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a local network","id":"15","title":"Deploying to a local network"},"150":{"body":"Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data: pub fn creates_contract(ctx: mut Context): ctx.create2(...)","breadcrumbs":"Specification (WIP) » Items » Functions » Context » create/create2","id":"150","title":"create/create2"},"151":{"body":"Reading block chain information such as the current block number requires Context (but does not require it to be mutable). pub fn retrieves_blocknumber(ctx: Context) { ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » block number","id":"151","title":"block number"},"152":{"body":"self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage. Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value)","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Self","id":"152","title":"Self"},"153":{"body":"self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Mutability","id":"153","title":"Mutability"},"154":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Examples","id":"154","title":"Examples"},"155":{"body":"contract example { value: u256; pub fn check_value(self) -> u256 { return self.value; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Reading contract storage","id":"155","title":"Reading contract storage"},"156":{"body":"contract example { value: u256; pub fn update_value(mut self) { self.value += 1; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Writing contract storage","id":"156","title":"Writing contract storage"},"157":{"body":"pragma Statement const Statement let Statement Assignment Statement Augmenting Assignment Statement revert Statement return Statemetn if Statement for Statement while Statement break Statement continue Statement match Statement assert Statement","breadcrumbs":"Specification (WIP) » Statements » Statements","id":"157","title":"Statements"},"158":{"body":"Syntax PragmaStatement : pragma VersionRequirement VersionRequirement :Following the semver implementation by cargo The pragma statement is denoted with the keyword pragma. Evaluating a pragma statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement. An example of a pragma statement: pragma ^0.1.0 The version requirement syntax is identical to the one that is used by cargo ( more info ).","breadcrumbs":"Specification (WIP) » Statements » pragma Statement » pragma statement","id":"158","title":"pragma statement"},"159":{"body":"Syntax ConstStatement : const IDENTIFIER : Type = Expression A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type. Example: const TEN: u256 = 10\nconst HUNDO: u256 = TEN * TEN contract Foo { pub fn bar() -> u256 { return HUNDO }\n}","breadcrumbs":"Specification (WIP) » Statements » const Statement » const statement","id":"159","title":"const statement"},"16":{"body":"In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545). The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil. cast send --rpc-url localhost:8545 --private-key --create $(cat output/GuestBook/GuestBook.bin) Here's what the response was at the time of writing this tutorial. blockHash 0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702\nblockNumber 1\ncontractAddress 0x5FbDB2315678afecb367f032d93F642f64180aa3\ncumulativeGasUsed 196992\neffectiveGasPrice 4000000000\ngasUsed 196992\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622\ntransactionIndex 0\ntype 2 This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract. Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Making the deployment transaction","id":"16","title":"Making the deployment transaction"},"160":{"body":"Syntax LetStatement : let IDENTIFIER | TupleTarget : Type = Expression TupleTarget : ( TupleTargetItem (, TupleTargetItem ) + ) TupleTargetItem : IDENTIFIER | TupleTarget A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope. Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue . Example: contract Foo { pub fn bar() { let val1: u256 = 1 let (val2):(u256) = (1,) let (val3, val4):(u256, bool) = (1, false) let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4)) }\n}","breadcrumbs":"Specification (WIP) » Statements » let Statement » let statement","id":"160","title":"let statement"},"161":{"body":"Syntax AssignmentStatement : Expression = Expression An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression. Example: contract Foo { some_array: Array pub fn bar(mut self) { let mut val1: u256 = 10 // Assignment of stack variable val1 = 10 let mut values: (u256, u256) = (1, 2) // Assignment of tuple item values.item0 = 3 // Assignment of storage array slot self.some_array[5] = 1000 }\n}","breadcrumbs":"Specification (WIP) » Statements » Assignment Statement » Assignment statement","id":"161","title":"Assignment statement"},"162":{"body":"Syntax AssignmentStatement : Expression = Expression | Expression += Expression | Expression -= Expression | Expression %= Expression | Expression **= Expression | Expression <<= Expression | Expression >>= Expression | Expression |= Expression | Expression ^= Expression | Expression &= Expression Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements. An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression. Example: fn example() -> u8 { let mut a: u8 = 1 let b: u8 = 2 a += b a -= b a *= b a /= b a %= b a **= b a <<= b a >>= b a |= b a ^= b a &= b return a\n}","breadcrumbs":"Specification (WIP) » Statements » Augmenting Assignment Statement » Augmenting Assignment statement","id":"162","title":"Augmenting Assignment statement"},"163":{"body":"Syntax RevertStatement : revert Expression ? The revert statement is denoted with the keyword revert. Evaluating a revert statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838 . An example of a revert statement without revert data: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n} An example of a revert statement with revert data: struct ApplicationError { pub code: u8\n} contract Foo { pub fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert ApplicationError(code: 5) } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n}","breadcrumbs":"Specification (WIP) » Statements » revert Statement » revert statement","id":"163","title":"revert statement"},"164":{"body":"Syntax ReturnStatement : return Expression ? The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly. An example of a return statement without explicit use of an expression: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(to) { return } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n} The above can also be written in a slightly more verbose form: contract Foo { fn transfer(self, to: address, value: u256) -> () { if not self.in_whitelist(to) { return () } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n}","breadcrumbs":"Specification (WIP) » Statements » return Statement » return statement","id":"164","title":"return statement"},"165":{"body":"Syntax IfStatement : if Expression { ( Statement | Expression )+ } (else { ( Statement | Expression )+ })? Example: contract Foo { pub fn bar(val: u256) -> u256 { if val > 5 { return 1 } else { return 2 } }\n} The if statement is used for conditional execution.","breadcrumbs":"Specification (WIP) » Statements » if Statement » if statement","id":"165","title":"if statement"},"166":{"body":"Syntax ForStatement : for IDENTIFIER in Expression { ( Statement | Expression )+ } A for statement is a syntactic construct for looping over elements provided by an array type . An example of a for loop over the contents of an array: Example: contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » for Statement » for statement","id":"166","title":"for statement"},"167":{"body":"Syntax WhileStatement : while Expression { ( Statement | Expression )+ } A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes. Example: contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » while Statement » while statement","id":"167","title":"while statement"},"168":{"body":"Syntax BreakStatement : break The break statement can only be used within a for or while loop and causes the immediate termination of the loop. If used within nested loops the break statement is associated with the innermost enclosing loop. An example of a break statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n} An example of a break statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » break Statement » break statement","id":"168","title":"break statement"},"169":{"body":"Syntax ContinueStatement : continue The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head. If used within nested loops the continue statement is associated with the innermost enclosing loop. An example of a continue statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n} An example of a continue statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » continue Statement » continue statement","id":"169","title":"continue statement"},"17":{"body":"Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example). The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message \"We <3 Fe\" . cast send --rpc-url http://localhost:8545 --private-key \"sign(string)\" '\"We <3 Fe\"' The response will look approximately as follows: blockHash 0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7\nblockNumber 2\ncontractAddress cumulativeGasUsed 36278\neffectiveGasPrice 3767596722\ngasUsed 36278\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c\ntransactionIndex 0\ntype 2","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Signing the guest book","id":"17","title":"Signing the guest book"},"170":{"body":"Syntax MatchStatement : match Expression { ( Pattern => { Statement * } )+ } Pattern : PatternElem ( | PatternElem )* PatternElem : IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path | Path ( TuplePatterns ? ) |( TuplePatterns ? ) | Path { StructPatterns ? } TuplePatterns : Pattern ( , Pattern )* StructPatterns : Field ( , Field )*(, ..)? Field : IDENTIFIER : Pattern A match statements compares expression with patterns, then executes body of the matched arm. Example: enum MyEnum { Unit Tuple(u32, u256, bool)\n} contract Foo { pub fn bar(self) -> u256 { let val: MyEnum = MyEnum::Tuple(1, 10, false) return self.eval(val) } fn eval(self, val: MyEnum) -> u256 { match val { MyEnum::Unit => { return 0 } MyEnum::Tuple(.., false) => { return 1 } MyEnum::Tuple(a, b, true) => { return u256(a) + b } } }\n}","breadcrumbs":"Specification (WIP) » Statements » match Statement » match statement","id":"170","title":"match statement"},"171":{"body":"Syntax AssertStatement : assert Expression (, Expression )? The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression. If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code . Warning: The current implementation of assert is under active discussion and likely to change. An example of a assert statement without the optional message: contract Foo { fn bar(val: u256) { assert val > 5 }\n} An example of a assert statement with an error message: contract Foo { fn bar(val: u256) { assert val > 5, \"Must be greater than five\" }\n}","breadcrumbs":"Specification (WIP) » Statements » assert Statement » assert statement","id":"171","title":"assert statement"},"172":{"body":"Call expressions Tuple expressions List expressions Struct expressions Index expressions Attribute expressions Name expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators","breadcrumbs":"Specification (WIP) » Expressions » Expressions","id":"172","title":"Expressions"},"173":{"body":"Syntax CallExpression : Expression GenericArgs ? ( CallParams ? ) GenericArgs : < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL )* > CallParams : CallArg ( , CallArg )* ,? CallArg : ( CallArgLabel =)? Expression CallArgLabel : IDENTIFIER Label must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal. A call expression calls a function. The syntax of a call expression is an expression , followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition . If the function eventually returns, then the expression completes. Example: contract Foo { pub fn demo(self) { let ann: address = 0xaa let bob: address = 0xbb self.transfer(from: ann, to: bob, 25) } pub fn transfer(self, from: address, to: address, _ val: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Call expressions » Call expressions","id":"173","title":"Call expressions"},"174":{"body":"Syntax TupleExpression : ( TupleElements ? ) TupleElements : ( Expression , )+ Expression ? A tuple expression constructs tuple values . The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands . The number of tuple initializer operands is the arity of the constructed tuple. 1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression. Tuple expressions without any tuple initializer operands produce the unit tuple. For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field. For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2. Examples of tuple expressions and their types: Expression Type () () (unit) (0, 4) (u256, u256) (true, ) (bool, ) (true, -1, 1) (bool, i256, u256) A tuple field can be accessed via an attribute expression . Example: contract Foo { pub fn bar() { // Creating a tuple via a tuple expression let some_tuple: (u256, bool) = (1, false) // Accessing the first tuple field via the `item0` field baz(input: some_tuple.item0) } pub fn baz(input: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Tuple expressions » Tuple expressions","id":"174","title":"Tuple expressions"},"175":{"body":"Syntax ListExpression : [ ListElements ? ] ListElements : Expression (, Expression )* ,? A list expression constructs array values . The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands . The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array. Examples of tuple expressions and their types: Expression Type [1, self.get_number()] u256[2] [true, false, false] bool[3] An array item can be accessed via an index expression . Example: contract Foo { fn get_val3() -> u256 { return 3 } pub fn baz() { let val1: u256 = 2 // A list expression let foo: Array = [1, val1, get_val3()] }\n}","breadcrumbs":"Specification (WIP) » Expressions » List expressions » List expressions","id":"175","title":"List expressions"},"176":{"body":"TBW","breadcrumbs":"Specification (WIP) » Expressions » Struct expressions » Struct expressions","id":"176","title":"Struct expressions"},"177":{"body":"Syntax IndexExpression : Expression [ Expression ] Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map. Example: contract Foo { balances: Map pub fn baz(mut self, mut values: Array) { // Assign value at slot 5 values[5] = 1000 // Read value at slot 5 let val1: u256 = values[5] // Assign value for address zero self.balances[address(0)] = 10000 // Read balance of address zero let bal: u256 = self.balances[address(0)] }\n}","breadcrumbs":"Specification (WIP) » Expressions » Index expressions » Index expressions","id":"177","title":"Index expressions"},"178":{"body":"Syntax AttributeExpression : Expression . IDENTIFIER An attribute expression evaluates to the location of an attribute of a struct , tuple or contract . The syntax for an attribute expression is an expression, then a . and finally an identifier. Examples: struct Point { pub x: u256 pub y: u256\n} contract Foo { some_point: Point some_tuple: (bool, u256) fn get_point() -> Point { return Point(x: 100, y: 500) } pub fn baz(some_point: Point, some_tuple: (bool, u256)) { // Different examples of attribute expressions let bool_1: bool = some_tuple.item0 let x1: u256 = some_point.x let point1: u256 = get_point().x let point2: u256 = some_point.x }\n}","breadcrumbs":"Specification (WIP) » Expressions » Attribute expressions » Attribute expressions","id":"178","title":"Attribute expressions"},"179":{"body":"Syntax NameExpression : IDENTIFIER A name expression resolves to a local variable. Example: contract Foo { pub fn baz(foo: u256) { // name expression resolving to the value of `foo` foo }\n}","breadcrumbs":"Specification (WIP) » Expressions » Name expressions » Name expressions","id":"179","title":"Name expressions"},"18":{"body":"The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook. Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying. To do that run: $ cast call --rpc-url http://localhost:8545 \"get_msg(address)\" Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction. The response arrives in the form of hex-encoded bytes padded with zeroes: 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000 Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows: cast to_ascii \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000\" or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command: cast call --rpc-url https://rpc.sepolia.org \"get_msg(address)\" | cast --to-ascii Either way, the response will be the message you passed to the sign(string) function. \"We <3 Fe\" Congratulations! You've deployed real Fe code to a local blockchain! 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Reading the signatures","id":"18","title":"Reading the signatures"},"180":{"body":"Syntax PathExpression : IDENTIFIER ( :: IDENTIFIER )* A name expression resolves to a local variable. Example: contract Foo { pub fn baz() { // CONST_VALUE is defined in another module `my_mod`. let foo: u32 = my_mod::CONST_VALUE }\n}","breadcrumbs":"Specification (WIP) » Expressions » Path expressions » Path expressions","id":"180","title":"Path expressions"},"181":{"body":"Syntax LiteralExpression : | STRING_LITERAL | INTEGER_LITERAL | BOOLEAN_LITERAL A literal expression consists of one of the literal forms described earlier. It directly describes a number, string or boolean value. \"hello\" // string type\n5 // integer type\ntrue // boolean type","breadcrumbs":"Specification (WIP) » Expressions » Literal expressions » Literal expressions","id":"181","title":"Literal expressions"},"182":{"body":"Syntax ArithmeticExpression : Expression + Expression | Expression - Expression | Expression * Expression | Expression / Expression | Expression % Expression | Expression ** Expression | Expression & Expression | Expression | Expression | Expression ^ Expression | Expression << Expression | Expression >> Expression Binary operators expressions are all written with infix notation . This table summarizes the behavior of arithmetic and logical binary operators on primitive types. Symbol Integer + Addition - Subtraction * Multiplication / Division* % Remainder ** Exponentiation & Bitwise AND | Bitwise OR ^ Bitwise XOR << Left Shift >> Right Shift * Integer division rounds towards zero. Here are examples of these operators being used. 3 + 6 == 9\n6 - 3 == 3\n2 * 3 == 6\n6 / 3 == 2\n5 % 4 == 1\n2 ** 4 == 16\n12 & 25 == 8\n12 | 25 == 29\n12 ^ 25 == 21\n212 << 1 == 424\n212 >> 1 == 106","breadcrumbs":"Specification (WIP) » Expressions » Arithmetic Operators » Arithmetic Operators","id":"182","title":"Arithmetic Operators"},"183":{"body":"Syntax ComparisonExpression : Expression == Expression | Expression != Expression | Expression > Expression | Expression < Expression | Expression >= Expression | Expression <= Expression Symbol Meaning == Equal != Not equal > Greater than < Less than >= Greater than or equal to <= Less than or equal to Here are examples of the comparison operators being used. 123 == 123\n23 != -12\n12 > 11\n11 >= 11\n11 < 12\n11 <= 11","breadcrumbs":"Specification (WIP) » Expressions » Comparison Operators » Comparison Operators","id":"183","title":"Comparison Operators"},"184":{"body":"Syntax BooleanExpression : Expression or Expression | Expression and Expression The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'. Example: const x: bool = false or true // true","breadcrumbs":"Specification (WIP) » Expressions » Boolean Operators » Boolean Operators","id":"184","title":"Boolean Operators"},"185":{"body":"Syntax UnaryExpression : not Expression | - Expression | ~ Expression The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument. Example: fn f() { let x: bool = not true // false let y: i256 = -1 let z: i256 = i256(~1) // -2\n}","breadcrumbs":"Specification (WIP) » Expressions » Unary Operators » Unary Operators","id":"185","title":"Unary Operators"},"186":{"body":"","breadcrumbs":"Specification (WIP) » Type System » Type System","id":"186","title":"Type System"},"187":{"body":"Every variable, item, and value in a Fe program has a type. The _ of a value defines the interpretation of the memory holding it and the operations that may be performed on the value. Built-in types are tightly integrated into the language, in nontrivial ways that are not possible to emulate in user-defined types. User-defined types have limited capabilities. The list of types is: Data types Base types: Boolean — true or false Address - Ethereum address Numeric — integer Reference types: Sequence types Tuple Array String Struct Enum Map Other types: Unit Contract Function","breadcrumbs":"Specification (WIP) » Type System » Types » Types","id":"187","title":"Types"},"188":{"body":"The bool type is a data type which can be either true or false. Example: let x: bool = true","breadcrumbs":"Specification (WIP) » Type System » Types » Boolean Type » Boolean type","id":"188","title":"Boolean type"},"189":{"body":"An contract type is the type denoted by the name of an contract item . A value of a given contract type carries the contract's public interface as attribute functions. A new contract value can be created by either casting an address to a contract type or by creating a new contract using the type attribute functions create or create2. Example: contract Foo { pub fn get_my_num() -> u256 { return 42 }\n} contract FooFactory { pub fn create2_foo(mut ctx: Context) -> address { // `0` is the value being sent and `52` is the address salt let foo: Foo = Foo.create2(ctx, 0, 52) return address(foo) }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Contract Type » Contract types","id":"189","title":"Contract types"},"19":{"body":"Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token. In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website. IMPORTANT : It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet. Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this: If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport. You can use an RPC provider such as Alchemy or Infura You can use an open public node such as https://rpc.sepolia.org. Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint: cast send --rpc-url https://rpc.sepolia.org --private-key --create $(cat output/GuestBook/GuestBook.bin) Now you have deployed the contract to a public network and anyone can interact with it. To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past: address link deploy tx hash 0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76 etherscan contract address 0x810cbd4365396165874C054d01B1Ede4cc249265 etherscan Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database. Congratulations! You've deployed real Fe code to a live network 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a public test network","id":"19","title":"Deploying to a public test network"},"190":{"body":"The unsigned integer types consist of: Type Minimum Maximum u8 0 28-1 u16 0 216-1 u32 0 232-1 u64 0 264-1 u128 0 2128-1 u256 0 2256-1 The signed two's complement integer types consist of: Type Minimum Maximum i8 -(27) 27-1 i16 -(215) 215-1 i32 -(231) 231-1 i64 -(263) 263-1 i128 -(2127) 2127-1 i256 -(2255) 2255-1","breadcrumbs":"Specification (WIP) » Type System » Types » Numeric Types » Numeric types","id":"190","title":"Numeric types"},"191":{"body":"Syntax TupleType : ( ) | ( ( Type , )+ Type ? ) Tuple types are a family of structural types [1] for heterogeneous lists of other types. The syntax for a tuple type is a parenthesized, comma-separated list of types. A tuple type has a number of fields equal to the length of the list of types. This number of fields determines the arity of the tuple. A tuple with n fields is called an n-ary tuple . For example, a tuple with 2 fields is a 2-ary tuple. Fields of tuples are named using increasing numeric names matching their position in the list of types. The first field is item0. The second field is item1. And so on. The type of each field is the type of the same position in the tuple's list of types. For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type . Its one value is also called unit or the unit value . Some examples of tuple types: () (also known as the unit or zero-sized type ) (u8, u8) (bool, i32) (i32, bool) (different type from the previous example) Values of this type are constructed using a tuple expression . Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. Tuple fields can be accessed via an attribute expression . Structural types are always equivalent if their internal types are equivalent.","breadcrumbs":"Specification (WIP) » Type System » Types » Tuple Types » Tuple Types","id":"191","title":"Tuple Types"},"192":{"body":"Syntax ArrayType : Array< Type , INTEGER_LITERAL > An array is a fixed-size sequence of N elements of type T. The array type is written as Array. The size is an integer literal. Arrays are either stored in storage or memory but are never stored directly on the stack. Examples: contract Foo { // An array in storage bar: Array fn do_something() { // An array in memory let values: Array = [10, 100, 100] }\n} All elements of arrays are always initialized, and access to an array is always bounds-checked in safe methods and operators.","breadcrumbs":"Specification (WIP) » Type System » Types » Array Types » Array types","id":"192","title":"Array types"},"193":{"body":"A struct type is the type denoted by the name of an struct item . A struct type is a heterogeneous product of other types, called the fields of the type. New instances of a struct can be constructed with a struct expression . Struct types are either stored in storage or memory but are never stored directly on the stack. Examples: struct Rectangle { pub width: u256 pub length: u256\n} contract Example { // A Rectangle in storage area: Rectangle fn do_something() { let length: u256 = 20 // A rectangle in memory let square: Rectangle = Rectangle(width: 10, length) }\n} All fields of struct types are always initialized. The data layout of a struct is not part of its external API and may be changed in any release. The fields of a struct may be qualified by visibility modifiers , to allow access to data in a struct outside a module.","breadcrumbs":"Specification (WIP) » Type System » Types » Struct Types » Struct types","id":"193","title":"Struct types"},"194":{"body":"An enum type is the type denoted by the name of an enum item .","breadcrumbs":"Specification (WIP) » Type System » Types » Enum Types » Enum types","id":"194","title":"Enum types"},"195":{"body":"The address type represents a 20 byte Ethereum address. Example: contract Example { // An address in storage someone: address fn do_something() { // A plain address (not part of a tuple, struct etc) remains on the stack let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Address Type » Address Type","id":"195","title":"Address Type"},"196":{"body":"The type Map is used to associate key values with data. The following types can be used as key: unit type boolean type address type numeric types The values can be of any type including other maps, structs , tuples or arrays . Example: contract Foo { bar: Map> baz: Map> pub fn read_bar(self, a: address, b: address) -> u256 { return self.bar[a][b] } pub fn write_bar(mut self, a: address, b: address, value: u256) { self.bar[a][b] = value } pub fn read_baz(self, a: address, b: u256) -> bool { return self.baz[a][b] } pub fn write_baz(mut self, a: address, b: u256, value: bool) { self.baz[a][b] = value }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Map Type » Map type","id":"196","title":"Map type"},"197":{"body":"A value of type String represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8. The String type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters. Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as \"fox\" but it can not hold a full sentence such as \"The brown fox jumps over the white fence\". Example: contract Foo { fn bar() { let single_byte_string: String<1> = \"a\" let longer_string: String<100> = \"foo\" }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » String Type » String Type","id":"197","title":"String Type"},"198":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Unit Type » Unit type","id":"198","title":"Unit type"},"199":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Function Type » Function Types","id":"199","title":"Function Types"},"2":{"body":"Fe is for anyone that develops using the EVM ! Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains. Fe's syntax will feel familiar to Rust and Python developers. Here's what a minimal contract looks like in Fe: contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n}","breadcrumbs":"Introduction » Who is Fe for?","id":"2","title":"Who is Fe for?"},"20":{"body":"Well done! You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls. Here's some ideas for what you could do next: Experiment with different developer tooling Get more comfortable with Foundry by exploring the documentation Repeat the steps in this guide but for a more complex contract - be creative! Continue to the Using Fe pages to explore Fe more deeply.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Summary","id":"20","title":"Summary"},"200":{"body":"There are three places where data can be stored on the EVM: stack : 256-bit values placed on the stack that are loaded using DUP operations. storage : 256-bit address space where 256-bit values can be stored. Accessing higher storage slots does not increase gas cost. memory : 256-bit address space where 256-bit values can be stored. Accessing higher memory slots increases gas cost. Each data type can be stored in these locations. How data is stored is described in this section.","breadcrumbs":"Specification (WIP) » Data Layout » Data Layout","id":"200","title":"Data Layout"},"201":{"body":"The following can be stored on the stack: base type values pointers to reference type values The size of each value stored on the stack must not exceed 256 bits. Since all base types are less than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack. Example: fn f() { let foo: u256 = 42 // foo is stored on the stack let bar: Array = [0; 100] // bar is a memory pointer stored on the stack\n}","breadcrumbs":"Specification (WIP) » Data Layout » Stack » Stack","id":"201","title":"Stack"},"202":{"body":"All data types can be stored in storage.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Storage","id":"202","title":"Storage"},"203":{"body":"Storage pointers for constant size values are determined at compile time. Example: contract Cats { population: u256 // assigned a static location by the compiler\n} The value of a base type in storage is found by simply loading the value from storage at the given pointer. To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Constant size values in storage » Constant size values in storage","id":"203","title":"Constant size values in storage"},"204":{"body":"Maps are not assigned pointers, because they do not have a location in storage. They are instead assigned a nonce that is used to derive the location of keyed values during runtime. Example: contract Foo { bar: Map // bar is assigned a static nonce by the compiler baz: Map> // baz is assigned a static nonce by the compiler\n} The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value .i.e. keccak256(, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to a nested hash i.e. keccak256(keccak256(, 0x00), 0x01).","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Maps in storage » Maps in storage","id":"204","title":"Maps in storage"},"205":{"body":"Reference type values can be copied from storage and into memory using the to_mem function. Example: let my_array_var: Array = self.my_array_field.to_mem()","breadcrumbs":"Specification (WIP) » Data Layout » Storage » to_mem() function » The to_mem function","id":"205","title":"The to_mem function"},"206":{"body":"Only sequence types can be stored in memory. The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly allocated segments begin at the value given by this slot. When more memory has been allocated, the value stored in 0x00 is increased. We do not free memory after it is allocated.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Memory","id":"206","title":"Memory"},"207":{"body":"Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and reference them using pointers kept on the stack. Example: fn f() { let foo: Array = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.\n} To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Sequence types in memory » Sequence types in memory","id":"207","title":"Sequence types in memory"},"208":{"body":"You can contribute to Fe!","breadcrumbs":"Contributing » Contributing","id":"208","title":"Contributing"},"209":{"body":"","breadcrumbs":"Contributing » Ways to contribute:","id":"209","title":"Ways to contribute:"},"21":{"body":"Welcome to the Fe user guide! Here you can find information about how to use Fe to develop smart contracts. Read more about: Installing Fe organizing your code using projects We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!","breadcrumbs":"Using Fe » User guide","id":"21","title":"User guide"},"210":{"body":"If you find problems with Fe you can report them to the development team on the project Github . You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.","breadcrumbs":"Contributing » 1. Reporting or fixing issues.","id":"210","title":"1. Reporting or fixing issues."},"211":{"body":"We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide. To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.","breadcrumbs":"Contributing » 2. Improving the docs.","id":"211","title":"2. Improving the docs."},"212":{"body":"You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling. It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board . Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master. To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.","breadcrumbs":"Contributing » 3. Developing Fe","id":"212","title":"3. Developing Fe"},"213":{"body":"We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter. Please note that this project has a Code of Conduct . By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.","breadcrumbs":"Contributing » 4. Community engagement","id":"213","title":"4. Community engagement"},"214":{"body":"","breadcrumbs":"Contributing » Processes","id":"214","title":"Processes"},"215":{"body":"To report an issue, please use the Github issue board . When reporting issues, please mention the following details: Fe version. your operating system. the steps required to reproduce the issue actual vs expected behaviour any error messages or relevant logs the specific source code where the issue originates The appropriate place for technical discussions about the language itself is the Fe Discord .","breadcrumbs":"Contributing » Reporting issues","id":"215","title":"Reporting issues"},"216":{"body":"Please fork the Fe repository and raise pull requests against the master branch. Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge. New features should be accompanied by appropriate tests. Finally, please make sure you respect the coding style for this project. Thank you for contributing to Fe!","breadcrumbs":"Contributing » Rasing Pull Requests","id":"216","title":"Rasing Pull Requests"},"217":{"body":"🖥️ Download Binaries 📄 Draft Spec ℹ️ Getting Started Fe is moving fast. Read up on all the latest improvements.","breadcrumbs":"Release Notes » Release Notes","id":"217","title":"Release Notes"},"218":{"body":"","breadcrumbs":"Release Notes » 0.26.0 \"Zircon\" (2023-11-03)","id":"218","title":"0.26.0 \"Zircon\" (2023-11-03)"},"219":{"body":"Give option to produce runtime bytecode as compilation artifact Previously, the compiler could only produce the bytecode that is used for the deployment of the contract. Now it can also produce the runtime bytecode which is the bytecode that is saved to storage. Being able to obtain the runtime bytecode is useful for contract verification. To obtain the runtime bytecode use the runtime-bytecode option of the --emit flag (multiple options allowed). Example Output: mycontract.bin (bytecode for deployment) mycontract.runtime.bin (runtime bytecode) ( #947 ) New verify command to verify onchain contracts against local source code. People need to be able to verify that a deployed contract matches the source code that the author claims was used to deploy it. Previously, there was no simple way to achieve this. These are the steps to verify a contract with the verify command: Obtain the project's source code locally. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag) From the project directory run fe verify Example: $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com\nIt's a match!✨ Onchain contract:\nAddress: 0xf0adbb9ed4135d1509ad039505bada942d18755f\nBytecode: 0x60008..76b90 Local contract:\nContract name: SimpleDAO\nSource file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe\nBytecode: 0x60008..76b90 Hint: Run with --verbose to see the contract's source code. ( #948 )","breadcrumbs":"Release Notes » Features","id":"219","title":"Features"},"22":{"body":"At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL . Note: If you happen to be a Windows developer, consider getting involved and help us to support the Windows platform natively. Here would be a good place to start. On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable. /usr/sbin/softwareupdate --install-rosetta --agree-to-license","breadcrumbs":"Using Fe » Installation » Installation","id":"22","title":"Installation"},"220":{"body":"Added a new page on EVM precompiles ( #944 )","breadcrumbs":"Release Notes » Improved Documentation","id":"220","title":"Improved Documentation"},"221":{"body":"","breadcrumbs":"Release Notes » 0.25.0 \"Yoshiokaite\" (2023-10-26)","id":"221","title":"0.25.0 \"Yoshiokaite\" (2023-10-26)"},"222":{"body":"Use the project root as default path for fe test Just run fe test from any directory of the project. ( #913 ) Completed std::buf::MemoryBuffer refactor. ( #917 ) Allow filtering tests to run via fe test --filter (self, mut _ val: T) -> u256 { return val.compute(val: 1000) }\n} contract Example { pub fn run_test(self) { let runner: Runner = Runner(); let mut mac: Mac = Mac(); assert runner.run(mac) == 1001 }\n} ( #865 ) The ctx parameter can now be passed into test functions. example: #test\nfn my_test(ctx: Context) { assert ctx.block_number() == 0\n} ( #880 ) The following has been added to the standard library: Memory buffer abstraction example: use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}\nuse std::traits::Max #test\nfn test_buf_rw() { let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) let mut writer: MemoryBufferWriter = buf.writer() let mut reader: MemoryBufferReader = buf.reader() writer.write(value: 42) writer.write(value: 42) writer.write(value: 26) writer.write(value: u8(26)) writer.write(value: u256::max()) writer.write(value: u128::max()) writer.write(value: u64::max()) writer.write(value: u32::max()) writer.write(value: u16::max()) writer.write(value: u8::max()) writer.write(value: u8(0)) assert reader.read_u256() == 42 assert reader.read_u256() == 42 assert reader.read_u256() == 26 assert reader.read_u8() == 26 assert reader.read_u256() == u256::max() assert reader.read_u128() == u128::max() assert reader.read_u64() == u64::max() assert reader.read_u32() == u32::max() assert reader.read_u16() == u16::max() assert reader.read_u8() == u8::max() assert reader.read_u8() == 0\n} Precompiles example: use std::precompiles\nuse std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter} #test\nfn test_ec_recover() { let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada ) assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)\n} ctx.raw_call() example: use std::buf::{ RawCallBuffer, MemoryBufferReader, MemoryBufferWriter\n}\nuse std::evm contract Foo { pub unsafe fn __call__() { if evm::call_data_load(offset: 0) == 42 { evm::mstore(offset: 0, value: 26) evm::return_mem(offset: 0, len: 32) } else if evm::call_data_load(offset: 0) == 26 { revert } }\n} #test\nfn test_raw_call(mut ctx: Context) { let foo: Foo = Foo.create(ctx, 0) let mut buf: RawCallBuffer = RawCallBuffer::new( input_len: 32, output_len: 32 ) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 42) assert ctx.raw_call(addr: address(foo), value: 0, buf) let mut reader: MemoryBufferReader = buf.reader() assert reader.read_u256() == 26 assert not ctx.raw_call(addr: address(foo), value: 0, buf)\n} ( #885 )","breadcrumbs":"Release Notes » Features","id":"230","title":"Features"},"231":{"body":"Fixed an ICE when using aggregate types with aggregate type fields in public functions This code would previously cause an ICE: struct Tx { pub data: Array\n} contract Foo { pub fn bar(mut tx: Tx) {}\n} ( #867 ) Fixed a regression where the compiler would not reject a method call on a struct in storage. E.g. the follwing code should be rejected as it is missing a to_mem() call: struct Bar { pub x: u256 pub fn get_x(self) -> u256{ return self.x }\n} contract Foo { bar: Bar pub fn __init__(mut self) { self.bar = Bar( x: 2 ) } fn yay(self) { self.bar.get_x() }\n} The compiler will now reject the code and suggest a to_mem() before callingget_x(). ( #881 )","breadcrumbs":"Release Notes » Bugfixes","id":"231","title":"Bugfixes"},"232":{"body":"This is the first non-alpha release of Fe. Read our announcement for more details.","breadcrumbs":"Release Notes » 0.22.0 \"Vulcanite\" (2023-04-05)","id":"232","title":"0.22.0 \"Vulcanite\" (2023-04-05)"},"233":{"body":"Support for tests. example: #test\nfn my_test() { assert 26 + 16 == 42\n} Tests can be executed using the test subcommand. example: $ fe test foo.fe ( #807 ) Fixed broken trait orphan rule Fe has an orphan rule for Traits similar to Rust's that requires that either the trait or the type that we are implementing the trait for are located in the same ingot as the impl. This rule was implemented incorrectly so that instead of requiring them to be in the same ingot, they were required to be in the same module. This change fixes this so that the orphan rule is enforced correctly. ( #863 ) address values can now be specified with a number literal, with no explicit cast. So instead of let t: address = address(0xfe), one can now write let t: address = 0xfe. This also means that it's possible to define const addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe ( #864 )","breadcrumbs":"Release Notes » Features","id":"233","title":"Features"},"234":{"body":"Fixed resolving of generic arguments to associated functions. For example, this code would previously crash the compiler: ... // This function doesn't take self pub fn run_static(_ val: T) -> u256 { return val.compute(val: 1000) }\n... // Invoking it would previously crash the compiler\nRunner::run_static(Mac())\n... ( #861 )","breadcrumbs":"Release Notes » Bugfixes","id":"234","title":"Bugfixes"},"235":{"body":"Changed the Deployment tutorial to use foundry and the Sepolia network ( #853 )","breadcrumbs":"Release Notes » Improved Documentation","id":"235","title":"Improved Documentation"},"236":{"body":"","breadcrumbs":"Release Notes » 0.21.0-alpha (2023-02-28)","id":"236","title":"0.21.0-alpha (2023-02-28)"},"237":{"body":"Support for Self type With this change Self (with capital S) can be used to refer to the enclosing type in contracts, structs, impls and traits. E.g. trait Min { fn min() -> Self;\n} impl Min for u8 { fn min() -> u8 { // Both `u8` or `Self` are valid here return 0 }\n} Usage: u8::min() ( #803 ) Added Min and Max traits to the std library. The std library implements the traits for all numeric types. Example use std::traits::{Min, Max}\n... assert u8::min() < u8::max()\n``` ([#836](https://github.com/ethereum/fe/issues/836)) Upgraded underlying solc compiler to version 0.8.18","breadcrumbs":"Release Notes » Features","id":"237","title":"Features"},"238":{"body":"the release contains minor bugfixes","breadcrumbs":"Release Notes » Bugfixes","id":"238","title":"Bugfixes"},"239":{"body":"","breadcrumbs":"Release Notes » 0.20.0-alpha (2022-12-05)","id":"239","title":"0.20.0-alpha (2022-12-05)"},"24":{"body":"Fe is distributed via a single executable file linked from the home page . In the future we will make sure it can be installed through a variety of popular package managers such as apt. Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac. Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.","breadcrumbs":"Using Fe » Installation » Download the compiler","id":"24","title":"Download the compiler"},"240":{"body":"Removed the event type as well as the emit keyword. Instead the struct type now automatically implements the Emittable trait and can be emitted via ctx.emit(..). Indexed fields can be annotated via the #indexed attribute. E.g. struct Signed { book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg)) }\n} ( #717 ) Allow to call trait methods on types when trait is in scope So far traits were only useful as bounds for generic functions. With this change traits can also be used as illustrated with the following example: trait Double { fn double(self) -> u256;\n} impl Double for (u256, u256) { fn double(self) -> u256 { return (self.item0 + self.item1) * 2 }\n} contract Example { pub fn run_test(self) { assert (0, 1).double() == 2 }\n} If a call turns out to be ambigious the compiler currently asks the user to disambiguate via renaming. In the future we will likely introduce a syntax to allow to disambiguate at the callsite. ( #757 ) Allow contract associated functions to be called via ContractName::function_name() syntax. ( #767 ) Add enum types and match statement. enum can now be defined, e.g., pub enum MyEnum { Unit Tuple(u32, u256, bool) fn unit() -> MyEnum { return MyEnum::Unit }\n} Also, match statement is introduced, e.g., pub fn eval_enum() -> u256{ match MyEnum { MyEnum::Unit => { return 0 } MyEnum::Tuple(a, _, false) => { return u256(a) } MyEnum::Tuple(.., true) => { return u256(1) } }\n} For now, available patterns are restricted to Wildcard(_), which matches all patterns: _ Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c) Boolean literal(true and false) Enum variant. e.g., MyEnum::Tuple(a, b, c) Tuple pattern. e.g., (a, b, c) Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true} Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true) Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true) Fe compiler performs the exhaustiveness and usefulness checks for match statement. So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. ( #770 ) Changed comments to use // instead of # ( #776 ) Added the mut keyword, to mark things as mutable. Any variable or function parameter not marked mut is now immutable. contract Counter { count: u256 pub fn increment(mut self) -> u256 { // `self` is mutable, so storage can be modified self.count += 1 return self.count }\n} struct Point { pub x: u32 pub y: u32 pub fn add(mut self, _ other: Point) { self.x += other.x self.y += other.y // other.x = 1000 // ERROR: `other` is not mutable }\n} fn pointless() { let origin: Point = Point(x: 0, y: 0) // origin.x = 10 // ERROR: origin is not mutable let x: u32 = 10 // x_coord = 100 // ERROR: `x_coord` is not mutable let mut y: u32 = 0 y = 10 // OK let mut p: Point = origin // copies `origin` p.x = 10 // OK, doesn't modify `origin` let mut q: Point = p // copies `p` q.x = 100 // doesn't modify `p` p.add(q) assert p.x == 110\n} Note that, in this release, primitive type function parameters can't be mut. This restriction might be lifted in a future release. For example: fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut x += 1\n} ( #777 ) The contents of the std::prelude module (currently just the Context struct) are now automatically used by every module, so use std::context::Context is no longer required. ( #779 ) When the Fe compiler generates a JSON ABI file for a contract, the \"stateMutability\" field for each function now reflects whether the function can read or modify chain or contract state, based on the presence or absence of the self and ctx parameters, and whether those parameters are mutable. If a function doesn't take self or ctx, it's \"pure\". If a function takes self or ctx immutably, it can read state but not mutate state, so it's a \"view\" If a function takes mut self or mut ctx, it can mutate state, and is thus marked \"payable\". Note that we're following the convention set by Solidity for this field, which isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently distinguish between \"payable\" and \"nonpayable\" functions; if you want a function to revert when Eth is sent, you need to do it manually (eg assert ctx.msg_value() == 0). ( #783 ) Trait associated functions This change allows trait functions that do not take a self parameter. The following demonstrates a possible trait associated function and its usage: trait Max { fn max(self) -> u8;\n} impl Max for u8 { fn max() -> u8 { return u8(255) }\n} contract Example { pub fn run_test(self) { assert u8::max() == 255 }\n} ( #805 )","breadcrumbs":"Release Notes » Features","id":"240","title":"Features"},"241":{"body":"Fix issue where calls to assiciated functions did not enforce visibility rules. E.g the following code should be rejected but previously wasn't: struct Foo { fn do_private_things() { }\n} contract Bar { fn test() { Foo::do_private_things() }\n} With this change, the above code is now rejected because do_private_things is not pub. ( #767 ) Padding on bytes and string ABI types is zeroed out. ( #769 ) Ensure traits from other modules or even ingots can be implemented ( #773 ) Certain cases where the compiler would not reject pure functions being called on instances are now properly rejected. ( #775 ) Reject calling to_mem() on primitive types in storage ( #801 ) Disallow importing private type via use The following was previously allowed but will now error: use foo::PrivateStruct ( #815 )","breadcrumbs":"Release Notes » Bugfixes","id":"241","title":"Bugfixes"},"242":{"body":"","breadcrumbs":"Release Notes » 0.19.1-alpha \"Sunstone\" (2022-07-06)","id":"242","title":"0.19.1-alpha \"Sunstone\" (2022-07-06)"},"243":{"body":"Support returning nested struct. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn return_nested_struct() -> NestedStruct { ... }\n} ( #635 ) Made some small changes to how the Context object is used. ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0)) ctx is required when calling an external contract function that requires ctx Example: use std::context::Context // see issue #679 contract Foo { pub fn emit_stuff(ctx: Context) { emit Stuff(ctx) # will be `ctx.emit(Stuff{})` someday }\n}\ncontract Bar { pub fn call_foo_emit_stuff(ctx: Context) { Foo(address(0)).emit_stuff(ctx) }\n}\nevent Stuff {} ( #703 ) Braces! Fe has abandoned python-style significant whitespace in favor of the trusty curly brace. In addition, elif is now spelled else if, and the pass statement no longer exists. Example: pub struct SomeError {} contract Foo { x: u8 y: u16 pub fn f(a: u8) -> u8 { if a > 10 { let x: u8 = 5 return a + x } else if a == 0 { revert SomeError() } else { return a * 10 } } pub fn noop() {}\n} ( #707 ) traits and generic function parameter Traits can now be defined, e.g: trait Computable { fn compute(self, val: u256) -> u256;\n} The mechanism to implement a trait is via an impl block e.g: struct Linux { pub counter: u256 pub fn get_counter(self) -> u256 { return self.counter } pub fn something_static() -> u256 { return 5 }\n} impl Computable for Linux { fn compute(self, val: u256) -> u256 { return val + Linux::something_static() + self.get_counter() }\n} Traits can only appear as bounds for generic functions e.g.: struct Runner { pub fn run(self, _ val: T) -> u256 { return val.compute(val: 1000) }\n} Only struct functions (not contract functions) can have generic parameters. The run method of Runner can be called with any type that implements Computable e.g. contract Example { pub fn generic_compute(self) { let runner: Runner = Runner(); assert runner.run(Mac()) == 1001 assert runner.run(Linux(counter: 10)) == 1015 }\n} ( #710 ) Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe ( #726 ) Allow using complex type as array element type. Example: contract Foo { pub fn bar() -> i256 { let my_array: Array = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)] let sum: i256 = 0 for pair in my_array { sum += pair.x } return sum }\n} struct Pair { pub x: i256 pub y: i256 pub fn new(_ x: i256, _ y: i256) -> Pair { return Pair(x, y) }\n} ( #730 ) The fe CLI now has subcommands: fe new myproject - creates a new project structure fe check . - analyzes fe source code and prints errors fe build . - builds a fe project ( #732 ) Support passing nested struct types to public functions. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn f(arg: NestedStruct) { ... }\n} ( #733 ) Added support for repeat expressions ([VALUE; LENGTH]). e.g. let my_array: Array = [bool; 42] Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. ( #747 )","breadcrumbs":"Release Notes » Features","id":"243","title":"Features"},"244":{"body":"Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. ( #734 ) Fix issue where a negative constant leads to an ICE E.g. the following code would previously crash the compiler but shouldn't: const INIT_VAL: i8 = -1\ncontract Foo { pub fn init_bar() { let x: i8 = INIT_VAL }\n} ( #745 ) Fix a bug that causes ICE when nested if-statement has multiple exit point. E.g. the following code would previously crash the compiler but shouldn't: pub fn foo(self) { if true { if self.something { return } } if true { if self.something { return } }\n} ( #749 )","breadcrumbs":"Release Notes » Bugfixes","id":"244","title":"Bugfixes"},"245":{"body":"","breadcrumbs":"Release Notes » 0.18.0-alpha \"Ruby\" (2022-05-27)","id":"245","title":"0.18.0-alpha \"Ruby\" (2022-05-27)"},"246":{"body":"Added support for parsing of attribute calls with generic arguments (e.g. foo.bar()). ( #719 )","breadcrumbs":"Release Notes » Features","id":"246","title":"Features"},"247":{"body":"Fix a regression where the stateMutability field would not be included in the generated ABI ( #722 ) Fix two regressions introduced in 0.17.0 Properly lower right shift operation to yul's sar if operand is signed type Properly lower negate operation to call safe_sub ( #723 )","breadcrumbs":"Release Notes » Bugfixes","id":"247","title":"Bugfixes"},"248":{"body":"","breadcrumbs":"Release Notes » 0.17.0-alpha \"Quartz\" (2022-05-26)","id":"248","title":"0.17.0-alpha \"Quartz\" (2022-05-26)"},"249":{"body":"Support for underscores in numbers to improve readability e.g. 100_000. Example let num: u256 = 1000_000_000_000 ( #149 ) Optimized access of struct fields in storage ( #249 ) Unit type () is now ABI encodable ( #442 ) Temporary default stateMutability to payable in ABI The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction. As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. ( #705 )","breadcrumbs":"Release Notes » Features","id":"249","title":"Features"},"25":{"body":"In order to be able to execute the Fe compiler we will have to make the file executable . This can be done by navigating to the directory where the file is located and executing chmod + x (e.g. chmod +x fe). After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to: fe 0.21.0-alpha\nThe Fe Developers \nAn implementation of the Fe smart contract language USAGE: fe_amd64_latest OPTIONS: -h, --help Print help information -V, --version Print version information SUBCOMMANDS: build Build the current project check Analyze the current project and report errors, but don't build artifacts help Print this message or the help of the given subcommand(s) new Create new fe project","breadcrumbs":"Using Fe » Installation » Add permission to execute","id":"25","title":"Add permission to execute"},"250":{"body":"Fixed a crash caused by certain memory to memory assignments. E.g. the following code would previously lead to a compiler crash: my_struct.x = my_struct.y ( #590 ) Reject unary minus operation if the target type is an unsigned integer number. Code below should be reject by fe compiler: contract Foo: pub fn bar(self) -> u32: let unsigned: u32 = 1 return -unsigned pub fn foo(): let a: i32 = 1 let b: u32 = -a ( #651 ) Fixed crash when passing a struct that contains an array E.g. the following would previously result in a compiler crash: struct MyArray: pub x: Array contract Foo: pub fn bar(my_arr: MyArray): pass ( #681 ) reject infinite size struct definitions. Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. ( #682 ) Return instead of revert when contract is called without data. If a contract is called without data so that no function is invoked, we would previously revert but that would leave us without a way to send ETH to a contract so instead it will cause a return now. ( #694 ) Resolve compiler crash when using certain reserved YUL words as struct field names. E.g. the following would previously lead to a compiler crash because numer is a reserved keyword in YUL. struct Foo: pub number: u256 contract Meh: pub fn yay() -> Foo: return Foo(number:2) ( #709 )","breadcrumbs":"Release Notes » Bugfixes","id":"250","title":"Bugfixes"},"251":{"body":"","breadcrumbs":"Release Notes » 0.16.0-alpha (2022-05-05)","id":"251","title":"0.16.0-alpha (2022-05-05)"},"252":{"body":"Change static function call syntax from Bar.foo() to Bar::foo() ( #241 ) Added support for retrieving the base fee via ctx.base_fee() ( #503 )","breadcrumbs":"Release Notes » Features","id":"252","title":"Features"},"253":{"body":"Resolve functions on structs via path (e.g. bi::ba::bums()) ( #241 )","breadcrumbs":"Release Notes » Bugfixes","id":"253","title":"Bugfixes"},"254":{"body":"","breadcrumbs":"Release Notes » 0.15.0-alpha (2022-04-04)","id":"254","title":"0.15.0-alpha (2022-04-04)"},"255":{"body":"Labels are now required on function arguments. Labels can be omitted if the argument is a variable with a name that matches the label, or if the function definition specifies that an argument should have no label. Functions often take several arguments of the same type; compiler-checked labels can help prevent accidentally providing arguments in the wrong order. Example: contract CoolCoin: balance: Map loans: Map<(address, address), i256> pub fn demo(self, ann: address, bob: address): let is_loan: bool = false self.give(from: ann, to: bob, 100, is_loan) fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool): self.cred[sender] -= val self.cred[recipient] += val if is_loan: self.loans[(sender, recipient)] += val Note that arguments must be provided in the order specified in the function definition. A parameter's label defaults to the parameter name, but can be changed by specifying a different label to the left of the parameter name. Labels should be clear and convenient for the caller, while parameter names are only used in the function body, and can thus be longer and more descriptive. In the example above, we choose to use sender and recipient as identifiers in the body of fn transfer, but use labels from: and to:. In cases where it's ideal to not have labels, e.g. if a function takes a single argument, or if types are sufficient to differentiate between arguments, use _ to specify that a given parameter has no label. It's also fine to require labels for some arguments, but not others. Example: fn add(_ x: u256, _ y: u256) -> u256: return x + y contract Foo: fn transfer(self, _ to: address, wei: u256): pass pub fn demo(self): transfer(address(0), wei: add(1000, 42)) ( #397 )","breadcrumbs":"Release Notes » Features","id":"255","title":"Features"},"256":{"body":"The region of memory used to compute the slot of a storage map value was not being allocated. ( #684 )","breadcrumbs":"Release Notes » Bugfixes","id":"256","title":"Bugfixes"},"257":{"body":"","breadcrumbs":"Release Notes » 0.14.0-alpha (2022-03-02)","id":"257","title":"0.14.0-alpha (2022-03-02)"},"258":{"body":"Events can now be defined outside of contracts. Example: event Transfer: idx sender: address idx receiver: address value: u256 contract Foo: fn transferFoo(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) contract Bar: fn transferBar(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) ( #80 ) The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block. Example: use std::evm::{mstore, mload} fn memory_shenanigans(): unsafe: mstore(0x20, 42) let x: u256 = mload(0x20) assert x == 42 The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. The global function send_value has been ported to Fe, and is now available as std::send_value. ( #629 ) Support structs that have non-base type fields in storage. Example: struct Point: pub x: u256 pub y: u256 struct Bar: pub name: String<3> pub numbers: Array pub point: Point pub something: (u256, bool) contract Foo: my_bar: Bar pub fn complex_struct_in_storage(self) -> String<3>: self.my_bar = Bar( name: \"foo\", numbers: [1, 2], point: Point(x: 100, y: 200), something: (1, true), ) # Asserting the values as they were set initially assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 # We can change the values of the array self.my_bar.numbers[0] = 10 self.my_bar.numbers[1] = 20 assert self.my_bar.numbers[0] == 10 assert self.my_bar.numbers[1] == 20 # We can set the array itself self.my_bar.numbers = [1, 2] assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 # We can change the values of the Point self.my_bar.point.x = 1000 self.my_bar.point.y = 2000 assert self.my_bar.point.x == 1000 assert self.my_bar.point.y == 2000 # We can set the point itself self.my_bar.point = Point(x=100, y=200) assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 # We can change the value of the tuple self.my_bar.something.item0 = 10 self.my_bar.something.item1 = false assert self.my_bar.something.item0 == 10 assert not self.my_bar.something.item1 # We can set the tuple itself self.my_bar.something = (1, true) assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 return self.my_bar.name.to_mem() ( #636 ) Features that read and modify state outside of contracts are now implemented on a struct named \"Context\". Context is included in the standard library and can be imported with use std::context::Context. Instances of Context are created by calls to public functions that declare it in the signature or by unsafe code. Basic example: use std::context::Context contract Foo: my_num: u256 pub fn baz(ctx: Context) -> u256: return ctx.block_number() pub fn bing(self, new_num: u256) -> u256: self.my_num = new_num return self.my_num contract Bar: pub fn call_baz(ctx: Context, foo_addr: address) -> u256: # future syntax: `let foo = ctx.load(foo_addr)` let foo: Foo = Foo(ctx, foo_addr) return foo.baz() pub fn call_bing(ctx: Context) -> u256: # future syntax: `let foo = ctx.create(0)` let foo: Foo = Foo.create(ctx, 0) return foo.bing(42) Example with __call__ and unsafe block: use std::context::Context\nuse std::evm contract Foo: pub fn __call__(): unsafe: # creating an instance of `Context` is unsafe let ctx: Context = Context() let value: u256 = u256(bar(ctx)) # return `value` evm::mstore(0, value) evm::return_mem(0, 32) fn bar(ctx: Context) -> address: return ctx.self_address() ( #638 )","breadcrumbs":"Release Notes » Features","id":"258","title":"Features"},"259":{"body":"","breadcrumbs":"Release Notes » Features","id":"259","title":"Features"},"26":{"body":"You can also build Fe from the source code provided in our Github repository . To do this you will need to have Rust installed. Then, clone the github repository using: git clone https://github.com/ethereum/fe.git Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system: sudo apt-get update &&\\ apt-get install libboost-all-dev &&\\ apt-get install libclang-dev &&\\ apt-get install cmake Navigate to the folder containing the Fe source code. cd fe Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend. cargo build -r --feature solc-backend You will now find your Fe binary in /target/release. Check the build with: ./target/release/fe --version If everything worked, you should see the Fe version printed to the terminal: fe 0.24.0 You can run the built-in tests using: cargo test --workspace --features solc-backend","breadcrumbs":"Using Fe » Installation » Building from source","id":"26","title":"Building from source"},"260":{"body":"Example: contract Foo: pub fn bar(): const LOCAL_CONST: i32 = 1","breadcrumbs":"Release Notes » Support local constant","id":"260","title":"Support local constant"},"261":{"body":"Example: const GLOBAL: i32 = 8 contract Foo: pub fn bar(): const LOCAL: i32 = GLOBAL * 8","breadcrumbs":"Release Notes » Support constant expression","id":"261","title":"Support constant expression"},"262":{"body":"Example: const GLOBAL: u256= 8\nconst USE_GLOBAL: bool = false\ntype MY_ARRAY = Array contract Foo: pub fn bar(): let my_array: Array","breadcrumbs":"Release Notes » Support constant generics expression","id":"262","title":"Support constant generics expression"},"263":{"body":"","breadcrumbs":"Release Notes » Bug fixes","id":"263","title":"Bug fixes"},"264":{"body":"Example: const GLOBAL: i32 = \"FOO\" contract Foo: pub fn bar(): let FOO: i32 = GLOBAL","breadcrumbs":"Release Notes » Fix ICE when constant type is mismatch","id":"264","title":"Fix ICE when constant type is mismatch"},"265":{"body":"Example: const BAR: i32 = 1 contract FOO: pub fn bar(): BAR = 10 ( #649 ) Argument label syntax now uses : instead of =. Example: struct Foo: x: u256 y: u256 let x: MyStruct = MyStruct(x: 10, y: 11)\n# previously: MyStruct(x = 10, y = 11) ( #665 ) Support module-level pub modifier, now default visibility of items in a module is private. Example: # This constant can be used outside of the module.\npub const PUBLIC:i32 = 1 # This constant can NOT be used outside of the module.\nconst PRIVATE: i32 = 1 ( #677 )","breadcrumbs":"Release Notes » Fix ICE when assigning value to constant twice","id":"265","title":"Fix ICE when assigning value to constant twice"},"266":{"body":"Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed. An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun. Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file. parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax. ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. ( #628 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"266","title":"Internal Changes - for Fe Contributors"},"267":{"body":"","breadcrumbs":"Release Notes » 0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)","id":"267","title":"0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)"},"268":{"body":"Support private fields on structs Public fields now need to be declared with the pub modifier, otherwise they default to private fields. If a struct contains private fields it can not be constructed directly except from within the struct itself. The recommended way is to implement a method new(...) as demonstrated in the following example. struct House: pub price: u256 pub size: u256 vacant: bool pub fn new(price: u256, size: u256) -> House return House(price=price, size=size, vacant=true) contract Manager: house: House pub fn create_house(price: u256, size: u256): self.house = House::new(price, size) let can_access_price: u256 = self.house.price # can not access `self.house.vacant` because the field is private ( #214 ) Support non-base type fields in structs Support is currently limited in two ways: Structs with complex fields can not be returned from public functions Structs with complex fields can not be stored in storage ( #343 ) Addresses can now be explicitly cast to u256. For example: fn f(addr: address) -> u256: return u256(addr) ( #621 ) A special function named __call__ can now be defined in contracts. The body of this function will execute in place of the standard dispatcher when the contract is called. example (with intrinsics): contract Foo: pub fn __call__(self): unsafe: if __calldataload(0) == 1: __revert(0, 0) else: __return(0, 0) ( #622 )","breadcrumbs":"Release Notes » Features","id":"268","title":"Features"},"269":{"body":"Fixed a crash that happend when using a certain unprintable ASCII char ( #551 ) The argument to revert wasn't being lowered by the compiler, meaning that some revert calls would cause a compiler panic in later stages. For example: const BAD_MOJO: u256 = 0xdeaddead struct Error: code: u256 fn fail(): revert Error(code = BAD_MOJO) ( #619 ) Fixed a regression where an empty list expression ([]) would lead to a compiler crash. ( #623 ) Fixed a bug where int array elements were not sign extended in their ABI encodings. ( #633 )","breadcrumbs":"Release Notes » Bugfixes","id":"269","title":"Bugfixes"},"27":{"body":"Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension . In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then \"Install Extension\") and search for fe-lang.code-ve. Click on the extension and then click on the Install button. We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.","breadcrumbs":"Using Fe » Installation » Editor support & Syntax highlighting","id":"27","title":"Editor support & Syntax highlighting"},"270":{"body":"","breadcrumbs":"Release Notes » 0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)","id":"270","title":"0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)"},"271":{"body":"Added unsafe low-level \"intrinsic\" functions, that perform raw evm operations. For example: fn foo(): unsafe: __mtore(0, 5000) assert __mload(0) == 5000 The functions available are exactly those defined in yul's \"evm dialect\": https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct. These are intended to be used for implementing basic standard library functionality, and shouldn't typically be needed in normal contract code. Note: some intrinsic functions don't return a value (eg __log0); using these functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) will currently result in a compiler panic in the yul compilation phase. ( #603 ) Added an out of bounds check for accessing array items. If an array index is retrieved at an index that is not within the bounds of the array it now reverts with Panic(0x32). ( #606 )","breadcrumbs":"Release Notes » Features","id":"271","title":"Features"},"272":{"body":"Ensure ternary expression short circuit. Example: contract Foo: pub fn bar(input: u256) -> u256: return 1 if input > 5 else revert_me() fn revert_me() -> u256: revert return 0 Previous to this change, the code above would always revert no matter which branch of the ternary expressions it would resolve to. That is because both sides were evaluated and then one side was discarded. With this change, only the branch that doesn't get picked won't get evaluated at all. The same is true for the boolean operations and and or. ( #488 )","breadcrumbs":"Release Notes » Bugfixes","id":"272","title":"Bugfixes"},"273":{"body":"Added a globally available dummy std lib. This library contains a single get_42 function, which can be called using std::get_42(). Once low-level intrinsics have been added to the language, we can delete get_42 and start adding useful code. ( #601 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"273","title":"Internal Changes - for Fe Contributors"},"274":{"body":"","breadcrumbs":"Release Notes » 0.11.0-alpha \"Karlite\" (2021-12-02)","id":"274","title":"0.11.0-alpha \"Karlite\" (2021-12-02)"},"275":{"body":"Added support for multi-file inputs. Implementation details: Mostly copied Rust's crate system, but use the term ingot instead of crate. Below is an example of an ingot's file tree, as supported by the current implementation. `-- basic_ingot `-- src |-- bar | `-- baz.fe |-- bing.fe |-- ding | |-- dang.fe | `-- dong.fe `-- main.fe There are still a few features that will be worked on over the coming months: source files accompanying each directory module (e.g. my_mod.fe) configuration files and the ability to create library ingots test directories module-level pub modifier (all items in a module are public) mod statements (all fe files in the input tree are public modules) These things will be implemented in order of importance over the next few months. ( #562 ) The syntax for array types has changed to match other generic types. For example, u8[4] is now written Array. ( #571 ) Functions can now be defined on struct types. Example: struct Point: x: u64 y: u64 # Doesn't take `self`. Callable as `Point.origin()`. # Note that the syntax for this will soon be changed to `Point::origin()`. pub fn origin() -> Point: return Point(x=0, y=0) # Takes `self`. Callable on a value of type `Point`. pub fn translate(self, x: u64, y: u64): self.x += x self.y += y pub fn add(self, other: Point) -> Point: let x: u64 = self.x + other.x let y: u64 = self.y + other.y return Point(x, y) pub fn hash(self) -> u256: return keccak256(self.abi_encode()) pub fn do_pointy_things(): let p1: Point = Point.origin() p1.translate(5, 10) let p2: Point = Point(x=1, y=2) let p3: Point = p1.add(p2) assert p3.x == 6 and p3.y == 12 ( #577 )","breadcrumbs":"Release Notes » Features","id":"275","title":"Features"},"276":{"body":"Fixed a rare compiler crash. Example: let my_array: i256[1] = [-1 << 1] Previous to this fix, the given example would lead to an ICE. ( #550 ) Contracts can now create an instance of a contract defined later in a file. This issue was caused by a weakness in the way we generated yul. ( #596 )","breadcrumbs":"Release Notes » Bugfixes","id":"276","title":"Bugfixes"},"277":{"body":"File IDs are now attached to Spans. ( #587 ) The fe analyzer now builds a dependency graph of source code \"items\" (functions, contracts, structs, etc). This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) output. Note that the yul output is still cluttered with utility functions that may or may not be needed by a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many of these utility functions into fe; when this happens they'll become part of the dependency graph and will only be included in the yul output when needed. The dependency graph will also enable future analyzer warnings about unused code. ( #596 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"277","title":"Internal Changes - for Fe Contributors"},"278":{"body":"","breadcrumbs":"Release Notes » 0.10.0-alpha (2021-10-31)","id":"278","title":"0.10.0-alpha (2021-10-31)"},"279":{"body":"Support for module level constants for base types Example: const TEN = 10 contract pub fn do_moon_math(self) -> u256: return 4711 * TEN The values of base type constants are always inlined. ( #192 ) Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) ( #492 ) Replaced import statements with use statements. Example: use foo::{bar::*, baz as baz26} Note: this only adds support for parsing use statements. ( #547 ) Functions can no be defined outside of contracts. Example: fn add_bonus(x: u256) -> u256: return x + 10 contract PointTracker: points: Map pub fn add_points(self, user: address, val: u256): self.points[user] += add_bonus(val) ( #566 ) Implemented a send_value(to: address, value_in_wei: u256) function. The function is similar to the sendValue function by OpenZeppelin with the differences being that: It reverts with Error(0x100) instead of Error(\"Address: insufficient balance\") to safe more gas. It uses selfbalance() instead of balance(address()) to safe more gas It reverts with Error(0x101) instead of Error(\"Address: unable to send value, recipient may have reverted\") also to safe more gas. ( #567 ) Added support for unsafe functions and unsafe blocks within functions. Note that there's currently no functionality within Fe that requires the use of unsafe, but we plan to add built-in unsafe functions that perform raw evm operations which will only callable within an unsafe block or function. ( #569 ) Added balance() and balance_of(account: address) methods. ( #572 ) Added support for explicit casting between numeric types. Example: let a: i8 = i8(-1)\nlet a1: i16 = i16(a)\nlet a2: u16 = u16(a1) assert a2 == u16(65535) let b: i8 = i8(-1)\nlet b1: u8 = u8(b)\nlet b2: u16 = u16(b1) assert b2 == u16(255) Notice that Fe allows casting between any two numeric types but does not allow to change both the sign and the size of the type in one step as that would leave room for ambiguity as the example above demonstrates. ( #576 )","breadcrumbs":"Release Notes » Features","id":"279","title":"Features"},"28":{"body":"A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.","breadcrumbs":"Using Fe » Using projects » Fe projects","id":"28","title":"Fe projects"},"280":{"body":"Adjust numeric values loaded from memory or storage Previous to this fix numeric values that were loaded from either memory or storage were not properly loaded on the stack which could result in numeric values not treated as intended. Example: contract Foo: pub fn bar() -> i8: let in_memory: i8[1] = [-3] return in_memory[0] In the example above bar() would not return -3 but 253 instead. ( #524 ) Propagate reverts from external contract calls. Before this fix the following code to should_revert() or should_revert2() would succeed even though it clearly should not. contract A: contract_b: B pub fn __init__(contract_b: address): self.contract_b = B(contract_b) pub fn should_revert(): self.contract_b.fail() pub fn should_revert2(): self.contract_b.fail_with_custom_error() struct SomeError: pass contract B: pub fn fail(): revert pub fn fail_with_custom_error(): revert SomeError() With this fix the revert errors are properly passed upwards the call hierachy. ( #574 ) Fixed bug in left shift operation. Example: Let's consider the value 1 as an u8 which is represented as the following 256 bit item on the EVM stack 00..|00000001|. A left shift of 8 bits (val << 8) turns that into 00..01|00000000|. Previous to this fix this resulted in the compiler taking 256 as the value for the u8 when clearly 256 is not even in the range of u8 anymore. With this fix the left shift operations was fixed to properly \"clean up\" the result of the shift so that 00..01|00000000| turns into 00..00|00000000|. ( #575 ) Ensure negation is checked and reverts with over/underflow if needed. Example: The minimum value for an i8 is -128 but the maximum value of an i8 is 127 which means that negating -128 should lead to an overflow since 128 does not fit into an i8. Before this fix, negation operations where not checked for over/underflow resulting in returning the oversized value. ( #578 )","breadcrumbs":"Release Notes » Bugfixes","id":"280","title":"Bugfixes"},"281":{"body":"In the analysis stage, all name resolution (of variable names, function names, type names, etc used in code) now happens via a single resolve_name pathway, so we can catch more cases of name collisions and log more helpful error messages. ( #555 ) Added a new category of tests: differential contract testing. Each of these tests is pased on a pair of contracts where one implementation is written in Fe and the other one is written in Solidity. The implementations should have the same public APIs and are assumed to always return identical results given equal inputs. The inputs are randomly generated using proptest and hence are expected to discover unknown bugs. ( #578 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"281","title":"Internal Changes - for Fe Contributors"},"282":{"body":"","breadcrumbs":"Release Notes » 0.9.0-alpha (2021-09-29)","id":"282","title":"0.9.0-alpha (2021-09-29)"},"283":{"body":"The self variable is no longer implicitly defined in code blocks. It must now be declared as the first parameter in a function signature. Example: contract Foo: my_stored_num: u256 pub fn bar(self, my_num: u256): self.my_stored_num = my_num pub fn baz(self): self.bar(my_pure_func()) pub fn my_pure_func() -> u256: return 42 + 26 ( #520 ) The analyzer now disallows defining a type, variable, or function whose name conflicts with a built-in type, function, or object. Example: error: type name conflicts with built-in type\n┌─ compile_errors/shadow_builtin_type.fe:1:6\n│\n1 │ type u256 = u8\n│ ^^^^ `u256` is a built-in type ( #539 )","breadcrumbs":"Release Notes » Features","id":"283","title":"Features"},"284":{"body":"Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. ( #534 ) Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) are no longer ignored if the semantic analysis stage succeeds. ( #535 ) Fixed issue #531 by adding a $ to the front of lowered tuple names. ( #546 )","breadcrumbs":"Release Notes » Bugfixes","id":"284","title":"Bugfixes"},"285":{"body":"Implemented pretty printing of Fe AST. ( #540 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"285","title":"Internal Changes - for Fe Contributors"},"286":{"body":"","breadcrumbs":"Release Notes » 0.8.0-alpha \"Haxonite\" (2021-08-31)","id":"286","title":"0.8.0-alpha \"Haxonite\" (2021-08-31)"},"287":{"body":"Support quotes, tabs and carriage returns in string literals and otherwise restrict string literals to the printable subset of the ASCII table. ( #329 ) The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation. Types can now refer to other types defined later in the file. Example: type Posts = Map\ntype PostId = u256\ntype PostBody = String<140> Duplicate definition errors now show the location of the original definition. The analysis of each function, type definition, etc happens independently, so an error in one doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. ( #468 ) Function definitions are now denoted with the keyword fn instead of def. ( #496 ) Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. ( #509 ) Implemented support for numeric unary invert operator (~) ( #526 )","breadcrumbs":"Release Notes » Features","id":"287","title":"Features"},"288":{"body":"Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. ( #468 ) Fixed an issue where certain expressions were not being moved to the correct location. ( #493 ) Fixed an issue with a missing return statement not properly detected. Previous to this fix, the following code compiles but it should not: contract Foo: pub fn bar(val: u256) -> u256: if val > 1: return 5 With this change, the compiler rightfully detects that the code is missing a return or revert statement after the if statement since it is not guaranteed that the path of execution always follows the arm of the if statement. ( #497 ) Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, resulting in an internal compiler error in a later pass. Example: my_tuple.item001. These are now rejected with an error message. ( #510 ) Check call argument labels for function calls. Previously the compiler would not check any labels that were used when making function calls on self or external contracts. This can be especially problematic if gives developers the impression that they could apply function arguments in any order as long as they are named which is not the case. contract Foo: pub fn baz(): self.bar(val2=1, doesnt_even_exist=2) pub fn bar(val1: u256, val2: u256): pass Code as the one above is now rightfully rejected by the compiler. ( #517 )","breadcrumbs":"Release Notes » Bugfixes","id":"288","title":"Bugfixes"},"289":{"body":"Various improvements and bug fixes to both the content and layout of the specification. ( #489 ) Document all remaining statements and expressions in the spec. Also added a CI check to ensure code examples in the documentation are validated against the latest compiler. ( #514 )","breadcrumbs":"Release Notes » Improved Documentation","id":"289","title":"Improved Documentation"},"29":{"body":"You can start a project using the new subcommand: $ fe new This will generate a template project containing the following: A src directory containing two .fe files. A fe.toml manifest with basic project info and some local project imports.","breadcrumbs":"Using Fe » Using projects » Creating a project","id":"29","title":"Creating a project"},"290":{"body":"Separated Fe type traits between crates. ( #485 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"290","title":"Internal Changes - for Fe Contributors"},"291":{"body":"","breadcrumbs":"Release Notes » 0.7.0-alpha \"Galaxite\" (2021-07-27)","id":"291","title":"0.7.0-alpha \"Galaxite\" (2021-07-27)"},"292":{"body":"Enable the optimizer by default. The optimizer can still be disabled by supplying --optimize=false as an argument. ( #439 ) The following checks are now performed while decoding data: The size of the encoded data fits within the size range known at compile-time. Values are correctly padded. unsigned integers, addresses, and bools are checked to have correct left zero padding the size of signed integers are checked bytes and strings are checked to have correct right padding Data section offsets are consistent with the size of preceding values in the data section. The dynamic size of strings does not exceed their maximum size. The dynamic size of byte arrays (u8[n]) is equal to the size of the array. ( #440 ) Type aliases can now include tuples. Example: type InternetPoints = (address, u256) ( #459 ) Revert with custom errors Example: struct PlatformError: code: u256 pub fn do_something(): revert PlatformError(code=4711) Error encoding follows Solidity which is based on EIP-838 . This means that custom errors returned from Fe are fully compatible with Solidity. ( #464 ) The builtin value msg.sig now has type u256. Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. ( #472 ) Encode certain reverts as panics. With this change, the following reverts are encoded as Panic(uint256) with the following panic codes: 0x01: An assertion that failed and did not specify an error message 0x11: An arithmetic expression resulted in an over- or underflow 0x12: An arithmetic expression divided or modulo by zero The panic codes are aligned with the panic codes that Solidity uses . ( #476 )","breadcrumbs":"Release Notes » Features","id":"292","title":"Features"},"293":{"body":"Fixed a crash when trying to access an invalid attribute on a string. Example: contract Foo: pub fn foo(): \"\".does_not_exist The above now yields a proper user error. ( #444 ) Ensure String type is capitalized in error messages ( #445 ) Fixed ICE when using a static string that spans over multiple lines. Previous to this fix, the following code would lead to a compiler crash: contract Foo: pub fn return_with_newline() -> String<16>: return \"foo balu\" The above code now works as intended. ( #448 ) Fixed ICE when using a tuple declaration and specifying a non-tuple type. Fixed a second ICE when using a tuple declaration where the number of target items doesn't match the number of items in the declared type. ( #469 )","breadcrumbs":"Release Notes » Bugfixes","id":"293","title":"Bugfixes"},"294":{"body":"Cleaned up ABI encoding internals. Improved yulc panic formatting. ( #472 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"294","title":"Internal Changes - for Fe Contributors"},"295":{"body":"","breadcrumbs":"Release Notes » 0.6.0-alpha \"Feldspar\" (2021-06-10)","id":"295","title":"0.6.0-alpha \"Feldspar\" (2021-06-10)"},"296":{"body":"Support for pragma statement Example: pragma ^0.1.0 ( #361 ) Add support for tuple destructuring Example: my_tuple: (u256, bool) = (42, true)\n(x, y): (u256, bool) = my_tuple ( #376 ) Call expression can now accept generic arguments Replace stringN to String Example: s: String<10> = String<10>(\"HI\") ( #379 ) Many analyzer errors now include helpful messages and underlined code. Event and struct constructor arguments must now be labeled and in the order specified in the definition. The analyzer now verifies that the left-hand side of an assignment is actually assignable. ( #398 ) Types of integer literal are now inferred, rather than defaulting to u256. contract C: fn f(x: u8) -> u16: y: u8 = 100 # had to use u8(100) before z: i8 = -129 # \"literal out of range\" error return 1000 # had to use `return u16(1000)` before fn g(): self.f(50) Similar inference is done for empty array literals. Previously, empty array literals caused a compiler crash, because the array element type couldn't be determined. contract C: fn f(xs: u8[10]): pass fn g(): self.f([]) (Note that array length mismatch is still a type error, so this code won't actually compile.) ( #429 ) The Map type name is now capitalized. Example: contract GuestBook: guests: Map> ( #431 ) Convert all remaining errors to use the new advanced error reporting system ( #432 ) Analyzer throws an error if __init__ is not public. ( #435 )","breadcrumbs":"Release Notes » Features","id":"296","title":"Features"},"297":{"body":"Refactored front-end \"not implemented\" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. ( #437 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"297","title":"Internal Changes - for Fe Contributors"},"298":{"body":"","breadcrumbs":"Release Notes » 0.5.0-alpha (2021-05-27)","id":"298","title":"0.5.0-alpha (2021-05-27)"},"299":{"body":"Add support for hexadecimal/octal/binary numeric literals. Example: value_hex: u256 = 0xff\nvalue_octal: u256 = 0o77\nvalue_binary: u256 = 0b11 ( #333 ) Added support for list expressions. Example: values: u256[3] = [10, 20, 30] # or anywhere else where expressions can be used such as in a call sum: u256 = self.sum([10, 20, 30]) ( #388 ) Contracts, events, and structs can now be empty. e.g. event MyEvent: pass ... contract MyContract: pass ... struct MyStruct: pass ( #406 ) External calls can now handle dynamically-sized return types. ( #415 )","breadcrumbs":"Release Notes » Features","id":"299","title":"Features"},"3":{"body":"One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours. The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability , Fe will provide an enhanced developer experience for everyone working with the EVM.","breadcrumbs":"Introduction » What problems does Fe solve?","id":"3","title":"What problems does Fe solve?"},"30":{"body":"The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run. For example: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = \"../lib\" You can also specify which version of a particular dependency you want to use, using curly braces: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = {path = \"../lib\", version = \"1.0\"}","breadcrumbs":"Using Fe » Using projects » Manifest","id":"30","title":"Manifest"},"300":{"body":"The analyzer will return an error if a tuple attribute is not of the form item. ( #401 )","breadcrumbs":"Release Notes » Bugfixes","id":"300","title":"Bugfixes"},"301":{"body":"Created a landing page for Fe at https://fe-lang.org ( #394 ) Provide a Quickstart chapter in Fe Guide ( #403 )","breadcrumbs":"Release Notes » Improved Documentation","id":"301","title":"Improved Documentation"},"302":{"body":"Using insta to validate Analyzer outputs. ( #387 ) Analyzer now disallows using context.add_ methods to update attributes. ( #392 ) () now represents a distinct type internally called the unit type, instead of an empty tuple. The lowering pass now does the following: Valueless return statements are given a () value and functions without a return value are given explicit () returns. ( #406 ) Add CI check to ensure fragment files always end with a new line ( #4711 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"302","title":"Internal Changes - for Fe Contributors"},"303":{"body":"","breadcrumbs":"Release Notes » 0.4.0-alpha (2021-04-28)","id":"303","title":"0.4.0-alpha (2021-04-28)"},"304":{"body":"Support for revert messages in assert statements E.g assert a == b, \"my revert statement\" The provided string is abi-encoded as if it were a call to a function Error(string). For example, the revert string \"Not enough Ether provided.\" returns the following hexadecimal as error return data: 0x08c379a0 // Function selector for Error(string)\n0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset\n0x000000000000000000000000000000000000000000000000000000000000001a // String length\n0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data ( #288 ) Added support for augmented assignments. e.g. contract Foo: pub fn add(a: u256, b: u256) -> u256: a += b return a pub fn sub(a: u256, b: u256) -> u256: a -= b return a pub fn mul(a: u256, b: u256) -> u256: a *= b return a pub fn div(a: u256, b: u256) -> u256: a /= b return a pub fn mod(a: u256, b: u256) -> u256: a %= b return a pub fn pow(a: u256, b: u256) -> u256: a **= b return a pub fn lshift(a: u8, b: u8) -> u8: a <<= b return a pub fn rshift(a: u8, b: u8) -> u8: a >>= b return a pub fn bit_or(a: u8, b: u8) -> u8: a |= b return a pub fn bit_xor(a: u8, b: u8) -> u8: a ^= b return a pub fn bit_and(a: u8, b: u8) -> u8: a &= b return a ( #338 ) A new parser implementation, which provides more helpful error messages with fancy underlines and code context. ( #346 ) Added support for tuples with base type items. e.g. contract Foo: my_num: u256 pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool): my_tuple: (u256, bool) = (my_num, my_bool) self.my_num = my_tuple.item0 return my_tuple ( #352 )","breadcrumbs":"Release Notes » Features","id":"304","title":"Features"},"305":{"body":"Properly reject invalid emit ( #211 ) Properly tokenize numeric literals when they start with 0 ( #331 ) Reject non-string assert reasons as type error ( #335 ) Properly reject code that creates a circular dependency when using create or create2. Example, the following code is now rightfully rejected because it tries to create an instance of Foo from within the Foo contract itself. contract Foo: pub fn bar()->address: foo:Foo=Foo.create(0) return address(foo) ( #362 )","breadcrumbs":"Release Notes » Bugfixes","id":"305","title":"Bugfixes"},"306":{"body":"AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. ( #332 ) Added support for running tests against solidity fixtures. Also added tests that cover how solidity encodes revert reason strings. ( #342 ) Refactoring of binary operation type checking. ( #347 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"306","title":"Internal Changes - for Fe Contributors"},"307":{"body":"","breadcrumbs":"Release Notes » 0.3.0-alpha \"Calamine\" (2021-03-24)","id":"307","title":"0.3.0-alpha \"Calamine\" (2021-03-24)"},"308":{"body":"Add over/underflow checks for multiplications of all integers ( #271 ) Add full support for empty Tuples. ( #276 ) All functions in Fe implicitly return an empty Tuple if they have no other return value. However, before this change one was not able to use the empty Tuple syntax () explicitly. With this change, all of these are treated equally: contract Foo: pub fn explicit_return_a1(): return pub fn explicit_return_a2(): return () pub fn explicit_return_b1() ->(): return pub fn explicit_return_b2() ->(): return () pub fn implicit_a1(): pass pub fn implicit_a2() ->(): pass The JSON ABI builder now supports structs as both input and output. ( #296 ) Make subsequently defined contracts visible. Before this change: # can't see Bar\ncontract Foo: ...\n# can see Foo\ncontract Bar: ... With this change the restriction is lifted and the following becomes possible. ( #298 ) contract Foo: bar: Bar pub fn external_bar() -> u256: return self.bar.bar()\ncontract Bar: foo: Foo pub fn external_foo() -> u256: return self.foo.foo() Perform checks for divison operations on integers ( #308 ) Support for msg.sig to read the function identifier. ( #311 ) Perform checks for modulo operations on integers ( #312 ) Perform over/underflow checks for exponentiation operations on integers ( #313 )","breadcrumbs":"Release Notes » Features","id":"308","title":"Features"},"309":{"body":"Properly reject emit not followed by an event invocation ( #212 ) Properly reject octal number literals ( #222 ) Properly reject code that tries to emit a non-existing event. ( #250 ) Example that now produces a compile time error: emit DoesNotExist() Contracts that create other contracts can now include __init__ functions. See https://github.com/ethereum/fe/issues/284 ( #304 ) Prevent multiple types with same name in one module. ( #317 ) Examples that now produce compile time errors: type bar = u8\ntype bar = u16 or struct SomeStruct: some_field: u8 struct SomeStruct: other: u8 or contract SomeContract: some_field: u8 contract SomeContract: other: u8 Prevent multiple fields with same name in one struct. Example that now produces a compile time error: struct SomeStruct: some_field: u8 some_field: u8 Prevent variable definition in child scope when name already taken in parent scope. Example that now produces a compile time error: pub fn bar(): my_array: u256[3] sum: u256 = 0 for i in my_array: sum: u256 = 0 The CLI was using the overwrite flag to enable Yul optimization. i.e. # Would both overwrite output files and run the Yul optimizer.\n$ fe my_contract.fe --overwrite Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. ( #320 ) Ensure analyzer rejects code that uses return values for __init__ functions. ( #323 ) An example that now produces a compile time error: contract C: pub fn __init__() -> i32: return 0 Properly reject calling an undefined function on an external contract ( #324 )","breadcrumbs":"Release Notes » Bugfixes","id":"309","title":"Bugfixes"},"31":{"body":"There are two project modes: main and lib. Main projects can import libraries and have code output. Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects. The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.","breadcrumbs":"Using Fe » Using projects » Project modes","id":"31","title":"Project modes"},"310":{"body":"Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. ( #179 ) IDs added to AST nodes. ( #315 ) Failures in the Yul generation phase now panic; any failure is a bug. ( #327 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"310","title":"Internal Changes - for Fe Contributors"},"311":{"body":"","breadcrumbs":"Release Notes » 0.2.0-alpha \"Borax\" (2021-02-27)","id":"311","title":"0.2.0-alpha \"Borax\" (2021-02-27)"},"312":{"body":"Add support for string literals. Example: fn get_ticker_symbol() -> string3: return \"ETH\" String literals are stored in and loaded from the compiled bytecode. ( #186 ) The CLI now compiles every contract in a module, not just the first one. ( #197 ) Sample compiler output with all targets enabled: output\n|-- Bar\n| |-- Bar.bin\n| |-- Bar_abi.json\n| `-- Bar_ir.yul\n|-- Foo\n| |-- Foo.bin\n| |-- Foo_abi.json\n| `-- Foo_ir.yul\n|-- module.ast\n`-- module.tokens Add support for string type casts ( #201 ) Example: val: string100 = string100(\"foo\") Add basic support for structs. ( #203 ) Example: struct House: price: u256 size: u256 vacant: bool contract City: pub fn get_price() -> u256: building: House = House(300, 500, true) assert building.size == 500 assert building.price == 300 assert building.vacant return building.price Added support for external contract calls. Contract definitions now add a type to the module scope, which may be used to create contract values with the contract's public functions as callable attributes. ( #204 ) Example: contract Foo: pub fn build_array(a: u256, b: u256) -> u256[3]: my_array: u256[3] my_array[0] = a my_array[1] = a * b my_array[2] = b return my_array contract FooProxy: pub fn call_build_array( foo_address: address, a: u256, b: u256, ) -> u256[3]: foo: Foo = Foo(foo_address) return foo.build_array(a, b) Add support for block, msg, chain, and tx properties: ( #208 ) block.coinbase: address\nblock.difficulty: u256\nblock.number: u256\nblock.timestamp: u256\nchain.id: u256\nmsg.value: u256\ntx.gas_price: u256\ntx.origin: address (Note that msg.sender: address was added previously.) Example: fn post_fork() -> bool: return block.number > 2675000 The CLI now panics if an error is encountered during Yul compilation. ( #218 ) Support for contract creations. Example of create2, which takes a value and address salt as parameters. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create2_foo() -> address: # value and salt foo: Foo = Foo.create2(0, 52) return address(foo) Example of create, which just takes a value parameter. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create_foo() -> address: # value and salt foo: Foo = Foo.create(0) return address(foo) Note: We do not yet support init parameters. ( #239 ) Support updating individual struct fields in storage. ( #246 ) Example: pub fn update_house_price(price: u256): self.my_house.price = price Implement global keccak256 method. The method expects one parameter of bytes[n] and returns the hash as an u256. In a future version keccak256 will most likely be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). ( #255 ) Example: pub fn hash_single_byte(val: bytes[1]) -> u256: return keccak256(val) Require structs to be initialized using keyword arguments. Example: struct House: vacant: bool price: u256 Previously, House could be instantiated as House(true, 1000000). With this change it is required to be instantiated like House(vacant=true, price=1000000) This ensures property assignment is less prone to get mixed up. It also makes struct initialization visually stand out more from function calls. ( #260 ) Implement support for boolean not operator. ( #264 ) Example: if not covid_test.is_positive(person): allow_boarding(person) Do over/underflow checks for additions (SafeMath). With this change all additions (e.g x + y) for signed and unsigned integers check for over- and underflows and revert if necessary. ( #265 ) Added a builtin function abi_encode() that can be used to encode structs. The return type is a fixed-size array of bytes that is equal in size to the encoding. The type system does not support dynamically-sized arrays yet, which is why we used fixed. ( #266 ) Example: struct House: price: u256 size: u256 rooms: u8 vacant: bool contract Foo: pub fn hashed_house() -> u256: house: House = House( price=300, size=500, rooms=u8(20), vacant=true ) return keccak256(house.abi_encode()) Perform over/underflow checks for subtractions (SafeMath). ( #267 ) With this change all subtractions (e.g x - y) for signed and unsigned integers check for over- and underflows and revert if necessary. Support for the boolean operations and and or. ( #270 ) Examples: contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x and y contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x or y Support for self.address. This expression returns the address of the current contract. Example: contract Foo: pub fn bar() -> address: return self.address","breadcrumbs":"Release Notes » Features","id":"312","title":"Features"},"313":{"body":"Perform type checking when calling event constructors Previously, the following would not raise an error even though it should: contract Foo: event MyEvent: val_1: string100 val_2: u8 pub fn foo(): emit MyEvent(\"foo\", 1000) Wit this change, the code fails with a type error as expected. ( #202 ) Fix bug where compilation of contracts without public functions would result in illegal YUL. ( #219 ) E.g without this change, the following doesn't compile to proper YUL contract Empty: lonely: u256 Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a non user friendly error at the YUL compilation stage. With this change it is caught at the analyzer stage and presented to the user as a regular error. ( #225 ) Fix crash when return is used without value. These two methods should both be treated as returning () pub fn explicit_return(): return pub fn implicit(): pass Without this change, the explicit_return crashes the compiler. ( #261 )","breadcrumbs":"Release Notes » Bugfixes","id":"313","title":"Bugfixes"},"314":{"body":"Renamed the fe-semantics library to fe-analyzer. ( #207 ) Runtime testing utilities. ( #243 ) Values are stored more efficiently in storage. ( #251 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"314","title":"Internal Changes - for Fe Contributors"},"315":{"body":"WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead. This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.","breadcrumbs":"Release Notes » 0.1.0-alpha \"Amethyst\" (2021-01-20)","id":"315","title":"0.1.0-alpha \"Amethyst\" (2021-01-20)"},"316":{"body":"Added support for for loop, allows iteration over static arrays. ( #134 ) Enforce bounds on numeric literals in type constructors. For instance calling u8(1000) or i8(-250) will give an error because the literals 1000 and -250 do not fit into u8 or i8. ( #145 ) Added builtin copying methods clone() and to_mem() to reference types. ( #155 ) usage: # copy a segment of storage into memory and assign the new pointer\nmy_mem_array = self.my_sto_array.to_mem() # copy a segment of memory into another segment of memory and assign the new pointer\nmy_other_mem_array = my_mem_array.clone() Support emitting JSON ABI via --emit abi. The default value of --emit is now abi,bytecode. ( #160 ) Ensure integer type constructor reject all expressions that aren't a numeric literal. For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16. pub fn bar(val: u8) -> u16: return u16(val) Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. ( #163 ) Support for ABI decoding of all array type. ( #172 ) Support for value assignments in declaration. Previously, this code would fail: another_reference: u256[10] = my_array As a workaround declaration and assignment could be split apart. another_reference: u256[10]\nanother_reference = my_array With this change, the shorter declaration with assignment syntax is supported. ( #173 )","breadcrumbs":"Release Notes » Features","id":"316","title":"Features"},"317":{"body":"Point to examples in the README ( #162 ) Overhaul README page to better reflect the current state of the project. ( #177 ) Added descriptions of the to_mem and clone functions to the spec. ( #195 )","breadcrumbs":"Release Notes » Improved Documentation","id":"317","title":"Improved Documentation"},"318":{"body":"Updated the Solidity backend to v0.8.0. ( #169 ) Run CI tests on Mac and support creating Mac binaries for releases. ( #178 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"318","title":"Internal Changes - for Fe Contributors"},"319":{"body":"","breadcrumbs":"Code of Conduct » Contributor Covenant Code of Conduct","id":"319","title":"Contributor Covenant Code of Conduct"},"32":{"body":"You can import code from external files with the following syntax: use utils::get_42 This will import the get_42 function from the file utils.fe. You can also import using a custom name/alias: use utils::get_42 as get_42","breadcrumbs":"Using Fe » Using projects » Importing","id":"32","title":"Importing"},"320":{"body":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","breadcrumbs":"Code of Conduct » Our Pledge","id":"320","title":"Our Pledge"},"321":{"body":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","breadcrumbs":"Code of Conduct » Our Standards","id":"321","title":"Our Standards"},"322":{"body":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","breadcrumbs":"Code of Conduct » Enforcement Responsibilities","id":"322","title":"Enforcement Responsibilities"},"323":{"body":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","breadcrumbs":"Code of Conduct » Scope","id":"323","title":"Scope"},"324":{"body":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at piper@pipermerriam.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","breadcrumbs":"Code of Conduct » Enforcement","id":"324","title":"Enforcement"},"325":{"body":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","breadcrumbs":"Code of Conduct » Enforcement Guidelines","id":"325","title":"Enforcement Guidelines"},"326":{"body":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","breadcrumbs":"Code of Conduct » 1. Correction","id":"326","title":"1. Correction"},"327":{"body":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","breadcrumbs":"Code of Conduct » 2. Warning","id":"327","title":"2. Warning"},"328":{"body":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","breadcrumbs":"Code of Conduct » 3. Temporary Ban","id":"328","title":"3. Temporary Ban"},"329":{"body":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","breadcrumbs":"Code of Conduct » 4. Permanent Ban","id":"329","title":"4. Permanent Ban"},"33":{"body":"The templates created using fe new include a simple test demonstrating the test syntax. To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value. For example, to test the say_hello function on Contract which is expected to return the string \"hello\": fn test_contract(mut ctx: Context) { let contract: Contract = Contract.create(ctx, 0) assert main.say_hello() == \"hello\"\n} You can run all the tests in a project by running the following command: fe test You will receive test results directly to the console.","breadcrumbs":"Using Fe » Using projects » Tests","id":"33","title":"Tests"},"330":{"body":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","breadcrumbs":"Code of Conduct » Attribution","id":"330","title":"Attribution"},"34":{"body":"Once you have created a project, you can run the usual Fe CLI subcommands against the project path.","breadcrumbs":"Using Fe » Using projects » Running your project","id":"34","title":"Running your project"},"35":{"body":"Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here! For now, you can get started with: Open auction Watch this space for more tutorials coming soon!","breadcrumbs":"Using Fe » Tutorials » Tutorials","id":"35","title":"Tutorials"},"36":{"body":"This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts. An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.","breadcrumbs":"Using Fe » Tutorials » Open auction » Auction contract","id":"36","title":"Auction contract"},"37":{"body":"To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.","breadcrumbs":"Using Fe » Tutorials » Open auction » The auction rules","id":"37","title":"The auction rules"},"38":{"body":"To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page. With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe. Now you are ready to start coding in Fe! You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.","breadcrumbs":"Using Fe » Tutorials » Open auction » Get Started","id":"38","title":"Get Started"},"39":{"body":"You can see the entire contract here . You can refer back to this at any time to check implementation details.","breadcrumbs":"Using Fe » Tutorials » Open auction » Writing the Contract","id":"39","title":"Writing the Contract"},"4":{"body":"You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide . You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord . Learn more on our Contributing page.","breadcrumbs":"Introduction » Get Started","id":"4","title":"Get Started"},"40":{"body":"A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows: contract Auction { pub fn __init__() {}\n} To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice: auction_end_time: u256\nbeneficiary: address\nhighest_bidder: address\nhighest_bid: u256\npending_returns: Map\nended: bool Notice that variables are named using snake case (lower case, underscore separated, like_this). Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification. The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length. The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false. The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map. Keys can be any numeric type, address, boolean or unit. Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments. The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256. When you have implemented all this, your contract should look like this: contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time }\n} Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables. The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context. self self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript. Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is \"mutable\". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains. Context Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed. Read more on Context in Fe In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.","breadcrumbs":"Using Fe » Tutorials » Open auction » Defining the Contract and initializing variables","id":"40","title":"Defining the Contract and initializing variables"},"41":{"body":"Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable. This logic can be implemented as follows: pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))\n} The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data . Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition: struct AuctionAlreadyEnded {\n} The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe: struct BidNotHighEnough { pub highest_bid: u256\n} Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data. Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value. Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event: struct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} You have now implemented all the logic to handle a bid!","breadcrumbs":"Using Fe » Tutorials » Open auction » Bidding","id":"41","title":"Bidding"},"42":{"body":"A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times). Add the following to the contract to implement the withdraw method: pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true\n} Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).","breadcrumbs":"Using Fe » Tutorials » Open auction » Withdrawing","id":"42","title":"Withdrawing"},"43":{"body":"Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event. First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows: struct AuctionNotYetEnded {\n} You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct: struct AuctionEndAlreadyCalled {} If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. Your method can look as follows: pub fn action_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid)\n} Congratulations! You just wrote an open auction contract in Fe!","breadcrumbs":"Using Fe » Tutorials » Open auction » End the auction","id":"43","title":"End the auction"},"44":{"body":"To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data. You can add the following functions to the contract: pub fn check_highest_bidder(self) -> address { return self.highest_bidder;\n} pub fn check_highest_bid(self) -> u256 { return self.highest_bid;\n} pub fn check_ended(self) -> bool { return self.ended;\n}","breadcrumbs":"Using Fe » Tutorials » Open auction » View functions","id":"44","title":"View functions"},"45":{"body":"Your contract is now ready to use! Compile it using fe build auction.fe You will find the contract ABI and bytecode in the newly created outputs directory. Start a local blockchain to deploy your contract to: anvil There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode. First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10: cast --to_hex(10) >> 0xa // this is 10 in hex Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments. cast send --from --private-key --create $(cat output/Auction/Auction.bin) $(cast abi-encode \"__init__(uint256,address)\" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720) You will see the contract address reported in your terminal. Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35: cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"bid()\" --value \"100ether\" --private-key --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 You can check whether this was successful by calling the check_highest_bidder() function: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bidder()\" You will see a response looking similar to: 0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720 The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address). You can do the same to check the highest bid: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bid()\" This returns: 0x0000000000000000000000000000000000000000000000056bc75e2d63100000 Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH): cast --to-dec 56bc75e2d63100000 >> 100000000000000000000 // 100 ETH in wei Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using: cast balance
    And check whether the auction open time has expired using cast \"check_ended()\"","breadcrumbs":"Using Fe » Tutorials » Open auction » Build and deploy the contract","id":"45","title":"Build and deploy the contract"},"46":{"body":"Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain! If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war! By following this tutorial, you learned: basic Fe types, such as bool, address, map and u256 basic Fe styles, such as snake case for variable names how to create a contract with a constructor how to revert how to handle state variables how to avoid reentrancy how to use ctx to handle transaction data how to emit events using ctx.emit how to deploy a contract with constructor arguments using Foundry how to interact with your contract","breadcrumbs":"Using Fe » Tutorials » Open auction » Summary","id":"46","title":"Summary"},"47":{"body":"Simple open auction","breadcrumbs":"Using Fe » Example Contracts » Example Contracts","id":"47","title":"Example Contracts"},"48":{"body":"// errors\nstruct AuctionAlreadyEnded {\n} struct AuctionNotYetEnded {\n} struct AuctionEndAlreadyCalled {} struct BidNotHighEnough { pub highest_bid: u256\n} // events\nstruct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} struct AuctionEnded { #indexed pub winner: address pub amount: u256\n} contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time } //method pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value())) } pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true } pub fn auction_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid) } pub fn check_highest_bidder(self) -> address { return self.highest_bidder; } pub fn check_highest_bid(self) -> u256 { return self.highest_bid; } pub fn check_ended(self) -> bool { return self.ended; }\n}","breadcrumbs":"Using Fe » Example Contracts » Open auction","id":"48","title":"Using Fe"},"49":{"body":"There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.","breadcrumbs":"Using Fe » Useful external links » Useful external links","id":"49","title":"Useful external links"},"5":{"body":"Let's get started with Fe! In this section you will learn how to write and deploy your first contract. Writing your first contract Deploying a contract to a testnet","breadcrumbs":"Quickstart » Quickstart","id":"5","title":"Quickstart"},"50":{"body":"VS Code extension Foundry Fe Support","breadcrumbs":"Using Fe » Useful external links » Tools","id":"50","title":"Tools"},"51":{"body":"Bountiful - Bug bounty platform written in Fe, live on Mainnet Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism","breadcrumbs":"Using Fe » Useful external links » Projects","id":"51","title":"Projects"},"52":{"body":"These are community projects written in Fe at various hackathons. Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis. p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe. Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses. Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend. Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a \"chain\": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift! Go do it - A commitment device to help you achieve your goals. Powerbald - On chain lottery written in Fe sspc-flutter-fe - Stupid Simple Payment Channel written in Fe","breadcrumbs":"Using Fe » Useful external links » Hackathon projects","id":"52","title":"Hackathon projects"},"53":{"body":"Fe standard library - The Fe standard library comes bundled with the compiler but it is also a useful example for real world Fe code. Implementing an UniswapV3 trade in Fe","breadcrumbs":"Using Fe » Useful external links » Others","id":"53","title":"Others"},"54":{"body":"Fe or Solidity, which is better? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Blog posts","id":"54","title":"Blog posts"},"55":{"body":"Fe or Solidity, which is better? by Ahmed Castro Fe o Solidity, ¿cuál es es mejor? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Videos","id":"55","title":"Videos"},"56":{"body":"Read how to become a Fe developer. Build & Test Release","breadcrumbs":"Development » Development","id":"56","title":"Development"},"57":{"body":"Please make sure Rust is installed . Basic The following commands only build the Fe -> Yul compiler components. build the CLI: cargo build test: cargo test --workspace Full The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system: cmake boost(1.65+) libclang brew install boost Once these have been installed, you may run the full build. This is enabled using the solc-backend feature. build the CLI: cargo build --features solc-backend test: cargo test --workspace --features solc-backend","breadcrumbs":"Development » Build & Test » Build and test","id":"57","title":"Build and test"},"58":{"body":"","breadcrumbs":"Development » Release » Release","id":"58","title":"Release"},"59":{"body":"Make sure that version follows semver rules e.g (0.23.0).","breadcrumbs":"Development » Release » Versioning","id":"59","title":"Versioning"},"6":{"body":"Before you dive in, you need to download and install Fe. For this quickstart you should simply download the binary from fe-lang.org . Then change the name and file permissions: mv fe_amd64 fe\nchmod +x fe Now you are ready to do the quickstart tutorial! For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.","breadcrumbs":"Quickstart » Download and install Fe","id":"6","title":"Download and install Fe"},"60":{"body":"Prerequisite : Release notes are generated with towncrier . Ensure to have towncrier installed and the command is available. Run make notes version= where is the version we are generating the release notes for e.g. 0.23.0. Example: make notes version=0.23.0 Examine the generated release notes and if needed perform and commit any manual changes.","breadcrumbs":"Development » Release » Generate Release Notes","id":"60","title":"Generate Release Notes"},"61":{"body":"Run make release version=. Example: make release version=0.23.0 This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.","breadcrumbs":"Development » Release » Generate the release","id":"61","title":"Generate the release"},"62":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. After the tests are adjusted run make push-tag to create the tag and push it to Github.","breadcrumbs":"Development » Release » Tag and push the release","id":"62","title":"Tag and push the release"},"63":{"body":"Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.","breadcrumbs":"Development » Release » Manually edit the release on GitHub","id":"63","title":"Manually edit the release on GitHub"},"64":{"body":"A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions ( See GitHub issue #543 ).","breadcrumbs":"Development » Release » Updating Docs & Website","id":"64","title":"Updating Docs & Website"},"65":{"body":"Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.","breadcrumbs":"Development » Release » Preview the sites locally","id":"65","title":"Preview the sites locally"},"66":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).","breadcrumbs":"Development » Release » Deploy website & docs","id":"66","title":"Deploy website & docs"},"67":{"body":"The standard library includes commonly used algorithms and data structures that come bundled as part of the language. Precompiles","breadcrumbs":"Standard Library » Fe Standard Library","id":"67","title":"Fe Standard Library"},"68":{"body":"Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork . The nine precompiles available in the Fe standard library are: ec_recover SHA2 256 ripemd160 identity mod_exp ec_add ec_mul ec_pairing blake2f These precompiles are imported as follows: use std::precompiles","breadcrumbs":"Standard Library » Precompiles » Precompiles","id":"68","title":"Precompiles"},"69":{"body":"ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.","breadcrumbs":"Standard Library » Precompiles » ec_recover","id":"69","title":"ec_recover"},"7":{"body":"Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address. The code of the contract dictates how: it manipulates its own state interacts with other contracts exposes external APIs to be called from other contracts or users To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address. Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.","breadcrumbs":"Quickstart » Write your first contract » Write your first Fe contract","id":"7","title":"Write your first Fe contract"},"70":{"body":"hash: the hash of the signed message, u256 v: the recovery identifier, a number in the range 27-30, u256 r: elliptic curve parameter, u256 s: elliptic curve parameter, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"70","title":"Parameters"},"71":{"body":"ec_recover returns an address.","breadcrumbs":"Standard Library » Precompiles » Returns","id":"71","title":"Returns"},"72":{"body":"pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"72","title":"Function signature"},"73":{"body":"let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"73","title":"Example"},"74":{"body":"SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.","breadcrumbs":"Standard Library » Precompiles » SHA2_256","id":"74","title":"SHA2_256"},"75":{"body":"buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"75","title":"Parameters"},"76":{"body":"SHA2_256 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"76","title":"Returns"},"77":{"body":"pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"77","title":"Function signature"},"78":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::sha2_256(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"78","title":"Example"},"79":{"body":"ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.","breadcrumbs":"Standard Library » Precompiles » ripemd_160","id":"79","title":"ripemd_160"},"8":{"body":"Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content. contract GuestBook { messages: Map>\n} Here we're using a map to associate messages with Ethereum addresses. The messages will simply be a string of a maximum length of 100 written as String<100>. The addresses are represented by the builtin address type. Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output. Compiled guest_book.fe. Outputs in `output` If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file. ├── fe\n├── guest_book.fe\n└── output └── GuestBook ├── GuestBook_abi.json └── GuestBook.bin The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array. The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters. We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.","breadcrumbs":"Quickstart » Write your first contract » Create a guest_book.fe file","id":"8","title":"Create a guest_book.fe file"},"80":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"80","title":"Parameters"},"81":{"body":"ripemd_160 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"81","title":"Returns"},"82":{"body":"pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"82","title":"Function signature"},"83":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::ripemd_160(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"83","title":"Example"},"84":{"body":"identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.","breadcrumbs":"Standard Library » Precompiles » identity","id":"84","title":"identity"},"85":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"85","title":"Parameters"},"86":{"body":"identity returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"86","title":"Returns"},"87":{"body":"pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"87","title":"Function signature"},"88":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)\nlet mut result: MemoryBufferReader = precompiles::identity(buf).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"88","title":"Example"},"89":{"body":"mod_exp is a modular exponentiation function required for elliptic curve operations.","breadcrumbs":"Standard Library » Precompiles » mod_exp","id":"89","title":"mod_exp"},"9":{"body":"Let's focus on the functionality of our world changing application and add a method to sign the guestbook. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n} In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub. Let's recompile the contract again and see what happens. Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite. Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory. Let's try it again with ./fe build guest_book.fe --overwrite. This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting. [ { \"name\": \"sign\", \"type\": \"function\", \"inputs\": [ { \"name\": \"book_msg\", \"type\": \"bytes100\" } ], \"outputs\": [] }\n] Since our contract now has a public sign method the corresponding ABI has changed accordingly.","breadcrumbs":"Quickstart » Write your first contract » Add a method to sign the guest book","id":"9","title":"Add a method to sign the guest book"},"90":{"body":"b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer m: MemoryBuffer: the modulus, MemoryBuffer b_size: u256: the length of b in bytes, u256 e_size: u256: the length of e in bytes, u256 m_size: u256: then length of m in bytes, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"90","title":"Parameters"},"91":{"body":"mod_exp returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"91","title":"Returns"},"92":{"body":"pub fn mod_exp( b_size: u256, e_size: u256, m_size: u256, b: MemoryBuffer, e: MemoryBuffer, m: MemoryBuffer,\n) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"92","title":"Function signature"},"93":{"body":"let mut result: MemoryBufferReader = precompiles::mod_exp( b_size: 1, e_size: 1, m_size: 1, b: MemoryBuffer::from_u8(value: 8), e: MemoryBuffer::from_u8(value: 9), m: MemoryBuffer::from_u8(value: 10),\n).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"93","title":"Example"},"94":{"body":"ec_add does point addition on elliptic curves.","breadcrumbs":"Standard Library » Precompiles » ec_add","id":"94","title":"ec_add"},"95":{"body":"x1: x-coordinate 1, u256 y1: y coordinate 1, u256 x2: x coordinate 2, u256 y2: y coordinate 2, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"95","title":"Parameters"},"96":{"body":"pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"96","title":"Function signature"},"97":{"body":"ec_add returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"97","title":"Returns"},"98":{"body":"let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)","breadcrumbs":"Standard Library » Precompiles » Example","id":"98","title":"Example"},"99":{"body":"ec_mul is for multiplying elliptic curve points.","breadcrumbs":"Standard Library » Precompiles » ec_mul","id":"99","title":"ec_mul"}},"length":331,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.0},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"295":{"tf":1.0},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.0},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.0},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.0},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.0}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.0},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.0},"303":{"tf":1.0},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.0}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.0}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.0}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.0},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.23606797749979},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":2.6457513110645907},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":1.4142135623730951},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.7320508075688772}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.0},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":2.8284271247461903},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.0},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.23606797749979},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"43":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.7320508075688772},"329":{"tf":1.4142135623730951}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":3.872983346207417},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.4142135623730951},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.0},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":2.8284271247461903},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.6457513110645907},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":2.8284271247461903},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.0},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":69,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.0},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"213":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.0},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.23606797749979},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":2.23606797749979},"144":{"tf":3.0},"145":{"tf":2.23606797749979},"146":{"tf":4.242640687119285},"148":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"150":{"tf":1.4142135623730951},"151":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":2.8284271247461903},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":2.23606797749979},"130":{"tf":2.0},"135":{"tf":4.242640687119285},"136":{"tf":1.0},"137":{"tf":2.0},"138":{"tf":2.6457513110645907},"139":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"16":{"tf":2.6457513110645907},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.0},"19":{"tf":2.8284271247461903},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"40":{"tf":4.58257569495584},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.4641016151377544},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.7320508075688772},"7":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"208":{"tf":1.4142135623730951},"209":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.0},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.0},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.0},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":30,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.0},"202":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":22,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":2.8284271247461903},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.7320508075688772},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":18,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.23606797749979},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.7320508075688772},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":1.7320508075688772},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.7320508075688772},"301":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":2.8284271247461903},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":1.7320508075688772},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.4142135623730951},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":121,"docs":{"10":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.0},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.1622776601683795},"173":{"tf":2.8284271247461903},"174":{"tf":3.872983346207417},"175":{"tf":3.1622776601683795},"176":{"tf":1.0},"177":{"tf":2.0},"178":{"tf":2.449489742783178},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"182":{"tf":4.795831523312719},"183":{"tf":3.4641016151377544},"184":{"tf":2.0},"185":{"tf":2.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":15,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"259":{"tf":1.0},"26":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":98,"docs":{"0":{"tf":2.0},"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.0},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.6457513110645907},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.23606797749979},"23":{"tf":2.0},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.6457513110645907},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"29":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"38":{"tf":2.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.7320508075688772},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":2.8284271247461903},"53":{"tf":2.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.449489742783178},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.6457513110645907}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":25,"docs":{"10":{"tf":1.0},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":80,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"108":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.1622776601683795},"139":{"tf":2.0},"141":{"tf":5.656854249492381},"143":{"tf":3.1622776601683795},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"146":{"tf":2.0},"148":{"tf":1.0},"152":{"tf":2.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.0},"205":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.0},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.0},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.23606797749979},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"296":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.4142135623730951},"217":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"294":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.0},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":12,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"26":{"tf":2.23606797749979},"27":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.0},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.0},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.449489742783178},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":22,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"113":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":14,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":6,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":2.8284271247461903},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":2.6457513110645907},"172":{"tf":1.0},"181":{"tf":1.7320508075688772},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.0},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.23606797749979},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.449489742783178},"207":{"tf":1.7320508075688772},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.0},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":1.7320508075688772}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"19":{"tf":3.1622776601683795},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.0},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":26,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"42":{"tf":1.0},"60":{"tf":2.449489742783178},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.4142135623730951},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.0},"183":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":2.23606797749979},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.0}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":1.7320508075688772},"157":{"tf":1.0},"158":{"tf":2.6457513110645907},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.0},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":24,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"29":{"tf":2.23606797749979},"30":{"tf":2.449489742783178},"31":{"tf":2.449489742783178},"317":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.449489742783178},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":14,"docs":{"193":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":1.4142135623730951},"315":{"tf":2.0},"318":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.7320508075688772},"62":{"tf":1.0},"63":{"tf":2.0},"64":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.4142135623730951},"215":{"tf":1.7320508075688772},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":1.7320508075688772},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.0},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.1622776601683795},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"86":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":3.872983346207417},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.0},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":2.6457513110645907},"153":{"tf":1.4142135623730951},"156":{"tf":1.0},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.4142135623730951},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.0},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":15,"docs":{"1":{"tf":1.0},"113":{"tf":1.4142135623730951},"132":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.4142135623730951},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":2.6457513110645907},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":12,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":3.7416573867739413},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"162":{"tf":2.0},"163":{"tf":2.449489742783178},"164":{"tf":2.0},"165":{"tf":2.0},"166":{"tf":1.7320508075688772},"167":{"tf":1.4142135623730951},"168":{"tf":2.23606797749979},"169":{"tf":2.23606797749979},"170":{"tf":1.7320508075688772},"171":{"tf":2.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.0},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.4641016151377544},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":10,"docs":{"113":{"tf":1.0},"186":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.0},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.23606797749979},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":2,"docs":{"19":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.605551275463989},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.47213595499958},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.1622776601683795},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":3.3166247903554},"188":{"tf":1.7320508075688772},"189":{"tf":2.449489742783178},"190":{"tf":2.23606797749979},"191":{"tf":4.69041575982343},"192":{"tf":2.0},"193":{"tf":2.8284271247461903},"194":{"tf":1.7320508075688772},"195":{"tf":1.4142135623730951},"196":{"tf":2.8284271247461903},"197":{"tf":2.23606797749979},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.23606797749979},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.0},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":117,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.0},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.23606797749979},"46":{"tf":2.23606797749979},"48":{"tf":1.0},"49":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"9":{"tf":1.0}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"breadcrumbs":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"267":{"tf":2.0},"315":{"tf":1.4142135623730951}}},"2":{"df":4,"docs":{"236":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"274":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951}}},"3":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951}}},"4":{"df":3,"docs":{"232":{"tf":1.4142135623730951},"254":{"tf":2.0},"303":{"tf":1.4142135623730951}}},"5":{"df":6,"docs":{"232":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":2.0},"298":{"tf":1.4142135623730951}}},"6":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951}}},"7":{"df":2,"docs":{"242":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"8":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"9":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.4142135623730951},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951}}},"2":{"df":8,"docs":{"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0}}},"3":{"df":6,"docs":{"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"236":{"tf":1.4142135623730951}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.4142135623730951},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.4142135623730951}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":2.0},"270":{"tf":2.0},"278":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.4142135623730951},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.4142135623730951}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.4142135623730951}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.23606797749979},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.449489742783178},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":3.0},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":2.0},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"25":{"tf":1.0},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":2.0}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":2.0},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.3166247903554},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":3.1622776601683795},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.8284271247461903},"162":{"tf":2.449489742783178},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.6457513110645907},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":15,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.449489742783178},"37":{"tf":2.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":3.1622776601683795},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":2.23606797749979},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":2.0},"329":{"tf":1.7320508075688772}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":4.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.7320508075688772},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":2.0},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.7320508075688772},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":3.1622776601683795},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"253":{"tf":1.4142135623730951},"256":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"276":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"284":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.8284271247461903},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":3.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":3.1622776601683795},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":2.0},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":74,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"32":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.7320508075688772},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":2.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"213":{"tf":1.0},"319":{"tf":1.7320508075688772},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.4142135623730951},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":2.0},"244":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":2.0},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.6457513110645907},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":2.0},"143":{"tf":2.449489742783178},"144":{"tf":3.3166247903554},"145":{"tf":2.6457513110645907},"146":{"tf":4.358898943540674},"147":{"tf":1.0},"148":{"tf":2.0},"149":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"151":{"tf":1.7320508075688772},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":3.1622776601683795},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.7320508075688772},"129":{"tf":1.0},"13":{"tf":2.449489742783178},"130":{"tf":2.0},"135":{"tf":4.47213595499958},"136":{"tf":1.4142135623730951},"137":{"tf":2.23606797749979},"138":{"tf":3.0},"139":{"tf":2.0},"14":{"tf":1.7320508075688772},"140":{"tf":2.0},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.7320508075688772},"156":{"tf":1.7320508075688772},"159":{"tf":1.4142135623730951},"16":{"tf":2.8284271247461903},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.23606797749979},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.7320508075688772},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.3166247903554},"19":{"tf":3.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":2.0},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.7320508075688772},"39":{"tf":1.7320508075688772},"40":{"tf":4.69041575982343},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.605551275463989},"46":{"tf":2.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"7":{"tf":2.8284271247461903},"8":{"tf":2.449489742783178},"9":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"208":{"tf":2.0},"209":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.0},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.4142135623730951},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.4142135623730951},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.7320508075688772}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":36,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.449489742783178},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":24,"docs":{"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.449489742783178},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":2.0},"18":{"tf":1.4142135623730951},"19":{"tf":3.1622776601683795},"2":{"tf":1.0},"20":{"tf":1.7320508075688772},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":28,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.0},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":2.0},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":2.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"289":{"tf":2.0},"301":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.4142135623730951},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.7320508075688772},"6":{"tf":2.0},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.7320508075688772}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.7320508075688772},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.0}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.6457513110645907},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":3.1622776601683795},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":2.23606797749979},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":122,"docs":{"10":{"tf":1.0},"103":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"124":{"tf":2.0},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.4142135623730951},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.23606797749979},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.4641016151377544},"173":{"tf":3.3166247903554},"174":{"tf":4.242640687119285},"175":{"tf":3.605551275463989},"176":{"tf":2.0},"177":{"tf":2.6457513110645907},"178":{"tf":3.0},"179":{"tf":2.449489742783178},"180":{"tf":2.23606797749979},"181":{"tf":2.23606797749979},"182":{"tf":4.898979485566356},"183":{"tf":3.605551275463989},"184":{"tf":2.23606797749979},"185":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":21,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"259":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"268":{"tf":1.4142135623730951},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":107,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.449489742783178},"10":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.23606797749979},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.8284271247461903},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"222":{"tf":2.23606797749979},"23":{"tf":2.23606797749979},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.8284271247461903},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.1622776601683795},"266":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":2.0},"279":{"tf":1.4142135623730951},"28":{"tf":2.0},"281":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"3":{"tf":2.0},"30":{"tf":1.0},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.0},"310":{"tf":1.4142135623730951},"314":{"tf":2.0},"315":{"tf":1.0},"318":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"36":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":2.23606797749979},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"52":{"tf":3.0},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.6457513110645907},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.8284271247461903}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":27,"docs":{"10":{"tf":1.4142135623730951},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":89,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.3166247903554},"139":{"tf":2.23606797749979},"141":{"tf":5.830951894845301},"142":{"tf":1.0},"143":{"tf":3.3166247903554},"144":{"tf":2.6457513110645907},"145":{"tf":1.7320508075688772},"146":{"tf":2.23606797749979},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":2.23606797749979},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.7320508075688772},"205":{"tf":2.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"79":{"tf":1.0},"82":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.7320508075688772},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"296":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":2.0},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.7320508075688772},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.7320508075688772},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.449489742783178},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.23606797749979},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.7320508075688772},"217":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"227":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"289":{"tf":1.7320508075688772},"294":{"tf":1.0},"301":{"tf":1.4142135623730951},"317":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":2.23606797749979},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":13,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.449489742783178},"27":{"tf":1.7320508075688772},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.23606797749979},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":2.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"294":{"tf":1.7320508075688772},"297":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.23606797749979},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.6457513110645907},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":45,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.7320508075688772},"130":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":2.0},"118":{"tf":2.0},"119":{"tf":2.449489742783178},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":11,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.7320508075688772},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":13,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":57,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":12,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":3.1622776601683795},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":2.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":2.0},"127":{"tf":2.8284271247461903},"172":{"tf":1.0},"181":{"tf":2.23606797749979},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.7320508075688772},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":2.0},"204":{"tf":2.0},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.6457513110645907},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.8284271247461903},"207":{"tf":2.449489742783178},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.7320508075688772},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":2.0}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.23606797749979},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":2.23606797749979},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"19":{"tf":3.3166247903554},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.4142135623730951},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":117,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.4142135623730951},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"42":{"tf":1.0},"60":{"tf":2.6457513110645907},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.7320508075688772},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.6457513110645907},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":19,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.449489742783178},"183":{"tf":2.0},"184":{"tf":2.449489742783178},"185":{"tf":2.6457513110645907},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"80":{"tf":1.4142135623730951},"85":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.7320508075688772},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.7320508075688772},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":2.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":2.0},"157":{"tf":1.0},"158":{"tf":3.0},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":48,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":3.0},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.7320508075688772},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":25,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":2.0},"29":{"tf":2.6457513110645907},"30":{"tf":2.6457513110645907},"31":{"tf":2.8284271247461903},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":2.23606797749979},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.23606797749979}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":2.0},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.7320508075688772},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"18":{"tf":2.0},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":113,"docs":{"193":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.4142135623730951},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":2.23606797749979},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.4142135623730951},"56":{"tf":1.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.0},"60":{"tf":2.449489742783178},"61":{"tf":2.23606797749979},"62":{"tf":1.7320508075688772},"63":{"tf":2.449489742783178},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.7320508075688772},"215":{"tf":2.0},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.7320508075688772},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.7320508075688772},"106":{"tf":1.7320508075688772},"110":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.4641016151377544},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.7320508075688772},"76":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":4.123105625617661},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.7320508075688772},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.4142135623730951},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":38,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":3.0},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.7320508075688772},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.4142135623730951},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.23606797749979},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.4142135623730951},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":2.0},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":105,"docs":{"1":{"tf":1.0},"113":{"tf":2.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":3.0},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":56,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":4.0},"158":{"tf":2.6457513110645907},"159":{"tf":2.23606797749979},"160":{"tf":2.23606797749979},"161":{"tf":2.449489742783178},"162":{"tf":2.6457513110645907},"163":{"tf":3.0},"164":{"tf":2.6457513110645907},"165":{"tf":2.6457513110645907},"166":{"tf":2.449489742783178},"167":{"tf":2.23606797749979},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"170":{"tf":2.449489742783178},"171":{"tf":2.6457513110645907},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":2.0},"203":{"tf":2.6457513110645907},"204":{"tf":2.23606797749979},"205":{"tf":1.4142135623730951},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":2.0},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.7320508075688772},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.3166247903554},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.23606797749979},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":23,"docs":{"113":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":2.0},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":2.0},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.1622776601683795},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":11,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":2.0},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.4142135623730951},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.4142135623730951}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.872983346207417},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.7320508075688772},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.69041575982343},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":4.0},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":18,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.4641016151377544},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":3.7416573867739413},"188":{"tf":2.6457513110645907},"189":{"tf":3.1622776601683795},"190":{"tf":3.0},"191":{"tf":5.0990195135927845},"192":{"tf":2.8284271247461903},"193":{"tf":3.4641016151377544},"194":{"tf":2.6457513110645907},"195":{"tf":2.449489742783178},"196":{"tf":3.4641016151377544},"197":{"tf":3.0},"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.6457513110645907},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.23606797749979},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":133,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"22":{"tf":1.0},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"23":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"24":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.23606797749979},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.7320508075688772},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":2.23606797749979},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"46":{"tf":2.449489742783178},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.449489742783178},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.7320508075688772},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.4142135623730951},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.6457513110645907},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.4142135623730951},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.4142135623730951}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"p":{"df":95,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.0},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"7":{"tf":2.23606797749979},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"title":{"root":{"0":{".":{"1":{".":{"0":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"236":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"221":{"tf":1.0},"225":{"tf":1.0},"278":{"tf":1.0},"295":{"tf":1.0}}},"1":{"df":1,"docs":{"218":{"tf":1.0}}},"2":{"df":3,"docs":{"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0}}},"df":2,"docs":{"210":{"tf":1.0},"326":{"tf":1.0}}},"2":{"0":{"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"315":{"tf":1.0}}},"4":{"df":1,"docs":{"307":{"tf":1.0}}},"6":{"df":2,"docs":{"221":{"tf":1.0},"248":{"tf":1.0}}},"7":{"df":4,"docs":{"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0}}},"8":{"df":2,"docs":{"236":{"tf":1.0},"303":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":2,"docs":{"211":{"tf":1.0},"327":{"tf":1.0}}},"3":{"1":{"df":4,"docs":{"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"df":2,"docs":{"212":{"tf":1.0},"328":{"tf":1.0}}},"4":{"df":2,"docs":{"213":{"tf":1.0},"329":{"tf":1.0}}},"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"146":{"tf":1.0}}}},"d":{"d":{"df":3,"docs":{"10":{"tf":1.0},"25":{"tf":1.0},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"195":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"134":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"h":{"a":{"df":21,"docs":{"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"192":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"171":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"265":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"178":{"tf":1.0},"330":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"b":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"151":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"125":{"tf":1.0},"184":{"tf":1.0},"188":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"168":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"263":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"df":3,"docs":{"26":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"203":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"142":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"169":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":12,"docs":{"11":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"189":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"47":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"208":{"tf":1.0},"209":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"326":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"8":{"tf":1.0}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":6,"docs":{"11":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"14":{"tf":1.0},"212":{"tf":1.0},"56":{"tf":1.0}}}}}}}},"o":{"c":{"df":3,"docs":{"211":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"322":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"133":{"tf":1.0},"194":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":13,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"154":{"tf":1.0},"47":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":12,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":27,"docs":{"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":24,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"113":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"48":{"tf":1.0},"6":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"x":{"df":4,"docs":{"210":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":14,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"199":{"tf":1.0},"205":{"tf":1.0},"44":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"262":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"325":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":2,"docs":{"264":{"tf":1.0},"265":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":9,"docs":{"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"177":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"127":{"tf":1.0}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"200":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"67":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"49":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"181":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"260":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"196":{"tf":1.0},"204":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"207":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"264":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"89":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"145":{"tf":1.0},"153":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"15":{"tf":1.0},"19":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"217":{"tf":1.0},"60":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"190":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":9,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"109":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"227":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"136":{"tf":1.0},"158":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"216":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"10":{"tf":1.0},"155":{"tf":1.0},"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"217":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"119":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.0},"164":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"152":{"tf":1.0}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"18":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"65":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"203":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"3":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"201":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"321":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"4":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"137":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"126":{"tf":1.0},"197":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"131":{"tf":1.0},"140":{"tf":1.0},"176":{"tf":1.0},"193":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"186":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"33":{"tf":1.0},"57":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"50":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":17,"docs":{"134":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"207":{"tf":1.0},"264":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"185":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"198":{"tf":1.0}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"64":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":2,"docs":{"48":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"203":{"tf":1.0},"265":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"137":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"59":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"44":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"327":{"tf":1.0}}}},"y":{"df":1,"docs":{"209":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"156":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/docs/searchindex.json b/docs/searchindex.json new file mode 100644 index 0000000000..742ee1e4ed --- /dev/null +++ b/docs/searchindex.json @@ -0,0 +1 @@ +{"doc_urls":["index.html#what-is-fe","index.html#why-fe","index.html#who-is-fe-for","index.html#what-problems-does-fe-solve","index.html#get-started","quickstart/index.html#quickstart","quickstart/index.html#download-and-install-fe","quickstart/first_contract.html#write-your-first-fe-contract","quickstart/first_contract.html#create-a-guest_bookfe-file","quickstart/first_contract.html#add-a-method-to-sign-the-guest-book","quickstart/first_contract.html#add-a-method-to-read-a-message","quickstart/deploy_contract.html#deploy-your-contract","quickstart/deploy_contract.html#prerequisites","quickstart/deploy_contract.html#introduction","quickstart/deploy_contract.html#your-developer-environment","quickstart/deploy_contract.html#deploying-to-a-local-network","quickstart/deploy_contract.html#making-the-deployment-transaction","quickstart/deploy_contract.html#signing-the-guest-book","quickstart/deploy_contract.html#reading-the-signatures","quickstart/deploy_contract.html#deploying-to-a-public-test-network","quickstart/deploy_contract.html#summary","user-guide/index.html#user-guide","user-guide/installation.html#installation","user-guide/installation.html#package-managers","user-guide/installation.html#download-the-compiler","user-guide/installation.html#add-permission-to-execute","user-guide/installation.html#building-from-source","user-guide/installation.html#editor-support--syntax-highlighting","user-guide/projects.html#fe-projects","user-guide/projects.html#creating-a-project","user-guide/projects.html#manifest","user-guide/projects.html#project-modes","user-guide/projects.html#importing","user-guide/projects.html#tests","user-guide/projects.html#running-your-project","user-guide/tutorials/index.html#tutorials","user-guide/tutorials/auction.html#auction-contract","user-guide/tutorials/auction.html#the-auction-rules","user-guide/tutorials/auction.html#get-started","user-guide/tutorials/auction.html#writing-the-contract","user-guide/tutorials/auction.html#defining-the-contract-and-initializing-variables","user-guide/tutorials/auction.html#bidding","user-guide/tutorials/auction.html#withdrawing","user-guide/tutorials/auction.html#end-the-auction","user-guide/tutorials/auction.html#view-functions","user-guide/tutorials/auction.html#build-and-deploy-the-contract","user-guide/tutorials/auction.html#summary","user-guide/example_contracts/index.html#example-contracts","user-guide/example_contracts/auction_contract.html","user-guide/external_links.html#useful-external-links","user-guide/external_links.html#tools","user-guide/external_links.html#projects","user-guide/external_links.html#hackathon-projects","user-guide/external_links.html#others","user-guide/external_links.html#blog-posts","user-guide/external_links.html#videos","development/index.html#development","development/build.html#build-and-test","development/release.html#release","development/release.html#versioning","development/release.html#generate-release-notes","development/release.html#generate-the-release","development/release.html#tag-and-push-the-release","development/release.html#manually-edit-the-release-on-github","development/release.html#updating-docs--website","development/release.html#preview-the-sites-locally","development/release.html#deploy-website--docs","std/index.html#fe-standard-library","std/precompiles.html#precompiles","std/precompiles.html#ec_recover","std/precompiles.html#parameters","std/precompiles.html#returns","std/precompiles.html#function-signature","std/precompiles.html#example","std/precompiles.html#sha2_256","std/precompiles.html#parameters-1","std/precompiles.html#returns-1","std/precompiles.html#function-signature-1","std/precompiles.html#example-1","std/precompiles.html#ripemd_160","std/precompiles.html#parameters-2","std/precompiles.html#returns-2","std/precompiles.html#function-signature-2","std/precompiles.html#example-2","std/precompiles.html#identity","std/precompiles.html#parameters-3","std/precompiles.html#returns-3","std/precompiles.html#function-signature-3","std/precompiles.html#example-3","std/precompiles.html#mod_exp","std/precompiles.html#parameters-4","std/precompiles.html#returns-4","std/precompiles.html#function-signature-4","std/precompiles.html#example-4","std/precompiles.html#ec_add","std/precompiles.html#parameters-5","std/precompiles.html#function-signature-5","std/precompiles.html#returns-5","std/precompiles.html#example-5","std/precompiles.html#ec_mul","std/precompiles.html#parameters-6","std/precompiles.html#function-signature-6","std/precompiles.html#returns-6","std/precompiles.html#example-6","std/precompiles.html#ec_pairing","std/precompiles.html#parameters-7","std/precompiles.html#returns-7","std/precompiles.html#example-7","std/precompiles.html#blake_2f","std/precompiles.html#parameters-8","std/precompiles.html#returns-8","std/precompiles.html#function-signature-7","std/precompiles.html#example-8","spec/index.html#fe-language-specification","spec/notation.html#notation","spec/notation.html#grammar","spec/lexical_structure/index.html#lexical-structure","spec/lexical_structure/keywords.html#keywords","spec/lexical_structure/keywords.html#strict-keywords","spec/lexical_structure/keywords.html#reserved-keywords","spec/lexical_structure/identifiers.html#identifiers","spec/lexical_structure/tokens.html#tokens","spec/lexical_structure/tokens.html#newline","spec/lexical_structure/tokens.html#literals","spec/lexical_structure/tokens.html#examples","spec/lexical_structure/tokens.html#boolean-literals","spec/lexical_structure/tokens.html#string-literals","spec/lexical_structure/tokens.html#integer-literals","spec/comments.html#comments","spec/items/index.html#items","spec/items/visibility_and_privacy.html#visibility-and-privacy","spec/items/structs.html#structs","spec/items/traits.html#traits","spec/items/enums.html#enum","spec/items/type_aliases.html#type-aliases","spec/items/contracts.html#contracts","spec/items/contracts.html#pragma","spec/items/contracts.html#state-variables","spec/items/contracts.html#contract-functions","spec/items/contracts.html#the-__init__-function","spec/items/contracts.html#structs","spec/items/functions/index.html#functions","spec/items/functions/context.html#context","spec/items/functions/context.html#rationale","spec/items/functions/context.html#the-context-object","spec/items/functions/context.html#context-mutability","spec/items/functions/context.html#abi-conformity","spec/items/functions/context.html#examples","spec/items/functions/context.html#msg_sender-and-msg_value","spec/items/functions/context.html#transferring-ether","spec/items/functions/context.html#createcreate2","spec/items/functions/context.html#block-number","spec/items/functions/self.html#self","spec/items/functions/self.html#mutability","spec/items/functions/self.html#examples","spec/items/functions/self.html#reading-contract-storage","spec/items/functions/self.html#writing-contract-storage","spec/statements/index.html#statements","spec/statements/pragma.html#pragma-statement","spec/statements/const.html#const-statement","spec/statements/let.html#let-statement","spec/statements/assign.html#assignment-statement","spec/statements/augassign.html#augmenting-assignment-statement","spec/statements/revert.html#revert-statement","spec/statements/return.html#return-statement","spec/statements/if.html#if-statement","spec/statements/for.html#for-statement","spec/statements/while.html#while-statement","spec/statements/break.html#break-statement","spec/statements/continue.html#continue-statement","spec/statements/match.html#match-statement","spec/statements/assert.html#assert-statement","spec/expressions/index.html#expressions","spec/expressions/call.html#call-expressions","spec/expressions/tuple.html#tuple-expressions","spec/expressions/list.html#list-expressions","spec/expressions/struct.html#struct-expressions","spec/expressions/indexing.html#index-expressions","spec/expressions/attribute.html#attribute-expressions","spec/expressions/name.html#name-expressions","spec/expressions/path.html#path-expressions","spec/expressions/literal.html#literal-expressions","spec/expressions/arithmetic_operators.html#arithmetic-operators","spec/expressions/comparison_operators.html#comparison-operators","spec/expressions/boolean_operators.html#boolean-operators","spec/expressions/unary_operators.html#unary-operators","spec/type_system/index.html#type-system","spec/type_system/types/index.html#types","spec/type_system/types/boolean.html#boolean-type","spec/type_system/types/contract.html#contract-types","spec/type_system/types/numeric.html#numeric-types","spec/type_system/types/tuple.html#tuple-types","spec/type_system/types/array.html#array-types","spec/type_system/types/struct.html#struct-types","spec/type_system/types/enum.html#enum-types","spec/type_system/types/address.html#address-type","spec/type_system/types/map.html#map-type","spec/type_system/types/string.html#string-type","spec/type_system/types/unit.html#unit-type","spec/type_system/types/function.html#function-types","spec/data_layout/index.html#data-layout","spec/data_layout/stack.html#stack","spec/data_layout/storage/index.html#storage","spec/data_layout/storage/constant_size_values_in_storage.html#constant-size-values-in-storage","spec/data_layout/storage/maps_in_storage.html#maps-in-storage","spec/data_layout/storage/to_mem_function.html#the-to_mem-function","spec/data_layout/memory/index.html#memory","spec/data_layout/memory/sequence_types_in_memory.html#sequence-types-in-memory","contributing.html#contributing","contributing.html#ways-to-contribute","contributing.html#1-reporting-or-fixing-issues","contributing.html#2-improving-the-docs","contributing.html#3-developing-fe","contributing.html#4-community-engagement","contributing.html#processes","contributing.html#reporting-issues","contributing.html#rasing-pull-requests","release_notes.html#release-notes","release_notes.html#0260-zircon-2023-11-03","release_notes.html#features","release_notes.html#improved-documentation","release_notes.html#0250-yoshiokaite-2023-10-26","release_notes.html#features-1","release_notes.html#bugfixes","release_notes.html#improved-documentation-1","release_notes.html#0240-xenotime-2023-08-10","release_notes.html#features-2","release_notes.html#performance-improvements","release_notes.html#improved-documentation-2","release_notes.html#0230-wiluite-2023-06-01","release_notes.html#features-3","release_notes.html#bugfixes-1","release_notes.html#0220-vulcanite-2023-04-05","release_notes.html#features-4","release_notes.html#bugfixes-2","release_notes.html#improved-documentation-3","release_notes.html#0210-alpha-2023-02-28","release_notes.html#features-5","release_notes.html#bugfixes-3","release_notes.html#0200-alpha-2022-12-05","release_notes.html#features-6","release_notes.html#bugfixes-4","release_notes.html#0191-alpha-sunstone-2022-07-06","release_notes.html#features-7","release_notes.html#bugfixes-5","release_notes.html#0180-alpha-ruby-2022-05-27","release_notes.html#features-8","release_notes.html#bugfixes-6","release_notes.html#0170-alpha-quartz-2022-05-26","release_notes.html#features-9","release_notes.html#bugfixes-7","release_notes.html#0160-alpha-2022-05-05","release_notes.html#features-10","release_notes.html#bugfixes-8","release_notes.html#0150-alpha-2022-04-04","release_notes.html#features-11","release_notes.html#bugfixes-9","release_notes.html#0140-alpha-2022-03-02","release_notes.html#features-12","release_notes.html#features-13","release_notes.html#support-local-constant","release_notes.html#support-constant-expression","release_notes.html#support-constant-generics-expression","release_notes.html#bug-fixes","release_notes.html#fix-ice-when-constant-type-is-mismatch","release_notes.html#fix-ice-when-assigning-value-to-constant-twice","release_notes.html#internal-changes---for-fe-contributors","release_notes.html#0130-alpha-2022-01-31-0130-alpha-2022-01-31","release_notes.html#features-14","release_notes.html#bugfixes-10","release_notes.html#0120-alpha-2021-12-31-0120-alpha-2021-12-31","release_notes.html#features-15","release_notes.html#bugfixes-11","release_notes.html#internal-changes---for-fe-contributors-1","release_notes.html#0110-alpha-karlite-2021-12-02","release_notes.html#features-16","release_notes.html#bugfixes-12","release_notes.html#internal-changes---for-fe-contributors-2","release_notes.html#0100-alpha-2021-10-31","release_notes.html#features-17","release_notes.html#bugfixes-13","release_notes.html#internal-changes---for-fe-contributors-3","release_notes.html#090-alpha-2021-09-29","release_notes.html#features-18","release_notes.html#bugfixes-14","release_notes.html#internal-changes---for-fe-contributors-4","release_notes.html#080-alpha-haxonite-2021-08-31","release_notes.html#features-19","release_notes.html#bugfixes-15","release_notes.html#improved-documentation-4","release_notes.html#internal-changes---for-fe-contributors-5","release_notes.html#070-alpha-galaxite-2021-07-27","release_notes.html#features-20","release_notes.html#bugfixes-16","release_notes.html#internal-changes---for-fe-contributors-6","release_notes.html#060-alpha-feldspar-2021-06-10","release_notes.html#features-21","release_notes.html#internal-changes---for-fe-contributors-7","release_notes.html#050-alpha-2021-05-27","release_notes.html#features-22","release_notes.html#bugfixes-17","release_notes.html#improved-documentation-5","release_notes.html#internal-changes---for-fe-contributors-8","release_notes.html#040-alpha-2021-04-28","release_notes.html#features-23","release_notes.html#bugfixes-18","release_notes.html#internal-changes---for-fe-contributors-9","release_notes.html#030-alpha-calamine-2021-03-24","release_notes.html#features-24","release_notes.html#bugfixes-19","release_notes.html#internal-changes---for-fe-contributors-10","release_notes.html#020-alpha-borax-2021-02-27","release_notes.html#features-25","release_notes.html#bugfixes-20","release_notes.html#internal-changes---for-fe-contributors-11","release_notes.html#010-alpha-amethyst-2021-01-20","release_notes.html#features-26","release_notes.html#improved-documentation-6","release_notes.html#internal-changes---for-fe-contributors-12","code_of_conduct.html#contributor-covenant-code-of-conduct","code_of_conduct.html#our-pledge","code_of_conduct.html#our-standards","code_of_conduct.html#enforcement-responsibilities","code_of_conduct.html#scope","code_of_conduct.html#enforcement","code_of_conduct.html#enforcement-guidelines","code_of_conduct.html#1-correction","code_of_conduct.html#2-warning","code_of_conduct.html#3-temporary-ban","code_of_conduct.html#4-permanent-ban","code_of_conduct.html#attribution"],"index":{"documentStore":{"docInfo":{"0":{"body":53,"breadcrumbs":2,"title":1},"1":{"body":65,"breadcrumbs":2,"title":1},"10":{"body":131,"breadcrumbs":8,"title":4},"100":{"body":11,"breadcrumbs":4,"title":1},"101":{"body":9,"breadcrumbs":5,"title":2},"102":{"body":6,"breadcrumbs":4,"title":1},"103":{"body":11,"breadcrumbs":4,"title":1},"104":{"body":7,"breadcrumbs":4,"title":1},"105":{"body":12,"breadcrumbs":4,"title":1},"106":{"body":9,"breadcrumbs":4,"title":1},"107":{"body":35,"breadcrumbs":4,"title":1},"108":{"body":34,"breadcrumbs":4,"title":1},"109":{"body":23,"breadcrumbs":4,"title":1},"11":{"body":0,"breadcrumbs":6,"title":2},"110":{"body":7,"breadcrumbs":4,"title":1},"111":{"body":17,"breadcrumbs":5,"title":2},"112":{"body":37,"breadcrumbs":4,"title":1},"113":{"body":113,"breadcrumbs":5,"title":3},"114":{"body":0,"breadcrumbs":4,"title":1},"115":{"body":77,"breadcrumbs":4,"title":1},"116":{"body":3,"breadcrumbs":6,"title":2},"117":{"body":7,"breadcrumbs":6,"title":1},"118":{"body":56,"breadcrumbs":7,"title":2},"119":{"body":62,"breadcrumbs":7,"title":2},"12":{"body":16,"breadcrumbs":5,"title":1},"120":{"body":46,"breadcrumbs":6,"title":1},"121":{"body":0,"breadcrumbs":6,"title":1},"122":{"body":4,"breadcrumbs":6,"title":1},"123":{"body":24,"breadcrumbs":6,"title":1},"124":{"body":49,"breadcrumbs":6,"title":1},"125":{"body":4,"breadcrumbs":7,"title":2},"126":{"body":34,"breadcrumbs":7,"title":2},"127":{"body":118,"breadcrumbs":7,"title":2},"128":{"body":2,"breadcrumbs":4,"title":1},"129":{"body":7,"breadcrumbs":4,"title":1},"13":{"body":102,"breadcrumbs":5,"title":1},"130":{"body":132,"breadcrumbs":7,"title":2},"131":{"body":62,"breadcrumbs":5,"title":1},"132":{"body":102,"breadcrumbs":5,"title":1},"133":{"body":71,"breadcrumbs":5,"title":1},"134":{"body":37,"breadcrumbs":7,"title":2},"135":{"body":132,"breadcrumbs":5,"title":1},"136":{"body":26,"breadcrumbs":5,"title":1},"137":{"body":25,"breadcrumbs":6,"title":2},"138":{"body":61,"breadcrumbs":6,"title":2},"139":{"body":45,"breadcrumbs":6,"title":2},"14":{"body":65,"breadcrumbs":6,"title":2},"140":{"body":27,"breadcrumbs":5,"title":1},"141":{"body":386,"breadcrumbs":5,"title":1},"142":{"body":14,"breadcrumbs":6,"title":1},"143":{"body":119,"breadcrumbs":6,"title":1},"144":{"body":85,"breadcrumbs":7,"title":2},"145":{"body":42,"breadcrumbs":7,"title":2},"146":{"body":174,"breadcrumbs":7,"title":2},"147":{"body":0,"breadcrumbs":6,"title":1},"148":{"body":40,"breadcrumbs":7,"title":2},"149":{"body":23,"breadcrumbs":7,"title":2},"15":{"body":90,"breadcrumbs":7,"title":3},"150":{"body":19,"breadcrumbs":6,"title":1},"151":{"body":17,"breadcrumbs":7,"title":2},"152":{"body":67,"breadcrumbs":6,"title":1},"153":{"body":24,"breadcrumbs":6,"title":1},"154":{"body":0,"breadcrumbs":6,"title":1},"155":{"body":10,"breadcrumbs":8,"title":3},"156":{"body":10,"breadcrumbs":8,"title":3},"157":{"body":25,"breadcrumbs":4,"title":1},"158":{"body":41,"breadcrumbs":7,"title":2},"159":{"body":40,"breadcrumbs":7,"title":2},"16":{"body":169,"breadcrumbs":7,"title":3},"160":{"body":66,"breadcrumbs":5,"title":1},"161":{"body":58,"breadcrumbs":7,"title":2},"162":{"body":73,"breadcrumbs":9,"title":3},"163":{"body":93,"breadcrumbs":7,"title":2},"164":{"body":78,"breadcrumbs":7,"title":2},"165":{"body":25,"breadcrumbs":5,"title":1},"166":{"body":38,"breadcrumbs":5,"title":1},"167":{"body":50,"breadcrumbs":5,"title":1},"168":{"body":85,"breadcrumbs":7,"title":2},"169":{"body":90,"breadcrumbs":7,"title":2},"17":{"body":84,"breadcrumbs":7,"title":3},"170":{"body":77,"breadcrumbs":7,"title":2},"171":{"body":81,"breadcrumbs":7,"title":2},"172":{"body":26,"breadcrumbs":4,"title":1},"173":{"body":87,"breadcrumbs":7,"title":2},"174":{"body":138,"breadcrumbs":7,"title":2},"175":{"body":80,"breadcrumbs":7,"title":2},"176":{"body":1,"breadcrumbs":7,"title":2},"177":{"body":65,"breadcrumbs":7,"title":2},"178":{"body":65,"breadcrumbs":7,"title":2},"179":{"body":21,"breadcrumbs":7,"title":2},"18":{"body":122,"breadcrumbs":6,"title":2},"180":{"body":23,"breadcrumbs":7,"title":2},"181":{"body":28,"breadcrumbs":7,"title":2},"182":{"body":98,"breadcrumbs":7,"title":2},"183":{"body":42,"breadcrumbs":7,"title":2},"184":{"body":24,"breadcrumbs":7,"title":2},"185":{"body":45,"breadcrumbs":7,"title":2},"186":{"body":0,"breadcrumbs":6,"title":2},"187":{"body":60,"breadcrumbs":6,"title":1},"188":{"body":10,"breadcrumbs":9,"title":2},"189":{"body":65,"breadcrumbs":9,"title":2},"19":{"body":213,"breadcrumbs":8,"title":4},"190":{"body":64,"breadcrumbs":9,"title":2},"191":{"body":136,"breadcrumbs":9,"title":2},"192":{"body":59,"breadcrumbs":9,"title":2},"193":{"body":81,"breadcrumbs":9,"title":2},"194":{"body":7,"breadcrumbs":9,"title":2},"195":{"body":27,"breadcrumbs":9,"title":2},"196":{"body":78,"breadcrumbs":9,"title":2},"197":{"body":69,"breadcrumbs":9,"title":2},"198":{"body":1,"breadcrumbs":9,"title":2},"199":{"body":1,"breadcrumbs":9,"title":2},"2":{"body":43,"breadcrumbs":2,"title":1},"20":{"body":49,"breadcrumbs":5,"title":1},"200":{"body":56,"breadcrumbs":6,"title":2},"201":{"body":53,"breadcrumbs":6,"title":1},"202":{"body":4,"breadcrumbs":6,"title":1},"203":{"body":39,"breadcrumbs":13,"title":4},"204":{"body":59,"breadcrumbs":9,"title":2},"205":{"body":14,"breadcrumbs":9,"title":2},"206":{"body":32,"breadcrumbs":6,"title":1},"207":{"body":42,"breadcrumbs":11,"title":3},"208":{"body":2,"breadcrumbs":2,"title":1},"209":{"body":0,"breadcrumbs":3,"title":2},"21":{"body":36,"breadcrumbs":4,"title":2},"210":{"body":20,"breadcrumbs":5,"title":4},"211":{"body":41,"breadcrumbs":4,"title":3},"212":{"body":82,"breadcrumbs":4,"title":3},"213":{"body":25,"breadcrumbs":4,"title":3},"214":{"body":0,"breadcrumbs":2,"title":1},"215":{"body":42,"breadcrumbs":3,"title":2},"216":{"body":55,"breadcrumbs":4,"title":3},"217":{"body":13,"breadcrumbs":4,"title":2},"218":{"body":0,"breadcrumbs":7,"title":5},"219":{"body":141,"breadcrumbs":3,"title":1},"22":{"body":44,"breadcrumbs":4,"title":1},"220":{"body":6,"breadcrumbs":4,"title":2},"221":{"body":0,"breadcrumbs":7,"title":5},"222":{"body":130,"breadcrumbs":3,"title":1},"223":{"body":29,"breadcrumbs":3,"title":1},"224":{"body":6,"breadcrumbs":4,"title":2},"225":{"body":0,"breadcrumbs":7,"title":5},"226":{"body":31,"breadcrumbs":3,"title":1},"227":{"body":18,"breadcrumbs":4,"title":2},"228":{"body":7,"breadcrumbs":4,"title":2},"229":{"body":0,"breadcrumbs":7,"title":5},"23":{"body":24,"breadcrumbs":5,"title":2},"230":{"body":245,"breadcrumbs":3,"title":1},"231":{"body":78,"breadcrumbs":3,"title":1},"232":{"body":9,"breadcrumbs":7,"title":5},"233":{"body":86,"breadcrumbs":3,"title":1},"234":{"body":31,"breadcrumbs":3,"title":1},"235":{"body":8,"breadcrumbs":4,"title":2},"236":{"body":0,"breadcrumbs":7,"title":5},"237":{"body":63,"breadcrumbs":3,"title":1},"238":{"body":4,"breadcrumbs":3,"title":1},"239":{"body":0,"breadcrumbs":7,"title":5},"24":{"body":47,"breadcrumbs":5,"title":2},"240":{"body":522,"breadcrumbs":3,"title":1},"241":{"body":80,"breadcrumbs":3,"title":1},"242":{"body":0,"breadcrumbs":8,"title":6},"243":{"body":375,"breadcrumbs":3,"title":1},"244":{"body":63,"breadcrumbs":3,"title":1},"245":{"body":0,"breadcrumbs":8,"title":6},"246":{"body":10,"breadcrumbs":3,"title":1},"247":{"body":30,"breadcrumbs":3,"title":1},"248":{"body":0,"breadcrumbs":8,"title":6},"249":{"body":66,"breadcrumbs":3,"title":1},"25":{"body":78,"breadcrumbs":6,"title":3},"250":{"body":175,"breadcrumbs":3,"title":1},"251":{"body":0,"breadcrumbs":7,"title":5},"252":{"body":16,"breadcrumbs":3,"title":1},"253":{"body":8,"breadcrumbs":3,"title":1},"254":{"body":0,"breadcrumbs":7,"title":5},"255":{"body":176,"breadcrumbs":3,"title":1},"256":{"body":11,"breadcrumbs":3,"title":1},"257":{"body":0,"breadcrumbs":7,"title":5},"258":{"body":374,"breadcrumbs":3,"title":1},"259":{"body":0,"breadcrumbs":3,"title":1},"26":{"body":104,"breadcrumbs":5,"title":2},"260":{"body":10,"breadcrumbs":5,"title":3},"261":{"body":15,"breadcrumbs":5,"title":3},"262":{"body":24,"breadcrumbs":6,"title":4},"263":{"body":0,"breadcrumbs":4,"title":2},"264":{"body":13,"breadcrumbs":7,"title":5},"265":{"body":67,"breadcrumbs":8,"title":6},"266":{"body":133,"breadcrumbs":6,"title":4},"267":{"body":0,"breadcrumbs":12,"title":10},"268":{"body":141,"breadcrumbs":3,"title":1},"269":{"body":57,"breadcrumbs":3,"title":1},"27":{"body":60,"breadcrumbs":7,"title":4},"270":{"body":0,"breadcrumbs":12,"title":10},"271":{"body":94,"breadcrumbs":3,"title":1},"272":{"body":52,"breadcrumbs":3,"title":1},"273":{"body":27,"breadcrumbs":6,"title":4},"274":{"body":0,"breadcrumbs":8,"title":6},"275":{"body":184,"breadcrumbs":3,"title":1},"276":{"body":31,"breadcrumbs":3,"title":1},"277":{"body":80,"breadcrumbs":6,"title":4},"278":{"body":0,"breadcrumbs":7,"title":5},"279":{"body":213,"breadcrumbs":3,"title":1},"28":{"body":36,"breadcrumbs":6,"title":2},"280":{"body":185,"breadcrumbs":3,"title":1},"281":{"body":72,"breadcrumbs":6,"title":4},"282":{"body":0,"breadcrumbs":7,"title":5},"283":{"body":67,"breadcrumbs":3,"title":1},"284":{"body":41,"breadcrumbs":3,"title":1},"285":{"body":6,"breadcrumbs":6,"title":4},"286":{"body":0,"breadcrumbs":8,"title":6},"287":{"body":102,"breadcrumbs":3,"title":1},"288":{"body":136,"breadcrumbs":3,"title":1},"289":{"body":26,"breadcrumbs":4,"title":2},"29":{"body":27,"breadcrumbs":6,"title":2},"290":{"body":7,"breadcrumbs":6,"title":4},"291":{"body":0,"breadcrumbs":8,"title":6},"292":{"body":170,"breadcrumbs":3,"title":1},"293":{"body":84,"breadcrumbs":3,"title":1},"294":{"body":10,"breadcrumbs":6,"title":4},"295":{"body":0,"breadcrumbs":8,"title":6},"296":{"body":167,"breadcrumbs":3,"title":1},"297":{"body":15,"breadcrumbs":6,"title":4},"298":{"body":0,"breadcrumbs":7,"title":5},"299":{"body":62,"breadcrumbs":3,"title":1},"3":{"body":50,"breadcrumbs":4,"title":3},"30":{"body":61,"breadcrumbs":5,"title":1},"300":{"body":8,"breadcrumbs":3,"title":1},"301":{"body":13,"breadcrumbs":4,"title":2},"302":{"body":54,"breadcrumbs":6,"title":4},"303":{"body":0,"breadcrumbs":7,"title":5},"304":{"body":192,"breadcrumbs":3,"title":1},"305":{"body":53,"breadcrumbs":3,"title":1},"306":{"body":34,"breadcrumbs":6,"title":4},"307":{"body":0,"breadcrumbs":8,"title":6},"308":{"body":135,"breadcrumbs":3,"title":1},"309":{"body":181,"breadcrumbs":3,"title":1},"31":{"body":28,"breadcrumbs":6,"title":2},"310":{"body":23,"breadcrumbs":6,"title":4},"311":{"body":0,"breadcrumbs":8,"title":6},"312":{"body":479,"breadcrumbs":3,"title":1},"313":{"body":108,"breadcrumbs":3,"title":1},"314":{"body":17,"breadcrumbs":6,"title":4},"315":{"body":44,"breadcrumbs":8,"title":6},"316":{"body":146,"breadcrumbs":3,"title":1},"317":{"body":20,"breadcrumbs":4,"title":2},"318":{"body":15,"breadcrumbs":6,"title":4},"319":{"body":0,"breadcrumbs":6,"title":4},"32":{"body":20,"breadcrumbs":5,"title":1},"320":{"body":51,"breadcrumbs":3,"title":1},"321":{"body":75,"breadcrumbs":3,"title":1},"322":{"body":42,"breadcrumbs":4,"title":2},"323":{"body":34,"breadcrumbs":3,"title":1},"324":{"body":25,"breadcrumbs":3,"title":1},"325":{"body":13,"breadcrumbs":4,"title":2},"326":{"body":27,"breadcrumbs":4,"title":2},"327":{"body":42,"breadcrumbs":4,"title":2},"328":{"body":41,"breadcrumbs":5,"title":3},"329":{"body":26,"breadcrumbs":5,"title":3},"33":{"body":70,"breadcrumbs":5,"title":1},"330":{"body":32,"breadcrumbs":3,"title":1},"34":{"body":11,"breadcrumbs":6,"title":2},"35":{"body":20,"breadcrumbs":4,"title":1},"36":{"body":30,"breadcrumbs":7,"title":2},"37":{"body":34,"breadcrumbs":7,"title":2},"38":{"body":43,"breadcrumbs":6,"title":1},"39":{"body":10,"breadcrumbs":7,"title":2},"4":{"body":26,"breadcrumbs":2,"title":1},"40":{"body":446,"breadcrumbs":9,"title":4},"41":{"body":264,"breadcrumbs":6,"title":1},"42":{"body":97,"breadcrumbs":6,"title":1},"43":{"body":118,"breadcrumbs":7,"title":2},"44":{"body":64,"breadcrumbs":7,"title":2},"45":{"body":228,"breadcrumbs":8,"title":3},"46":{"body":68,"breadcrumbs":6,"title":1},"47":{"body":3,"breadcrumbs":6,"title":2},"48":{"body":155,"breadcrumbs":6,"title":2},"49":{"body":13,"breadcrumbs":8,"title":3},"5":{"body":15,"breadcrumbs":2,"title":1},"50":{"body":6,"breadcrumbs":6,"title":1},"51":{"body":17,"breadcrumbs":6,"title":1},"52":{"body":109,"breadcrumbs":7,"title":2},"53":{"body":19,"breadcrumbs":6,"title":1},"54":{"body":5,"breadcrumbs":7,"title":2},"55":{"body":14,"breadcrumbs":6,"title":1},"56":{"body":7,"breadcrumbs":2,"title":1},"57":{"body":74,"breadcrumbs":5,"title":2},"58":{"body":0,"breadcrumbs":3,"title":1},"59":{"body":8,"breadcrumbs":3,"title":1},"6":{"body":37,"breadcrumbs":4,"title":3},"60":{"body":34,"breadcrumbs":5,"title":3},"61":{"body":18,"breadcrumbs":4,"title":2},"62":{"body":18,"breadcrumbs":5,"title":3},"63":{"body":21,"breadcrumbs":6,"title":4},"64":{"body":58,"breadcrumbs":5,"title":3},"65":{"body":19,"breadcrumbs":5,"title":3},"66":{"body":22,"breadcrumbs":5,"title":3},"67":{"body":13,"breadcrumbs":5,"title":3},"68":{"body":66,"breadcrumbs":4,"title":1},"69":{"body":49,"breadcrumbs":4,"title":1},"7":{"body":55,"breadcrumbs":8,"title":4},"70":{"body":23,"breadcrumbs":4,"title":1},"71":{"body":3,"breadcrumbs":4,"title":1},"72":{"body":11,"breadcrumbs":5,"title":2},"73":{"body":11,"breadcrumbs":4,"title":1},"74":{"body":14,"breadcrumbs":4,"title":1},"75":{"body":5,"breadcrumbs":4,"title":1},"76":{"body":4,"breadcrumbs":4,"title":1},"77":{"body":6,"breadcrumbs":5,"title":2},"78":{"body":7,"breadcrumbs":4,"title":1},"79":{"body":13,"breadcrumbs":4,"title":1},"8":{"body":124,"breadcrumbs":7,"title":3},"80":{"body":5,"breadcrumbs":4,"title":1},"81":{"body":4,"breadcrumbs":4,"title":1},"82":{"body":6,"breadcrumbs":5,"title":2},"83":{"body":7,"breadcrumbs":4,"title":1},"84":{"body":11,"breadcrumbs":4,"title":1},"85":{"body":5,"breadcrumbs":4,"title":1},"86":{"body":5,"breadcrumbs":4,"title":1},"87":{"body":6,"breadcrumbs":5,"title":2},"88":{"body":8,"breadcrumbs":4,"title":1},"89":{"body":8,"breadcrumbs":4,"title":1},"9":{"body":117,"breadcrumbs":9,"title":5},"90":{"body":39,"breadcrumbs":4,"title":1},"91":{"body":5,"breadcrumbs":4,"title":1},"92":{"body":16,"breadcrumbs":5,"title":2},"93":{"body":20,"breadcrumbs":4,"title":1},"94":{"body":5,"breadcrumbs":4,"title":1},"95":{"body":20,"breadcrumbs":4,"title":1},"96":{"body":11,"breadcrumbs":5,"title":2},"97":{"body":6,"breadcrumbs":4,"title":1},"98":{"body":12,"breadcrumbs":4,"title":1},"99":{"body":5,"breadcrumbs":4,"title":1}},"docs":{"0":{"body":"Fe is the next generation smart contract language for Ethereum . Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun . Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM) . The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode. Fe is one of these languages.","breadcrumbs":"Introduction » What is Fe?","id":"0","title":"What is Fe?"},"1":{"body":"Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun. Fe shares similar syntax with the popular languages Rust and Python , easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees. Fe is: statically typed expressive compiled using Yul built to a detailed language specification able to limit dynamic behaviour rapidly evolving!","breadcrumbs":"Introduction » Why Fe?","id":"1","title":"Why Fe?"},"10":{"body":"To make the guest book more useful we will also add a method get_msg to read entries from a given address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr] }\n} However, we will hit another error as we try to recompile the current code. Unable to compile guest_book.fe.\nerror: value must be copied to memory ┌─ guest_book.fe:10:14 │\n8 │ return self.messages[addr] │ ^^^^^^^^^^^^^^^^^^^ this value is in storage │ = Hint: values located in storage can be copied to memory using the `to_mem` function. = Example: `self.my_array.to_mem()` When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function. Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics. The code should compile fine when we change it accordingly. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Congratulations! You finished your first little Fe project. 👏 In the next chapter we will learn how to deploy our code and tweak it a bit further.","breadcrumbs":"Quickstart » Write your first contract » Add a method to read a message","id":"10","title":"Add a method to read a message"},"100":{"body":"x: x-coordinate, u256 y: y coordinate, u256 s: multiplier, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"100","title":"Parameters"},"101":{"body":"pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"101","title":"Function signature"},"102":{"body":"ec_mul returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"102","title":"Returns"},"103":{"body":"let (x, y): (u256, u256) = precompiles::ec_mul( x: 1, y: 2, s: 2\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"103","title":"Example"},"104":{"body":"ec_pairing does elliptic curve pairing - a form of encrypted multiplication.","breadcrumbs":"Standard Library » Precompiles » ec_pairing","id":"104","title":"ec_pairing"},"105":{"body":"input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"105","title":"Parameters"},"106":{"body":"ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"106","title":"Returns"},"107":{"body":"let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da) writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6) writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc) writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9) writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90) writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e) writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001) writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45) writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4) writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7) writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2) writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc) assert precompiles::ec_pairing(buf)\n}","breadcrumbs":"Standard Library » Precompiles » Example","id":"107","title":"Example"},"108":{"body":"blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.","breadcrumbs":"Standard Library » Precompiles » blake_2f","id":"108","title":"blake_2f"},"109":{"body":"h: the state vector, Array m: message block vector, Array t: offset counter, Array f: bool rounds: number of rounds of mixing, u32","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"109","title":"Parameters"},"11":{"body":"","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploy your contract.","id":"11","title":"Deploy your contract."},"110":{"body":"blake_2f returns a modified state vector, Array","breadcrumbs":"Standard Library » Precompiles » Returns","id":"110","title":"Returns"},"111":{"body":"pub fn blake_2f(rounds: u32, h: Array, m: Array, t: Array, f: bool) -> Array","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"111","title":"Function signature"},"112":{"body":"let result: Array = precompiles::blake_2f( rounds: 12, h: [ 0x48c9bdf267e6096a, 0x3ba7ca8485ae67bb, 0x2bf894fe72f36e3c, 0xf1361d5f3af54fa5, 0xd182e6ad7f520e51, 0x1f6c3e2b8c68059b, 0x6bbd41fbabd9831f, 0x79217e1319cde05b, ], m: [ 0x6162630000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], t: [ 0x0300000000000000, 0x0000000000000000, ], f: true\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"112","title":"Example"},"113":{"body":"Warning: This is a work in progress document. It is incomplete and specifications aren't stable yet. Notation Lexical Structure Keywords Identifiers Tokens Comments Items Visibility and Privacy Structs Traits Enums Type Aliases Contracts Functions Context Self Statements pragma Statement Assignment Statement Augmenting Assignment Statement const Statement let Statement revert Statement return Statement if Statement for Statement while Statement break Statement continue Statement assert Statement Expressions Call expressions Tuple expressions List expressions Index expressions Attribute expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators Type System Types Boolean Type Contract Type Numeric Types Tuple Types Array Types Struct Types Enum Types Address Type Map Type String Type Data Layout Stack Storage Constant size values in storage Maps in storage to_mem() function Memory Sequence types in memory","breadcrumbs":"Specification (WIP) » Fe Language Specification","id":"113","title":"Fe Language Specification"},"114":{"body":"","breadcrumbs":"Specification (WIP) » Notation » Notation","id":"114","title":"Notation"},"115":{"body":"The following notations are used by the Lexer and Syntax grammar snippets: Notation Examples Meaning CAPITAL KW_IF A token produced by the lexer ItalicCamelCase Item A syntactical production string x, while, * The exact character(s) \\x \\n, \\r, \\t, \\0 The character represented by this escape x? pub? An optional item x* OuterAttribute * 0 or more of x x+ MacroMatch + 1 or more of x xa..b HEX_DIGIT1..6 a to b repetitions of x | u8 | u16, Block | Item Either one or another [ ] [b B] Any of the characters listed [ - ] [a-z] Any of the characters in the range ~[ ] ~[b B] Any characters, except those listed ~string ~\\n, ~*/ Any characters, except this sequence ( ) (, Parameter ) Groups items","breadcrumbs":"Specification (WIP) » Notation » Grammar","id":"115","title":"Grammar"},"116":{"body":"Keywords Identifiers Tokens","breadcrumbs":"Specification (WIP) » Lexical Structure » Lexical Structure","id":"116","title":"Lexical Structure"},"117":{"body":"Fe divides keywords into two categories: strict reserved","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Keywords","id":"117","title":"Keywords"},"118":{"body":"These keywords can only be used in their correct contexts. They cannot be used as the identifiers . Lexer: KW_AS : as KW_BREAK : break KW_CONST : const KW_CONTINUE : continue KW_CONST : contract KW_FN : fn KW_ELSE : else KW_ENUM : enum KW_EVENT : event KW_FALSE : false KW_FOR : for KW_IDX : idx KW_IF : if KW_IN : in KW_LET : let KW_MATCH : match KW_MUT : mut KW_NONPAYABLE : nonpayable KW_PAYABLE : payable KW_PUB : pub KW_RETURN : return KW_REVERT : revert KW_SELFVALUE : self KW_STRUCT : struct KW_TRUE : true KW_USE : use KW_WHILE : while KW_ADDRESS : address","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Strict keywords","id":"118","title":"Strict keywords"},"119":{"body":"These keywords aren't used yet, but they are reserved for future use. They have the same restrictions as strict keywords. The reasoning behind this is to make current programs forward compatible with future versions of Fe by forbidding them to use these keywords. Lexer: KW_ABSTRACT : abstract KW_ASYNC : async KW_AWAIT : await KW_DO : do KW_EXTERNAL : external KW_FINAL : final KW_IMPL : impl KW_MACRO : macro KW_OVERRIDE : override KW_PURE : pure KW_SELFTYPE : Self KW_STATIC : static KW_SUPER : super KW_TRAIT : trait KW_TYPE : type KW_TYPEOF : typeof KW_VIEW : view KW_VIRTUAL : virtual KW_WHERE : where KW_YIELD : yield","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Reserved keywords","id":"119","title":"Reserved keywords"},"12":{"body":"You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. If you don't have any of these components, please revisit Write your first contract .","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Prerequisites","id":"12","title":"Prerequisites"},"120":{"body":"Lexer: IDENTIFIER_OR_KEYWORD : [a-z A-Z] [a-z A-Z 0-9 _]* | _ [a-z A-Z 0-9 _]+ Except a strict or reserved keyword An identifier is any nonempty ASCII string of the following form: Either The first character is a letter. The remaining characters are alphanumeric or _. Or The first character is _. The identifier is more than one character. _ alone is not an identifier. The remaining characters are alphanumeric or _.","breadcrumbs":"Specification (WIP) » Lexical Structure » Identifiers » Identifiers","id":"120","title":"Identifiers"},"121":{"body":"","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Tokens","id":"121","title":"Tokens"},"122":{"body":"A token that represents a new line.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » NEWLINE","id":"122","title":"NEWLINE"},"123":{"body":"A literal is an expression consisting of a single token, rather than a sequence of tokens, that immediately and directly denotes the value it evaluates to, rather than referring to it by name or some other evaluation rule. A literal is a form of constant expression, so is evaluated (primarily) at compile time.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Literals","id":"123","title":"Literals"},"124":{"body":"Strings Example Characters Escapes String \"hello\" ASCII subset Quote & ASCII ASCII escapes Name \\n Newline \\r Carriage return \\t Tab \\\\ Backslash Quote escapes Name \\\" Double quote Numbers Number literals * Example Decimal integer 98_222 Hex integer 0xff Octal integer 0o77 Binary integer 0b1111_0000 * All number literals allow _ as a visual separator: 1_234","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Examples","id":"124","title":"Examples"},"125":{"body":"Lexer BOOLEAN_LITERAL : true | false","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Boolean literals","id":"125","title":"Boolean literals"},"126":{"body":"Lexer STRING_LITERAL : \" ( PRINTABLE_ASCII_CHAR | QUOTE_ESCAPE | ASCII_ESCAPE )* \" PRINTABLE_ASCII_CHAR : Any ASCII character between 0x1F and 0x7E QUOTE_ESCAPE : \\\" ASCII_ESCAPE : | \\n | \\r | \\t | \\\\ A string literal is a sequence of any characters that are in the set of printable ASCII characters as well as a set of defined escape sequences. Line breaks are allowed in string literals.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » String literals","id":"126","title":"String literals"},"127":{"body":"Lexer INTEGER_LITERAL : ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL ) DEC_LITERAL : DEC_DIGIT (DEC_DIGIT|_)* BIN_LITERAL : 0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)* OCT_LITERAL : 0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)* HEX_LITERAL : 0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)* BIN_DIGIT : [0-1] OCT_DIGIT : [0-7] DEC_DIGIT : [0-9] HEX_DIGIT : [0-9 a-f A-F] An integer literal has one of four forms: A decimal literal starts with a decimal digit and continues with any mixture of decimal digits and underscores . A hex literal starts with the character sequence U+0030 U+0078 (0x) and continues as any mixture (with at least one digit) of hex digits and underscores. An octal literal starts with the character sequence U+0030 U+006F (0o) and continues as any mixture (with at least one digit) of octal digits and underscores. A binary literal starts with the character sequence U+0030 U+0062 (0b) and continues as any mixture (with at least one digit) of binary digits and underscores. Examples of integer literals of various forms: 123 // type u256\n0xff // type u256\n0o70 // type u256\n0b1111_1111_1001_0000 // type u256\n0b1111_1111_1001_0000i64 // type u256","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Integer literals","id":"127","title":"Integer literals"},"128":{"body":"Lexer LINE_COMMENT : // *","breadcrumbs":"Specification (WIP) » Comments » Comments","id":"128","title":"Comments"},"129":{"body":"Visibility and Privacy Structs Enums Type Aliases Contracts","breadcrumbs":"Specification (WIP) » Items » Items","id":"129","title":"Items"},"13":{"body":"When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a \"live\" network, you are handling assets with real-world value! In this guide, you will deploy your contract to a local blockchain . This will be an \"ephemeral\" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Introduction","id":"13","title":"Introduction"},"130":{"body":"These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question \"Can this item be used at this location?\" Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified. Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions. Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility. For example, this is a function that can be called externally from a transaction: pub fn answer_to_life_the_universe_and_everything() -> u256 { return 42\n} Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition. For example, given an Ingot with the following structure: example_ingot\n└── src ├── ding │ └── dong.fe └── main.fe With ding/dong.fe having the following contents: pub struct Dang { pub my_address: address pub my_u256: u256 pub my_i8: i8\n} Then main.fe can use the Dang struct since it is pub-qualified: use ding::dong::Dang contract Foo { pub fn hot_dang() -> Dang { return Dang( my_address: 8, my_u256: 42, my_i8: -1 ) }\n}","breadcrumbs":"Specification (WIP) » Items » Visibility and Privacy » Visibility and Privacy","id":"130","title":"Visibility and Privacy"},"131":{"body":"Syntax Struct : struct IDENTIFIER { StructField * StructMethod * } StructField : pub? IDENTIFIER : Type StructMethod : Function A struct is a nominal struct type defined with the keyword struct. An example of a struct item and its use: struct Point { pub x: u256 pub y: u256\n} fn pointy_stuff() { let mut p: Point = Point(x: 10, y: 11) let px: u256 = p.x p.x = 100\n} Builtin functions: abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.","breadcrumbs":"Specification (WIP) » Items » Structs » Structs","id":"131","title":"Structs"},"132":{"body":"Syntax Trait : trait IDENTIFIER { TraitMethod * } TraitMethod : fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? ; A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function. All traits define an implicit type parameter Self that refers to \"the type that is implementing this interface\". Example of the Min trait from Fe's standard library: pub trait Min { fn min() -> Self;\n} Example of the i8 type implementing the Min trait: impl Min for i8 { fn min() -> Self { return -128 }\n} Example of a function restricting a generic parameter to types implementing the Compute trait: pub trait Compute { fn compute(self) -> u256;\n} struct Example { fn do_something(val: T) -> u256 { return val.compute() }\n}","breadcrumbs":"Specification (WIP) » Items » Traits » Traits","id":"132","title":"Traits"},"133":{"body":"Syntax Enumeration : enum IDENTIFIER { EnumField * EnumMethod * } EnumField : IDENTIFIER | IDENTIFIER ( TupleElements ?) EnumMethod : Function TupleElements : Type ( , Type )* An enum , also referred to as enumeration is a simultaneous definition of a nominal Enum type , that can be used to create or pattern-match values of the corresponding type. Enumerations are declared with the keyword enum. An example of an enum item and its use: enum Animal { Dog Cat Bird(BirdType) pub fn bark(self) -> String<10> { match self { Animal::Dog => { return \"bow\" } Animal::Cat => { return \"meow\" } Animal::Bird(BirdType::Duck) => { return \"quack\" } Animal::Bird(BirdType::Owl) => { return \"hoot\" } } }\n} enum BirdType { Duck Owl\n} fn f() { let barker: Animal = Animal::Dog barker.bark()\n}","breadcrumbs":"Specification (WIP) » Items » Enums » Enum","id":"133","title":"Enum"},"134":{"body":"Syntax TypeAlias : type IDENTIFIER = Type A type alias defines a new name for an existing type . Type aliases are declared with the keyword type. For example, the following defines the type BookMsg as a synonym for the type u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe. type BookMsg = Array","breadcrumbs":"Specification (WIP) » Items » Type Aliases » Type aliases","id":"134","title":"Type aliases"},"135":{"body":"Syntax Contract : contract IDENTIFIER { ContractMember * _} ContractMember : Visibility ? ( ContractField | Function | Struct | Enum ) Visibility : pub? ContractField : IDENTIFIER : Type A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain. Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data). In Fe, contracts are defined in files with .fe extensions and compiled using fe build. A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods. An example of a contract: struct Signed { pub book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg: book_msg)) } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Multiple contracts can be compiled from a single .fe contract file.","breadcrumbs":"Specification (WIP) » Items » Contracts » Contracts","id":"135","title":"Contracts"},"136":{"body":"An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it. Read more on pragma","breadcrumbs":"Specification (WIP) » Items » Contracts » pragma","id":"136","title":"pragma"},"137":{"body":"State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function. pub contract Example { some_number: u256 _some_string: String<100>\n}","breadcrumbs":"Specification (WIP) » Items » Contracts » State variables","id":"137","title":"State variables"},"138":{"body":"Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well. Individual functions can be called internally or externally depending upon their visibility (either private or public). Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument. Read more on functions .","breadcrumbs":"Specification (WIP) » Items » Contracts » Contract functions","id":"138","title":"Contract functions"},"139":{"body":"The __init__ function is a special contract function that can only be called at contract deployment time . It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function. pub contract Example { _some_number: u256 _some_string: String<100> pub fn __init__(mut self, number: u256, string: String<100>) { self._some_number=number; self._some_string=string; }\n} It is not possible to call __init__ at runtime.","breadcrumbs":"Specification (WIP) » Items » Contracts » The __init__() function","id":"139","title":"The __init__() function"},"14":{"body":"Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process. In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps. Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Your developer environment","id":"14","title":"Your developer environment"},"140":{"body":"Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error. Read more on structs .","breadcrumbs":"Specification (WIP) » Items » Contracts » Structs","id":"140","title":"Structs"},"141":{"body":"Constant size values stored on the stack or in memory can be passed into and returned by functions. Syntax Function : FunctionQualifiers fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? { FunctionStatements * } FunctionQualifiers : pub? FunctionStatements : ReturnStatement | VariableDeclarationStatement | AssignStatement | AugmentedAssignStatement | ForStatement | WhileStatement | IfStatement | AssertStatement | BreakStatement | ContinueStatement | RevertStatement | Expression FunctionParameters : self? | self,? FunctionParam (, FunctionParam )* ,? FunctionParam : FunctionParamLabel ? IDENTIFIER : Types FunctionParamLabel : _ | IDENTIFIER FunctionReturnType : -> Types A function definition consists of name and code block along with an optional list of parameters and return value. Functions are declared with the keyword fn. Functions may declare a set of input parameters, through which the caller passes arguments into the function, and the output type of the value the function will return to its caller on completion. When referred to, a function yields a first-class value of the corresponding zero-sized function type , which when called evaluates to a direct call to the function. A function header prepends a set or curly brackets {...} which contain the function body. For example, this is a simple function: fn add(x: u256, y: u256) -> u256 { return x + y\n} Functions can be defined inside of a contract, inside of a struct, or at the \"top level\" of a module (that is, not nested within another item). Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n} contract CoolCoin { balance: Map fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool { if self.balance[sender] < value { return false } self.balance[sender] -= value self.balance[recipient] += value return true } pub fn demo(mut self) { let ann: address = 0xaa let bob: address = 0xbb self.balance[ann] = 100 let bonus: u256 = 2 let value: u256 = add(10, bonus) let ok: bool = self.transfer(from: ann, to: bob, value) }\n} Function parameters have optional labels. When a function is called, the arguments must be labeled and provided in the order specified in the function definition. The label of a parameter defaults to the parameter name; a different label can be specified by adding an explicit label prior to the parameter name. For example: fn encrypt(msg cleartext: u256, key: u256) -> u256 { return cleartext ^ key\n} fn demo() { let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)\n} Here, the first parameter of the encrypt function has the label msg, which is used when calling the function, while the parameter name is cleartext, which is used inside the function body. The parameter name is an implementation detail of the function, and can be changed without modifying any function calls, as long as the label remains the same. When calling a function, a label can be omitted when the argument is a variable with a name that matches the parameter label. Example: let msg: u256 = 0xdecafbad\nlet cyf: u256 = encrypt(msg, key: 0x1234) A parameter can also be specified to have no label, by using _ in place of a label in the function definition. In this case, when calling the function, the corresponding argument must not be labeled. Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n}\nfn demo() { let sum: u256 = add(16, 32)\n} Functions defined inside of a contract or struct may take self as a parameter. This gives the function the ability to read and write contract storage or struct fields, respectively. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value) self is expected to come first parameter in the function's parameter list. Functions can also take a Context object which gives access to EVM features that read or write blockchain and transaction data. Context is expected to be first in the function's parameter list unless the function takes self, in which case Context should come second.","breadcrumbs":"Specification (WIP) » Items » Functions » Functions","id":"141","title":"Functions"},"142":{"body":"Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context","id":"142","title":"Context"},"143":{"body":"Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses. To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone. For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log). pub fn looks_pure_but_isnt() { // COMPILE ERROR block_number()\n} Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows: pub fn uses_context(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Rationale","id":"143","title":"Rationale"},"144":{"body":"The Context object gates access to features such as: emitting logs creating contracts transferring ether reading message info reading block info The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error. The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g. // The context object is automatically injected when this is called externally\npub fn multiply_block_number(ctx: Context) -> u256 { // but it has to be passed along in this function call return retrieves_blocknumber(ctx) * 1000\n} fn retrieves_blocknumber(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » The Context object","id":"144","title":"The Context object"},"145":{"body":"All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.: struct SomeEvent{\n} pub fn mutable(mut ctx: Context) { ctx.emit(SomeEvent())\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context mutability","id":"145","title":"Context mutability"},"146":{"body":"The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self . The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types. Category Characteristics Fe Syntax ABI Pure Can only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impure foo(val: u256) pure Read Contract Reading information from the contract instance (broad definition includes reading constants from contract code) foo(self) view Storage Writing Writing to contract storage (own or that of other contracts) foo(mut self) payable or nonpayable Context Reading Reading contextual information from the blockchain (msg, block etc) foo(ctx: Context) view Context Modifying Emitting logs, transferring ether, creating contracts foo(ctx: mut Context) payable or nonpayable Read Contract & Context Reading information from the contract instance and Context foo(self, ctx:Context) view Read Contract & write Context Reading information from the contract instance and modify Context foo(self, ctx: mut Context) view Storage Writing & read Context Writing to contract storage and read from Context foo(mut self, ctx: Context) payable or nonpayable Storage Writing & write Context Writing to contract storage and Context foo(mut self, ctx: mut Context) payable or nonpayable This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » ABI conformity","id":"146","title":"ABI conformity"},"147":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Examples","id":"147","title":"Examples"},"148":{"body":"Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable. // assumes existence of state variable named 'ledger' with type Map\npub fn add_to_ledger(mut self, ctx: Context) { self.ledger[ctx.msg_sender()] = ctx.msg_value();\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » msg_sender and msg_value","id":"148","title":"msg_sender and msg_value"},"149":{"body":"Transferring ether modifies the blockchain state, so it requires access to a mutable Context object. pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) { ctx.send_value(to: _addr, wei: amount)\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Transferring ether","id":"149","title":"Transferring ether"},"15":{"body":"Foundry has its own local network called Anvil . You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command: anvil You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console ( never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed. Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a local network","id":"15","title":"Deploying to a local network"},"150":{"body":"Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data: pub fn creates_contract(ctx: mut Context): ctx.create2(...)","breadcrumbs":"Specification (WIP) » Items » Functions » Context » create/create2","id":"150","title":"create/create2"},"151":{"body":"Reading block chain information such as the current block number requires Context (but does not require it to be mutable). pub fn retrieves_blocknumber(ctx: Context) { ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » block number","id":"151","title":"block number"},"152":{"body":"self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage. Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value)","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Self","id":"152","title":"Self"},"153":{"body":"self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Mutability","id":"153","title":"Mutability"},"154":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Examples","id":"154","title":"Examples"},"155":{"body":"contract example { value: u256; pub fn check_value(self) -> u256 { return self.value; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Reading contract storage","id":"155","title":"Reading contract storage"},"156":{"body":"contract example { value: u256; pub fn update_value(mut self) { self.value += 1; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Writing contract storage","id":"156","title":"Writing contract storage"},"157":{"body":"pragma Statement const Statement let Statement Assignment Statement Augmenting Assignment Statement revert Statement return Statemetn if Statement for Statement while Statement break Statement continue Statement match Statement assert Statement","breadcrumbs":"Specification (WIP) » Statements » Statements","id":"157","title":"Statements"},"158":{"body":"Syntax PragmaStatement : pragma VersionRequirement VersionRequirement :Following the semver implementation by cargo The pragma statement is denoted with the keyword pragma. Evaluating a pragma statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement. An example of a pragma statement: pragma ^0.1.0 The version requirement syntax is identical to the one that is used by cargo ( more info ).","breadcrumbs":"Specification (WIP) » Statements » pragma Statement » pragma statement","id":"158","title":"pragma statement"},"159":{"body":"Syntax ConstStatement : const IDENTIFIER : Type = Expression A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type. Example: const TEN: u256 = 10\nconst HUNDO: u256 = TEN * TEN contract Foo { pub fn bar() -> u256 { return HUNDO }\n}","breadcrumbs":"Specification (WIP) » Statements » const Statement » const statement","id":"159","title":"const statement"},"16":{"body":"In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545). The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil. cast send --rpc-url localhost:8545 --private-key --create $(cat output/GuestBook/GuestBook.bin) Here's what the response was at the time of writing this tutorial. blockHash 0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702\nblockNumber 1\ncontractAddress 0x5FbDB2315678afecb367f032d93F642f64180aa3\ncumulativeGasUsed 196992\neffectiveGasPrice 4000000000\ngasUsed 196992\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622\ntransactionIndex 0\ntype 2 This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract. Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Making the deployment transaction","id":"16","title":"Making the deployment transaction"},"160":{"body":"Syntax LetStatement : let IDENTIFIER | TupleTarget : Type = Expression TupleTarget : ( TupleTargetItem (, TupleTargetItem ) + ) TupleTargetItem : IDENTIFIER | TupleTarget A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope. Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue . Example: contract Foo { pub fn bar() { let val1: u256 = 1 let (val2):(u256) = (1,) let (val3, val4):(u256, bool) = (1, false) let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4)) }\n}","breadcrumbs":"Specification (WIP) » Statements » let Statement » let statement","id":"160","title":"let statement"},"161":{"body":"Syntax AssignmentStatement : Expression = Expression An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression. Example: contract Foo { some_array: Array pub fn bar(mut self) { let mut val1: u256 = 10 // Assignment of stack variable val1 = 10 let mut values: (u256, u256) = (1, 2) // Assignment of tuple item values.item0 = 3 // Assignment of storage array slot self.some_array[5] = 1000 }\n}","breadcrumbs":"Specification (WIP) » Statements » Assignment Statement » Assignment statement","id":"161","title":"Assignment statement"},"162":{"body":"Syntax AssignmentStatement : Expression = Expression | Expression += Expression | Expression -= Expression | Expression %= Expression | Expression **= Expression | Expression <<= Expression | Expression >>= Expression | Expression |= Expression | Expression ^= Expression | Expression &= Expression Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements. An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression. Example: fn example() -> u8 { let mut a: u8 = 1 let b: u8 = 2 a += b a -= b a *= b a /= b a %= b a **= b a <<= b a >>= b a |= b a ^= b a &= b return a\n}","breadcrumbs":"Specification (WIP) » Statements » Augmenting Assignment Statement » Augmenting Assignment statement","id":"162","title":"Augmenting Assignment statement"},"163":{"body":"Syntax RevertStatement : revert Expression ? The revert statement is denoted with the keyword revert. Evaluating a revert statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838 . An example of a revert statement without revert data: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n} An example of a revert statement with revert data: struct ApplicationError { pub code: u8\n} contract Foo { pub fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert ApplicationError(code: 5) } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n}","breadcrumbs":"Specification (WIP) » Statements » revert Statement » revert statement","id":"163","title":"revert statement"},"164":{"body":"Syntax ReturnStatement : return Expression ? The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly. An example of a return statement without explicit use of an expression: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(to) { return } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n} The above can also be written in a slightly more verbose form: contract Foo { fn transfer(self, to: address, value: u256) -> () { if not self.in_whitelist(to) { return () } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n}","breadcrumbs":"Specification (WIP) » Statements » return Statement » return statement","id":"164","title":"return statement"},"165":{"body":"Syntax IfStatement : if Expression { ( Statement | Expression )+ } (else { ( Statement | Expression )+ })? Example: contract Foo { pub fn bar(val: u256) -> u256 { if val > 5 { return 1 } else { return 2 } }\n} The if statement is used for conditional execution.","breadcrumbs":"Specification (WIP) » Statements » if Statement » if statement","id":"165","title":"if statement"},"166":{"body":"Syntax ForStatement : for IDENTIFIER in Expression { ( Statement | Expression )+ } A for statement is a syntactic construct for looping over elements provided by an array type . An example of a for loop over the contents of an array: Example: contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » for Statement » for statement","id":"166","title":"for statement"},"167":{"body":"Syntax WhileStatement : while Expression { ( Statement | Expression )+ } A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes. Example: contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » while Statement » while statement","id":"167","title":"while statement"},"168":{"body":"Syntax BreakStatement : break The break statement can only be used within a for or while loop and causes the immediate termination of the loop. If used within nested loops the break statement is associated with the innermost enclosing loop. An example of a break statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n} An example of a break statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » break Statement » break statement","id":"168","title":"break statement"},"169":{"body":"Syntax ContinueStatement : continue The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head. If used within nested loops the continue statement is associated with the innermost enclosing loop. An example of a continue statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n} An example of a continue statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » continue Statement » continue statement","id":"169","title":"continue statement"},"17":{"body":"Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example). The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message \"We <3 Fe\" . cast send --rpc-url http://localhost:8545 --private-key \"sign(string)\" '\"We <3 Fe\"' The response will look approximately as follows: blockHash 0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7\nblockNumber 2\ncontractAddress cumulativeGasUsed 36278\neffectiveGasPrice 3767596722\ngasUsed 36278\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c\ntransactionIndex 0\ntype 2","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Signing the guest book","id":"17","title":"Signing the guest book"},"170":{"body":"Syntax MatchStatement : match Expression { ( Pattern => { Statement * } )+ } Pattern : PatternElem ( | PatternElem )* PatternElem : IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path | Path ( TuplePatterns ? ) |( TuplePatterns ? ) | Path { StructPatterns ? } TuplePatterns : Pattern ( , Pattern )* StructPatterns : Field ( , Field )*(, ..)? Field : IDENTIFIER : Pattern A match statements compares expression with patterns, then executes body of the matched arm. Example: enum MyEnum { Unit Tuple(u32, u256, bool)\n} contract Foo { pub fn bar(self) -> u256 { let val: MyEnum = MyEnum::Tuple(1, 10, false) return self.eval(val) } fn eval(self, val: MyEnum) -> u256 { match val { MyEnum::Unit => { return 0 } MyEnum::Tuple(.., false) => { return 1 } MyEnum::Tuple(a, b, true) => { return u256(a) + b } } }\n}","breadcrumbs":"Specification (WIP) » Statements » match Statement » match statement","id":"170","title":"match statement"},"171":{"body":"Syntax AssertStatement : assert Expression (, Expression )? The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression. If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code . Warning: The current implementation of assert is under active discussion and likely to change. An example of a assert statement without the optional message: contract Foo { fn bar(val: u256) { assert val > 5 }\n} An example of a assert statement with an error message: contract Foo { fn bar(val: u256) { assert val > 5, \"Must be greater than five\" }\n}","breadcrumbs":"Specification (WIP) » Statements » assert Statement » assert statement","id":"171","title":"assert statement"},"172":{"body":"Call expressions Tuple expressions List expressions Struct expressions Index expressions Attribute expressions Name expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators","breadcrumbs":"Specification (WIP) » Expressions » Expressions","id":"172","title":"Expressions"},"173":{"body":"Syntax CallExpression : Expression GenericArgs ? ( CallParams ? ) GenericArgs : < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL )* > CallParams : CallArg ( , CallArg )* ,? CallArg : ( CallArgLabel =)? Expression CallArgLabel : IDENTIFIER Label must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal. A call expression calls a function. The syntax of a call expression is an expression , followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition . If the function eventually returns, then the expression completes. Example: contract Foo { pub fn demo(self) { let ann: address = 0xaa let bob: address = 0xbb self.transfer(from: ann, to: bob, 25) } pub fn transfer(self, from: address, to: address, _ val: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Call expressions » Call expressions","id":"173","title":"Call expressions"},"174":{"body":"Syntax TupleExpression : ( TupleElements ? ) TupleElements : ( Expression , )+ Expression ? A tuple expression constructs tuple values . The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands . The number of tuple initializer operands is the arity of the constructed tuple. 1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression. Tuple expressions without any tuple initializer operands produce the unit tuple. For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field. For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2. Examples of tuple expressions and their types: Expression Type () () (unit) (0, 4) (u256, u256) (true, ) (bool, ) (true, -1, 1) (bool, i256, u256) A tuple field can be accessed via an attribute expression . Example: contract Foo { pub fn bar() { // Creating a tuple via a tuple expression let some_tuple: (u256, bool) = (1, false) // Accessing the first tuple field via the `item0` field baz(input: some_tuple.item0) } pub fn baz(input: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Tuple expressions » Tuple expressions","id":"174","title":"Tuple expressions"},"175":{"body":"Syntax ListExpression : [ ListElements ? ] ListElements : Expression (, Expression )* ,? A list expression constructs array values . The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands . The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array. Examples of tuple expressions and their types: Expression Type [1, self.get_number()] u256[2] [true, false, false] bool[3] An array item can be accessed via an index expression . Example: contract Foo { fn get_val3() -> u256 { return 3 } pub fn baz() { let val1: u256 = 2 // A list expression let foo: Array = [1, val1, get_val3()] }\n}","breadcrumbs":"Specification (WIP) » Expressions » List expressions » List expressions","id":"175","title":"List expressions"},"176":{"body":"TBW","breadcrumbs":"Specification (WIP) » Expressions » Struct expressions » Struct expressions","id":"176","title":"Struct expressions"},"177":{"body":"Syntax IndexExpression : Expression [ Expression ] Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map. Example: contract Foo { balances: Map pub fn baz(mut self, mut values: Array) { // Assign value at slot 5 values[5] = 1000 // Read value at slot 5 let val1: u256 = values[5] // Assign value for address zero self.balances[address(0)] = 10000 // Read balance of address zero let bal: u256 = self.balances[address(0)] }\n}","breadcrumbs":"Specification (WIP) » Expressions » Index expressions » Index expressions","id":"177","title":"Index expressions"},"178":{"body":"Syntax AttributeExpression : Expression . IDENTIFIER An attribute expression evaluates to the location of an attribute of a struct , tuple or contract . The syntax for an attribute expression is an expression, then a . and finally an identifier. Examples: struct Point { pub x: u256 pub y: u256\n} contract Foo { some_point: Point some_tuple: (bool, u256) fn get_point() -> Point { return Point(x: 100, y: 500) } pub fn baz(some_point: Point, some_tuple: (bool, u256)) { // Different examples of attribute expressions let bool_1: bool = some_tuple.item0 let x1: u256 = some_point.x let point1: u256 = get_point().x let point2: u256 = some_point.x }\n}","breadcrumbs":"Specification (WIP) » Expressions » Attribute expressions » Attribute expressions","id":"178","title":"Attribute expressions"},"179":{"body":"Syntax NameExpression : IDENTIFIER A name expression resolves to a local variable. Example: contract Foo { pub fn baz(foo: u256) { // name expression resolving to the value of `foo` foo }\n}","breadcrumbs":"Specification (WIP) » Expressions » Name expressions » Name expressions","id":"179","title":"Name expressions"},"18":{"body":"The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook. Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying. To do that run: $ cast call --rpc-url http://localhost:8545 \"get_msg(address)\" Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction. The response arrives in the form of hex-encoded bytes padded with zeroes: 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000 Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows: cast to_ascii \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000\" or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command: cast call --rpc-url https://rpc.sepolia.org \"get_msg(address)\" | cast --to-ascii Either way, the response will be the message you passed to the sign(string) function. \"We <3 Fe\" Congratulations! You've deployed real Fe code to a local blockchain! 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Reading the signatures","id":"18","title":"Reading the signatures"},"180":{"body":"Syntax PathExpression : IDENTIFIER ( :: IDENTIFIER )* A name expression resolves to a local variable. Example: contract Foo { pub fn baz() { // CONST_VALUE is defined in another module `my_mod`. let foo: u32 = my_mod::CONST_VALUE }\n}","breadcrumbs":"Specification (WIP) » Expressions » Path expressions » Path expressions","id":"180","title":"Path expressions"},"181":{"body":"Syntax LiteralExpression : | STRING_LITERAL | INTEGER_LITERAL | BOOLEAN_LITERAL A literal expression consists of one of the literal forms described earlier. It directly describes a number, string or boolean value. \"hello\" // string type\n5 // integer type\ntrue // boolean type","breadcrumbs":"Specification (WIP) » Expressions » Literal expressions » Literal expressions","id":"181","title":"Literal expressions"},"182":{"body":"Syntax ArithmeticExpression : Expression + Expression | Expression - Expression | Expression * Expression | Expression / Expression | Expression % Expression | Expression ** Expression | Expression & Expression | Expression | Expression | Expression ^ Expression | Expression << Expression | Expression >> Expression Binary operators expressions are all written with infix notation . This table summarizes the behavior of arithmetic and logical binary operators on primitive types. Symbol Integer + Addition - Subtraction * Multiplication / Division* % Remainder ** Exponentiation & Bitwise AND | Bitwise OR ^ Bitwise XOR << Left Shift >> Right Shift * Integer division rounds towards zero. Here are examples of these operators being used. 3 + 6 == 9\n6 - 3 == 3\n2 * 3 == 6\n6 / 3 == 2\n5 % 4 == 1\n2 ** 4 == 16\n12 & 25 == 8\n12 | 25 == 29\n12 ^ 25 == 21\n212 << 1 == 424\n212 >> 1 == 106","breadcrumbs":"Specification (WIP) » Expressions » Arithmetic Operators » Arithmetic Operators","id":"182","title":"Arithmetic Operators"},"183":{"body":"Syntax ComparisonExpression : Expression == Expression | Expression != Expression | Expression > Expression | Expression < Expression | Expression >= Expression | Expression <= Expression Symbol Meaning == Equal != Not equal > Greater than < Less than >= Greater than or equal to <= Less than or equal to Here are examples of the comparison operators being used. 123 == 123\n23 != -12\n12 > 11\n11 >= 11\n11 < 12\n11 <= 11","breadcrumbs":"Specification (WIP) » Expressions » Comparison Operators » Comparison Operators","id":"183","title":"Comparison Operators"},"184":{"body":"Syntax BooleanExpression : Expression or Expression | Expression and Expression The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'. Example: const x: bool = false or true // true","breadcrumbs":"Specification (WIP) » Expressions » Boolean Operators » Boolean Operators","id":"184","title":"Boolean Operators"},"185":{"body":"Syntax UnaryExpression : not Expression | - Expression | ~ Expression The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument. Example: fn f() { let x: bool = not true // false let y: i256 = -1 let z: i256 = i256(~1) // -2\n}","breadcrumbs":"Specification (WIP) » Expressions » Unary Operators » Unary Operators","id":"185","title":"Unary Operators"},"186":{"body":"","breadcrumbs":"Specification (WIP) » Type System » Type System","id":"186","title":"Type System"},"187":{"body":"Every variable, item, and value in a Fe program has a type. The _ of a value defines the interpretation of the memory holding it and the operations that may be performed on the value. Built-in types are tightly integrated into the language, in nontrivial ways that are not possible to emulate in user-defined types. User-defined types have limited capabilities. The list of types is: Data types Base types: Boolean — true or false Address - Ethereum address Numeric — integer Reference types: Sequence types Tuple Array String Struct Enum Map Other types: Unit Contract Function","breadcrumbs":"Specification (WIP) » Type System » Types » Types","id":"187","title":"Types"},"188":{"body":"The bool type is a data type which can be either true or false. Example: let x: bool = true","breadcrumbs":"Specification (WIP) » Type System » Types » Boolean Type » Boolean type","id":"188","title":"Boolean type"},"189":{"body":"An contract type is the type denoted by the name of an contract item . A value of a given contract type carries the contract's public interface as attribute functions. A new contract value can be created by either casting an address to a contract type or by creating a new contract using the type attribute functions create or create2. Example: contract Foo { pub fn get_my_num() -> u256 { return 42 }\n} contract FooFactory { pub fn create2_foo(mut ctx: Context) -> address { // `0` is the value being sent and `52` is the address salt let foo: Foo = Foo.create2(ctx, 0, 52) return address(foo) }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Contract Type » Contract types","id":"189","title":"Contract types"},"19":{"body":"Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token. In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website. IMPORTANT : It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet. Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this: If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport. You can use an RPC provider such as Alchemy or Infura You can use an open public node such as https://rpc.sepolia.org. Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint: cast send --rpc-url https://rpc.sepolia.org --private-key --create $(cat output/GuestBook/GuestBook.bin) Now you have deployed the contract to a public network and anyone can interact with it. To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past: address link deploy tx hash 0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76 etherscan contract address 0x810cbd4365396165874C054d01B1Ede4cc249265 etherscan Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database. Congratulations! You've deployed real Fe code to a live network 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a public test network","id":"19","title":"Deploying to a public test network"},"190":{"body":"The unsigned integer types consist of: Type Minimum Maximum u8 0 28-1 u16 0 216-1 u32 0 232-1 u64 0 264-1 u128 0 2128-1 u256 0 2256-1 The signed two's complement integer types consist of: Type Minimum Maximum i8 -(27) 27-1 i16 -(215) 215-1 i32 -(231) 231-1 i64 -(263) 263-1 i128 -(2127) 2127-1 i256 -(2255) 2255-1","breadcrumbs":"Specification (WIP) » Type System » Types » Numeric Types » Numeric types","id":"190","title":"Numeric types"},"191":{"body":"Syntax TupleType : ( ) | ( ( Type , )+ Type ? ) Tuple types are a family of structural types [1] for heterogeneous lists of other types. The syntax for a tuple type is a parenthesized, comma-separated list of types. A tuple type has a number of fields equal to the length of the list of types. This number of fields determines the arity of the tuple. A tuple with n fields is called an n-ary tuple . For example, a tuple with 2 fields is a 2-ary tuple. Fields of tuples are named using increasing numeric names matching their position in the list of types. The first field is item0. The second field is item1. And so on. The type of each field is the type of the same position in the tuple's list of types. For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type . Its one value is also called unit or the unit value . Some examples of tuple types: () (also known as the unit or zero-sized type ) (u8, u8) (bool, i32) (i32, bool) (different type from the previous example) Values of this type are constructed using a tuple expression . Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. Tuple fields can be accessed via an attribute expression . Structural types are always equivalent if their internal types are equivalent.","breadcrumbs":"Specification (WIP) » Type System » Types » Tuple Types » Tuple Types","id":"191","title":"Tuple Types"},"192":{"body":"Syntax ArrayType : Array< Type , INTEGER_LITERAL > An array is a fixed-size sequence of N elements of type T. The array type is written as Array. The size is an integer literal. Arrays are either stored in storage or memory but are never stored directly on the stack. Examples: contract Foo { // An array in storage bar: Array fn do_something() { // An array in memory let values: Array = [10, 100, 100] }\n} All elements of arrays are always initialized, and access to an array is always bounds-checked in safe methods and operators.","breadcrumbs":"Specification (WIP) » Type System » Types » Array Types » Array types","id":"192","title":"Array types"},"193":{"body":"A struct type is the type denoted by the name of an struct item . A struct type is a heterogeneous product of other types, called the fields of the type. New instances of a struct can be constructed with a struct expression . Struct types are either stored in storage or memory but are never stored directly on the stack. Examples: struct Rectangle { pub width: u256 pub length: u256\n} contract Example { // A Rectangle in storage area: Rectangle fn do_something() { let length: u256 = 20 // A rectangle in memory let square: Rectangle = Rectangle(width: 10, length) }\n} All fields of struct types are always initialized. The data layout of a struct is not part of its external API and may be changed in any release. The fields of a struct may be qualified by visibility modifiers , to allow access to data in a struct outside a module.","breadcrumbs":"Specification (WIP) » Type System » Types » Struct Types » Struct types","id":"193","title":"Struct types"},"194":{"body":"An enum type is the type denoted by the name of an enum item .","breadcrumbs":"Specification (WIP) » Type System » Types » Enum Types » Enum types","id":"194","title":"Enum types"},"195":{"body":"The address type represents a 20 byte Ethereum address. Example: contract Example { // An address in storage someone: address fn do_something() { // A plain address (not part of a tuple, struct etc) remains on the stack let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Address Type » Address Type","id":"195","title":"Address Type"},"196":{"body":"The type Map is used to associate key values with data. The following types can be used as key: unit type boolean type address type numeric types The values can be of any type including other maps, structs , tuples or arrays . Example: contract Foo { bar: Map> baz: Map> pub fn read_bar(self, a: address, b: address) -> u256 { return self.bar[a][b] } pub fn write_bar(mut self, a: address, b: address, value: u256) { self.bar[a][b] = value } pub fn read_baz(self, a: address, b: u256) -> bool { return self.baz[a][b] } pub fn write_baz(mut self, a: address, b: u256, value: bool) { self.baz[a][b] = value }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Map Type » Map type","id":"196","title":"Map type"},"197":{"body":"A value of type String represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8. The String type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters. Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as \"fox\" but it can not hold a full sentence such as \"The brown fox jumps over the white fence\". Example: contract Foo { fn bar() { let single_byte_string: String<1> = \"a\" let longer_string: String<100> = \"foo\" }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » String Type » String Type","id":"197","title":"String Type"},"198":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Unit Type » Unit type","id":"198","title":"Unit type"},"199":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Function Type » Function Types","id":"199","title":"Function Types"},"2":{"body":"Fe is for anyone that develops using the EVM ! Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains. Fe's syntax will feel familiar to Rust and Python developers. Here's what a minimal contract looks like in Fe: contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n}","breadcrumbs":"Introduction » Who is Fe for?","id":"2","title":"Who is Fe for?"},"20":{"body":"Well done! You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls. Here's some ideas for what you could do next: Experiment with different developer tooling Get more comfortable with Foundry by exploring the documentation Repeat the steps in this guide but for a more complex contract - be creative! Continue to the Using Fe pages to explore Fe more deeply.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Summary","id":"20","title":"Summary"},"200":{"body":"There are three places where data can be stored on the EVM: stack : 256-bit values placed on the stack that are loaded using DUP operations. storage : 256-bit address space where 256-bit values can be stored. Accessing higher storage slots does not increase gas cost. memory : 256-bit address space where 256-bit values can be stored. Accessing higher memory slots increases gas cost. Each data type can be stored in these locations. How data is stored is described in this section.","breadcrumbs":"Specification (WIP) » Data Layout » Data Layout","id":"200","title":"Data Layout"},"201":{"body":"The following can be stored on the stack: base type values pointers to reference type values The size of each value stored on the stack must not exceed 256 bits. Since all base types are less than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack. Example: fn f() { let foo: u256 = 42 // foo is stored on the stack let bar: Array = [0; 100] // bar is a memory pointer stored on the stack\n}","breadcrumbs":"Specification (WIP) » Data Layout » Stack » Stack","id":"201","title":"Stack"},"202":{"body":"All data types can be stored in storage.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Storage","id":"202","title":"Storage"},"203":{"body":"Storage pointers for constant size values are determined at compile time. Example: contract Cats { population: u256 // assigned a static location by the compiler\n} The value of a base type in storage is found by simply loading the value from storage at the given pointer. To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Constant size values in storage » Constant size values in storage","id":"203","title":"Constant size values in storage"},"204":{"body":"Maps are not assigned pointers, because they do not have a location in storage. They are instead assigned a nonce that is used to derive the location of keyed values during runtime. Example: contract Foo { bar: Map // bar is assigned a static nonce by the compiler baz: Map> // baz is assigned a static nonce by the compiler\n} The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value .i.e. keccak256(, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to a nested hash i.e. keccak256(keccak256(, 0x00), 0x01).","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Maps in storage » Maps in storage","id":"204","title":"Maps in storage"},"205":{"body":"Reference type values can be copied from storage and into memory using the to_mem function. Example: let my_array_var: Array = self.my_array_field.to_mem()","breadcrumbs":"Specification (WIP) » Data Layout » Storage » to_mem() function » The to_mem function","id":"205","title":"The to_mem function"},"206":{"body":"Only sequence types can be stored in memory. The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly allocated segments begin at the value given by this slot. When more memory has been allocated, the value stored in 0x00 is increased. We do not free memory after it is allocated.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Memory","id":"206","title":"Memory"},"207":{"body":"Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and reference them using pointers kept on the stack. Example: fn f() { let foo: Array = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.\n} To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Sequence types in memory » Sequence types in memory","id":"207","title":"Sequence types in memory"},"208":{"body":"You can contribute to Fe!","breadcrumbs":"Contributing » Contributing","id":"208","title":"Contributing"},"209":{"body":"","breadcrumbs":"Contributing » Ways to contribute:","id":"209","title":"Ways to contribute:"},"21":{"body":"Welcome to the Fe user guide! Here you can find information about how to use Fe to develop smart contracts. Read more about: Installing Fe organizing your code using projects We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!","breadcrumbs":"Using Fe » User guide","id":"21","title":"User guide"},"210":{"body":"If you find problems with Fe you can report them to the development team on the project Github . You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.","breadcrumbs":"Contributing » 1. Reporting or fixing issues.","id":"210","title":"1. Reporting or fixing issues."},"211":{"body":"We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide. To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.","breadcrumbs":"Contributing » 2. Improving the docs.","id":"211","title":"2. Improving the docs."},"212":{"body":"You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling. It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board . Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master. To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.","breadcrumbs":"Contributing » 3. Developing Fe","id":"212","title":"3. Developing Fe"},"213":{"body":"We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter. Please note that this project has a Code of Conduct . By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.","breadcrumbs":"Contributing » 4. Community engagement","id":"213","title":"4. Community engagement"},"214":{"body":"","breadcrumbs":"Contributing » Processes","id":"214","title":"Processes"},"215":{"body":"To report an issue, please use the Github issue board . When reporting issues, please mention the following details: Fe version. your operating system. the steps required to reproduce the issue actual vs expected behaviour any error messages or relevant logs the specific source code where the issue originates The appropriate place for technical discussions about the language itself is the Fe Discord .","breadcrumbs":"Contributing » Reporting issues","id":"215","title":"Reporting issues"},"216":{"body":"Please fork the Fe repository and raise pull requests against the master branch. Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge. New features should be accompanied by appropriate tests. Finally, please make sure you respect the coding style for this project. Thank you for contributing to Fe!","breadcrumbs":"Contributing » Rasing Pull Requests","id":"216","title":"Rasing Pull Requests"},"217":{"body":"🖥️ Download Binaries 📄 Draft Spec ℹ️ Getting Started Fe is moving fast. Read up on all the latest improvements.","breadcrumbs":"Release Notes » Release Notes","id":"217","title":"Release Notes"},"218":{"body":"","breadcrumbs":"Release Notes » 0.26.0 \"Zircon\" (2023-11-03)","id":"218","title":"0.26.0 \"Zircon\" (2023-11-03)"},"219":{"body":"Give option to produce runtime bytecode as compilation artifact Previously, the compiler could only produce the bytecode that is used for the deployment of the contract. Now it can also produce the runtime bytecode which is the bytecode that is saved to storage. Being able to obtain the runtime bytecode is useful for contract verification. To obtain the runtime bytecode use the runtime-bytecode option of the --emit flag (multiple options allowed). Example Output: mycontract.bin (bytecode for deployment) mycontract.runtime.bin (runtime bytecode) ( #947 ) New verify command to verify onchain contracts against local source code. People need to be able to verify that a deployed contract matches the source code that the author claims was used to deploy it. Previously, there was no simple way to achieve this. These are the steps to verify a contract with the verify command: Obtain the project's source code locally. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag) From the project directory run fe verify Example: $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com\nIt's a match!✨ Onchain contract:\nAddress: 0xf0adbb9ed4135d1509ad039505bada942d18755f\nBytecode: 0x60008..76b90 Local contract:\nContract name: SimpleDAO\nSource file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe\nBytecode: 0x60008..76b90 Hint: Run with --verbose to see the contract's source code. ( #948 )","breadcrumbs":"Release Notes » Features","id":"219","title":"Features"},"22":{"body":"At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL . Note: If you happen to be a Windows developer, consider getting involved and help us to support the Windows platform natively. Here would be a good place to start. On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable. /usr/sbin/softwareupdate --install-rosetta --agree-to-license","breadcrumbs":"Using Fe » Installation » Installation","id":"22","title":"Installation"},"220":{"body":"Added a new page on EVM precompiles ( #944 )","breadcrumbs":"Release Notes » Improved Documentation","id":"220","title":"Improved Documentation"},"221":{"body":"","breadcrumbs":"Release Notes » 0.25.0 \"Yoshiokaite\" (2023-10-26)","id":"221","title":"0.25.0 \"Yoshiokaite\" (2023-10-26)"},"222":{"body":"Use the project root as default path for fe test Just run fe test from any directory of the project. ( #913 ) Completed std::buf::MemoryBuffer refactor. ( #917 ) Allow filtering tests to run via fe test --filter (self, mut _ val: T) -> u256 { return val.compute(val: 1000) }\n} contract Example { pub fn run_test(self) { let runner: Runner = Runner(); let mut mac: Mac = Mac(); assert runner.run(mac) == 1001 }\n} ( #865 ) The ctx parameter can now be passed into test functions. example: #test\nfn my_test(ctx: Context) { assert ctx.block_number() == 0\n} ( #880 ) The following has been added to the standard library: Memory buffer abstraction example: use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}\nuse std::traits::Max #test\nfn test_buf_rw() { let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) let mut writer: MemoryBufferWriter = buf.writer() let mut reader: MemoryBufferReader = buf.reader() writer.write(value: 42) writer.write(value: 42) writer.write(value: 26) writer.write(value: u8(26)) writer.write(value: u256::max()) writer.write(value: u128::max()) writer.write(value: u64::max()) writer.write(value: u32::max()) writer.write(value: u16::max()) writer.write(value: u8::max()) writer.write(value: u8(0)) assert reader.read_u256() == 42 assert reader.read_u256() == 42 assert reader.read_u256() == 26 assert reader.read_u8() == 26 assert reader.read_u256() == u256::max() assert reader.read_u128() == u128::max() assert reader.read_u64() == u64::max() assert reader.read_u32() == u32::max() assert reader.read_u16() == u16::max() assert reader.read_u8() == u8::max() assert reader.read_u8() == 0\n} Precompiles example: use std::precompiles\nuse std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter} #test\nfn test_ec_recover() { let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada ) assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)\n} ctx.raw_call() example: use std::buf::{ RawCallBuffer, MemoryBufferReader, MemoryBufferWriter\n}\nuse std::evm contract Foo { pub unsafe fn __call__() { if evm::call_data_load(offset: 0) == 42 { evm::mstore(offset: 0, value: 26) evm::return_mem(offset: 0, len: 32) } else if evm::call_data_load(offset: 0) == 26 { revert } }\n} #test\nfn test_raw_call(mut ctx: Context) { let foo: Foo = Foo.create(ctx, 0) let mut buf: RawCallBuffer = RawCallBuffer::new( input_len: 32, output_len: 32 ) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 42) assert ctx.raw_call(addr: address(foo), value: 0, buf) let mut reader: MemoryBufferReader = buf.reader() assert reader.read_u256() == 26 assert not ctx.raw_call(addr: address(foo), value: 0, buf)\n} ( #885 )","breadcrumbs":"Release Notes » Features","id":"230","title":"Features"},"231":{"body":"Fixed an ICE when using aggregate types with aggregate type fields in public functions This code would previously cause an ICE: struct Tx { pub data: Array\n} contract Foo { pub fn bar(mut tx: Tx) {}\n} ( #867 ) Fixed a regression where the compiler would not reject a method call on a struct in storage. E.g. the follwing code should be rejected as it is missing a to_mem() call: struct Bar { pub x: u256 pub fn get_x(self) -> u256{ return self.x }\n} contract Foo { bar: Bar pub fn __init__(mut self) { self.bar = Bar( x: 2 ) } fn yay(self) { self.bar.get_x() }\n} The compiler will now reject the code and suggest a to_mem() before callingget_x(). ( #881 )","breadcrumbs":"Release Notes » Bugfixes","id":"231","title":"Bugfixes"},"232":{"body":"This is the first non-alpha release of Fe. Read our announcement for more details.","breadcrumbs":"Release Notes » 0.22.0 \"Vulcanite\" (2023-04-05)","id":"232","title":"0.22.0 \"Vulcanite\" (2023-04-05)"},"233":{"body":"Support for tests. example: #test\nfn my_test() { assert 26 + 16 == 42\n} Tests can be executed using the test subcommand. example: $ fe test foo.fe ( #807 ) Fixed broken trait orphan rule Fe has an orphan rule for Traits similar to Rust's that requires that either the trait or the type that we are implementing the trait for are located in the same ingot as the impl. This rule was implemented incorrectly so that instead of requiring them to be in the same ingot, they were required to be in the same module. This change fixes this so that the orphan rule is enforced correctly. ( #863 ) address values can now be specified with a number literal, with no explicit cast. So instead of let t: address = address(0xfe), one can now write let t: address = 0xfe. This also means that it's possible to define const addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe ( #864 )","breadcrumbs":"Release Notes » Features","id":"233","title":"Features"},"234":{"body":"Fixed resolving of generic arguments to associated functions. For example, this code would previously crash the compiler: ... // This function doesn't take self pub fn run_static(_ val: T) -> u256 { return val.compute(val: 1000) }\n... // Invoking it would previously crash the compiler\nRunner::run_static(Mac())\n... ( #861 )","breadcrumbs":"Release Notes » Bugfixes","id":"234","title":"Bugfixes"},"235":{"body":"Changed the Deployment tutorial to use foundry and the Sepolia network ( #853 )","breadcrumbs":"Release Notes » Improved Documentation","id":"235","title":"Improved Documentation"},"236":{"body":"","breadcrumbs":"Release Notes » 0.21.0-alpha (2023-02-28)","id":"236","title":"0.21.0-alpha (2023-02-28)"},"237":{"body":"Support for Self type With this change Self (with capital S) can be used to refer to the enclosing type in contracts, structs, impls and traits. E.g. trait Min { fn min() -> Self;\n} impl Min for u8 { fn min() -> u8 { // Both `u8` or `Self` are valid here return 0 }\n} Usage: u8::min() ( #803 ) Added Min and Max traits to the std library. The std library implements the traits for all numeric types. Example use std::traits::{Min, Max}\n... assert u8::min() < u8::max()\n``` ([#836](https://github.com/ethereum/fe/issues/836)) Upgraded underlying solc compiler to version 0.8.18","breadcrumbs":"Release Notes » Features","id":"237","title":"Features"},"238":{"body":"the release contains minor bugfixes","breadcrumbs":"Release Notes » Bugfixes","id":"238","title":"Bugfixes"},"239":{"body":"","breadcrumbs":"Release Notes » 0.20.0-alpha (2022-12-05)","id":"239","title":"0.20.0-alpha (2022-12-05)"},"24":{"body":"Fe is distributed via a single executable file linked from the home page . In the future we will make sure it can be installed through a variety of popular package managers such as apt. Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac. Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.","breadcrumbs":"Using Fe » Installation » Download the compiler","id":"24","title":"Download the compiler"},"240":{"body":"Removed the event type as well as the emit keyword. Instead the struct type now automatically implements the Emittable trait and can be emitted via ctx.emit(..). Indexed fields can be annotated via the #indexed attribute. E.g. struct Signed { book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg)) }\n} ( #717 ) Allow to call trait methods on types when trait is in scope So far traits were only useful as bounds for generic functions. With this change traits can also be used as illustrated with the following example: trait Double { fn double(self) -> u256;\n} impl Double for (u256, u256) { fn double(self) -> u256 { return (self.item0 + self.item1) * 2 }\n} contract Example { pub fn run_test(self) { assert (0, 1).double() == 2 }\n} If a call turns out to be ambigious the compiler currently asks the user to disambiguate via renaming. In the future we will likely introduce a syntax to allow to disambiguate at the callsite. ( #757 ) Allow contract associated functions to be called via ContractName::function_name() syntax. ( #767 ) Add enum types and match statement. enum can now be defined, e.g., pub enum MyEnum { Unit Tuple(u32, u256, bool) fn unit() -> MyEnum { return MyEnum::Unit }\n} Also, match statement is introduced, e.g., pub fn eval_enum() -> u256{ match MyEnum { MyEnum::Unit => { return 0 } MyEnum::Tuple(a, _, false) => { return u256(a) } MyEnum::Tuple(.., true) => { return u256(1) } }\n} For now, available patterns are restricted to Wildcard(_), which matches all patterns: _ Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c) Boolean literal(true and false) Enum variant. e.g., MyEnum::Tuple(a, b, c) Tuple pattern. e.g., (a, b, c) Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true} Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true) Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true) Fe compiler performs the exhaustiveness and usefulness checks for match statement. So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. ( #770 ) Changed comments to use // instead of # ( #776 ) Added the mut keyword, to mark things as mutable. Any variable or function parameter not marked mut is now immutable. contract Counter { count: u256 pub fn increment(mut self) -> u256 { // `self` is mutable, so storage can be modified self.count += 1 return self.count }\n} struct Point { pub x: u32 pub y: u32 pub fn add(mut self, _ other: Point) { self.x += other.x self.y += other.y // other.x = 1000 // ERROR: `other` is not mutable }\n} fn pointless() { let origin: Point = Point(x: 0, y: 0) // origin.x = 10 // ERROR: origin is not mutable let x: u32 = 10 // x_coord = 100 // ERROR: `x_coord` is not mutable let mut y: u32 = 0 y = 10 // OK let mut p: Point = origin // copies `origin` p.x = 10 // OK, doesn't modify `origin` let mut q: Point = p // copies `p` q.x = 100 // doesn't modify `p` p.add(q) assert p.x == 110\n} Note that, in this release, primitive type function parameters can't be mut. This restriction might be lifted in a future release. For example: fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut x += 1\n} ( #777 ) The contents of the std::prelude module (currently just the Context struct) are now automatically used by every module, so use std::context::Context is no longer required. ( #779 ) When the Fe compiler generates a JSON ABI file for a contract, the \"stateMutability\" field for each function now reflects whether the function can read or modify chain or contract state, based on the presence or absence of the self and ctx parameters, and whether those parameters are mutable. If a function doesn't take self or ctx, it's \"pure\". If a function takes self or ctx immutably, it can read state but not mutate state, so it's a \"view\" If a function takes mut self or mut ctx, it can mutate state, and is thus marked \"payable\". Note that we're following the convention set by Solidity for this field, which isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently distinguish between \"payable\" and \"nonpayable\" functions; if you want a function to revert when Eth is sent, you need to do it manually (eg assert ctx.msg_value() == 0). ( #783 ) Trait associated functions This change allows trait functions that do not take a self parameter. The following demonstrates a possible trait associated function and its usage: trait Max { fn max(self) -> u8;\n} impl Max for u8 { fn max() -> u8 { return u8(255) }\n} contract Example { pub fn run_test(self) { assert u8::max() == 255 }\n} ( #805 )","breadcrumbs":"Release Notes » Features","id":"240","title":"Features"},"241":{"body":"Fix issue where calls to assiciated functions did not enforce visibility rules. E.g the following code should be rejected but previously wasn't: struct Foo { fn do_private_things() { }\n} contract Bar { fn test() { Foo::do_private_things() }\n} With this change, the above code is now rejected because do_private_things is not pub. ( #767 ) Padding on bytes and string ABI types is zeroed out. ( #769 ) Ensure traits from other modules or even ingots can be implemented ( #773 ) Certain cases where the compiler would not reject pure functions being called on instances are now properly rejected. ( #775 ) Reject calling to_mem() on primitive types in storage ( #801 ) Disallow importing private type via use The following was previously allowed but will now error: use foo::PrivateStruct ( #815 )","breadcrumbs":"Release Notes » Bugfixes","id":"241","title":"Bugfixes"},"242":{"body":"","breadcrumbs":"Release Notes » 0.19.1-alpha \"Sunstone\" (2022-07-06)","id":"242","title":"0.19.1-alpha \"Sunstone\" (2022-07-06)"},"243":{"body":"Support returning nested struct. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn return_nested_struct() -> NestedStruct { ... }\n} ( #635 ) Made some small changes to how the Context object is used. ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0)) ctx is required when calling an external contract function that requires ctx Example: use std::context::Context // see issue #679 contract Foo { pub fn emit_stuff(ctx: Context) { emit Stuff(ctx) # will be `ctx.emit(Stuff{})` someday }\n}\ncontract Bar { pub fn call_foo_emit_stuff(ctx: Context) { Foo(address(0)).emit_stuff(ctx) }\n}\nevent Stuff {} ( #703 ) Braces! Fe has abandoned python-style significant whitespace in favor of the trusty curly brace. In addition, elif is now spelled else if, and the pass statement no longer exists. Example: pub struct SomeError {} contract Foo { x: u8 y: u16 pub fn f(a: u8) -> u8 { if a > 10 { let x: u8 = 5 return a + x } else if a == 0 { revert SomeError() } else { return a * 10 } } pub fn noop() {}\n} ( #707 ) traits and generic function parameter Traits can now be defined, e.g: trait Computable { fn compute(self, val: u256) -> u256;\n} The mechanism to implement a trait is via an impl block e.g: struct Linux { pub counter: u256 pub fn get_counter(self) -> u256 { return self.counter } pub fn something_static() -> u256 { return 5 }\n} impl Computable for Linux { fn compute(self, val: u256) -> u256 { return val + Linux::something_static() + self.get_counter() }\n} Traits can only appear as bounds for generic functions e.g.: struct Runner { pub fn run(self, _ val: T) -> u256 { return val.compute(val: 1000) }\n} Only struct functions (not contract functions) can have generic parameters. The run method of Runner can be called with any type that implements Computable e.g. contract Example { pub fn generic_compute(self) { let runner: Runner = Runner(); assert runner.run(Mac()) == 1001 assert runner.run(Linux(counter: 10)) == 1015 }\n} ( #710 ) Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe ( #726 ) Allow using complex type as array element type. Example: contract Foo { pub fn bar() -> i256 { let my_array: Array = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)] let sum: i256 = 0 for pair in my_array { sum += pair.x } return sum }\n} struct Pair { pub x: i256 pub y: i256 pub fn new(_ x: i256, _ y: i256) -> Pair { return Pair(x, y) }\n} ( #730 ) The fe CLI now has subcommands: fe new myproject - creates a new project structure fe check . - analyzes fe source code and prints errors fe build . - builds a fe project ( #732 ) Support passing nested struct types to public functions. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn f(arg: NestedStruct) { ... }\n} ( #733 ) Added support for repeat expressions ([VALUE; LENGTH]). e.g. let my_array: Array = [bool; 42] Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. ( #747 )","breadcrumbs":"Release Notes » Features","id":"243","title":"Features"},"244":{"body":"Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. ( #734 ) Fix issue where a negative constant leads to an ICE E.g. the following code would previously crash the compiler but shouldn't: const INIT_VAL: i8 = -1\ncontract Foo { pub fn init_bar() { let x: i8 = INIT_VAL }\n} ( #745 ) Fix a bug that causes ICE when nested if-statement has multiple exit point. E.g. the following code would previously crash the compiler but shouldn't: pub fn foo(self) { if true { if self.something { return } } if true { if self.something { return } }\n} ( #749 )","breadcrumbs":"Release Notes » Bugfixes","id":"244","title":"Bugfixes"},"245":{"body":"","breadcrumbs":"Release Notes » 0.18.0-alpha \"Ruby\" (2022-05-27)","id":"245","title":"0.18.0-alpha \"Ruby\" (2022-05-27)"},"246":{"body":"Added support for parsing of attribute calls with generic arguments (e.g. foo.bar()). ( #719 )","breadcrumbs":"Release Notes » Features","id":"246","title":"Features"},"247":{"body":"Fix a regression where the stateMutability field would not be included in the generated ABI ( #722 ) Fix two regressions introduced in 0.17.0 Properly lower right shift operation to yul's sar if operand is signed type Properly lower negate operation to call safe_sub ( #723 )","breadcrumbs":"Release Notes » Bugfixes","id":"247","title":"Bugfixes"},"248":{"body":"","breadcrumbs":"Release Notes » 0.17.0-alpha \"Quartz\" (2022-05-26)","id":"248","title":"0.17.0-alpha \"Quartz\" (2022-05-26)"},"249":{"body":"Support for underscores in numbers to improve readability e.g. 100_000. Example let num: u256 = 1000_000_000_000 ( #149 ) Optimized access of struct fields in storage ( #249 ) Unit type () is now ABI encodable ( #442 ) Temporary default stateMutability to payable in ABI The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction. As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. ( #705 )","breadcrumbs":"Release Notes » Features","id":"249","title":"Features"},"25":{"body":"In order to be able to execute the Fe compiler we will have to make the file executable . This can be done by navigating to the directory where the file is located and executing chmod + x (e.g. chmod +x fe). After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to: fe 0.21.0-alpha\nThe Fe Developers \nAn implementation of the Fe smart contract language USAGE: fe_amd64_latest OPTIONS: -h, --help Print help information -V, --version Print version information SUBCOMMANDS: build Build the current project check Analyze the current project and report errors, but don't build artifacts help Print this message or the help of the given subcommand(s) new Create new fe project","breadcrumbs":"Using Fe » Installation » Add permission to execute","id":"25","title":"Add permission to execute"},"250":{"body":"Fixed a crash caused by certain memory to memory assignments. E.g. the following code would previously lead to a compiler crash: my_struct.x = my_struct.y ( #590 ) Reject unary minus operation if the target type is an unsigned integer number. Code below should be reject by fe compiler: contract Foo: pub fn bar(self) -> u32: let unsigned: u32 = 1 return -unsigned pub fn foo(): let a: i32 = 1 let b: u32 = -a ( #651 ) Fixed crash when passing a struct that contains an array E.g. the following would previously result in a compiler crash: struct MyArray: pub x: Array contract Foo: pub fn bar(my_arr: MyArray): pass ( #681 ) reject infinite size struct definitions. Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. ( #682 ) Return instead of revert when contract is called without data. If a contract is called without data so that no function is invoked, we would previously revert but that would leave us without a way to send ETH to a contract so instead it will cause a return now. ( #694 ) Resolve compiler crash when using certain reserved YUL words as struct field names. E.g. the following would previously lead to a compiler crash because numer is a reserved keyword in YUL. struct Foo: pub number: u256 contract Meh: pub fn yay() -> Foo: return Foo(number:2) ( #709 )","breadcrumbs":"Release Notes » Bugfixes","id":"250","title":"Bugfixes"},"251":{"body":"","breadcrumbs":"Release Notes » 0.16.0-alpha (2022-05-05)","id":"251","title":"0.16.0-alpha (2022-05-05)"},"252":{"body":"Change static function call syntax from Bar.foo() to Bar::foo() ( #241 ) Added support for retrieving the base fee via ctx.base_fee() ( #503 )","breadcrumbs":"Release Notes » Features","id":"252","title":"Features"},"253":{"body":"Resolve functions on structs via path (e.g. bi::ba::bums()) ( #241 )","breadcrumbs":"Release Notes » Bugfixes","id":"253","title":"Bugfixes"},"254":{"body":"","breadcrumbs":"Release Notes » 0.15.0-alpha (2022-04-04)","id":"254","title":"0.15.0-alpha (2022-04-04)"},"255":{"body":"Labels are now required on function arguments. Labels can be omitted if the argument is a variable with a name that matches the label, or if the function definition specifies that an argument should have no label. Functions often take several arguments of the same type; compiler-checked labels can help prevent accidentally providing arguments in the wrong order. Example: contract CoolCoin: balance: Map loans: Map<(address, address), i256> pub fn demo(self, ann: address, bob: address): let is_loan: bool = false self.give(from: ann, to: bob, 100, is_loan) fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool): self.cred[sender] -= val self.cred[recipient] += val if is_loan: self.loans[(sender, recipient)] += val Note that arguments must be provided in the order specified in the function definition. A parameter's label defaults to the parameter name, but can be changed by specifying a different label to the left of the parameter name. Labels should be clear and convenient for the caller, while parameter names are only used in the function body, and can thus be longer and more descriptive. In the example above, we choose to use sender and recipient as identifiers in the body of fn transfer, but use labels from: and to:. In cases where it's ideal to not have labels, e.g. if a function takes a single argument, or if types are sufficient to differentiate between arguments, use _ to specify that a given parameter has no label. It's also fine to require labels for some arguments, but not others. Example: fn add(_ x: u256, _ y: u256) -> u256: return x + y contract Foo: fn transfer(self, _ to: address, wei: u256): pass pub fn demo(self): transfer(address(0), wei: add(1000, 42)) ( #397 )","breadcrumbs":"Release Notes » Features","id":"255","title":"Features"},"256":{"body":"The region of memory used to compute the slot of a storage map value was not being allocated. ( #684 )","breadcrumbs":"Release Notes » Bugfixes","id":"256","title":"Bugfixes"},"257":{"body":"","breadcrumbs":"Release Notes » 0.14.0-alpha (2022-03-02)","id":"257","title":"0.14.0-alpha (2022-03-02)"},"258":{"body":"Events can now be defined outside of contracts. Example: event Transfer: idx sender: address idx receiver: address value: u256 contract Foo: fn transferFoo(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) contract Bar: fn transferBar(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) ( #80 ) The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block. Example: use std::evm::{mstore, mload} fn memory_shenanigans(): unsafe: mstore(0x20, 42) let x: u256 = mload(0x20) assert x == 42 The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. The global function send_value has been ported to Fe, and is now available as std::send_value. ( #629 ) Support structs that have non-base type fields in storage. Example: struct Point: pub x: u256 pub y: u256 struct Bar: pub name: String<3> pub numbers: Array pub point: Point pub something: (u256, bool) contract Foo: my_bar: Bar pub fn complex_struct_in_storage(self) -> String<3>: self.my_bar = Bar( name: \"foo\", numbers: [1, 2], point: Point(x: 100, y: 200), something: (1, true), ) # Asserting the values as they were set initially assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 # We can change the values of the array self.my_bar.numbers[0] = 10 self.my_bar.numbers[1] = 20 assert self.my_bar.numbers[0] == 10 assert self.my_bar.numbers[1] == 20 # We can set the array itself self.my_bar.numbers = [1, 2] assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 # We can change the values of the Point self.my_bar.point.x = 1000 self.my_bar.point.y = 2000 assert self.my_bar.point.x == 1000 assert self.my_bar.point.y == 2000 # We can set the point itself self.my_bar.point = Point(x=100, y=200) assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 # We can change the value of the tuple self.my_bar.something.item0 = 10 self.my_bar.something.item1 = false assert self.my_bar.something.item0 == 10 assert not self.my_bar.something.item1 # We can set the tuple itself self.my_bar.something = (1, true) assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 return self.my_bar.name.to_mem() ( #636 ) Features that read and modify state outside of contracts are now implemented on a struct named \"Context\". Context is included in the standard library and can be imported with use std::context::Context. Instances of Context are created by calls to public functions that declare it in the signature or by unsafe code. Basic example: use std::context::Context contract Foo: my_num: u256 pub fn baz(ctx: Context) -> u256: return ctx.block_number() pub fn bing(self, new_num: u256) -> u256: self.my_num = new_num return self.my_num contract Bar: pub fn call_baz(ctx: Context, foo_addr: address) -> u256: # future syntax: `let foo = ctx.load(foo_addr)` let foo: Foo = Foo(ctx, foo_addr) return foo.baz() pub fn call_bing(ctx: Context) -> u256: # future syntax: `let foo = ctx.create(0)` let foo: Foo = Foo.create(ctx, 0) return foo.bing(42) Example with __call__ and unsafe block: use std::context::Context\nuse std::evm contract Foo: pub fn __call__(): unsafe: # creating an instance of `Context` is unsafe let ctx: Context = Context() let value: u256 = u256(bar(ctx)) # return `value` evm::mstore(0, value) evm::return_mem(0, 32) fn bar(ctx: Context) -> address: return ctx.self_address() ( #638 )","breadcrumbs":"Release Notes » Features","id":"258","title":"Features"},"259":{"body":"","breadcrumbs":"Release Notes » Features","id":"259","title":"Features"},"26":{"body":"You can also build Fe from the source code provided in our Github repository . To do this you will need to have Rust installed. Then, clone the github repository using: git clone https://github.com/ethereum/fe.git Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system: sudo apt-get update &&\\ apt-get install libboost-all-dev &&\\ apt-get install libclang-dev &&\\ apt-get install cmake Navigate to the folder containing the Fe source code. cd fe Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend. cargo build -r --feature solc-backend You will now find your Fe binary in /target/release. Check the build with: ./target/release/fe --version If everything worked, you should see the Fe version printed to the terminal: fe 0.24.0 You can run the built-in tests using: cargo test --workspace --features solc-backend","breadcrumbs":"Using Fe » Installation » Building from source","id":"26","title":"Building from source"},"260":{"body":"Example: contract Foo: pub fn bar(): const LOCAL_CONST: i32 = 1","breadcrumbs":"Release Notes » Support local constant","id":"260","title":"Support local constant"},"261":{"body":"Example: const GLOBAL: i32 = 8 contract Foo: pub fn bar(): const LOCAL: i32 = GLOBAL * 8","breadcrumbs":"Release Notes » Support constant expression","id":"261","title":"Support constant expression"},"262":{"body":"Example: const GLOBAL: u256= 8\nconst USE_GLOBAL: bool = false\ntype MY_ARRAY = Array contract Foo: pub fn bar(): let my_array: Array","breadcrumbs":"Release Notes » Support constant generics expression","id":"262","title":"Support constant generics expression"},"263":{"body":"","breadcrumbs":"Release Notes » Bug fixes","id":"263","title":"Bug fixes"},"264":{"body":"Example: const GLOBAL: i32 = \"FOO\" contract Foo: pub fn bar(): let FOO: i32 = GLOBAL","breadcrumbs":"Release Notes » Fix ICE when constant type is mismatch","id":"264","title":"Fix ICE when constant type is mismatch"},"265":{"body":"Example: const BAR: i32 = 1 contract FOO: pub fn bar(): BAR = 10 ( #649 ) Argument label syntax now uses : instead of =. Example: struct Foo: x: u256 y: u256 let x: MyStruct = MyStruct(x: 10, y: 11)\n# previously: MyStruct(x = 10, y = 11) ( #665 ) Support module-level pub modifier, now default visibility of items in a module is private. Example: # This constant can be used outside of the module.\npub const PUBLIC:i32 = 1 # This constant can NOT be used outside of the module.\nconst PRIVATE: i32 = 1 ( #677 )","breadcrumbs":"Release Notes » Fix ICE when assigning value to constant twice","id":"265","title":"Fix ICE when assigning value to constant twice"},"266":{"body":"Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed. An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun. Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file. parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax. ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. ( #628 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"266","title":"Internal Changes - for Fe Contributors"},"267":{"body":"","breadcrumbs":"Release Notes » 0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)","id":"267","title":"0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)"},"268":{"body":"Support private fields on structs Public fields now need to be declared with the pub modifier, otherwise they default to private fields. If a struct contains private fields it can not be constructed directly except from within the struct itself. The recommended way is to implement a method new(...) as demonstrated in the following example. struct House: pub price: u256 pub size: u256 vacant: bool pub fn new(price: u256, size: u256) -> House return House(price=price, size=size, vacant=true) contract Manager: house: House pub fn create_house(price: u256, size: u256): self.house = House::new(price, size) let can_access_price: u256 = self.house.price # can not access `self.house.vacant` because the field is private ( #214 ) Support non-base type fields in structs Support is currently limited in two ways: Structs with complex fields can not be returned from public functions Structs with complex fields can not be stored in storage ( #343 ) Addresses can now be explicitly cast to u256. For example: fn f(addr: address) -> u256: return u256(addr) ( #621 ) A special function named __call__ can now be defined in contracts. The body of this function will execute in place of the standard dispatcher when the contract is called. example (with intrinsics): contract Foo: pub fn __call__(self): unsafe: if __calldataload(0) == 1: __revert(0, 0) else: __return(0, 0) ( #622 )","breadcrumbs":"Release Notes » Features","id":"268","title":"Features"},"269":{"body":"Fixed a crash that happend when using a certain unprintable ASCII char ( #551 ) The argument to revert wasn't being lowered by the compiler, meaning that some revert calls would cause a compiler panic in later stages. For example: const BAD_MOJO: u256 = 0xdeaddead struct Error: code: u256 fn fail(): revert Error(code = BAD_MOJO) ( #619 ) Fixed a regression where an empty list expression ([]) would lead to a compiler crash. ( #623 ) Fixed a bug where int array elements were not sign extended in their ABI encodings. ( #633 )","breadcrumbs":"Release Notes » Bugfixes","id":"269","title":"Bugfixes"},"27":{"body":"Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension . In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then \"Install Extension\") and search for fe-lang.code-ve. Click on the extension and then click on the Install button. We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.","breadcrumbs":"Using Fe » Installation » Editor support & Syntax highlighting","id":"27","title":"Editor support & Syntax highlighting"},"270":{"body":"","breadcrumbs":"Release Notes » 0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)","id":"270","title":"0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)"},"271":{"body":"Added unsafe low-level \"intrinsic\" functions, that perform raw evm operations. For example: fn foo(): unsafe: __mtore(0, 5000) assert __mload(0) == 5000 The functions available are exactly those defined in yul's \"evm dialect\": https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct. These are intended to be used for implementing basic standard library functionality, and shouldn't typically be needed in normal contract code. Note: some intrinsic functions don't return a value (eg __log0); using these functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) will currently result in a compiler panic in the yul compilation phase. ( #603 ) Added an out of bounds check for accessing array items. If an array index is retrieved at an index that is not within the bounds of the array it now reverts with Panic(0x32). ( #606 )","breadcrumbs":"Release Notes » Features","id":"271","title":"Features"},"272":{"body":"Ensure ternary expression short circuit. Example: contract Foo: pub fn bar(input: u256) -> u256: return 1 if input > 5 else revert_me() fn revert_me() -> u256: revert return 0 Previous to this change, the code above would always revert no matter which branch of the ternary expressions it would resolve to. That is because both sides were evaluated and then one side was discarded. With this change, only the branch that doesn't get picked won't get evaluated at all. The same is true for the boolean operations and and or. ( #488 )","breadcrumbs":"Release Notes » Bugfixes","id":"272","title":"Bugfixes"},"273":{"body":"Added a globally available dummy std lib. This library contains a single get_42 function, which can be called using std::get_42(). Once low-level intrinsics have been added to the language, we can delete get_42 and start adding useful code. ( #601 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"273","title":"Internal Changes - for Fe Contributors"},"274":{"body":"","breadcrumbs":"Release Notes » 0.11.0-alpha \"Karlite\" (2021-12-02)","id":"274","title":"0.11.0-alpha \"Karlite\" (2021-12-02)"},"275":{"body":"Added support for multi-file inputs. Implementation details: Mostly copied Rust's crate system, but use the term ingot instead of crate. Below is an example of an ingot's file tree, as supported by the current implementation. `-- basic_ingot `-- src |-- bar | `-- baz.fe |-- bing.fe |-- ding | |-- dang.fe | `-- dong.fe `-- main.fe There are still a few features that will be worked on over the coming months: source files accompanying each directory module (e.g. my_mod.fe) configuration files and the ability to create library ingots test directories module-level pub modifier (all items in a module are public) mod statements (all fe files in the input tree are public modules) These things will be implemented in order of importance over the next few months. ( #562 ) The syntax for array types has changed to match other generic types. For example, u8[4] is now written Array. ( #571 ) Functions can now be defined on struct types. Example: struct Point: x: u64 y: u64 # Doesn't take `self`. Callable as `Point.origin()`. # Note that the syntax for this will soon be changed to `Point::origin()`. pub fn origin() -> Point: return Point(x=0, y=0) # Takes `self`. Callable on a value of type `Point`. pub fn translate(self, x: u64, y: u64): self.x += x self.y += y pub fn add(self, other: Point) -> Point: let x: u64 = self.x + other.x let y: u64 = self.y + other.y return Point(x, y) pub fn hash(self) -> u256: return keccak256(self.abi_encode()) pub fn do_pointy_things(): let p1: Point = Point.origin() p1.translate(5, 10) let p2: Point = Point(x=1, y=2) let p3: Point = p1.add(p2) assert p3.x == 6 and p3.y == 12 ( #577 )","breadcrumbs":"Release Notes » Features","id":"275","title":"Features"},"276":{"body":"Fixed a rare compiler crash. Example: let my_array: i256[1] = [-1 << 1] Previous to this fix, the given example would lead to an ICE. ( #550 ) Contracts can now create an instance of a contract defined later in a file. This issue was caused by a weakness in the way we generated yul. ( #596 )","breadcrumbs":"Release Notes » Bugfixes","id":"276","title":"Bugfixes"},"277":{"body":"File IDs are now attached to Spans. ( #587 ) The fe analyzer now builds a dependency graph of source code \"items\" (functions, contracts, structs, etc). This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) output. Note that the yul output is still cluttered with utility functions that may or may not be needed by a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many of these utility functions into fe; when this happens they'll become part of the dependency graph and will only be included in the yul output when needed. The dependency graph will also enable future analyzer warnings about unused code. ( #596 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"277","title":"Internal Changes - for Fe Contributors"},"278":{"body":"","breadcrumbs":"Release Notes » 0.10.0-alpha (2021-10-31)","id":"278","title":"0.10.0-alpha (2021-10-31)"},"279":{"body":"Support for module level constants for base types Example: const TEN = 10 contract pub fn do_moon_math(self) -> u256: return 4711 * TEN The values of base type constants are always inlined. ( #192 ) Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) ( #492 ) Replaced import statements with use statements. Example: use foo::{bar::*, baz as baz26} Note: this only adds support for parsing use statements. ( #547 ) Functions can no be defined outside of contracts. Example: fn add_bonus(x: u256) -> u256: return x + 10 contract PointTracker: points: Map pub fn add_points(self, user: address, val: u256): self.points[user] += add_bonus(val) ( #566 ) Implemented a send_value(to: address, value_in_wei: u256) function. The function is similar to the sendValue function by OpenZeppelin with the differences being that: It reverts with Error(0x100) instead of Error(\"Address: insufficient balance\") to safe more gas. It uses selfbalance() instead of balance(address()) to safe more gas It reverts with Error(0x101) instead of Error(\"Address: unable to send value, recipient may have reverted\") also to safe more gas. ( #567 ) Added support for unsafe functions and unsafe blocks within functions. Note that there's currently no functionality within Fe that requires the use of unsafe, but we plan to add built-in unsafe functions that perform raw evm operations which will only callable within an unsafe block or function. ( #569 ) Added balance() and balance_of(account: address) methods. ( #572 ) Added support for explicit casting between numeric types. Example: let a: i8 = i8(-1)\nlet a1: i16 = i16(a)\nlet a2: u16 = u16(a1) assert a2 == u16(65535) let b: i8 = i8(-1)\nlet b1: u8 = u8(b)\nlet b2: u16 = u16(b1) assert b2 == u16(255) Notice that Fe allows casting between any two numeric types but does not allow to change both the sign and the size of the type in one step as that would leave room for ambiguity as the example above demonstrates. ( #576 )","breadcrumbs":"Release Notes » Features","id":"279","title":"Features"},"28":{"body":"A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.","breadcrumbs":"Using Fe » Using projects » Fe projects","id":"28","title":"Fe projects"},"280":{"body":"Adjust numeric values loaded from memory or storage Previous to this fix numeric values that were loaded from either memory or storage were not properly loaded on the stack which could result in numeric values not treated as intended. Example: contract Foo: pub fn bar() -> i8: let in_memory: i8[1] = [-3] return in_memory[0] In the example above bar() would not return -3 but 253 instead. ( #524 ) Propagate reverts from external contract calls. Before this fix the following code to should_revert() or should_revert2() would succeed even though it clearly should not. contract A: contract_b: B pub fn __init__(contract_b: address): self.contract_b = B(contract_b) pub fn should_revert(): self.contract_b.fail() pub fn should_revert2(): self.contract_b.fail_with_custom_error() struct SomeError: pass contract B: pub fn fail(): revert pub fn fail_with_custom_error(): revert SomeError() With this fix the revert errors are properly passed upwards the call hierachy. ( #574 ) Fixed bug in left shift operation. Example: Let's consider the value 1 as an u8 which is represented as the following 256 bit item on the EVM stack 00..|00000001|. A left shift of 8 bits (val << 8) turns that into 00..01|00000000|. Previous to this fix this resulted in the compiler taking 256 as the value for the u8 when clearly 256 is not even in the range of u8 anymore. With this fix the left shift operations was fixed to properly \"clean up\" the result of the shift so that 00..01|00000000| turns into 00..00|00000000|. ( #575 ) Ensure negation is checked and reverts with over/underflow if needed. Example: The minimum value for an i8 is -128 but the maximum value of an i8 is 127 which means that negating -128 should lead to an overflow since 128 does not fit into an i8. Before this fix, negation operations where not checked for over/underflow resulting in returning the oversized value. ( #578 )","breadcrumbs":"Release Notes » Bugfixes","id":"280","title":"Bugfixes"},"281":{"body":"In the analysis stage, all name resolution (of variable names, function names, type names, etc used in code) now happens via a single resolve_name pathway, so we can catch more cases of name collisions and log more helpful error messages. ( #555 ) Added a new category of tests: differential contract testing. Each of these tests is pased on a pair of contracts where one implementation is written in Fe and the other one is written in Solidity. The implementations should have the same public APIs and are assumed to always return identical results given equal inputs. The inputs are randomly generated using proptest and hence are expected to discover unknown bugs. ( #578 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"281","title":"Internal Changes - for Fe Contributors"},"282":{"body":"","breadcrumbs":"Release Notes » 0.9.0-alpha (2021-09-29)","id":"282","title":"0.9.0-alpha (2021-09-29)"},"283":{"body":"The self variable is no longer implicitly defined in code blocks. It must now be declared as the first parameter in a function signature. Example: contract Foo: my_stored_num: u256 pub fn bar(self, my_num: u256): self.my_stored_num = my_num pub fn baz(self): self.bar(my_pure_func()) pub fn my_pure_func() -> u256: return 42 + 26 ( #520 ) The analyzer now disallows defining a type, variable, or function whose name conflicts with a built-in type, function, or object. Example: error: type name conflicts with built-in type\n┌─ compile_errors/shadow_builtin_type.fe:1:6\n│\n1 │ type u256 = u8\n│ ^^^^ `u256` is a built-in type ( #539 )","breadcrumbs":"Release Notes » Features","id":"283","title":"Features"},"284":{"body":"Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. ( #534 ) Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) are no longer ignored if the semantic analysis stage succeeds. ( #535 ) Fixed issue #531 by adding a $ to the front of lowered tuple names. ( #546 )","breadcrumbs":"Release Notes » Bugfixes","id":"284","title":"Bugfixes"},"285":{"body":"Implemented pretty printing of Fe AST. ( #540 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"285","title":"Internal Changes - for Fe Contributors"},"286":{"body":"","breadcrumbs":"Release Notes » 0.8.0-alpha \"Haxonite\" (2021-08-31)","id":"286","title":"0.8.0-alpha \"Haxonite\" (2021-08-31)"},"287":{"body":"Support quotes, tabs and carriage returns in string literals and otherwise restrict string literals to the printable subset of the ASCII table. ( #329 ) The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation. Types can now refer to other types defined later in the file. Example: type Posts = Map\ntype PostId = u256\ntype PostBody = String<140> Duplicate definition errors now show the location of the original definition. The analysis of each function, type definition, etc happens independently, so an error in one doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. ( #468 ) Function definitions are now denoted with the keyword fn instead of def. ( #496 ) Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. ( #509 ) Implemented support for numeric unary invert operator (~) ( #526 )","breadcrumbs":"Release Notes » Features","id":"287","title":"Features"},"288":{"body":"Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. ( #468 ) Fixed an issue where certain expressions were not being moved to the correct location. ( #493 ) Fixed an issue with a missing return statement not properly detected. Previous to this fix, the following code compiles but it should not: contract Foo: pub fn bar(val: u256) -> u256: if val > 1: return 5 With this change, the compiler rightfully detects that the code is missing a return or revert statement after the if statement since it is not guaranteed that the path of execution always follows the arm of the if statement. ( #497 ) Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, resulting in an internal compiler error in a later pass. Example: my_tuple.item001. These are now rejected with an error message. ( #510 ) Check call argument labels for function calls. Previously the compiler would not check any labels that were used when making function calls on self or external contracts. This can be especially problematic if gives developers the impression that they could apply function arguments in any order as long as they are named which is not the case. contract Foo: pub fn baz(): self.bar(val2=1, doesnt_even_exist=2) pub fn bar(val1: u256, val2: u256): pass Code as the one above is now rightfully rejected by the compiler. ( #517 )","breadcrumbs":"Release Notes » Bugfixes","id":"288","title":"Bugfixes"},"289":{"body":"Various improvements and bug fixes to both the content and layout of the specification. ( #489 ) Document all remaining statements and expressions in the spec. Also added a CI check to ensure code examples in the documentation are validated against the latest compiler. ( #514 )","breadcrumbs":"Release Notes » Improved Documentation","id":"289","title":"Improved Documentation"},"29":{"body":"You can start a project using the new subcommand: $ fe new This will generate a template project containing the following: A src directory containing two .fe files. A fe.toml manifest with basic project info and some local project imports.","breadcrumbs":"Using Fe » Using projects » Creating a project","id":"29","title":"Creating a project"},"290":{"body":"Separated Fe type traits between crates. ( #485 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"290","title":"Internal Changes - for Fe Contributors"},"291":{"body":"","breadcrumbs":"Release Notes » 0.7.0-alpha \"Galaxite\" (2021-07-27)","id":"291","title":"0.7.0-alpha \"Galaxite\" (2021-07-27)"},"292":{"body":"Enable the optimizer by default. The optimizer can still be disabled by supplying --optimize=false as an argument. ( #439 ) The following checks are now performed while decoding data: The size of the encoded data fits within the size range known at compile-time. Values are correctly padded. unsigned integers, addresses, and bools are checked to have correct left zero padding the size of signed integers are checked bytes and strings are checked to have correct right padding Data section offsets are consistent with the size of preceding values in the data section. The dynamic size of strings does not exceed their maximum size. The dynamic size of byte arrays (u8[n]) is equal to the size of the array. ( #440 ) Type aliases can now include tuples. Example: type InternetPoints = (address, u256) ( #459 ) Revert with custom errors Example: struct PlatformError: code: u256 pub fn do_something(): revert PlatformError(code=4711) Error encoding follows Solidity which is based on EIP-838 . This means that custom errors returned from Fe are fully compatible with Solidity. ( #464 ) The builtin value msg.sig now has type u256. Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. ( #472 ) Encode certain reverts as panics. With this change, the following reverts are encoded as Panic(uint256) with the following panic codes: 0x01: An assertion that failed and did not specify an error message 0x11: An arithmetic expression resulted in an over- or underflow 0x12: An arithmetic expression divided or modulo by zero The panic codes are aligned with the panic codes that Solidity uses . ( #476 )","breadcrumbs":"Release Notes » Features","id":"292","title":"Features"},"293":{"body":"Fixed a crash when trying to access an invalid attribute on a string. Example: contract Foo: pub fn foo(): \"\".does_not_exist The above now yields a proper user error. ( #444 ) Ensure String type is capitalized in error messages ( #445 ) Fixed ICE when using a static string that spans over multiple lines. Previous to this fix, the following code would lead to a compiler crash: contract Foo: pub fn return_with_newline() -> String<16>: return \"foo balu\" The above code now works as intended. ( #448 ) Fixed ICE when using a tuple declaration and specifying a non-tuple type. Fixed a second ICE when using a tuple declaration where the number of target items doesn't match the number of items in the declared type. ( #469 )","breadcrumbs":"Release Notes » Bugfixes","id":"293","title":"Bugfixes"},"294":{"body":"Cleaned up ABI encoding internals. Improved yulc panic formatting. ( #472 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"294","title":"Internal Changes - for Fe Contributors"},"295":{"body":"","breadcrumbs":"Release Notes » 0.6.0-alpha \"Feldspar\" (2021-06-10)","id":"295","title":"0.6.0-alpha \"Feldspar\" (2021-06-10)"},"296":{"body":"Support for pragma statement Example: pragma ^0.1.0 ( #361 ) Add support for tuple destructuring Example: my_tuple: (u256, bool) = (42, true)\n(x, y): (u256, bool) = my_tuple ( #376 ) Call expression can now accept generic arguments Replace stringN to String Example: s: String<10> = String<10>(\"HI\") ( #379 ) Many analyzer errors now include helpful messages and underlined code. Event and struct constructor arguments must now be labeled and in the order specified in the definition. The analyzer now verifies that the left-hand side of an assignment is actually assignable. ( #398 ) Types of integer literal are now inferred, rather than defaulting to u256. contract C: fn f(x: u8) -> u16: y: u8 = 100 # had to use u8(100) before z: i8 = -129 # \"literal out of range\" error return 1000 # had to use `return u16(1000)` before fn g(): self.f(50) Similar inference is done for empty array literals. Previously, empty array literals caused a compiler crash, because the array element type couldn't be determined. contract C: fn f(xs: u8[10]): pass fn g(): self.f([]) (Note that array length mismatch is still a type error, so this code won't actually compile.) ( #429 ) The Map type name is now capitalized. Example: contract GuestBook: guests: Map> ( #431 ) Convert all remaining errors to use the new advanced error reporting system ( #432 ) Analyzer throws an error if __init__ is not public. ( #435 )","breadcrumbs":"Release Notes » Features","id":"296","title":"Features"},"297":{"body":"Refactored front-end \"not implemented\" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. ( #437 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"297","title":"Internal Changes - for Fe Contributors"},"298":{"body":"","breadcrumbs":"Release Notes » 0.5.0-alpha (2021-05-27)","id":"298","title":"0.5.0-alpha (2021-05-27)"},"299":{"body":"Add support for hexadecimal/octal/binary numeric literals. Example: value_hex: u256 = 0xff\nvalue_octal: u256 = 0o77\nvalue_binary: u256 = 0b11 ( #333 ) Added support for list expressions. Example: values: u256[3] = [10, 20, 30] # or anywhere else where expressions can be used such as in a call sum: u256 = self.sum([10, 20, 30]) ( #388 ) Contracts, events, and structs can now be empty. e.g. event MyEvent: pass ... contract MyContract: pass ... struct MyStruct: pass ( #406 ) External calls can now handle dynamically-sized return types. ( #415 )","breadcrumbs":"Release Notes » Features","id":"299","title":"Features"},"3":{"body":"One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours. The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability , Fe will provide an enhanced developer experience for everyone working with the EVM.","breadcrumbs":"Introduction » What problems does Fe solve?","id":"3","title":"What problems does Fe solve?"},"30":{"body":"The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run. For example: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = \"../lib\" You can also specify which version of a particular dependency you want to use, using curly braces: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = {path = \"../lib\", version = \"1.0\"}","breadcrumbs":"Using Fe » Using projects » Manifest","id":"30","title":"Manifest"},"300":{"body":"The analyzer will return an error if a tuple attribute is not of the form item. ( #401 )","breadcrumbs":"Release Notes » Bugfixes","id":"300","title":"Bugfixes"},"301":{"body":"Created a landing page for Fe at https://fe-lang.org ( #394 ) Provide a Quickstart chapter in Fe Guide ( #403 )","breadcrumbs":"Release Notes » Improved Documentation","id":"301","title":"Improved Documentation"},"302":{"body":"Using insta to validate Analyzer outputs. ( #387 ) Analyzer now disallows using context.add_ methods to update attributes. ( #392 ) () now represents a distinct type internally called the unit type, instead of an empty tuple. The lowering pass now does the following: Valueless return statements are given a () value and functions without a return value are given explicit () returns. ( #406 ) Add CI check to ensure fragment files always end with a new line ( #4711 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"302","title":"Internal Changes - for Fe Contributors"},"303":{"body":"","breadcrumbs":"Release Notes » 0.4.0-alpha (2021-04-28)","id":"303","title":"0.4.0-alpha (2021-04-28)"},"304":{"body":"Support for revert messages in assert statements E.g assert a == b, \"my revert statement\" The provided string is abi-encoded as if it were a call to a function Error(string). For example, the revert string \"Not enough Ether provided.\" returns the following hexadecimal as error return data: 0x08c379a0 // Function selector for Error(string)\n0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset\n0x000000000000000000000000000000000000000000000000000000000000001a // String length\n0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data ( #288 ) Added support for augmented assignments. e.g. contract Foo: pub fn add(a: u256, b: u256) -> u256: a += b return a pub fn sub(a: u256, b: u256) -> u256: a -= b return a pub fn mul(a: u256, b: u256) -> u256: a *= b return a pub fn div(a: u256, b: u256) -> u256: a /= b return a pub fn mod(a: u256, b: u256) -> u256: a %= b return a pub fn pow(a: u256, b: u256) -> u256: a **= b return a pub fn lshift(a: u8, b: u8) -> u8: a <<= b return a pub fn rshift(a: u8, b: u8) -> u8: a >>= b return a pub fn bit_or(a: u8, b: u8) -> u8: a |= b return a pub fn bit_xor(a: u8, b: u8) -> u8: a ^= b return a pub fn bit_and(a: u8, b: u8) -> u8: a &= b return a ( #338 ) A new parser implementation, which provides more helpful error messages with fancy underlines and code context. ( #346 ) Added support for tuples with base type items. e.g. contract Foo: my_num: u256 pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool): my_tuple: (u256, bool) = (my_num, my_bool) self.my_num = my_tuple.item0 return my_tuple ( #352 )","breadcrumbs":"Release Notes » Features","id":"304","title":"Features"},"305":{"body":"Properly reject invalid emit ( #211 ) Properly tokenize numeric literals when they start with 0 ( #331 ) Reject non-string assert reasons as type error ( #335 ) Properly reject code that creates a circular dependency when using create or create2. Example, the following code is now rightfully rejected because it tries to create an instance of Foo from within the Foo contract itself. contract Foo: pub fn bar()->address: foo:Foo=Foo.create(0) return address(foo) ( #362 )","breadcrumbs":"Release Notes » Bugfixes","id":"305","title":"Bugfixes"},"306":{"body":"AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. ( #332 ) Added support for running tests against solidity fixtures. Also added tests that cover how solidity encodes revert reason strings. ( #342 ) Refactoring of binary operation type checking. ( #347 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"306","title":"Internal Changes - for Fe Contributors"},"307":{"body":"","breadcrumbs":"Release Notes » 0.3.0-alpha \"Calamine\" (2021-03-24)","id":"307","title":"0.3.0-alpha \"Calamine\" (2021-03-24)"},"308":{"body":"Add over/underflow checks for multiplications of all integers ( #271 ) Add full support for empty Tuples. ( #276 ) All functions in Fe implicitly return an empty Tuple if they have no other return value. However, before this change one was not able to use the empty Tuple syntax () explicitly. With this change, all of these are treated equally: contract Foo: pub fn explicit_return_a1(): return pub fn explicit_return_a2(): return () pub fn explicit_return_b1() ->(): return pub fn explicit_return_b2() ->(): return () pub fn implicit_a1(): pass pub fn implicit_a2() ->(): pass The JSON ABI builder now supports structs as both input and output. ( #296 ) Make subsequently defined contracts visible. Before this change: # can't see Bar\ncontract Foo: ...\n# can see Foo\ncontract Bar: ... With this change the restriction is lifted and the following becomes possible. ( #298 ) contract Foo: bar: Bar pub fn external_bar() -> u256: return self.bar.bar()\ncontract Bar: foo: Foo pub fn external_foo() -> u256: return self.foo.foo() Perform checks for divison operations on integers ( #308 ) Support for msg.sig to read the function identifier. ( #311 ) Perform checks for modulo operations on integers ( #312 ) Perform over/underflow checks for exponentiation operations on integers ( #313 )","breadcrumbs":"Release Notes » Features","id":"308","title":"Features"},"309":{"body":"Properly reject emit not followed by an event invocation ( #212 ) Properly reject octal number literals ( #222 ) Properly reject code that tries to emit a non-existing event. ( #250 ) Example that now produces a compile time error: emit DoesNotExist() Contracts that create other contracts can now include __init__ functions. See https://github.com/ethereum/fe/issues/284 ( #304 ) Prevent multiple types with same name in one module. ( #317 ) Examples that now produce compile time errors: type bar = u8\ntype bar = u16 or struct SomeStruct: some_field: u8 struct SomeStruct: other: u8 or contract SomeContract: some_field: u8 contract SomeContract: other: u8 Prevent multiple fields with same name in one struct. Example that now produces a compile time error: struct SomeStruct: some_field: u8 some_field: u8 Prevent variable definition in child scope when name already taken in parent scope. Example that now produces a compile time error: pub fn bar(): my_array: u256[3] sum: u256 = 0 for i in my_array: sum: u256 = 0 The CLI was using the overwrite flag to enable Yul optimization. i.e. # Would both overwrite output files and run the Yul optimizer.\n$ fe my_contract.fe --overwrite Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. ( #320 ) Ensure analyzer rejects code that uses return values for __init__ functions. ( #323 ) An example that now produces a compile time error: contract C: pub fn __init__() -> i32: return 0 Properly reject calling an undefined function on an external contract ( #324 )","breadcrumbs":"Release Notes » Bugfixes","id":"309","title":"Bugfixes"},"31":{"body":"There are two project modes: main and lib. Main projects can import libraries and have code output. Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects. The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.","breadcrumbs":"Using Fe » Using projects » Project modes","id":"31","title":"Project modes"},"310":{"body":"Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. ( #179 ) IDs added to AST nodes. ( #315 ) Failures in the Yul generation phase now panic; any failure is a bug. ( #327 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"310","title":"Internal Changes - for Fe Contributors"},"311":{"body":"","breadcrumbs":"Release Notes » 0.2.0-alpha \"Borax\" (2021-02-27)","id":"311","title":"0.2.0-alpha \"Borax\" (2021-02-27)"},"312":{"body":"Add support for string literals. Example: fn get_ticker_symbol() -> string3: return \"ETH\" String literals are stored in and loaded from the compiled bytecode. ( #186 ) The CLI now compiles every contract in a module, not just the first one. ( #197 ) Sample compiler output with all targets enabled: output\n|-- Bar\n| |-- Bar.bin\n| |-- Bar_abi.json\n| `-- Bar_ir.yul\n|-- Foo\n| |-- Foo.bin\n| |-- Foo_abi.json\n| `-- Foo_ir.yul\n|-- module.ast\n`-- module.tokens Add support for string type casts ( #201 ) Example: val: string100 = string100(\"foo\") Add basic support for structs. ( #203 ) Example: struct House: price: u256 size: u256 vacant: bool contract City: pub fn get_price() -> u256: building: House = House(300, 500, true) assert building.size == 500 assert building.price == 300 assert building.vacant return building.price Added support for external contract calls. Contract definitions now add a type to the module scope, which may be used to create contract values with the contract's public functions as callable attributes. ( #204 ) Example: contract Foo: pub fn build_array(a: u256, b: u256) -> u256[3]: my_array: u256[3] my_array[0] = a my_array[1] = a * b my_array[2] = b return my_array contract FooProxy: pub fn call_build_array( foo_address: address, a: u256, b: u256, ) -> u256[3]: foo: Foo = Foo(foo_address) return foo.build_array(a, b) Add support for block, msg, chain, and tx properties: ( #208 ) block.coinbase: address\nblock.difficulty: u256\nblock.number: u256\nblock.timestamp: u256\nchain.id: u256\nmsg.value: u256\ntx.gas_price: u256\ntx.origin: address (Note that msg.sender: address was added previously.) Example: fn post_fork() -> bool: return block.number > 2675000 The CLI now panics if an error is encountered during Yul compilation. ( #218 ) Support for contract creations. Example of create2, which takes a value and address salt as parameters. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create2_foo() -> address: # value and salt foo: Foo = Foo.create2(0, 52) return address(foo) Example of create, which just takes a value parameter. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create_foo() -> address: # value and salt foo: Foo = Foo.create(0) return address(foo) Note: We do not yet support init parameters. ( #239 ) Support updating individual struct fields in storage. ( #246 ) Example: pub fn update_house_price(price: u256): self.my_house.price = price Implement global keccak256 method. The method expects one parameter of bytes[n] and returns the hash as an u256. In a future version keccak256 will most likely be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). ( #255 ) Example: pub fn hash_single_byte(val: bytes[1]) -> u256: return keccak256(val) Require structs to be initialized using keyword arguments. Example: struct House: vacant: bool price: u256 Previously, House could be instantiated as House(true, 1000000). With this change it is required to be instantiated like House(vacant=true, price=1000000) This ensures property assignment is less prone to get mixed up. It also makes struct initialization visually stand out more from function calls. ( #260 ) Implement support for boolean not operator. ( #264 ) Example: if not covid_test.is_positive(person): allow_boarding(person) Do over/underflow checks for additions (SafeMath). With this change all additions (e.g x + y) for signed and unsigned integers check for over- and underflows and revert if necessary. ( #265 ) Added a builtin function abi_encode() that can be used to encode structs. The return type is a fixed-size array of bytes that is equal in size to the encoding. The type system does not support dynamically-sized arrays yet, which is why we used fixed. ( #266 ) Example: struct House: price: u256 size: u256 rooms: u8 vacant: bool contract Foo: pub fn hashed_house() -> u256: house: House = House( price=300, size=500, rooms=u8(20), vacant=true ) return keccak256(house.abi_encode()) Perform over/underflow checks for subtractions (SafeMath). ( #267 ) With this change all subtractions (e.g x - y) for signed and unsigned integers check for over- and underflows and revert if necessary. Support for the boolean operations and and or. ( #270 ) Examples: contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x and y contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x or y Support for self.address. This expression returns the address of the current contract. Example: contract Foo: pub fn bar() -> address: return self.address","breadcrumbs":"Release Notes » Features","id":"312","title":"Features"},"313":{"body":"Perform type checking when calling event constructors Previously, the following would not raise an error even though it should: contract Foo: event MyEvent: val_1: string100 val_2: u8 pub fn foo(): emit MyEvent(\"foo\", 1000) Wit this change, the code fails with a type error as expected. ( #202 ) Fix bug where compilation of contracts without public functions would result in illegal YUL. ( #219 ) E.g without this change, the following doesn't compile to proper YUL contract Empty: lonely: u256 Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a non user friendly error at the YUL compilation stage. With this change it is caught at the analyzer stage and presented to the user as a regular error. ( #225 ) Fix crash when return is used without value. These two methods should both be treated as returning () pub fn explicit_return(): return pub fn implicit(): pass Without this change, the explicit_return crashes the compiler. ( #261 )","breadcrumbs":"Release Notes » Bugfixes","id":"313","title":"Bugfixes"},"314":{"body":"Renamed the fe-semantics library to fe-analyzer. ( #207 ) Runtime testing utilities. ( #243 ) Values are stored more efficiently in storage. ( #251 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"314","title":"Internal Changes - for Fe Contributors"},"315":{"body":"WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead. This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.","breadcrumbs":"Release Notes » 0.1.0-alpha \"Amethyst\" (2021-01-20)","id":"315","title":"0.1.0-alpha \"Amethyst\" (2021-01-20)"},"316":{"body":"Added support for for loop, allows iteration over static arrays. ( #134 ) Enforce bounds on numeric literals in type constructors. For instance calling u8(1000) or i8(-250) will give an error because the literals 1000 and -250 do not fit into u8 or i8. ( #145 ) Added builtin copying methods clone() and to_mem() to reference types. ( #155 ) usage: # copy a segment of storage into memory and assign the new pointer\nmy_mem_array = self.my_sto_array.to_mem() # copy a segment of memory into another segment of memory and assign the new pointer\nmy_other_mem_array = my_mem_array.clone() Support emitting JSON ABI via --emit abi. The default value of --emit is now abi,bytecode. ( #160 ) Ensure integer type constructor reject all expressions that aren't a numeric literal. For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16. pub fn bar(val: u8) -> u16: return u16(val) Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. ( #163 ) Support for ABI decoding of all array type. ( #172 ) Support for value assignments in declaration. Previously, this code would fail: another_reference: u256[10] = my_array As a workaround declaration and assignment could be split apart. another_reference: u256[10]\nanother_reference = my_array With this change, the shorter declaration with assignment syntax is supported. ( #173 )","breadcrumbs":"Release Notes » Features","id":"316","title":"Features"},"317":{"body":"Point to examples in the README ( #162 ) Overhaul README page to better reflect the current state of the project. ( #177 ) Added descriptions of the to_mem and clone functions to the spec. ( #195 )","breadcrumbs":"Release Notes » Improved Documentation","id":"317","title":"Improved Documentation"},"318":{"body":"Updated the Solidity backend to v0.8.0. ( #169 ) Run CI tests on Mac and support creating Mac binaries for releases. ( #178 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"318","title":"Internal Changes - for Fe Contributors"},"319":{"body":"","breadcrumbs":"Code of Conduct » Contributor Covenant Code of Conduct","id":"319","title":"Contributor Covenant Code of Conduct"},"32":{"body":"You can import code from external files with the following syntax: use utils::get_42 This will import the get_42 function from the file utils.fe. You can also import using a custom name/alias: use utils::get_42 as get_42","breadcrumbs":"Using Fe » Using projects » Importing","id":"32","title":"Importing"},"320":{"body":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","breadcrumbs":"Code of Conduct » Our Pledge","id":"320","title":"Our Pledge"},"321":{"body":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","breadcrumbs":"Code of Conduct » Our Standards","id":"321","title":"Our Standards"},"322":{"body":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","breadcrumbs":"Code of Conduct » Enforcement Responsibilities","id":"322","title":"Enforcement Responsibilities"},"323":{"body":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","breadcrumbs":"Code of Conduct » Scope","id":"323","title":"Scope"},"324":{"body":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at piper@pipermerriam.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","breadcrumbs":"Code of Conduct » Enforcement","id":"324","title":"Enforcement"},"325":{"body":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","breadcrumbs":"Code of Conduct » Enforcement Guidelines","id":"325","title":"Enforcement Guidelines"},"326":{"body":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","breadcrumbs":"Code of Conduct » 1. Correction","id":"326","title":"1. Correction"},"327":{"body":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","breadcrumbs":"Code of Conduct » 2. Warning","id":"327","title":"2. Warning"},"328":{"body":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","breadcrumbs":"Code of Conduct » 3. Temporary Ban","id":"328","title":"3. Temporary Ban"},"329":{"body":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","breadcrumbs":"Code of Conduct » 4. Permanent Ban","id":"329","title":"4. Permanent Ban"},"33":{"body":"The templates created using fe new include a simple test demonstrating the test syntax. To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value. For example, to test the say_hello function on Contract which is expected to return the string \"hello\": fn test_contract(mut ctx: Context) { let contract: Contract = Contract.create(ctx, 0) assert main.say_hello() == \"hello\"\n} You can run all the tests in a project by running the following command: fe test You will receive test results directly to the console.","breadcrumbs":"Using Fe » Using projects » Tests","id":"33","title":"Tests"},"330":{"body":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","breadcrumbs":"Code of Conduct » Attribution","id":"330","title":"Attribution"},"34":{"body":"Once you have created a project, you can run the usual Fe CLI subcommands against the project path.","breadcrumbs":"Using Fe » Using projects » Running your project","id":"34","title":"Running your project"},"35":{"body":"Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here! For now, you can get started with: Open auction Watch this space for more tutorials coming soon!","breadcrumbs":"Using Fe » Tutorials » Tutorials","id":"35","title":"Tutorials"},"36":{"body":"This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts. An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.","breadcrumbs":"Using Fe » Tutorials » Open auction » Auction contract","id":"36","title":"Auction contract"},"37":{"body":"To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.","breadcrumbs":"Using Fe » Tutorials » Open auction » The auction rules","id":"37","title":"The auction rules"},"38":{"body":"To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page. With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe. Now you are ready to start coding in Fe! You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.","breadcrumbs":"Using Fe » Tutorials » Open auction » Get Started","id":"38","title":"Get Started"},"39":{"body":"You can see the entire contract here . You can refer back to this at any time to check implementation details.","breadcrumbs":"Using Fe » Tutorials » Open auction » Writing the Contract","id":"39","title":"Writing the Contract"},"4":{"body":"You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide . You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord . Learn more on our Contributing page.","breadcrumbs":"Introduction » Get Started","id":"4","title":"Get Started"},"40":{"body":"A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows: contract Auction { pub fn __init__() {}\n} To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice: auction_end_time: u256\nbeneficiary: address\nhighest_bidder: address\nhighest_bid: u256\npending_returns: Map\nended: bool Notice that variables are named using snake case (lower case, underscore separated, like_this). Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification. The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length. The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false. The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map. Keys can be any numeric type, address, boolean or unit. Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments. The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256. When you have implemented all this, your contract should look like this: contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time }\n} Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables. The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context. self self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript. Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is \"mutable\". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains. Context Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed. Read more on Context in Fe In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.","breadcrumbs":"Using Fe » Tutorials » Open auction » Defining the Contract and initializing variables","id":"40","title":"Defining the Contract and initializing variables"},"41":{"body":"Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable. This logic can be implemented as follows: pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))\n} The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data . Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition: struct AuctionAlreadyEnded {\n} The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe: struct BidNotHighEnough { pub highest_bid: u256\n} Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data. Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value. Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event: struct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} You have now implemented all the logic to handle a bid!","breadcrumbs":"Using Fe » Tutorials » Open auction » Bidding","id":"41","title":"Bidding"},"42":{"body":"A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times). Add the following to the contract to implement the withdraw method: pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true\n} Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).","breadcrumbs":"Using Fe » Tutorials » Open auction » Withdrawing","id":"42","title":"Withdrawing"},"43":{"body":"Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event. First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows: struct AuctionNotYetEnded {\n} You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct: struct AuctionEndAlreadyCalled {} If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. Your method can look as follows: pub fn action_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid)\n} Congratulations! You just wrote an open auction contract in Fe!","breadcrumbs":"Using Fe » Tutorials » Open auction » End the auction","id":"43","title":"End the auction"},"44":{"body":"To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data. You can add the following functions to the contract: pub fn check_highest_bidder(self) -> address { return self.highest_bidder;\n} pub fn check_highest_bid(self) -> u256 { return self.highest_bid;\n} pub fn check_ended(self) -> bool { return self.ended;\n}","breadcrumbs":"Using Fe » Tutorials » Open auction » View functions","id":"44","title":"View functions"},"45":{"body":"Your contract is now ready to use! Compile it using fe build auction.fe You will find the contract ABI and bytecode in the newly created outputs directory. Start a local blockchain to deploy your contract to: anvil There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode. First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10: cast --to_hex(10) >> 0xa // this is 10 in hex Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments. cast send --from --private-key --create $(cat output/Auction/Auction.bin) $(cast abi-encode \"__init__(uint256,address)\" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720) You will see the contract address reported in your terminal. Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35: cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"bid()\" --value \"100ether\" --private-key --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 You can check whether this was successful by calling the check_highest_bidder() function: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bidder()\" You will see a response looking similar to: 0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720 The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address). You can do the same to check the highest bid: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bid()\" This returns: 0x0000000000000000000000000000000000000000000000056bc75e2d63100000 Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH): cast --to-dec 56bc75e2d63100000 >> 100000000000000000000 // 100 ETH in wei Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using: cast balance
    And check whether the auction open time has expired using cast \"check_ended()\"","breadcrumbs":"Using Fe » Tutorials » Open auction » Build and deploy the contract","id":"45","title":"Build and deploy the contract"},"46":{"body":"Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain! If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war! By following this tutorial, you learned: basic Fe types, such as bool, address, map and u256 basic Fe styles, such as snake case for variable names how to create a contract with a constructor how to revert how to handle state variables how to avoid reentrancy how to use ctx to handle transaction data how to emit events using ctx.emit how to deploy a contract with constructor arguments using Foundry how to interact with your contract","breadcrumbs":"Using Fe » Tutorials » Open auction » Summary","id":"46","title":"Summary"},"47":{"body":"Simple open auction","breadcrumbs":"Using Fe » Example Contracts » Example Contracts","id":"47","title":"Example Contracts"},"48":{"body":"// errors\nstruct AuctionAlreadyEnded {\n} struct AuctionNotYetEnded {\n} struct AuctionEndAlreadyCalled {} struct BidNotHighEnough { pub highest_bid: u256\n} // events\nstruct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} struct AuctionEnded { #indexed pub winner: address pub amount: u256\n} contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time } //method pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value())) } pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true } pub fn auction_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid) } pub fn check_highest_bidder(self) -> address { return self.highest_bidder; } pub fn check_highest_bid(self) -> u256 { return self.highest_bid; } pub fn check_ended(self) -> bool { return self.ended; }\n}","breadcrumbs":"Using Fe » Example Contracts » Open auction","id":"48","title":"Using Fe"},"49":{"body":"There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.","breadcrumbs":"Using Fe » Useful external links » Useful external links","id":"49","title":"Useful external links"},"5":{"body":"Let's get started with Fe! In this section you will learn how to write and deploy your first contract. Writing your first contract Deploying a contract to a testnet","breadcrumbs":"Quickstart » Quickstart","id":"5","title":"Quickstart"},"50":{"body":"VS Code extension Foundry Fe Support","breadcrumbs":"Using Fe » Useful external links » Tools","id":"50","title":"Tools"},"51":{"body":"Bountiful - Bug bounty platform written in Fe, live on Mainnet Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism","breadcrumbs":"Using Fe » Useful external links » Projects","id":"51","title":"Projects"},"52":{"body":"These are community projects written in Fe at various hackathons. Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis. p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe. Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses. Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend. Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a \"chain\": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift! Go do it - A commitment device to help you achieve your goals. Powerbald - On chain lottery written in Fe sspc-flutter-fe - Stupid Simple Payment Channel written in Fe","breadcrumbs":"Using Fe » Useful external links » Hackathon projects","id":"52","title":"Hackathon projects"},"53":{"body":"Fe standard library - The Fe standard library comes bundled with the compiler but it is also a useful example for real world Fe code. Implementing an UniswapV3 trade in Fe","breadcrumbs":"Using Fe » Useful external links » Others","id":"53","title":"Others"},"54":{"body":"Fe or Solidity, which is better? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Blog posts","id":"54","title":"Blog posts"},"55":{"body":"Fe or Solidity, which is better? by Ahmed Castro Fe o Solidity, ¿cuál es es mejor? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Videos","id":"55","title":"Videos"},"56":{"body":"Read how to become a Fe developer. Build & Test Release","breadcrumbs":"Development » Development","id":"56","title":"Development"},"57":{"body":"Please make sure Rust is installed . Basic The following commands only build the Fe -> Yul compiler components. build the CLI: cargo build test: cargo test --workspace Full The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system: cmake boost(1.65+) libclang brew install boost Once these have been installed, you may run the full build. This is enabled using the solc-backend feature. build the CLI: cargo build --features solc-backend test: cargo test --workspace --features solc-backend","breadcrumbs":"Development » Build & Test » Build and test","id":"57","title":"Build and test"},"58":{"body":"","breadcrumbs":"Development » Release » Release","id":"58","title":"Release"},"59":{"body":"Make sure that version follows semver rules e.g (0.23.0).","breadcrumbs":"Development » Release » Versioning","id":"59","title":"Versioning"},"6":{"body":"Before you dive in, you need to download and install Fe. For this quickstart you should simply download the binary from fe-lang.org . Then change the name and file permissions: mv fe_amd64 fe\nchmod +x fe Now you are ready to do the quickstart tutorial! For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.","breadcrumbs":"Quickstart » Download and install Fe","id":"6","title":"Download and install Fe"},"60":{"body":"Prerequisite : Release notes are generated with towncrier . Ensure to have towncrier installed and the command is available. Run make notes version= where is the version we are generating the release notes for e.g. 0.23.0. Example: make notes version=0.23.0 Examine the generated release notes and if needed perform and commit any manual changes.","breadcrumbs":"Development » Release » Generate Release Notes","id":"60","title":"Generate Release Notes"},"61":{"body":"Run make release version=. Example: make release version=0.23.0 This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.","breadcrumbs":"Development » Release » Generate the release","id":"61","title":"Generate the release"},"62":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. After the tests are adjusted run make push-tag to create the tag and push it to Github.","breadcrumbs":"Development » Release » Tag and push the release","id":"62","title":"Tag and push the release"},"63":{"body":"Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.","breadcrumbs":"Development » Release » Manually edit the release on GitHub","id":"63","title":"Manually edit the release on GitHub"},"64":{"body":"A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions ( See GitHub issue #543 ).","breadcrumbs":"Development » Release » Updating Docs & Website","id":"64","title":"Updating Docs & Website"},"65":{"body":"Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.","breadcrumbs":"Development » Release » Preview the sites locally","id":"65","title":"Preview the sites locally"},"66":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).","breadcrumbs":"Development » Release » Deploy website & docs","id":"66","title":"Deploy website & docs"},"67":{"body":"The standard library includes commonly used algorithms and data structures that come bundled as part of the language. Precompiles","breadcrumbs":"Standard Library » Fe Standard Library","id":"67","title":"Fe Standard Library"},"68":{"body":"Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork . The nine precompiles available in the Fe standard library are: ec_recover SHA2 256 ripemd160 identity mod_exp ec_add ec_mul ec_pairing blake2f These precompiles are imported as follows: use std::precompiles","breadcrumbs":"Standard Library » Precompiles » Precompiles","id":"68","title":"Precompiles"},"69":{"body":"ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.","breadcrumbs":"Standard Library » Precompiles » ec_recover","id":"69","title":"ec_recover"},"7":{"body":"Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address. The code of the contract dictates how: it manipulates its own state interacts with other contracts exposes external APIs to be called from other contracts or users To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address. Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.","breadcrumbs":"Quickstart » Write your first contract » Write your first Fe contract","id":"7","title":"Write your first Fe contract"},"70":{"body":"hash: the hash of the signed message, u256 v: the recovery identifier, a number in the range 27-30, u256 r: elliptic curve parameter, u256 s: elliptic curve parameter, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"70","title":"Parameters"},"71":{"body":"ec_recover returns an address.","breadcrumbs":"Standard Library » Precompiles » Returns","id":"71","title":"Returns"},"72":{"body":"pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"72","title":"Function signature"},"73":{"body":"let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"73","title":"Example"},"74":{"body":"SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.","breadcrumbs":"Standard Library » Precompiles » SHA2_256","id":"74","title":"SHA2_256"},"75":{"body":"buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"75","title":"Parameters"},"76":{"body":"SHA2_256 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"76","title":"Returns"},"77":{"body":"pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"77","title":"Function signature"},"78":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::sha2_256(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"78","title":"Example"},"79":{"body":"ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.","breadcrumbs":"Standard Library » Precompiles » ripemd_160","id":"79","title":"ripemd_160"},"8":{"body":"Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content. contract GuestBook { messages: Map>\n} Here we're using a map to associate messages with Ethereum addresses. The messages will simply be a string of a maximum length of 100 written as String<100>. The addresses are represented by the builtin address type. Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output. Compiled guest_book.fe. Outputs in `output` If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file. ├── fe\n├── guest_book.fe\n└── output └── GuestBook ├── GuestBook_abi.json └── GuestBook.bin The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array. The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters. We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.","breadcrumbs":"Quickstart » Write your first contract » Create a guest_book.fe file","id":"8","title":"Create a guest_book.fe file"},"80":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"80","title":"Parameters"},"81":{"body":"ripemd_160 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"81","title":"Returns"},"82":{"body":"pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"82","title":"Function signature"},"83":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::ripemd_160(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"83","title":"Example"},"84":{"body":"identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.","breadcrumbs":"Standard Library » Precompiles » identity","id":"84","title":"identity"},"85":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"85","title":"Parameters"},"86":{"body":"identity returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"86","title":"Returns"},"87":{"body":"pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"87","title":"Function signature"},"88":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)\nlet mut result: MemoryBufferReader = precompiles::identity(buf).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"88","title":"Example"},"89":{"body":"mod_exp is a modular exponentiation function required for elliptic curve operations.","breadcrumbs":"Standard Library » Precompiles » mod_exp","id":"89","title":"mod_exp"},"9":{"body":"Let's focus on the functionality of our world changing application and add a method to sign the guestbook. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n} In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub. Let's recompile the contract again and see what happens. Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite. Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory. Let's try it again with ./fe build guest_book.fe --overwrite. This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting. [ { \"name\": \"sign\", \"type\": \"function\", \"inputs\": [ { \"name\": \"book_msg\", \"type\": \"bytes100\" } ], \"outputs\": [] }\n] Since our contract now has a public sign method the corresponding ABI has changed accordingly.","breadcrumbs":"Quickstart » Write your first contract » Add a method to sign the guest book","id":"9","title":"Add a method to sign the guest book"},"90":{"body":"b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer m: MemoryBuffer: the modulus, MemoryBuffer b_size: u256: the length of b in bytes, u256 e_size: u256: the length of e in bytes, u256 m_size: u256: then length of m in bytes, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"90","title":"Parameters"},"91":{"body":"mod_exp returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"91","title":"Returns"},"92":{"body":"pub fn mod_exp( b_size: u256, e_size: u256, m_size: u256, b: MemoryBuffer, e: MemoryBuffer, m: MemoryBuffer,\n) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"92","title":"Function signature"},"93":{"body":"let mut result: MemoryBufferReader = precompiles::mod_exp( b_size: 1, e_size: 1, m_size: 1, b: MemoryBuffer::from_u8(value: 8), e: MemoryBuffer::from_u8(value: 9), m: MemoryBuffer::from_u8(value: 10),\n).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"93","title":"Example"},"94":{"body":"ec_add does point addition on elliptic curves.","breadcrumbs":"Standard Library » Precompiles » ec_add","id":"94","title":"ec_add"},"95":{"body":"x1: x-coordinate 1, u256 y1: y coordinate 1, u256 x2: x coordinate 2, u256 y2: y coordinate 2, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"95","title":"Parameters"},"96":{"body":"pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"96","title":"Function signature"},"97":{"body":"ec_add returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"97","title":"Returns"},"98":{"body":"let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)","breadcrumbs":"Standard Library » Precompiles » Example","id":"98","title":"Example"},"99":{"body":"ec_mul is for multiplying elliptic curve points.","breadcrumbs":"Standard Library » Precompiles » ec_mul","id":"99","title":"ec_mul"}},"length":331,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.0},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"295":{"tf":1.0},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.0},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.0},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.0},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.0}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.0},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.0},"303":{"tf":1.0},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.0}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.0}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.0}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.0},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.23606797749979},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":2.6457513110645907},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":1.4142135623730951},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.7320508075688772}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.0},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":2.8284271247461903},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.0},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.23606797749979},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"43":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.7320508075688772},"329":{"tf":1.4142135623730951}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":3.872983346207417},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.4142135623730951},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.0},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":2.8284271247461903},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.6457513110645907},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":2.8284271247461903},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.0},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":69,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.0},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"213":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.0},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.23606797749979},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":2.23606797749979},"144":{"tf":3.0},"145":{"tf":2.23606797749979},"146":{"tf":4.242640687119285},"148":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"150":{"tf":1.4142135623730951},"151":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":2.8284271247461903},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":2.23606797749979},"130":{"tf":2.0},"135":{"tf":4.242640687119285},"136":{"tf":1.0},"137":{"tf":2.0},"138":{"tf":2.6457513110645907},"139":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"16":{"tf":2.6457513110645907},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.0},"19":{"tf":2.8284271247461903},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"40":{"tf":4.58257569495584},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.4641016151377544},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.7320508075688772},"7":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"208":{"tf":1.4142135623730951},"209":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.0},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.0},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.0},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":30,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.0},"202":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":22,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":2.8284271247461903},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.7320508075688772},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":18,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.23606797749979},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.7320508075688772},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":1.7320508075688772},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.7320508075688772},"301":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":2.8284271247461903},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":1.7320508075688772},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.4142135623730951},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":121,"docs":{"10":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.0},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.1622776601683795},"173":{"tf":2.8284271247461903},"174":{"tf":3.872983346207417},"175":{"tf":3.1622776601683795},"176":{"tf":1.0},"177":{"tf":2.0},"178":{"tf":2.449489742783178},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"182":{"tf":4.795831523312719},"183":{"tf":3.4641016151377544},"184":{"tf":2.0},"185":{"tf":2.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":15,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"259":{"tf":1.0},"26":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":98,"docs":{"0":{"tf":2.0},"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.0},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.6457513110645907},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.23606797749979},"23":{"tf":2.0},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.6457513110645907},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"29":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"38":{"tf":2.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.7320508075688772},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":2.8284271247461903},"53":{"tf":2.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.449489742783178},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.6457513110645907}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":25,"docs":{"10":{"tf":1.0},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":80,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"108":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.1622776601683795},"139":{"tf":2.0},"141":{"tf":5.656854249492381},"143":{"tf":3.1622776601683795},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"146":{"tf":2.0},"148":{"tf":1.0},"152":{"tf":2.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.0},"205":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.0},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.0},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.23606797749979},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"296":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.4142135623730951},"217":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"294":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.0},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":12,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"26":{"tf":2.23606797749979},"27":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.0},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.0},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.449489742783178},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":22,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"113":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":14,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":6,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":2.8284271247461903},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":2.6457513110645907},"172":{"tf":1.0},"181":{"tf":1.7320508075688772},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.0},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.23606797749979},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.449489742783178},"207":{"tf":1.7320508075688772},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.0},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":1.7320508075688772}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"19":{"tf":3.1622776601683795},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.0},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":26,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"42":{"tf":1.0},"60":{"tf":2.449489742783178},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.4142135623730951},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.0},"183":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":2.23606797749979},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.0}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":1.7320508075688772},"157":{"tf":1.0},"158":{"tf":2.6457513110645907},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.0},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":24,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"29":{"tf":2.23606797749979},"30":{"tf":2.449489742783178},"31":{"tf":2.449489742783178},"317":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.449489742783178},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":14,"docs":{"193":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":1.4142135623730951},"315":{"tf":2.0},"318":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.7320508075688772},"62":{"tf":1.0},"63":{"tf":2.0},"64":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.4142135623730951},"215":{"tf":1.7320508075688772},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":1.7320508075688772},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.0},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.1622776601683795},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"86":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":3.872983346207417},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.0},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":2.6457513110645907},"153":{"tf":1.4142135623730951},"156":{"tf":1.0},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.4142135623730951},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.0},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":15,"docs":{"1":{"tf":1.0},"113":{"tf":1.4142135623730951},"132":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.4142135623730951},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":2.6457513110645907},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":12,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":3.7416573867739413},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"162":{"tf":2.0},"163":{"tf":2.449489742783178},"164":{"tf":2.0},"165":{"tf":2.0},"166":{"tf":1.7320508075688772},"167":{"tf":1.4142135623730951},"168":{"tf":2.23606797749979},"169":{"tf":2.23606797749979},"170":{"tf":1.7320508075688772},"171":{"tf":2.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.0},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.4641016151377544},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":10,"docs":{"113":{"tf":1.0},"186":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.0},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.23606797749979},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":2,"docs":{"19":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.605551275463989},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.47213595499958},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.1622776601683795},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":3.3166247903554},"188":{"tf":1.7320508075688772},"189":{"tf":2.449489742783178},"190":{"tf":2.23606797749979},"191":{"tf":4.69041575982343},"192":{"tf":2.0},"193":{"tf":2.8284271247461903},"194":{"tf":1.7320508075688772},"195":{"tf":1.4142135623730951},"196":{"tf":2.8284271247461903},"197":{"tf":2.23606797749979},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.23606797749979},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.0},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":117,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.0},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.23606797749979},"46":{"tf":2.23606797749979},"48":{"tf":1.0},"49":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"9":{"tf":1.0}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"breadcrumbs":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"267":{"tf":2.0},"315":{"tf":1.4142135623730951}}},"2":{"df":4,"docs":{"236":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"274":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951}}},"3":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951}}},"4":{"df":3,"docs":{"232":{"tf":1.4142135623730951},"254":{"tf":2.0},"303":{"tf":1.4142135623730951}}},"5":{"df":6,"docs":{"232":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":2.0},"298":{"tf":1.4142135623730951}}},"6":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951}}},"7":{"df":2,"docs":{"242":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"8":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"9":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.4142135623730951},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951}}},"2":{"df":8,"docs":{"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0}}},"3":{"df":6,"docs":{"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"236":{"tf":1.4142135623730951}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.4142135623730951},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.4142135623730951}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":2.0},"270":{"tf":2.0},"278":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.4142135623730951},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.4142135623730951}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.4142135623730951}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.23606797749979},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.449489742783178},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":3.0},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":2.0},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"25":{"tf":1.0},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":2.0}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":2.0},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.3166247903554},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":3.1622776601683795},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.8284271247461903},"162":{"tf":2.449489742783178},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.6457513110645907},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":15,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.449489742783178},"37":{"tf":2.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":3.1622776601683795},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":2.23606797749979},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":2.0},"329":{"tf":1.7320508075688772}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":4.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.7320508075688772},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":2.0},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.7320508075688772},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":3.1622776601683795},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"253":{"tf":1.4142135623730951},"256":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"276":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"284":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.8284271247461903},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":3.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":3.1622776601683795},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":2.0},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":74,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"32":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.7320508075688772},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":2.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"213":{"tf":1.0},"319":{"tf":1.7320508075688772},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.4142135623730951},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":2.0},"244":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":2.0},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.6457513110645907},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":2.0},"143":{"tf":2.449489742783178},"144":{"tf":3.3166247903554},"145":{"tf":2.6457513110645907},"146":{"tf":4.358898943540674},"147":{"tf":1.0},"148":{"tf":2.0},"149":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"151":{"tf":1.7320508075688772},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":3.1622776601683795},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.7320508075688772},"129":{"tf":1.0},"13":{"tf":2.449489742783178},"130":{"tf":2.0},"135":{"tf":4.47213595499958},"136":{"tf":1.4142135623730951},"137":{"tf":2.23606797749979},"138":{"tf":3.0},"139":{"tf":2.0},"14":{"tf":1.7320508075688772},"140":{"tf":2.0},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.7320508075688772},"156":{"tf":1.7320508075688772},"159":{"tf":1.4142135623730951},"16":{"tf":2.8284271247461903},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.23606797749979},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.7320508075688772},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.3166247903554},"19":{"tf":3.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":2.0},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.7320508075688772},"39":{"tf":1.7320508075688772},"40":{"tf":4.69041575982343},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.605551275463989},"46":{"tf":2.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"7":{"tf":2.8284271247461903},"8":{"tf":2.449489742783178},"9":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"208":{"tf":2.0},"209":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.0},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.4142135623730951},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.4142135623730951},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.7320508075688772}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":36,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.449489742783178},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":24,"docs":{"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.449489742783178},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":2.0},"18":{"tf":1.4142135623730951},"19":{"tf":3.1622776601683795},"2":{"tf":1.0},"20":{"tf":1.7320508075688772},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":28,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.0},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":2.0},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":2.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"289":{"tf":2.0},"301":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.4142135623730951},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.7320508075688772},"6":{"tf":2.0},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.7320508075688772}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.7320508075688772},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.0}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.6457513110645907},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":3.1622776601683795},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":2.23606797749979},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":122,"docs":{"10":{"tf":1.0},"103":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"124":{"tf":2.0},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.4142135623730951},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.23606797749979},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.4641016151377544},"173":{"tf":3.3166247903554},"174":{"tf":4.242640687119285},"175":{"tf":3.605551275463989},"176":{"tf":2.0},"177":{"tf":2.6457513110645907},"178":{"tf":3.0},"179":{"tf":2.449489742783178},"180":{"tf":2.23606797749979},"181":{"tf":2.23606797749979},"182":{"tf":4.898979485566356},"183":{"tf":3.605551275463989},"184":{"tf":2.23606797749979},"185":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":21,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"259":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"268":{"tf":1.4142135623730951},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":107,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.449489742783178},"10":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.23606797749979},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.8284271247461903},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"222":{"tf":2.23606797749979},"23":{"tf":2.23606797749979},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.8284271247461903},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.1622776601683795},"266":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":2.0},"279":{"tf":1.4142135623730951},"28":{"tf":2.0},"281":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"3":{"tf":2.0},"30":{"tf":1.0},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.0},"310":{"tf":1.4142135623730951},"314":{"tf":2.0},"315":{"tf":1.0},"318":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"36":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":2.23606797749979},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"52":{"tf":3.0},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.6457513110645907},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.8284271247461903}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":27,"docs":{"10":{"tf":1.4142135623730951},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":89,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.3166247903554},"139":{"tf":2.23606797749979},"141":{"tf":5.830951894845301},"142":{"tf":1.0},"143":{"tf":3.3166247903554},"144":{"tf":2.6457513110645907},"145":{"tf":1.7320508075688772},"146":{"tf":2.23606797749979},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":2.23606797749979},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.7320508075688772},"205":{"tf":2.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"79":{"tf":1.0},"82":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.7320508075688772},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"296":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":2.0},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.7320508075688772},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.7320508075688772},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.449489742783178},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.23606797749979},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.7320508075688772},"217":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"227":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"289":{"tf":1.7320508075688772},"294":{"tf":1.0},"301":{"tf":1.4142135623730951},"317":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":2.23606797749979},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":13,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.449489742783178},"27":{"tf":1.7320508075688772},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.23606797749979},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":2.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"294":{"tf":1.7320508075688772},"297":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.23606797749979},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.6457513110645907},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":45,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.7320508075688772},"130":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":2.0},"118":{"tf":2.0},"119":{"tf":2.449489742783178},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":11,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.7320508075688772},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":13,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":57,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":12,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":3.1622776601683795},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":2.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":2.0},"127":{"tf":2.8284271247461903},"172":{"tf":1.0},"181":{"tf":2.23606797749979},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.7320508075688772},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":2.0},"204":{"tf":2.0},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.6457513110645907},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.8284271247461903},"207":{"tf":2.449489742783178},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.7320508075688772},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":2.0}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.23606797749979},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":2.23606797749979},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"19":{"tf":3.3166247903554},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.4142135623730951},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":117,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.4142135623730951},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"42":{"tf":1.0},"60":{"tf":2.6457513110645907},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.7320508075688772},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.6457513110645907},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":19,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.449489742783178},"183":{"tf":2.0},"184":{"tf":2.449489742783178},"185":{"tf":2.6457513110645907},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"80":{"tf":1.4142135623730951},"85":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.7320508075688772},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.7320508075688772},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":2.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":2.0},"157":{"tf":1.0},"158":{"tf":3.0},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":48,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":3.0},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.7320508075688772},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":25,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":2.0},"29":{"tf":2.6457513110645907},"30":{"tf":2.6457513110645907},"31":{"tf":2.8284271247461903},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":2.23606797749979},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.23606797749979}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":2.0},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.7320508075688772},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"18":{"tf":2.0},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":113,"docs":{"193":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.4142135623730951},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":2.23606797749979},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.4142135623730951},"56":{"tf":1.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.0},"60":{"tf":2.449489742783178},"61":{"tf":2.23606797749979},"62":{"tf":1.7320508075688772},"63":{"tf":2.449489742783178},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.7320508075688772},"215":{"tf":2.0},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.7320508075688772},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.7320508075688772},"106":{"tf":1.7320508075688772},"110":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.4641016151377544},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.7320508075688772},"76":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":4.123105625617661},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.7320508075688772},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.4142135623730951},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":38,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":3.0},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.7320508075688772},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.4142135623730951},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.23606797749979},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.4142135623730951},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":2.0},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":105,"docs":{"1":{"tf":1.0},"113":{"tf":2.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":3.0},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":56,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":4.0},"158":{"tf":2.6457513110645907},"159":{"tf":2.23606797749979},"160":{"tf":2.23606797749979},"161":{"tf":2.449489742783178},"162":{"tf":2.6457513110645907},"163":{"tf":3.0},"164":{"tf":2.6457513110645907},"165":{"tf":2.6457513110645907},"166":{"tf":2.449489742783178},"167":{"tf":2.23606797749979},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"170":{"tf":2.449489742783178},"171":{"tf":2.6457513110645907},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":2.0},"203":{"tf":2.6457513110645907},"204":{"tf":2.23606797749979},"205":{"tf":1.4142135623730951},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":2.0},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.7320508075688772},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.3166247903554},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.23606797749979},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":23,"docs":{"113":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":2.0},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":2.0},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.1622776601683795},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":11,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":2.0},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.4142135623730951},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.4142135623730951}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.872983346207417},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.7320508075688772},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.69041575982343},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":4.0},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":18,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.4641016151377544},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":3.7416573867739413},"188":{"tf":2.6457513110645907},"189":{"tf":3.1622776601683795},"190":{"tf":3.0},"191":{"tf":5.0990195135927845},"192":{"tf":2.8284271247461903},"193":{"tf":3.4641016151377544},"194":{"tf":2.6457513110645907},"195":{"tf":2.449489742783178},"196":{"tf":3.4641016151377544},"197":{"tf":3.0},"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.6457513110645907},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.23606797749979},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":133,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"22":{"tf":1.0},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"23":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"24":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.23606797749979},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.7320508075688772},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":2.23606797749979},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"46":{"tf":2.449489742783178},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.449489742783178},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.7320508075688772},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.4142135623730951},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.6457513110645907},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.4142135623730951},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.4142135623730951}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"p":{"df":95,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.0},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"7":{"tf":2.23606797749979},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"title":{"root":{"0":{".":{"1":{".":{"0":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"236":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"221":{"tf":1.0},"225":{"tf":1.0},"278":{"tf":1.0},"295":{"tf":1.0}}},"1":{"df":1,"docs":{"218":{"tf":1.0}}},"2":{"df":3,"docs":{"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0}}},"df":2,"docs":{"210":{"tf":1.0},"326":{"tf":1.0}}},"2":{"0":{"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"315":{"tf":1.0}}},"4":{"df":1,"docs":{"307":{"tf":1.0}}},"6":{"df":2,"docs":{"221":{"tf":1.0},"248":{"tf":1.0}}},"7":{"df":4,"docs":{"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0}}},"8":{"df":2,"docs":{"236":{"tf":1.0},"303":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":2,"docs":{"211":{"tf":1.0},"327":{"tf":1.0}}},"3":{"1":{"df":4,"docs":{"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"df":2,"docs":{"212":{"tf":1.0},"328":{"tf":1.0}}},"4":{"df":2,"docs":{"213":{"tf":1.0},"329":{"tf":1.0}}},"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"146":{"tf":1.0}}}},"d":{"d":{"df":3,"docs":{"10":{"tf":1.0},"25":{"tf":1.0},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"195":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"134":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"h":{"a":{"df":21,"docs":{"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"192":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"171":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"265":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"178":{"tf":1.0},"330":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"b":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"151":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"125":{"tf":1.0},"184":{"tf":1.0},"188":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"168":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"263":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"df":3,"docs":{"26":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"203":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"142":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"169":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":12,"docs":{"11":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"189":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"47":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"208":{"tf":1.0},"209":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"326":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"8":{"tf":1.0}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":6,"docs":{"11":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"14":{"tf":1.0},"212":{"tf":1.0},"56":{"tf":1.0}}}}}}}},"o":{"c":{"df":3,"docs":{"211":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"322":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"133":{"tf":1.0},"194":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":13,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"154":{"tf":1.0},"47":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":12,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":27,"docs":{"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":24,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"113":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"48":{"tf":1.0},"6":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"x":{"df":4,"docs":{"210":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":14,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"199":{"tf":1.0},"205":{"tf":1.0},"44":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"262":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"325":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":2,"docs":{"264":{"tf":1.0},"265":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":9,"docs":{"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"177":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"127":{"tf":1.0}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"200":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"67":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"49":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"181":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"260":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"196":{"tf":1.0},"204":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"207":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"264":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"89":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"145":{"tf":1.0},"153":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"15":{"tf":1.0},"19":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"217":{"tf":1.0},"60":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"190":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":9,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"109":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"227":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"136":{"tf":1.0},"158":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"216":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"10":{"tf":1.0},"155":{"tf":1.0},"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"217":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"119":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.0},"164":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"152":{"tf":1.0}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"18":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"65":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"203":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"3":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"201":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"321":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"4":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"137":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"126":{"tf":1.0},"197":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"131":{"tf":1.0},"140":{"tf":1.0},"176":{"tf":1.0},"193":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"186":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"33":{"tf":1.0},"57":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"50":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":17,"docs":{"134":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"207":{"tf":1.0},"264":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"185":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"198":{"tf":1.0}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"64":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":2,"docs":{"48":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"203":{"tf":1.0},"265":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"137":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"59":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"44":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"327":{"tf":1.0}}}},"y":{"df":1,"docs":{"209":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"156":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/docs/spec/comments.html b/docs/spec/comments.html new file mode 100644 index 0000000000..1732ffb35c --- /dev/null +++ b/docs/spec/comments.html @@ -0,0 +1,233 @@ + + + + + + Comments - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Comments

    +
    +

    Lexer
    +LINE_COMMENT :
    +      // *

    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/index.html b/docs/spec/data_layout/index.html new file mode 100644 index 0000000000..19cafec520 --- /dev/null +++ b/docs/spec/data_layout/index.html @@ -0,0 +1,238 @@ + + + + + + Data Layout - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Data Layout

    +

    There are three places where data can be stored on the EVM:

    +
      +
    • stack: 256-bit values placed on the stack that are loaded using DUP operations.
    • +
    • storage: 256-bit address space where 256-bit values can be stored. Accessing higher +storage slots does not increase gas cost.
    • +
    • memory: 256-bit address space where 256-bit values can be stored. Accessing higher +memory slots increases gas cost.
    • +
    +

    Each data type can be stored in these locations. How data is stored is +described in this section.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/memory/index.html b/docs/spec/data_layout/memory/index.html new file mode 100644 index 0000000000..4139121c27 --- /dev/null +++ b/docs/spec/data_layout/memory/index.html @@ -0,0 +1,233 @@ + + + + + + Memory - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Memory

    +

    Only sequence types can be stored in memory.

    +

    The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly +allocated segments begin at the value given by this slot. When more memory has been allocated, +the value stored in 0x00 is increased.

    +

    We do not free memory after it is allocated.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/memory/sequence_types_in_memory.html b/docs/spec/data_layout/memory/sequence_types_in_memory.html new file mode 100644 index 0000000000..09ce395091 --- /dev/null +++ b/docs/spec/data_layout/memory/sequence_types_in_memory.html @@ -0,0 +1,237 @@ + + + + + + Sequence types in memory - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Sequence types in memory

    +

    Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and +reference them using pointers kept on the stack.

    +

    Example:

    +
    fn f() {
    +    let foo: Array<u256, 100> = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.
    +}
    +
    +

    To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/stack.html b/docs/spec/data_layout/stack.html new file mode 100644 index 0000000000..e9db4fd4e1 --- /dev/null +++ b/docs/spec/data_layout/stack.html @@ -0,0 +1,241 @@ + + + + + + Stack - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Stack

    +

    The following can be stored on the stack:

    +
      +
    • base type values
    • +
    • pointers to reference type values
    • +
    +

    The size of each value stored on the stack must not exceed 256 bits. Since all base types are less +than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack.

    +

    Example:

    +
    fn f() {
    +    let foo: u256 = 42 // foo is stored on the stack
    +    let bar: Array<u256, 100> = [0; 100] // bar is a memory pointer stored on the stack
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/storage/constant_size_values_in_storage.html b/docs/spec/data_layout/storage/constant_size_values_in_storage.html new file mode 100644 index 0000000000..c04aef505f --- /dev/null +++ b/docs/spec/data_layout/storage/constant_size_values_in_storage.html @@ -0,0 +1,238 @@ + + + + + + Constant size values in storage - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Constant size values in storage

    +

    Storage pointers for constant size values are determined at compile time.

    +

    Example:

    +
    contract Cats {
    +   population: u256 // assigned a static location by the compiler
    +}
    +
    +

    The value of a base type in storage is found by simply loading the value from storage at the +given pointer.

    +

    To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/storage/index.html b/docs/spec/data_layout/storage/index.html new file mode 100644 index 0000000000..66d2dca9a6 --- /dev/null +++ b/docs/spec/data_layout/storage/index.html @@ -0,0 +1,229 @@ + + + + + + Storage - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Storage

    +

    All data types can be stored in storage.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/storage/maps_in_storage.html b/docs/spec/data_layout/storage/maps_in_storage.html new file mode 100644 index 0000000000..bdca2a3824 --- /dev/null +++ b/docs/spec/data_layout/storage/maps_in_storage.html @@ -0,0 +1,239 @@ + + + + + + Maps in storage - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Maps in storage

    +

    Maps are not assigned pointers, because they do not have a location in storage. They are instead +assigned a nonce that is used to derive the location of keyed values during runtime.

    +

    Example:

    +
    contract Foo {
    +  bar: Map<address, u256> // bar is assigned a static nonce by the compiler
    +  baz: Map<address, Map<address, u256>> // baz is assigned a static nonce by the compiler
    +}
    +
    +

    The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value +.i.e. keccak256(<bar nonce>, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to +a nested hash i.e. keccak256(keccak256(<baz nonce>, 0x00), 0x01).

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/data_layout/storage/to_mem_function.html b/docs/spec/data_layout/storage/to_mem_function.html new file mode 100644 index 0000000000..7adda2f4f2 --- /dev/null +++ b/docs/spec/data_layout/storage/to_mem_function.html @@ -0,0 +1,232 @@ + + + + + + to_mem() function - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    The to_mem function

    +

    Reference type values can be copied from storage and into memory using the to_mem function.

    +

    Example:

    +
    let my_array_var: Array<u256, 10> = self.my_array_field.to_mem()
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/arithmetic_operators.html b/docs/spec/expressions/arithmetic_operators.html new file mode 100644 index 0000000000..d60aa64a35 --- /dev/null +++ b/docs/spec/expressions/arithmetic_operators.html @@ -0,0 +1,274 @@ + + + + + + Arithmetic Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Arithmetic Operators

    +
    +

    Syntax
    +ArithmeticExpression :
    +     Expression + Expression
    +   | Expression - Expression
    +   | Expression * Expression
    +   | Expression / Expression
    +   | Expression % Expression
    +   | Expression ** Expression
    +   | Expression & Expression
    +   | Expression | Expression
    +   | Expression ^ Expression
    +   | Expression << Expression
    +   | Expression >> Expression

    +
    +

    Binary operators expressions are all written with infix notation. +This table summarizes the behavior of arithmetic and logical binary operators on +primitive types.

    +
    + + + + + + + + + + + +
    SymbolInteger
    +Addition
    -Subtraction
    *Multiplication
    /Division*
    %Remainder
    **Exponentiation
    &Bitwise AND
    |Bitwise OR
    ^Bitwise XOR
    <<Left Shift
    >>Right Shift
    +
    +

    * Integer division rounds towards zero.

    +

    Here are examples of these operators being used.

    +
    3 + 6 == 9
    +6 - 3 == 3
    +2 * 3 == 6
    +6 / 3 == 2
    +5 % 4 == 1
    +2 ** 4 == 16
    +12 & 25 == 8
    +12 | 25 == 29
    +12 ^ 25 == 21
    +212 << 1 == 424
    +212 >> 1 == 106
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/attribute.html b/docs/spec/expressions/attribute.html new file mode 100644 index 0000000000..dde20edf3f --- /dev/null +++ b/docs/spec/expressions/attribute.html @@ -0,0 +1,258 @@ + + + + + + Attribute expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Attribute expressions

    +
    +

    Syntax
    +AttributeExpression :
    +   Expression . IDENTIFIER

    +
    +

    An attribute expression evaluates to the location of an attribute of a struct, tuple or contract.

    +

    The syntax for an attribute expression is an expression, then a . and finally an identifier.

    +

    Examples:

    +
    struct Point {
    +    pub x: u256
    +    pub y: u256
    +}
    +
    +contract Foo {
    +    some_point: Point
    +    some_tuple: (bool, u256)
    +
    +    fn get_point() -> Point {
    +        return Point(x: 100, y: 500)
    +    }
    +
    +    pub fn baz(some_point: Point, some_tuple: (bool, u256)) {
    +        // Different examples of attribute expressions
    +        let bool_1: bool = some_tuple.item0
    +        let x1: u256 = some_point.x
    +        let point1: u256 = get_point().x
    +        let point2: u256 = some_point.x
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/boolean_operators.html b/docs/spec/expressions/boolean_operators.html new file mode 100644 index 0000000000..6e2efeeac0 --- /dev/null +++ b/docs/spec/expressions/boolean_operators.html @@ -0,0 +1,238 @@ + + + + + + Boolean Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Boolean Operators

    +
    +

    Syntax
    +BooleanExpression :
    +     Expression or Expression
    +   | Expression and Expression

    +
    +

    The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'.

    +

    Example:

    +
    const x: bool = false or true // true
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/call.html b/docs/spec/expressions/call.html new file mode 100644 index 0000000000..39c8d65067 --- /dev/null +++ b/docs/spec/expressions/call.html @@ -0,0 +1,254 @@ + + + + + + Call expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Call expressions

    +
    +

    Syntax
    +CallExpression :
    +   Expression GenericArgs? ( CallParams? )

    +

    GenericArgs :
    +   < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL)* >

    +

    CallParams :
    +   CallArg ( , CallArg )* ,?

    +

    CallArg :
    +   (CallArgLabel =)? Expression

    +

    CallArgLabel :
    +   IDENTIFIERLabel must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal.

    +
    +

    A call expression calls a function. The syntax of a call expression is an expression, followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition. If the function eventually returns, then the expression completes.

    +

    Example:

    +
    contract Foo {
    +
    +    pub fn demo(self) {
    +        let ann: address = 0xaa
    +        let bob: address = 0xbb
    +        self.transfer(from: ann, to: bob, 25)
    +    }
    +
    +    pub fn transfer(self, from: address, to: address, _ val: u256) {}
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/comparison_operators.html b/docs/spec/expressions/comparison_operators.html new file mode 100644 index 0000000000..99e69aea1c --- /dev/null +++ b/docs/spec/expressions/comparison_operators.html @@ -0,0 +1,255 @@ + + + + + + Comparison Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Comparison Operators

    +
    +

    Syntax
    +ComparisonExpression :
    +      Expression == Expression
    +   | Expression != Expression
    +   | Expression > Expression
    +   | Expression < Expression
    +   | Expression >= Expression
    +   | Expression <= Expression

    +
    +
    + + + + + + +
    SymbolMeaning
    ==Equal
    !=Not equal
    >Greater than
    <Less than
    >=Greater than or equal to
    <=Less than or equal to
    +
    +

    Here are examples of the comparison operators being used.

    +
    123 == 123
    +23 != -12
    +12 > 11
    +11 >= 11
    +11 < 12
    +11 <= 11
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/index.html b/docs/spec/expressions/index.html new file mode 100644 index 0000000000..e836b9d0ff --- /dev/null +++ b/docs/spec/expressions/index.html @@ -0,0 +1,243 @@ + + + + + + Expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/indexing.html b/docs/spec/expressions/indexing.html new file mode 100644 index 0000000000..1fa92eeeae --- /dev/null +++ b/docs/spec/expressions/indexing.html @@ -0,0 +1,254 @@ + + + + + + Index expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Index expressions

    +
    +

    Syntax
    +IndexExpression :
    +   Expression [ Expression ]

    +
    +

    Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map.

    +

    Example:

    +
    contract Foo {
    +
    +    balances: Map<address, u256>
    +
    +
    +    pub fn baz(mut self, mut values: Array<u256, 10>) {
    +        // Assign value at slot 5
    +        values[5] = 1000
    +        // Read value at slot 5
    +        let val1: u256 = values[5]
    +
    +        // Assign value for address zero
    +        self.balances[address(0)] = 10000
    +
    +        // Read balance of address zero
    +        let bal: u256 = self.balances[address(0)]
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/list.html b/docs/spec/expressions/list.html new file mode 100644 index 0000000000..ad38467cad --- /dev/null +++ b/docs/spec/expressions/list.html @@ -0,0 +1,258 @@ + + + + + + List expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    List expressions

    +
    +

    Syntax
    +ListExpression :
    +   [ ListElements? ]

    +

    ListElements :
    +   Expression (, Expression)* ,?

    +
    +

    A list expression constructs array values.

    +

    The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands. The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array.

    +

    Examples of tuple expressions and their types:

    +
    + + +
    ExpressionType
    [1, self.get_number()]u256[2]
    [true, false, false]bool[3]
    +
    +

    An array item can be accessed via an index expression.

    +

    Example:

    +
    contract Foo {
    +
    +    fn get_val3() -> u256 {
    +        return 3
    +    }
    +
    +    pub fn baz() {
    +        let val1: u256 = 2
    +        // A list expression
    +        let foo: Array<u256, 3> = [1, val1, get_val3()]
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/literal.html b/docs/spec/expressions/literal.html new file mode 100644 index 0000000000..dcfef94cd6 --- /dev/null +++ b/docs/spec/expressions/literal.html @@ -0,0 +1,241 @@ + + + + + + Literal expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Literal expressions

    +
    +

    Syntax
    +LiteralExpression :
    +   | STRING_LITERAL
    +   | INTEGER_LITERAL
    +   | BOOLEAN_LITERAL

    +
    +

    A literal expression consists of one of the literal forms described earlier. +It directly describes a number, string or boolean value.

    +
    "hello"   // string type
    +5         // integer type
    +true      // boolean type
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/name.html b/docs/spec/expressions/name.html new file mode 100644 index 0000000000..3c2de09351 --- /dev/null +++ b/docs/spec/expressions/name.html @@ -0,0 +1,242 @@ + + + + + + Name expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Name expressions

    +
    +

    Syntax
    +NameExpression :
    +   IDENTIFIER

    +
    +

    A name expression resolves to a local variable.

    +

    Example:

    +
    contract Foo {
    +    pub fn baz(foo: u256) {
    +        // name expression resolving to the value of `foo`
    +        foo
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/path.html b/docs/spec/expressions/path.html new file mode 100644 index 0000000000..97ccef1ceb --- /dev/null +++ b/docs/spec/expressions/path.html @@ -0,0 +1,242 @@ + + + + + + Path expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Path expressions

    +
    +

    Syntax
    +PathExpression :
    +   IDENTIFIER ( :: IDENTIFIER )*

    +
    +

    A name expression resolves to a local variable.

    +

    Example:

    +
    contract Foo {
    +    pub fn baz() {
    +        // CONST_VALUE is defined in another module `my_mod`.
    +        let foo: u32 = my_mod::CONST_VALUE
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/struct.html b/docs/spec/expressions/struct.html new file mode 100644 index 0000000000..1793f827fc --- /dev/null +++ b/docs/spec/expressions/struct.html @@ -0,0 +1,229 @@ + + + + + + Struct expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Struct expressions

    +

    TBW

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/tuple.html b/docs/spec/expressions/tuple.html new file mode 100644 index 0000000000..2f6ee3381b --- /dev/null +++ b/docs/spec/expressions/tuple.html @@ -0,0 +1,262 @@ + + + + + + Tuple expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Tuple expressions

    +
    +

    Syntax
    +TupleExpression :
    +   ( TupleElements? )

    +

    TupleElements :
    +   ( Expression , )+ Expression?

    +
    +

    A tuple expression constructs tuple values.

    +

    The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands. The number of tuple initializer operands is the arity of the constructed tuple.

    +

    1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression.

    +

    Tuple expressions without any tuple initializer operands produce the unit tuple.

    +

    For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field.

    +

    For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2.

    +

    Examples of tuple expressions and their types:

    +
    + + + + +
    ExpressionType
    ()() (unit)
    (0, 4)(u256, u256)
    (true, )(bool, )
    (true, -1, 1)(bool, i256, u256)
    +
    +

    A tuple field can be accessed via an attribute expression.

    +

    Example:

    +
    contract Foo {
    +    pub fn bar() {
    +        // Creating a tuple via a tuple expression
    +        let some_tuple: (u256, bool) = (1, false)
    +
    +        // Accessing the first tuple field via the `item0` field
    +        baz(input: some_tuple.item0)
    +    }
    +    pub fn baz(input: u256) {}
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/expressions/unary_operators.html b/docs/spec/expressions/unary_operators.html new file mode 100644 index 0000000000..7a4591280b --- /dev/null +++ b/docs/spec/expressions/unary_operators.html @@ -0,0 +1,243 @@ + + + + + + Unary Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Unary Operators

    +
    +

    Syntax
    +UnaryExpression :
    +     not Expression
    +   | - Expression
    +   | ~ Expression

    +
    +

    The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument.

    +

    Example:

    +
    fn f() {
    +  let x: bool = not true  // false
    +  let y: i256 = -1
    +  let z: i256 = i256(~1)  // -2
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/index.html b/docs/spec/index.html new file mode 100644 index 0000000000..a028784771 --- /dev/null +++ b/docs/spec/index.html @@ -0,0 +1,325 @@ + + + + + + Specification (WIP) - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/contracts.html b/docs/spec/items/contracts.html new file mode 100644 index 0000000000..496d5a96d7 --- /dev/null +++ b/docs/spec/items/contracts.html @@ -0,0 +1,302 @@ + + + + + + Contracts - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Contracts

    +
    +

    Syntax
    +Contract :
    +   contract IDENTIFIER {
    +  ContractMember*
    +  _}

    +

    ContractMember:
    +   Visibility?
    +   (
    +         ContractField
    +      | Function
    +      | Struct
    +      | Enum
    +   )

    +

    Visibility :
    +   pub?

    +

    ContractField :
    +   IDENTIFIER : Type

    +
    +

    A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain.

    +

    Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data).

    +

    In Fe, contracts are defined in files with .fe extensions and compiled using fe build.

    +

    A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods.

    +

    An example of a contract:

    +
    struct Signed {
    +    pub book_msg: String<100>
    +}
    +
    +contract GuestBook {
    +    messages: Map<address, String<100>>
    +
    +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
    +        self.messages[ctx.msg_sender()] = book_msg
    +        ctx.emit(Signed(book_msg: book_msg))
    +    }
    +
    +    pub fn get_msg(self, addr: address) -> String<100> {
    +        return self.messages[addr].to_mem()
    +    }
    +}
    +
    +

    Multiple contracts can be compiled from a single .fe contract file.

    +

    pragma

    +

    An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it.

    +

    Read more on pragma

    +

    State variables

    +

    State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function.

    +
    pub contract Example {
    +    some_number: u256
    +    _some_string: String<100>
    +}
    +
    +

    Contract functions

    +

    Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well.

    +

    Individual functions can be called internally or externally depending upon their visibility (either private or public).

    +

    Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument.

    +

    Read more on functions.

    +

    The __init__() function

    +

    The __init__ function is a special contract function that can only be called at contract deployment time. It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function.

    +
    pub contract Example {
    +
    +    _some_number: u256
    +    _some_string: String<100>
    +
    +    pub fn __init__(mut self, number: u256, string: String<100>)  {
    +        self._some_number=number;
    +        self._some_string=string;
    +    }
    +}
    +
    +

    It is not possible to call __init__ at runtime.

    +

    Structs

    +

    Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error.

    +

    Read more on structs.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/enums.html b/docs/spec/items/enums.html new file mode 100644 index 0000000000..bb90e03fa5 --- /dev/null +++ b/docs/spec/items/enums.html @@ -0,0 +1,282 @@ + + + + + + Enums - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Enum

    +
    +

    Syntax
    +Enumeration :
    +   enum IDENTIFIER {
    +      EnumField*
    +      EnumMethod*
    +   }

    +

    EnumField :
    +   IDENTIFIER | IDENTIFIER(TupleElements?)

    +

    EnumMethod :
    +   Function

    +

    TupleElements :
    +   Type ( , Type )*

    +
    +

    An enum, also referred to as enumeration is a simultaneous definition of a +nominal Enum type, that can be used to create or pattern-match values of the corresponding type.

    +

    Enumerations are declared with the keyword enum.

    +

    An example of an enum item and its use:

    +
    enum Animal {
    +    Dog
    +    Cat
    +    Bird(BirdType)
    +    
    +    pub fn bark(self) -> String<10> {
    +        match self {
    +            Animal::Dog => {
    +                return "bow"
    +            }
    +
    +            Animal::Cat => {
    +                return "meow"
    +            }
    +            
    +            Animal::Bird(BirdType::Duck) => {
    +                return "quack"
    +            }
    +            
    +            Animal::Bird(BirdType::Owl) => {
    +                return "hoot"
    +            }
    +        }
    +    }
    +}
    +
    +enum BirdType {
    +    Duck
    +    Owl
    +}
    +
    +fn f() {
    +    let barker: Animal = Animal::Dog
    +    barker.bark()
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/functions/context.html b/docs/spec/items/functions/context.html new file mode 100644 index 0000000000..3320f7674c --- /dev/null +++ b/docs/spec/items/functions/context.html @@ -0,0 +1,318 @@ + + + + + + Context - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Context

    +

    Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.

    +

    Rationale

    +

    Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses.

    +

    To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone.

    +

    For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log).

    +
    pub fn looks_pure_but_isnt() {
    +  // COMPILE ERROR
    +  block_number()
    +}
    +
    +

    Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows:

    +
    pub fn uses_context(ctx: Context) -> u256 {
    +    return ctx.block_number()
    +}
    +
    +

    The Context object

    +

    The Context object gates access to features such as:

    +
      +
    • emitting logs
    • +
    • creating contracts
    • +
    • transferring ether
    • +
    • reading message info
    • +
    • reading block info
    • +
    +

    The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error.

    +

    The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g.

    +
    // The context object is automatically injected when this is called externally
    +pub fn multiply_block_number(ctx: Context) -> u256 {
    +  // but it has to be passed along in this function call
    +  return retrieves_blocknumber(ctx) * 1000
    +}
    +
    +fn retrieves_blocknumber(ctx: Context) -> u256 {
    +  return ctx.block_number()
    +}
    +
    +

    Context mutability

    +

    All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.:

    +
    struct SomeEvent{
    +}
    +
    +pub fn mutable(mut ctx: Context) {
    +    ctx.emit(SomeEvent())
    +}
    +
    +

    ABI conformity

    +

    The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self. The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types.

    +
    + + + + + + + + + +
    CategoryCharacteristicsFe SyntaxABI
    PureCan only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impurefoo(val: u256)pure
    Read ContractReading information from the contract instance (broad definition includes reading constants from contract code)foo(self)view
    Storage WritingWriting to contract storage (own or that of other contracts)foo(mut self)payable or nonpayable
    Context ReadingReading contextual information from the blockchain (msg, block etc)foo(ctx: Context)view
    Context ModifyingEmitting logs, transferring ether, creating contractsfoo(ctx: mut Context)payable or nonpayable
    Read Contract & ContextReading information from the contract instance and Contextfoo(self, ctx:Context)view
    Read Contract & write ContextReading information from the contract instance and modify Contextfoo(self, ctx: mut Context)view
    Storage Writing & read ContextWriting to contract storage and read from Contextfoo(mut self, ctx: Context)payable or nonpayable
    Storage Writing & write ContextWriting to contract storage and Contextfoo(mut self, ctx: mut Context)payable or nonpayable
    +
    +

    This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.

    +

    Examples

    +

    msg_sender and msg_value

    +

    Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the +transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable.

    +
    #![allow(unused)]
    +fn main() {
    +// assumes existence of state variable named 'ledger' with type Map<address, u256>
    +pub fn add_to_ledger(mut self, ctx: Context) {
    +    self.ledger[ctx.msg_sender()] = ctx.msg_value();
    +}
    +}
    +

    Transferring ether

    +

    Transferring ether modifies the blockchain state, so it requires access to a mutable Context object.

    +
    pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) {
    +    ctx.send_value(to: _addr, wei: amount)
    +}
    +
    +

    create/create2

    +

    Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn creates_contract(ctx: mut Context):
    +  ctx.create2(...)
    +}
    +

    block number

    +

    Reading block chain information such as the current block number requires Context (but does not require it to be mutable).

    +
    pub fn retrieves_blocknumber(ctx: Context) {
    +  ctx.block_number()
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/functions/index.html b/docs/spec/items/functions/index.html new file mode 100644 index 0000000000..61ee780439 --- /dev/null +++ b/docs/spec/items/functions/index.html @@ -0,0 +1,350 @@ + + + + + + Functions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Functions

    +

    Constant size values stored on the stack or in memory can be passed into and returned by functions.

    +
    +

    Syntax
    +Function :
    +   FunctionQualifiers fn IDENTIFIER
    +      ( FunctionParameters? )
    +      FunctionReturnType?
    +      {
    +      FunctionStatements*
    +      }

    +

    FunctionQualifiers :
    +   pub?

    +

    FunctionStatements :
    +         ReturnStatement
    +      | VariableDeclarationStatement
    +      | AssignStatement
    +      | AugmentedAssignStatement
    +      | ForStatement
    +      | WhileStatement
    +      | IfStatement
    +      | AssertStatement
    +      | BreakStatement
    +      | ContinueStatement
    +      | RevertStatement
    +      | Expression

    +

    FunctionParameters :
    +   self? | self,? FunctionParam (, FunctionParam)* ,?

    +

    FunctionParam :
    +   FunctionParamLabel? IDENTIFIER : Types

    +

    FunctionParamLabel :
    +   _ | IDENTIFIER

    +

    FunctionReturnType :
    +   -> Types

    +
    +

    A function definition consists of name and code block along with an optional +list of parameters and return value. Functions are declared with the +keyword fn. Functions may declare a set of input parameters, +through which the caller passes arguments into the function, and +the output type of the value the function will return to its caller +on completion.

    +

    When referred to, a function yields a first-class value of the +corresponding zero-sized function type, which +when called evaluates to a direct call to the function.

    +

    A function header prepends a set or curly brackets {...} which contain the function body.

    +

    For example, this is a simple function:

    +
    fn add(x: u256, y: u256) -> u256 {
    +    return x + y
    +}
    +
    +

    Functions can be defined inside of a contract, inside of a struct, or at the +"top level" of a module (that is, not nested within another item).

    +

    Example:

    +
    fn add(_ x: u256, _ y: u256) -> u256 {
    +    return x + y
    +}
    +
    +contract CoolCoin {
    +    balance: Map<address, u256>
    +
    +    fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool {
    +        if self.balance[sender] < value {
    +            return false
    +        }
    +        self.balance[sender] -= value
    +        self.balance[recipient] += value
    +        return true
    +    }
    +    pub fn demo(mut self) {
    +        let ann: address = 0xaa
    +        let bob: address = 0xbb
    +        self.balance[ann] = 100
    +
    +        let bonus: u256 = 2
    +        let value: u256 = add(10, bonus)
    +        let ok: bool = self.transfer(from: ann, to: bob, value)
    +    }
    +}
    +
    +

    Function parameters have optional labels. When a function is called, the +arguments must be labeled and provided in the order specified in the +function definition.

    +

    The label of a parameter defaults to the parameter name; a different label +can be specified by adding an explicit label prior to the parameter name. +For example:

    +
    fn encrypt(msg cleartext: u256, key: u256) -> u256 {
    +    return cleartext ^ key
    +}
    +
    +fn demo() {
    +    let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)
    +}
    +
    +

    Here, the first parameter of the encrypt function has the label msg, +which is used when calling the function, while the parameter name is +cleartext, which is used inside the function body. The parameter name +is an implementation detail of the function, and can be changed without +modifying any function calls, as long as the label remains the same.

    +

    When calling a function, a label can be omitted when the argument is +a variable with a name that matches the parameter label. Example:

    +
    let msg: u256 = 0xdecafbad
    +let cyf: u256 = encrypt(msg, key: 0x1234)
    +
    +

    A parameter can also be specified to have no label, by using _ in place of a +label in the function definition. In this case, when calling the function, the +corresponding argument must not be labeled. Example:

    +
    fn add(_ x: u256, _ y: u256) -> u256 {
    +    return x + y
    +}
    +fn demo() {
    +    let sum: u256 = add(16, 32)
    +}
    +
    +

    Functions defined inside of a contract or struct may take self as a +parameter. This gives the function the ability to read and write contract +storage or struct fields, respectively. If a function takes self +as a parameter, the function must be called via self. For example:

    +
    let ok: bool = self.transfer(from, to, value)
    +
    +

    self is expected to come first parameter in the function's parameter list.

    +

    Functions can also take a Context object which gives access to EVM features that read or write +blockchain and transaction data. Context is expected to be first in the function's parameter list +unless the function takes self, in which case Context should come second.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/functions/self.html b/docs/spec/items/functions/self.html new file mode 100644 index 0000000000..3db5fd0da3 --- /dev/null +++ b/docs/spec/items/functions/self.html @@ -0,0 +1,260 @@ + + + + + + Self - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Self

    +

    self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage.

    +
    +

    Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs.

    +
    +

    If a function takes self as a parameter, the function must be called via self. For example:

    +
    #![allow(unused)]
    +fn main() {
    +let ok: bool = self.transfer(from, to, value)
    +}
    +

    Mutability

    +

    self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.

    +

    Examples

    +

    Reading contract storage

    +
    contract example {
    +
    +    value: u256;
    +
    +    pub fn check_value(self) -> u256 {
    +        return self.value;
    +    }
    +}
    +
    +

    Writing contract storage

    +
    contract example {
    +
    +    value: u256;
    +
    +    pub fn update_value(mut self) {
    +        self.value += 1;
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/index.html b/docs/spec/items/index.html new file mode 100644 index 0000000000..bbe3505511 --- /dev/null +++ b/docs/spec/items/index.html @@ -0,0 +1,235 @@ + + + + + + Items - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/structs.html b/docs/spec/items/structs.html new file mode 100644 index 0000000000..9259cdd10f --- /dev/null +++ b/docs/spec/items/structs.html @@ -0,0 +1,257 @@ + + + + + + Structs - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Structs

    +
    +

    Syntax
    +Struct :
    +   struct IDENTIFIER {
    +      StructField*
    +      StructMethod*
    +   }

    +

    StructField :
    +   pub? IDENTIFIER : Type

    +

    StructMethod :
    +   Function

    +
    +

    A struct is a nominal struct type defined with the keyword struct.

    +

    An example of a struct item and its use:

    +
    struct Point {
    +    pub x: u256
    +    pub y: u256
    +}
    +
    +fn pointy_stuff() {
    +    let mut p: Point = Point(x: 10, y: 11)
    +    let px: u256 = p.x
    +    p.x = 100
    +}
    +
    +

    Builtin functions:

    +
      +
    • abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.
    • +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/traits.html b/docs/spec/items/traits.html new file mode 100644 index 0000000000..bb7cddca4b --- /dev/null +++ b/docs/spec/items/traits.html @@ -0,0 +1,264 @@ + + + + + + Traits - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Traits

    +
    +

    Syntax
    +Trait :
    +   trait IDENTIFIER {
    +      TraitMethod*
    +   }

    +

    TraitMethod :
    +   fn IDENTIFIER
    +      ( FunctionParameters? )
    +      FunctionReturnType? ;

    +
    +

    A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function.

    +

    All traits define an implicit type parameter Self that refers to "the type that is implementing this interface".

    +

    Example of the Min trait from Fe's standard library:

    +
    pub trait Min {
    +  fn min() -> Self;
    +}
    +
    +

    Example of the i8 type implementing the Min trait:

    +
    impl Min for i8 {
    +  fn min() -> Self {
    +    return -128
    +  }
    +}
    +
    +

    Example of a function restricting a generic parameter to types implementing the Compute trait:

    +
    pub trait Compute {
    +  fn compute(self) -> u256;
    +}
    +
    +struct Example {
    +  fn do_something<T: Compute>(val: T) -> u256 {
    +    return val.compute()
    +  }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/type_aliases.html b/docs/spec/items/type_aliases.html new file mode 100644 index 0000000000..d0951f0366 --- /dev/null +++ b/docs/spec/items/type_aliases.html @@ -0,0 +1,239 @@ + + + + + + Type Aliases - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Type aliases

    +
    +

    Syntax
    +TypeAlias :
    +   type IDENTIFIER = Type

    +
    +

    A type alias defines a new name for an existing type. Type aliases are +declared with the keyword type.

    +

    For example, the following defines the type BookMsg as a synonym for the type +u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe.

    +
    type BookMsg = Array<u8, 100>
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/items/visibility_and_privacy.html b/docs/spec/items/visibility_and_privacy.html new file mode 100644 index 0000000000..86db172e4a --- /dev/null +++ b/docs/spec/items/visibility_and_privacy.html @@ -0,0 +1,265 @@ + + + + + + Visibility and Privacy - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Visibility and Privacy

    +

    These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question "Can this item be used at this location?"

    +

    Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified.

    +

    Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions.

    +

    Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility.

    +

    For example, this is a function that can be called externally from a transaction:

    +
    pub fn answer_to_life_the_universe_and_everything() -> u256 {
    +    return 42
    +}
    +
    +

    Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition.

    +

    For example, given an Ingot with the following structure:

    +
    example_ingot
    +└── src
    +    ├── ding
    +    │   └── dong.fe
    +    └── main.fe
    +
    +

    With ding/dong.fe having the following contents:

    +
    pub struct Dang {
    +    pub my_address: address
    +    pub my_u256: u256
    +    pub my_i8: i8
    +}
    +
    +

    Then main.fe can use the Dang struct since it is pub-qualified:

    +
    use ding::dong::Dang
    +
    +contract Foo {
    +    pub fn hot_dang() -> Dang {
    +        return Dang(
    +            my_address: 8,
    +            my_u256: 42,
    +            my_i8: -1
    +        )
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/lexical_structure/identifiers.html b/docs/spec/lexical_structure/identifiers.html new file mode 100644 index 0000000000..e7dffcb197 --- /dev/null +++ b/docs/spec/lexical_structure/identifiers.html @@ -0,0 +1,247 @@ + + + + + + Identifiers - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Identifiers

    +
    +

    Lexer:
    +IDENTIFIER_OR_KEYWORD :
    +      [a-z A-Z] [a-z A-Z 0-9 _]*
    +   | _ [a-z A-Z 0-9 _]+ +Except a strict or reserved keyword

    +
    +

    An identifier is any nonempty ASCII string of the following form:

    +

    Either

    +
      +
    • The first character is a letter.
    • +
    • The remaining characters are alphanumeric or _.
    • +
    +

    Or

    +
      +
    • The first character is _.
    • +
    • The identifier is more than one character. _ alone is not an identifier.
    • +
    • The remaining characters are alphanumeric or _.
    • +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/lexical_structure/index.html b/docs/spec/lexical_structure/index.html new file mode 100644 index 0000000000..52a9fc6ec5 --- /dev/null +++ b/docs/spec/lexical_structure/index.html @@ -0,0 +1,233 @@ + + + + + + Lexical Structure - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Lexical Structure

    + + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/lexical_structure/keywords.html b/docs/spec/lexical_structure/keywords.html new file mode 100644 index 0000000000..f8c26f4ce3 --- /dev/null +++ b/docs/spec/lexical_structure/keywords.html @@ -0,0 +1,295 @@ + + + + + + Keywords - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Keywords

    +

    Fe divides keywords into two categories:

    + +

    Strict keywords

    +

    These keywords can only be used in their correct contexts. They cannot +be used as the identifiers.

    +
    +

    Lexer:
    +KW_AS : as
    +KW_BREAK : break
    +KW_CONST : const
    +KW_CONTINUE : continue
    +KW_CONST : contract
    +KW_FN : fn
    +KW_ELSE : else
    +KW_ENUM : enum
    +KW_EVENT : event
    +KW_FALSE : false
    +KW_FOR : for
    +KW_IDX : idx
    +KW_IF : if
    +KW_IN : in
    +KW_LET : let
    +KW_MATCH : match
    +KW_MUT : mut
    +KW_NONPAYABLE : nonpayable
    +KW_PAYABLE : payable
    +KW_PUB : pub
    +KW_RETURN : return
    +KW_REVERT : revert
    +KW_SELFVALUE : self
    +KW_STRUCT : struct
    +KW_TRUE : true
    +KW_USE : use
    +KW_WHILE : while
    +KW_ADDRESS : address

    +
    +

    Reserved keywords

    +

    These keywords aren't used yet, but they are reserved for future use. They have +the same restrictions as strict keywords. The reasoning behind this is to make +current programs forward compatible with future versions of Fe by forbidding +them to use these keywords.

    +
    +

    Lexer:
    +KW_ABSTRACT : abstract
    +KW_ASYNC : async
    +KW_AWAIT : await
    +KW_DO : do
    +KW_EXTERNAL : external
    +KW_FINAL : final
    +KW_IMPL : impl
    +KW_MACRO : macro
    +KW_OVERRIDE : override
    +KW_PURE : pure
    +KW_SELFTYPE : Self
    +KW_STATIC : static
    +KW_SUPER : super
    +KW_TRAIT : trait
    +KW_TYPE : type
    +KW_TYPEOF : typeof
    +KW_VIEW : view
    +KW_VIRTUAL : virtual
    +KW_WHERE : where
    +KW_YIELD : yield

    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/lexical_structure/tokens.html b/docs/spec/lexical_structure/tokens.html new file mode 100644 index 0000000000..04624d4bb2 --- /dev/null +++ b/docs/spec/lexical_structure/tokens.html @@ -0,0 +1,327 @@ + + + + + + Tokens - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Tokens

    +

    NEWLINE

    +

    A token that represents a new line.

    +

    Literals

    +

    A literal is an expression consisting of a single token, rather than a sequence +of tokens, that immediately and directly denotes the value it evaluates to, +rather than referring to it by name or some other evaluation rule. A literal is +a form of constant expression, so is evaluated (primarily) at compile time.

    +

    Examples

    +

    Strings

    +
    + +
    ExampleCharactersEscapes
    String"hello"ASCII subsetQuote & ASCII
    +
    +

    ASCII escapes

    +
    + + + + +
    Name
    \nNewline
    \rCarriage return
    \tTab
    \\Backslash
    +
    +

    Quote escapes

    +
    + +
    Name
    \"Double quote
    +
    +

    Numbers

    +
    + + + + +
    Number literals*Example
    Decimal integer98_222
    Hex integer0xff
    Octal integer0o77
    Binary integer0b1111_0000
    +
    +

    * All number literals allow _ as a visual separator: 1_234

    +

    Boolean literals

    +
    +

    Lexer
    +BOOLEAN_LITERAL :
    +   true | false

    +
    +

    String literals

    +
    +

    Lexer
    +STRING_LITERAL :
    +   " (
    +      PRINTABLE_ASCII_CHAR
    +      | QUOTE_ESCAPE
    +      | ASCII_ESCAPE
    +   )* "

    +

    PRINTABLE_ASCII_CHAR :
    +   Any ASCII character between 0x1F and 0x7E

    +

    QUOTE_ESCAPE :
    +   \"

    +

    ASCII_ESCAPE :
    +   | \n | \r | \t | \\

    +
    +

    A string literal is a sequence of any characters that are in the set of +printable ASCII characters as well as a set of defined escape sequences.

    +

    Line breaks are allowed in string literals.

    +

    Integer literals

    +
    +

    Lexer
    +INTEGER_LITERAL :
    +   ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL )

    +

    DEC_LITERAL :
    +   DEC_DIGIT (DEC_DIGIT|_)*

    +

    BIN_LITERAL :
    +   0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)*

    +

    OCT_LITERAL :
    +   0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)*

    +

    HEX_LITERAL :
    +   0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)*

    +

    BIN_DIGIT : [0-1]

    +

    OCT_DIGIT : [0-7]

    +

    DEC_DIGIT : [0-9]

    +

    HEX_DIGIT : [0-9 a-f A-F]

    +
    +

    An integer literal has one of four forms:

    +
      +
    • A decimal literal starts with a decimal digit and continues with any +mixture of decimal digits and underscores.
    • +
    • A hex literal starts with the character sequence U+0030 U+0078 +(0x) and continues as any mixture (with at least one digit) of hex digits +and underscores.
    • +
    • An octal literal starts with the character sequence U+0030 U+006F +(0o) and continues as any mixture (with at least one digit) of octal digits +and underscores.
    • +
    • A binary literal starts with the character sequence U+0030 U+0062 +(0b) and continues as any mixture (with at least one digit) of binary digits +and underscores.
    • +
    +

    Examples of integer literals of various forms:

    +
    123                      // type u256
    +0xff                     // type u256
    +0o70                     // type u256
    +0b1111_1111_1001_0000    // type u256
    +0b1111_1111_1001_0000i64 // type u256
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/notation.html b/docs/spec/notation.html new file mode 100644 index 0000000000..34ea1012a1 --- /dev/null +++ b/docs/spec/notation.html @@ -0,0 +1,246 @@ + + + + + + Notation - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Notation

    +

    Grammar

    +

    The following notations are used by the Lexer and Syntax grammar snippets:

    +
    + + + + + + + + + + + + + + +
    NotationExamplesMeaning
    CAPITALKW_IFA token produced by the lexer
    ItalicCamelCaseItemA syntactical production
    stringx, while, *The exact character(s)
    \x\n, \r, \t, \0The character represented by this escape
    x?pub?An optional item
    x*OuterAttribute*0 or more of x
    x+MacroMatch+1 or more of x
    xa..bHEX_DIGIT1..6a to b repetitions of x
    |u8 | u16, Block | ItemEither one or another
    [ ][b B]Any of the characters listed
    [ - ][a-z]Any of the characters in the range
    ~[ ]~[b B]Any characters, except those listed
    ~string~\n, ~*/Any characters, except this sequence
    ( )(, Parameter)Groups items
    +
    +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/assert.html b/docs/spec/statements/assert.html new file mode 100644 index 0000000000..9791c02eb7 --- /dev/null +++ b/docs/spec/statements/assert.html @@ -0,0 +1,254 @@ + + + + + + assert Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    assert statement

    +
    +

    Syntax
    +AssertStatement :
    +   assert Expression (, Expression)?

    +
    +

    The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression.

    +

    If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code.

    +
    +

    Warning: +The current implementation of assert is under active discussion and likely to change.

    +
    +

    An example of a assert statement without the optional message:

    +
    contract Foo {
    +    fn bar(val: u256) {
    +        assert val > 5
    +    }
    +}
    +
    +

    An example of a assert statement with an error message:

    +
    contract Foo {
    +
    +    fn bar(val: u256) {
    +        assert val > 5, "Must be greater than five"
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/assign.html b/docs/spec/statements/assign.html new file mode 100644 index 0000000000..32eb9292bc --- /dev/null +++ b/docs/spec/statements/assign.html @@ -0,0 +1,253 @@ + + + + + + Assignment Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Assignment statement

    +
    +

    Syntax
    +AssignmentStatement :
    +   Expression = Expression

    +
    +

    An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression.

    +

    Example:

    +
    contract Foo {
    +  some_array: Array<u256, 10>
    +
    +
    +  pub fn bar(mut self) {
    +    let mut val1: u256 = 10
    +    // Assignment of stack variable
    +    val1 = 10
    +
    +    let mut values: (u256, u256) = (1, 2)
    +    // Assignment of tuple item
    +    values.item0 = 3
    +
    +    // Assignment of storage array slot
    +    self.some_array[5] = 1000
    +  }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/augassign.html b/docs/spec/statements/augassign.html new file mode 100644 index 0000000000..59605bd106 --- /dev/null +++ b/docs/spec/statements/augassign.html @@ -0,0 +1,262 @@ + + + + + + Augmenting Assignment Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Augmenting Assignment statement

    +
    +

    Syntax
    +AssignmentStatement :
    +      Expression = Expression
    +   | Expression += Expression
    +   | Expression -= Expression
    +   | Expression %= Expression
    +   | Expression **= Expression
    +   | Expression <<= Expression
    +   | Expression >>= Expression
    +   | Expression |= Expression
    +   | Expression ^= Expression
    +   | Expression &= Expression

    +
    +

    Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements.

    +

    An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression.

    +

    Example:

    +
    fn example() -> u8 {
    +    let mut a: u8 = 1
    +    let b: u8 = 2
    +    a += b
    +    a -= b
    +    a *= b
    +    a /= b
    +    a %= b
    +    a **= b
    +    a <<= b
    +    a >>= b
    +    a |= b
    +    a ^= b
    +    a &= b
    +    return a
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/break.html b/docs/spec/statements/break.html new file mode 100644 index 0000000000..678ad7449a --- /dev/null +++ b/docs/spec/statements/break.html @@ -0,0 +1,277 @@ + + + + + + break Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    break statement

    +
    +

    Syntax
    +BreakStatement :
    +   break

    +
    +

    The break statement can only be used within a for or while loop and causes the immediate termination of the loop.

    +

    If used within nested loops the break statement is associated with the innermost enclosing loop.

    +

    An example of a break statement used within a while loop.

    +
    contract Foo {
    +
    +    pub fn bar() -> u256 {
    +        let mut sum: u256 = 0
    +        while sum < 10 {
    +            sum += 1
    +
    +            if some_abort_condition() {
    +                break
    +            }
    +        }
    +        return sum
    +    }
    +
    +    fn some_abort_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    +

    An example of a break statement used within a for loop.

    +
    contract Foo {
    +
    +    pub fn bar(values: Array<u256, 10>) -> u256 {
    +        let mut sum: u256 = 0
    +        for i in values {
    +            sum = sum + i
    +
    +            if some_abort_condition() {
    +                break
    +            }
    +        }
    +        return sum
    +    }
    +
    +    fn some_abort_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/const.html b/docs/spec/statements/const.html new file mode 100644 index 0000000000..ca258e59cf --- /dev/null +++ b/docs/spec/statements/const.html @@ -0,0 +1,244 @@ + + + + + + const Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    const statement

    +
    +

    Syntax
    +ConstStatement :
    +   const IDENTIFIER: Type = Expression

    +
    +

    A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type.

    +

    Example:

    +
    const TEN: u256 = 10
    +const HUNDO: u256 = TEN * TEN
    +
    +contract Foo {
    +  pub fn bar() -> u256 {
    +    return HUNDO
    +  }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/continue.html b/docs/spec/statements/continue.html new file mode 100644 index 0000000000..ca75ddaa2c --- /dev/null +++ b/docs/spec/statements/continue.html @@ -0,0 +1,278 @@ + + + + + + continue Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    continue statement

    +
    +

    Syntax
    +ContinueStatement :
    +   continue

    +
    +

    The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head.

    +

    If used within nested loops the continue statement is associated with the innermost enclosing loop.

    +

    An example of a continue statement used within a while loop.

    +
    contract Foo {
    +
    +    pub fn bar() -> u256 {
    +        let mut sum: u256 = 0
    +        while sum < 10 {
    +            sum += 1
    +
    +            if some_skip_condition() {
    +                continue
    +            }
    +        }
    +
    +        return sum
    +    }
    +
    +    fn some_skip_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    +

    An example of a continue statement used within a for loop.

    +
    contract Foo {
    +
    +    pub fn bar(values: Array<u256, 10>) -> u256 {
    +        let mut sum: u256 = 0
    +        for i in values {
    +            sum = sum + i
    +
    +            if some_skip_condition() {
    +                continue
    +            }
    +        }
    +        return sum
    +    }
    +
    +    fn some_skip_condition() -> bool {
    +        // some complex logic
    +        return true
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/for.html b/docs/spec/statements/for.html new file mode 100644 index 0000000000..a94a16ae8c --- /dev/null +++ b/docs/spec/statements/for.html @@ -0,0 +1,249 @@ + + + + + + for Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    for statement

    +
    +

    Syntax
    +ForStatement :
    +   for IDENTIFIER in Expression {
    +   (Statement | Expression)+
    +   }

    +
    +

    A for statement is a syntactic construct for looping over elements provided by an array type.

    +

    An example of a for loop over the contents of an array:

    +

    Example:

    +
    contract Foo {
    +
    +    pub fn bar(values: Array<u256, 10>) -> u256 {
    +        let mut sum: u256 = 0
    +        for i in values {
    +            sum = sum + i
    +        }
    +        return sum
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/if.html b/docs/spec/statements/if.html new file mode 100644 index 0000000000..295b3ad31a --- /dev/null +++ b/docs/spec/statements/if.html @@ -0,0 +1,250 @@ + + + + + + if Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    if statement

    +
    +

    Syntax
    +IfStatement :
    +   if Expression{ +   (Statement | Expression)+
    +   }
    +   (else {
    +   (Statement | Expression)+
    +   })?

    +
    +

    Example:

    +
    contract Foo {
    +    pub fn bar(val: u256) -> u256 {
    +        if val > 5 {
    +            return 1
    +        } else {
    +            return 2
    +        }
    +    }
    +}
    +
    +

    The if statement is used for conditional execution.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/index.html b/docs/spec/statements/index.html new file mode 100644 index 0000000000..05037b6a02 --- /dev/null +++ b/docs/spec/statements/index.html @@ -0,0 +1,244 @@ + + + + + + Statements - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/let.html b/docs/spec/statements/let.html new file mode 100644 index 0000000000..db5104fc03 --- /dev/null +++ b/docs/spec/statements/let.html @@ -0,0 +1,252 @@ + + + + + + let Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    let statement

    +
    +

    Syntax
    +LetStatement :
    +   let IDENTIFIER | TupleTarget : Type = Expression

    +

    TupleTarget :
    +   ( TupleTargetItem (, TupleTargetItem) + )

    +

    TupleTargetItem :
    +   IDENTIFIER | TupleTarget

    +
    +

    A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope.

    +
    +

    Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue.

    +
    +

    Example:

    +
    contract Foo {
    +
    +  pub fn bar() {
    +    let val1: u256 = 1
    +    let (val2):(u256) = (1,)
    +    let (val3, val4):(u256, bool) = (1, false)
    +    let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4))
    +  }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/match.html b/docs/spec/statements/match.html new file mode 100644 index 0000000000..b7a6d4e8b1 --- /dev/null +++ b/docs/spec/statements/match.html @@ -0,0 +1,277 @@ + + + + + + match Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    match statement

    +
    +

    Syntax
    +MatchStatement :
    +   match Expression {
    +      ( Pattern => { Statement* } )+
    +   }

    +

    Pattern :
    +   PatternElem ( | PatternElem )*

    +

    PatternElem :
    +   IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path |
    +   Path( TuplePatterns? ) |( TuplePatterns? ) |
    +   Path{ StructPatterns? }

    +

    TuplePatterns :
    +   Pattern ( , Pattern )*

    +

    StructPatterns :
    +   Field ( , Field)*(, ..)?

    +

    Field :
    +   IDENTIFIER : Pattern

    +
    +

    A match statements compares expression with patterns, then executes body of the matched arm.

    +

    Example:

    +
    enum MyEnum {
    +    Unit
    +    Tuple(u32, u256, bool)
    +}
    +
    +contract Foo {
    +    pub fn bar(self) -> u256 {
    +        let val: MyEnum = MyEnum::Tuple(1, 10, false)
    +        return self.eval(val)
    +    }
    +    
    +    fn eval(self, val: MyEnum) -> u256 {
    +        match val {
    +            MyEnum::Unit => {
    +                return 0
    +            }
    +            
    +            MyEnum::Tuple(.., false) => {
    +                return 1
    +            }
    +            
    +            MyEnum::Tuple(a, b, true) => {
    +                return u256(a) + b
    +            }
    +        }
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/pragma.html b/docs/spec/statements/pragma.html new file mode 100644 index 0000000000..c551033be6 --- /dev/null +++ b/docs/spec/statements/pragma.html @@ -0,0 +1,240 @@ + + + + + + pragma Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    pragma statement

    +
    +

    Syntax
    +PragmaStatement :
    +   pragma VersionRequirement

    +

    VersionRequirement :Following the semver implementation by cargo

    +
    +

    The pragma statement is denoted with the keyword pragma. Evaluating a pragma +statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement.

    +

    An example of a pragma statement:

    +
    pragma ^0.1.0
    +
    +

    The version requirement syntax is identical to the one that is used by cargo (more info).

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/return.html b/docs/spec/statements/return.html new file mode 100644 index 0000000000..08346d3d5c --- /dev/null +++ b/docs/spec/statements/return.html @@ -0,0 +1,262 @@ + + + + + + return Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    return statement

    +
    +

    Syntax
    +ReturnStatement :
    +   return Expression?

    +
    +

    The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly.

    +

    An example of a return statement without explicit use of an expression:

    +
    contract Foo {
    +    fn transfer(self, to: address, value: u256) {
    +        if not self.in_whitelist(to) {
    +            return
    +        }
    +    }
    +
    +    fn in_whitelist(self, to: address) -> bool {
    +        // revert used as placeholder for actual logic
    +        revert
    +    }
    +}
    +
    +

    The above can also be written in a slightly more verbose form:

    +
    contract Foo {
    +    fn transfer(self, to: address, value: u256) -> () {
    +        if not self.in_whitelist(to) {
    +            return ()
    +        }
    +    }
    +
    +    fn in_whitelist(self, to: address) -> bool {
    +        // revert used as placeholder for actual logic
    +        revert
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/revert.html b/docs/spec/statements/revert.html new file mode 100644 index 0000000000..347cb1bdbb --- /dev/null +++ b/docs/spec/statements/revert.html @@ -0,0 +1,267 @@ + + + + + + revert Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    revert statement

    +
    +

    Syntax
    +RevertStatement :
    +   revert Expression?

    +
    +

    The revert statement is denoted with the keyword revert. Evaluating a revert +statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838.

    +

    An example of a revert statement without revert data:

    +
    contract Foo {
    +    fn transfer(self, to: address, value: u256) {
    +        if not self.in_whitelist(addr: to) {
    +            revert
    +        }
    +        // more logic here
    +    }
    +
    +    fn in_whitelist(self, addr: address) -> bool {
    +        return false
    +    }
    +}
    +
    +

    An example of a revert statement with revert data:

    +
    struct ApplicationError {
    +    pub code: u8
    +}
    +
    +contract Foo {
    +    pub fn transfer(self, to: address, value: u256) {
    +        if not self.in_whitelist(addr: to) {
    +            revert ApplicationError(code: 5)
    +        }
    +        // more logic here
    +    }
    +
    +    fn in_whitelist(self, addr: address) -> bool {
    +        return false
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/statements/while.html b/docs/spec/statements/while.html new file mode 100644 index 0000000000..ea163cc1a7 --- /dev/null +++ b/docs/spec/statements/while.html @@ -0,0 +1,248 @@ + + + + + + while Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    while statement

    +
    +

    Syntax
    +WhileStatement :
    +   while Expression {
    +   (Statement | Expression)+
    +   }

    +
    +

    A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes.

    +

    Example:

    +
    contract Foo {
    +
    +    pub fn bar() -> u256 {
    +        let mut sum: u256 = 0
    +        while sum < 10 {
    +            sum += 1
    +        }
    +        return sum
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/index.html b/docs/spec/type_system/index.html new file mode 100644 index 0000000000..f39f5cd22d --- /dev/null +++ b/docs/spec/type_system/index.html @@ -0,0 +1,228 @@ + + + + + + Type System - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Type System

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/address.html b/docs/spec/type_system/types/address.html new file mode 100644 index 0000000000..cf273691b0 --- /dev/null +++ b/docs/spec/type_system/types/address.html @@ -0,0 +1,240 @@ + + + + + + Address Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Address Type

    +

    The address type represents a 20 byte Ethereum address.

    +

    Example:

    +
    contract Example {
    +  // An address in storage
    +  someone: address
    +
    +  fn do_something() {
    +    // A plain address (not part of a tuple, struct etc) remains on the stack
    +    let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f
    +  }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/array.html b/docs/spec/type_system/types/array.html new file mode 100644 index 0000000000..af17d89f1b --- /dev/null +++ b/docs/spec/type_system/types/array.html @@ -0,0 +1,249 @@ + + + + + + Array Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Array types

    +
    +

    Syntax
    +ArrayType :
    +   Array<Type, INTEGER_LITERAL>

    +
    +

    An array is a fixed-size sequence of N elements of type T. The array type +is written as Array<T, N>. The size is an integer literal.

    +

    Arrays are either stored in storage or memory but are never stored directly on the stack.

    +

    Examples:

    +
    contract Foo {
    +  // An array in storage
    +  bar: Array<u8, 10>
    +
    +  fn do_something() {
    +    // An array in memory
    +    let values: Array<u256, 3> = [10, 100, 100]
    +  }
    +}
    +
    +

    All elements of arrays are always initialized, and access to an array is +always bounds-checked in safe methods and operators.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/boolean.html b/docs/spec/type_system/types/boolean.html new file mode 100644 index 0000000000..0548687561 --- /dev/null +++ b/docs/spec/type_system/types/boolean.html @@ -0,0 +1,232 @@ + + + + + + Boolean Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Boolean type

    +

    The bool type is a data type which can be either true or false.

    +

    Example:

    +
    let x: bool = true
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/contract.html b/docs/spec/type_system/types/contract.html new file mode 100644 index 0000000000..62498c33e6 --- /dev/null +++ b/docs/spec/type_system/types/contract.html @@ -0,0 +1,248 @@ + + + + + + Contract Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Contract types

    +

    An contract type is the type denoted by the name of an contract item.

    +

    A value of a given contract type carries the contract's public interface as +attribute functions. A new contract value can be created by either casting +an address to a contract type or by creating a new contract using the type +attribute functions create or create2.

    +

    Example:

    +
    contract Foo {
    +    pub fn get_my_num() -> u256 {
    +        return 42
    +    }
    +}
    +
    +contract FooFactory {
    +    pub fn create2_foo(mut ctx: Context) -> address {
    +        // `0` is the value being sent and `52` is the address salt
    +        let foo: Foo = Foo.create2(ctx, 0, 52)
    +        return address(foo)
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/enum.html b/docs/spec/type_system/types/enum.html new file mode 100644 index 0000000000..379dc9500e --- /dev/null +++ b/docs/spec/type_system/types/enum.html @@ -0,0 +1,229 @@ + + + + + + Enum Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Enum types

    +

    An enum type is the type denoted by the name of an enum item.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/function.html b/docs/spec/type_system/types/function.html new file mode 100644 index 0000000000..533d245ead --- /dev/null +++ b/docs/spec/type_system/types/function.html @@ -0,0 +1,229 @@ + + + + + + Function Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Function Types

    +

    TBW

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/index.html b/docs/spec/type_system/types/index.html new file mode 100644 index 0000000000..08697ae64d --- /dev/null +++ b/docs/spec/type_system/types/index.html @@ -0,0 +1,269 @@ + + + + + + Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Types

    +

    Every variable, item, and value in a Fe program has a type. The _ of a +value defines the interpretation of the memory holding it and the operations +that may be performed on the value.

    +

    Built-in types are tightly integrated into the language, in nontrivial ways +that are not possible to emulate in user-defined types. User-defined types have +limited capabilities.

    +

    The list of types is:

    + + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/map.html b/docs/spec/type_system/types/map.html new file mode 100644 index 0000000000..8143902354 --- /dev/null +++ b/docs/spec/type_system/types/map.html @@ -0,0 +1,259 @@ + + + + + + Map Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Map type

    +

    The type Map<K, V> is used to associate key values with data.

    +

    The following types can be used as key:

    + +

    The values can be of any type including other maps, structs, tuples or arrays.

    +

    Example:

    +
    contract Foo {
    +    bar: Map<address, Map<address, u256>>
    +    baz: Map<address, Map<u256, bool>>
    +
    +    pub fn read_bar(self, a: address, b: address) -> u256 {
    +        return self.bar[a][b]
    +    }
    +
    +    pub fn write_bar(mut self, a: address, b: address, value: u256) {
    +        self.bar[a][b] = value
    +    }
    +
    +    pub fn read_baz(self, a: address, b: u256) -> bool {
    +        return self.baz[a][b]
    +    }
    +
    +    pub fn write_baz(mut self, a: address, b: u256, value: bool) {
    +        self.baz[a][b] = value
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/numeric.html b/docs/spec/type_system/types/numeric.html new file mode 100644 index 0000000000..5bd13c3fd9 --- /dev/null +++ b/docs/spec/type_system/types/numeric.html @@ -0,0 +1,247 @@ + + + + + + Numeric Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Numeric types

    +

    The unsigned integer types consist of:

    +
    + + + + + + +
    TypeMinimumMaximum
    u8028-1
    u160216-1
    u320232-1
    u640264-1
    u12802128-1
    u25602256-1
    +
    +

    The signed two's complement integer types consist of:

    +
    + + + + + + +
    TypeMinimumMaximum
    i8-(27)27-1
    i16-(215)215-1
    i32-(231)231-1
    i64-(263)263-1
    i128-(2127)2127-1
    i256-(2255)2255-1
    +
    +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/string.html b/docs/spec/type_system/types/string.html new file mode 100644 index 0000000000..bff78b40e9 --- /dev/null +++ b/docs/spec/type_system/types/string.html @@ -0,0 +1,240 @@ + + + + + + String Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    String Type

    +

    A value of type String<N> represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8.

    +

    The String<N> type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters.

    +

    Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as "fox" but it can not hold a full sentence such as "The brown fox jumps over the white fence".

    +

    Example:

    +
    contract Foo {
    +
    +  fn bar() {
    +    let single_byte_string: String<1> = "a"
    +    let longer_string: String<100> = "foo"
    +  }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/struct.html b/docs/spec/type_system/types/struct.html new file mode 100644 index 0000000000..dc7d4f7057 --- /dev/null +++ b/docs/spec/type_system/types/struct.html @@ -0,0 +1,254 @@ + + + + + + Struct Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Struct types

    +

    A struct type is the type denoted by the name of an struct item. +A struct type is a heterogeneous product of other types, called the +fields of the type.

    +

    New instances of a struct can be constructed with a struct expression.

    +

    Struct types are either stored in storage or memory but are never stored directly on the stack.

    +

    Examples:

    +
    struct Rectangle {
    +  pub width: u256
    +  pub length: u256
    +}
    +
    +contract Example {
    +  // A Rectangle in storage
    +  area: Rectangle
    +
    +  fn do_something() {
    +    let length: u256 = 20
    +    // A rectangle in memory
    +    let square: Rectangle = Rectangle(width: 10, length)
    +  }
    +}
    +
    +

    All fields of struct types are always initialized.

    +

    The data layout of a struct is not part of its external API and may be changed in any release.

    +

    The fields of a struct may be qualified by visibility modifiers, to allow +access to data in a struct outside a module.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/tuple.html b/docs/spec/type_system/types/tuple.html new file mode 100644 index 0000000000..03cd84c3ca --- /dev/null +++ b/docs/spec/type_system/types/tuple.html @@ -0,0 +1,260 @@ + + + + + + Tuple Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Tuple Types

    +
    +

    Syntax
    +TupleType :
    +      ( )
    +   | ( ( Type , )+ Type? )

    +
    +

    Tuple types are a family of structural types1 for heterogeneous lists of other types.

    +

    The syntax for a tuple type is a parenthesized, comma-separated list of types.

    +

    A tuple type has a number of fields equal to the length of the list of types. +This number of fields determines the arity of the tuple. +A tuple with n fields is called an n-ary tuple. +For example, a tuple with 2 fields is a 2-ary tuple.

    +

    Fields of tuples are named using increasing numeric names matching their position in the list of types. +The first field is item0. +The second field is item1. +And so on. +The type of each field is the type of the same position in the tuple's list of types.

    +

    For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type. +Its one value is also called unit or the unit value.

    +

    Some examples of tuple types:

    +
      +
    • () (also known as the unit or zero-sized type)
    • +
    • (u8, u8)
    • +
    • (bool, i32)
    • +
    • (i32, bool) (different type from the previous example)
    • +
    +

    Values of this type are constructed using a tuple expression. +Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. +Tuple fields can be accessed via an attribute expression.

    +
    1 +

    Structural types are always equivalent if their internal types are equivalent.

    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/spec/type_system/types/unit.html b/docs/spec/type_system/types/unit.html new file mode 100644 index 0000000000..6d444532a1 --- /dev/null +++ b/docs/spec/type_system/types/unit.html @@ -0,0 +1,229 @@ + + + + + + Unit Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Unit type

    +

    TBW

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/std/index.html b/docs/std/index.html new file mode 100644 index 0000000000..5c1f6ae685 --- /dev/null +++ b/docs/std/index.html @@ -0,0 +1,232 @@ + + + + + + Standard Library - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Fe Standard Library

    +

    The standard library includes commonly used algorithms and data structures that come bundled as part of the language.

    + + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/std/precompiles.html b/docs/std/precompiles.html new file mode 100644 index 0000000000..66b949a50a --- /dev/null +++ b/docs/std/precompiles.html @@ -0,0 +1,465 @@ + + + + + + Precompiles - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Precompiles

    +

    Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork.

    +

    The nine precompiles available in the Fe standard library are:

    + +

    These precompiles are imported as follows:

    +
    use std::precompiles
    +
    +

    ec_recover

    +

    ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.

    +

    Parameters

    +
      +
    • hash: the hash of the signed message, u256
    • +
    • v: the recovery identifier, a number in the range 27-30, u256
    • +
    • r: elliptic curve parameter, u256
    • +
    • s: elliptic curve parameter, u256
    • +
    +

    Returns

    +

    ec_recover returns an address.

    +

    Function signature

    +
    pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address
    +
    +

    Example

    +
    let result: address = precompiles::ec_recover(
    +    hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
    +    v: 28,
    +    r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
    +    s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
    +)
    +
    +

    SHA2_256

    +

    SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.

    +

    Parameters

    +
      +
    • buf: a sequence of bytes to hash, MemoryBuffer
    • +
    +

    Returns

    +

    SHA2_256 returns a hash as a u256

    +

    Function signature

    +
    pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256
    +
    +

    Example

    +
    let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
    +let result: u256 = precompiles::sha2_256(buf)
    +
    +

    ripemd_160

    +

    ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.

    +

    Parameters

    +
      +
    • input_buf: a sequence of bytes to hash, MemoryBuffer
    • +
    +

    Returns

    +

    ripemd_160 returns a hash as a u256

    +

    Function signature

    +
    pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256
    +
    +
    +

    Example

    +
    let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
    +let result: u256 = precompiles::ripemd_160(buf)
    +
    +

    identity

    +

    identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.

    +

    Parameters

    +
      +
    • input_buf: a sequence of bytes to hash, MemoryBuffer
    • +
    +

    Returns

    +

    identity returns a sequence of bytes, MemoryBuffer

    +

    Function signature

    +
    pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer
    +
    +
    +

    Example

    +
    let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)
    +let mut result: MemoryBufferReader = precompiles::identity(buf).reader()
    +
    +

    mod_exp

    +

    mod_exp is a modular exponentiation function required for elliptic curve operations.

    +

    Parameters

    +
      +
    • b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer
    • +
    • e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer
    • +
    • m: MemoryBuffer: the modulus, MemoryBuffer
    • +
    • b_size: u256: the length of b in bytes, u256
    • +
    • e_size: u256: the length of e in bytes, u256
    • +
    • m_size: u256: then length of m in bytes, u256
    • +
    +

    Returns

    +

    mod_exp returns a sequence of bytes, MemoryBuffer

    +

    Function signature

    +
    pub fn mod_exp(
    +    b_size: u256,
    +    e_size: u256,
    +    m_size: u256,
    +    b: MemoryBuffer,
    +    e: MemoryBuffer,
    +    m: MemoryBuffer,
    +) -> MemoryBuffer
    +
    +
    +

    Example

    +
    let mut result: MemoryBufferReader = precompiles::mod_exp(
    +    b_size: 1,
    +    e_size: 1,
    +    m_size: 1,
    +    b: MemoryBuffer::from_u8(value: 8),
    +    e: MemoryBuffer::from_u8(value: 9),
    +    m: MemoryBuffer::from_u8(value: 10),
    +).reader()
    +
    +

    ec_add

    +

    ec_add does point addition on elliptic curves.

    +

    Parameters

    +
      +
    • x1: x-coordinate 1, u256
    • +
    • y1: y coordinate 1, u256
    • +
    • x2: x coordinate 2, u256
    • +
    • y2: y coordinate 2, u256
    • +
    +

    Function signature

    +
    pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)
    +
    +

    Returns

    +

    ec_add returns a tuple of u256, (u256, u256).

    +

    Example

    +
    let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)
    +
    +

    ec_mul

    +

    ec_mul is for multiplying elliptic curve points.

    +

    Parameters

    +
      +
    • x: x-coordinate, u256
    • +
    • y: y coordinate, u256
    • +
    • s: multiplier, u256
    • +
    +

    Function signature

    +
    pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)
    +
    +

    Returns

    +

    ec_mul returns a tuple of u256, (u256, u256).

    +

    Example

    +
    let (x, y): (u256, u256) = precompiles::ec_mul(
    +    x: 1,
    +    y: 2,
    +    s: 2
    +)
    +
    +

    ec_pairing

    +

    ec_pairing does elliptic curve pairing - a form of encrypted multiplication.

    +

    Parameters

    +
      +
    • input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer
    • +
    +

    Returns

    +

    ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).

    +

    Example

    +
        let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384)
    +    let mut writer: MemoryBufferWriter = buf.writer()
    +
    +    writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da)
    +    writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6)
    +    writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc)
    +    writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9)
    +    writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90)
    +    writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e)
    +    writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001)
    +    writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45)
    +    writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4)
    +    writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7)
    +    writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2)
    +    writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc)
    +
    +    assert precompiles::ec_pairing(buf)
    +}
    +
    +

    blake_2f

    +

    blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.

    +

    Parameters

    +
      +
    • h: the state vector, Array<u64, 8>
    • +
    • m: message block vector, Array<u64, 16>
    • +
    • t: offset counter, Array<u64, 2>
    • +
    • f: bool
    • +
    • rounds: number of rounds of mixing, u32
    • +
    +

    Returns

    +

    blake_2f returns a modified state vector, Array<u64, 8>

    +

    Function signature

    +
    pub fn blake_2f(rounds: u32, h: Array<u64, 8>, m: Array<u64, 16>, t: Array<u64, 2>, f: bool) ->  Array<u64, 8>
    +
    +

    Example

    +
    let result: Array<u64, 8> = precompiles::blake_2f(
    +    rounds: 12,
    +    h: [
    +        0x48c9bdf267e6096a,
    +        0x3ba7ca8485ae67bb,
    +        0x2bf894fe72f36e3c,
    +        0xf1361d5f3af54fa5,
    +        0xd182e6ad7f520e51,
    +        0x1f6c3e2b8c68059b,
    +        0x6bbd41fbabd9831f,
    +        0x79217e1319cde05b,
    +    ],
    +    m: [
    +        0x6162630000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +        0x0000000000000000,
    +    ],
    +    t: [
    +        0x0300000000000000,
    +        0x0000000000000000,
    +    ],
    +    f: true
    +)
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/theme/custom-highlight.js b/docs/theme/custom-highlight.js new file mode 100644 index 0000000000..034e475b8e --- /dev/null +++ b/docs/theme/custom-highlight.js @@ -0,0 +1,87 @@ +function highlight_fe(hljs) { + const KEYWORDS = [ + "and", + "break", + "const", + "continue", + "contract", + "ingot", + "else", + "emit", + "enum", + "event", + "false", + "fn", + "for", + "idx", + "if", + "impl", + "in", + "let", + "loop", + "match", + "mut", + "or", + "not", + "pragma", + "pub", + "return", + "revert", + "self", + "Self", + "struct", + "trait", + "true", + "type", + "unsafe", + "use", + "where", + "while" + ]; + + const TYPES = [ + "address", + "i8", + "i16", + "i32", + "i64", + "i128", + "i256", + "u8", + "u16", + "u32", + "u64", + "u128", + "u256", + "bool", + "Context", + "Option", + "Result", + "String", + "Array", + "Map" + ]; + + return { + name: "Fe", + keywords: { + keyword: KEYWORDS.join(' '), + built_in: TYPES.join(' '), + literal: "false true", + }, + contains: [ + hljs.QUOTE_STRING_MODE, + hljs.C_NUMBER_MODE, + { + scope: "string", + begin: '"', + end: '"', + contains: [{ begin: "\\\\." }], + }, + hljs.COMMENT("//", "\n"), + ], + } +} + +hljs.registerLanguage("fe", highlight_fe); +hljs.initHighlightingOnLoad(); diff --git a/docs/theme/reference.css b/docs/theme/reference.css new file mode 100644 index 0000000000..ba64b1431c --- /dev/null +++ b/docs/theme/reference.css @@ -0,0 +1,64 @@ +/* +.parenthetical class used to keep e.g. "less-than symbol (<)" from wrapping +the end parenthesis onto its own line. Use in a span between the last word and +the parenthetical. So for this example, you'd use +```less-than symbol (`<`)``` +*/ +.parenthetical { + white-space: nowrap; +} + +/* +Warnings and notes: + +Write the
    s on their own line. E.g. + +
    + +Warning: This is bad! + +
    +*/ +main .warning p { + padding: 10px 20px; + margin: 20px 0; +} + +main .warning p::before { + content: "⚠️ "; +} + +.light main .warning p, +.rust main .warning p { + border: 2px solid red; + background: #ffcece; +} + +.rust main .warning p { + /* overrides previous declaration */ + border-color: #961717; +} + +.coal main .warning p, +.navy main .warning p, +.ayu main .warning p { + background: #542626 +} + +/* Make the links higher contrast on dark themes */ +.coal main .warning p a, +.navy main .warning p a, +.ayu main .warning p a { + color: #80d0d0 +} + +/* add consistent whitespace around code blocks*/ +.pre code { + white-space: pre; +} + +pre { + display: block; + margin-top: 4rem; + margin-bottom: 4rem; +} \ No newline at end of file diff --git a/docs/tomorrow-night.css b/docs/tomorrow-night.css new file mode 100644 index 0000000000..81fe276e7f --- /dev/null +++ b/docs/tomorrow-night.css @@ -0,0 +1,102 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/docs/user-guide/example_contracts/auction_contract.html b/docs/user-guide/example_contracts/auction_contract.html new file mode 100644 index 0000000000..44b62982ea --- /dev/null +++ b/docs/user-guide/example_contracts/auction_contract.html @@ -0,0 +1,324 @@ + + + + + + Open auction - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +
    // errors
    +struct AuctionAlreadyEnded {
    +}
    +
    +struct AuctionNotYetEnded {
    +}
    +
    +struct AuctionEndAlreadyCalled {}
    +
    +struct BidNotHighEnough {
    +    pub highest_bid: u256
    +}
    +
    +// events
    +struct HighestBidIncreased {
    +    #indexed
    +    pub bidder: address
    +    pub amount: u256
    +}
    +
    +struct AuctionEnded {
    +    #indexed
    +    pub winner: address
    +    pub amount: u256
    +}
    +
    +contract Auction {
    +    // states
    +    auction_end_time: u256
    +    beneficiary: address
    +
    +    highest_bidder: address
    +    highest_bid: u256
    +
    +    pending_returns: Map<address, u256>
    +
    +    ended: bool
    +
    +    // constructor
    +    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
    +        self.beneficiary = beneficiary_addr
    +        self.auction_end_time = ctx.block_timestamp() + bidding_time
    +    }
    +
    +    //method
    +    pub fn bid(mut self, mut ctx: Context) {
    +        if ctx.block_timestamp() > self.auction_end_time {
    +            revert AuctionAlreadyEnded()
    +        }
    +        if ctx.msg_value() <= self.highest_bid {
    +            revert BidNotHighEnough(highest_bid: self.highest_bid)
    +        }
    +        if self.highest_bid != 0 {
    +            self.pending_returns[self.highest_bidder] += self.highest_bid
    +        }
    +        self.highest_bidder = ctx.msg_sender()
    +        self.highest_bid = ctx.msg_value()
    +
    +        ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
    +    }
    +
    +    pub fn withdraw(mut self, mut ctx: Context) -> bool {
    +        let amount: u256 = self.pending_returns[ctx.msg_sender()]
    +
    +        if amount > 0 {
    +            self.pending_returns[ctx.msg_sender()] = 0
    +            ctx.send_value(to: ctx.msg_sender(), wei: amount)
    +        }
    +        return true
    +    }
    +
    +    pub fn auction_end(mut self, mut ctx: Context) {
    +        if ctx.block_timestamp() <= self.auction_end_time {
    +            revert AuctionNotYetEnded()
    +        }
    +        if self.ended {
    +            revert AuctionEndAlreadyCalled()
    +        }
    +        self.ended = true
    +        ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
    +
    +        ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
    +    }
    +
    +    pub fn check_highest_bidder(self) -> address {
    +        return self.highest_bidder;
    +    }
    +
    +    pub fn check_highest_bid(self) -> u256 {
    +        return self.highest_bid;
    +    }
    +
    +    pub fn check_ended(self) -> bool {
    +        return self.ended;
    +    }
    +}
    +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/example_contracts/index.html b/docs/user-guide/example_contracts/index.html new file mode 100644 index 0000000000..31b7ad9d32 --- /dev/null +++ b/docs/user-guide/example_contracts/index.html @@ -0,0 +1,231 @@ + + + + + + Example Contracts - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Example Contracts

    + + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/external_links.html b/docs/user-guide/external_links.html new file mode 100644 index 0000000000..c3643c37a4 --- /dev/null +++ b/docs/user-guide/external_links.html @@ -0,0 +1,289 @@ + + + + + + Useful external links - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Useful external links

    +

    There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.

    +

    Tools

    + +

    Projects

    +
      +
    • Bountiful - Bug bounty platform written in Fe, live on Mainnet
    • +
    • Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism
    • +
    +

    Hackathon projects

    +

    These are community projects written in Fe at various hackathons.

    +
      +
    • +

      Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis.

      +
    • +
    • +

      p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe.

      +
    • +
    • +

      Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses.

      +
    • +
    • +

      Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend.

      +
    • +
    • +

      Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a "chain": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift!

      +
    • +
    • +

      Go do it - A commitment device to help you achieve your goals.

      +
    • +
    • +

      Powerbald - On chain lottery written in Fe

      +
    • +
    • +

      sspc-flutter-fe - Stupid Simple Payment Channel written in Fe

      +
    • +
    +

    Others

    + +

    Blog posts

    + +

    Videos

    + + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/index.html b/docs/user-guide/index.html new file mode 100644 index 0000000000..7fc98a6870 --- /dev/null +++ b/docs/user-guide/index.html @@ -0,0 +1,236 @@ + + + + + + Using Fe - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    User guide

    +

    Welcome to the Fe user guide!

    +

    Here you can find information about how to use Fe to develop smart contracts.

    +

    Read more about:

    + +

    We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/installation.html b/docs/user-guide/installation.html new file mode 100644 index 0000000000..5fb65478ea --- /dev/null +++ b/docs/user-guide/installation.html @@ -0,0 +1,295 @@ + + + + + + Installation - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Installation

    +

    At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL.

    +
    +

    Note: If you happen to be a Windows developer, consider getting involved +and help us to support the Windows platform natively. Here would be a good place to start.

    +
    +

    On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable.

    +
    /usr/sbin/softwareupdate --install-rosetta --agree-to-license
    +
    +

    Package managers

    +

    Fe can be installed from Homebrew. Homebrew is available for Mac, Linux and Windows (via WSL). The following command installs Fe and exposes it as fe without any further configuration necessary:

    +
    brew install fe-lang/tap/fe
    +
    +

    Download the compiler

    +

    Fe is distributed via a single executable file linked from the home page. In the future we will make sure it can be installed through a variety of popular package managers such as apt.

    +

    Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac.

    +
    +

    Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.

    +
    +

    Add permission to execute

    +

    In order to be able to execute the Fe compiler we will have to make the file executable. This can be done by navigating to the directory where the file is located and executing chmod + x <filename> (e.g. chmod +x fe).

    +

    After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to:

    +
    fe 0.21.0-alpha
    +The Fe Developers <snakecharmers@ethereum.org>
    +An implementation of the Fe smart contract language
    +
    +USAGE:
    +    fe_amd64_latest <SUBCOMMAND>
    +
    +OPTIONS:
    +    -h, --help       Print help information
    +    -V, --version    Print version information
    +
    +SUBCOMMANDS:
    +    build    Build the current project
    +    check    Analyze the current project and report errors, but don't build artifacts
    +    help     Print this message or the help of the given subcommand(s)
    +    new      Create new fe project
    +
    +

    Building from source

    +

    You can also build Fe from the source code provided in our Github repository. To do this you will need to have Rust installed. Then, clone the github repository using:

    +
    git clone https://github.com/ethereum/fe.git
    +
    +

    Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system:

    +
    sudo apt-get update &&\
    + apt-get install libboost-all-dev &&\
    + apt-get install libclang-dev &&\
    + apt-get install cmake
    +
    +

    Navigate to the folder containing the Fe source code.

    +
    cd fe
    +
    +

    Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend.

    +
    cargo build -r --feature solc-backend
    +
    +

    You will now find your Fe binary in /target/release. Check the build with:

    +
    ./target/release/fe --version
    +
    +

    If everything worked, you should see the Fe version printed to the terminal:

    +
    fe 0.24.0
    +
    +

    You can run the built-in tests using:

    +
    cargo test --workspace --features solc-backend
    +
    +

    Editor support & Syntax highlighting

    +

    Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension.

    +

    In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then "Install Extension") and search for fe-lang.code-ve. Click on the extension and then click on the Install button.

    +

    We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/projects.html b/docs/user-guide/projects.html new file mode 100644 index 0000000000..8f7d720482 --- /dev/null +++ b/docs/user-guide/projects.html @@ -0,0 +1,287 @@ + + + + + + Using projects - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Fe projects

    +

    A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.

    +

    Creating a project

    +

    You can start a project using the new subcommand:

    +

    $ fe new <my_project>

    +

    This will generate a template project containing the following:

    +
      +
    • A src directory containing two .fe files.
    • +
    • A fe.toml manifest with basic project info and some local project imports.
    • +
    +

    Manifest

    +

    The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run.

    +

    For example:

    +
    name="my-project"
    +version = "1.0"
    +
    +[dependencies]
    +dependency_1 = "../lib"
    +
    +

    You can also specify which version of a particular dependency you want to use, using curly braces:

    +
    name="my-project"
    +version = "1.0"
    +
    +[dependencies]
    +dependency_1 = {path = "../lib", version = "1.0"}
    +
    +

    Project modes

    +

    There are two project modes: main and lib.

    +

    Main projects can import libraries and have code output.

    +

    Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects.

    +

    The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.

    +

    Importing

    +

    You can import code from external files with the following syntax:

    +
    #![allow(unused)]
    +fn main() {
    +use utils::get_42
    +}
    +

    This will import the get_42 function from the file utils.fe.

    +

    You can also import using a custom name/alias:

    +
    #![allow(unused)]
    +fn main() {
    +use utils::get_42 as get_42
    +}
    +

    Tests

    +

    The templates created using fe new include a simple test demonstrating the test syntax.

    +

    To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value.

    +

    For example, to test the say_hello function on Contract which is expected to return the string "hello":

    +
    #![allow(unused)]
    +fn main() {
    +fn test_contract(mut ctx: Context) {
    +    let contract: Contract = Contract.create(ctx, 0)
    +    assert main.say_hello() == "hello"
    +}
    +}
    +

    You can run all the tests in a project by running the following command:

    +
    fe test <project-root>
    +
    +

    You will receive test results directly to the console.

    +

    Running your project

    +

    Once you have created a project, you can run the usual Fe CLI subcommands against the project path.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/tutorials/auction.html b/docs/user-guide/tutorials/auction.html new file mode 100644 index 0000000000..ca7a85a28c --- /dev/null +++ b/docs/user-guide/tutorials/auction.html @@ -0,0 +1,454 @@ + + + + + + Open auction - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Auction contract

    +

    This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts.

    +

    An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.

    +

    The auction rules

    +

    To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.

    +

    Get Started

    +

    To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page.

    +

    With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe.

    +

    Now you are ready to start coding in Fe!

    +

    You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.

    +

    Writing the Contract

    +

    You can see the entire contract here. You can refer back to this at any time to check implementation details.

    +

    Defining the Contract and initializing variables

    +

    A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows:

    +
    #![allow(unused)]
    +fn main() {
    +contract Auction {
    +    pub fn __init__() {}
    +}
    +}
    +

    To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. +You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice:

    +
    auction_end_time: u256
    +beneficiary: address
    +highest_bidder: address
    +highest_bid: u256
    +pending_returns: Map<address, u256>
    +ended: bool
    +
    +

    Notice that variables are named using snake case (lower case, underscore separated, like_this). +Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification.

    +

    The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length.

    +

    The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false.

    +

    The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map<address, u256>. Keys can be any numeric type, address, boolean or unit.

    +

    Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments.

    +

    The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256.

    +

    When you have implemented all this, your contract should look like this:

    +
    contract Auction {
    +    // states
    +    auction_end_time: u256
    +    beneficiary: address
    +    highest_bidder: address
    +    highest_bid: u256
    +    pending_returns: Map<address, u256>
    +    ended: bool
    +
    +    // constructor
    +    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
    +        self.beneficiary = beneficiary_addr
    +        self.auction_end_time = ctx.block_timestamp() + bidding_time
    +    }
    +}
    +
    +

    Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables.

    +

    The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context.

    +

    self

    +

    self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript.

    +

    Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is "mutable". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains.

    +

    Context

    +

    Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed.

    +

    Read more on Context in Fe

    +

    In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.

    +

    Bidding

    +

    Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable.

    +

    This logic can be implemented as follows:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn bid(mut self, mut ctx: Context) {
    +    if ctx.block_timestamp() > self.auction_end_time {
    +        revert AuctionAlreadyEnded()
    +    }
    +    if ctx.msg_value() <= self.highest_bid {
    +        revert BidNotHighEnough(highest_bid: self.highest_bid)
    +    }
    +    if self.highest_bid != 0 {
    +        self.pending_returns[self.highest_bidder] += self.highest_bid
    +    }
    +    self.highest_bidder = ctx.msg_sender()
    +    self.highest_bid = ctx.msg_value()
    +
    +    ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
    +}
    +}
    +

    The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data. Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition:

    +
    struct AuctionAlreadyEnded {
    +}
    +
    +

    The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe:

    +
    struct BidNotHighEnough {
    +    pub highest_bid: u256
    +}
    +
    +
    +

    Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data.

    +
    +

    Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value.

    +

    Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event:

    +
    struct HighestBidIncreased {
    +    #indexed
    +    pub bidder: address
    +    pub amount: u256
    +}
    +
    +

    You have now implemented all the logic to handle a bid!

    +

    Withdrawing

    +

    A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times).

    +

    Add the following to the contract to implement the withdraw method:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn withdraw(mut self, mut ctx: Context) -> bool {
    +    let amount: u256 = self.pending_returns[ctx.msg_sender()]
    +
    +    if amount > 0 {
    +        self.pending_returns[ctx.msg_sender()] = 0
    +        ctx.send_value(to: ctx.msg_sender(), wei: amount)
    +    }
    +    return true
    +}
    +}
    +
    +

    Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).

    +
    +

    End the auction

    +

    Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event.

    +

    First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows:

    +
    struct AuctionNotYetEnded {
    +}
    +
    +

    You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct:

    +
    struct AuctionEndAlreadyCalled {}
    +
    +

    If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. +Your method can look as follows:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn action_end(mut self, mut ctx: Context) {
    +    if ctx.block_timestamp() <= self.auction_end_time {
    +        revert AuctionNotYetEnded()
    +    }
    +    if self.ended {
    +        revert AuctionEndAlreadyCalled()
    +    }
    +    self.ended = true
    +    ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
    +
    +    ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
    +}
    +}
    +

    Congratulations! You just wrote an open auction contract in Fe!

    +

    View functions

    +

    To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data.

    +

    You can add the following functions to the contract:

    +
    #![allow(unused)]
    +fn main() {
    +pub fn check_highest_bidder(self) -> address {
    +    return self.highest_bidder;
    +}
    +
    +pub fn check_highest_bid(self) -> u256 {
    +    return self.highest_bid;
    +}
    +
    +pub fn check_ended(self) -> bool {
    +    return self.ended;
    +}
    +}
    +

    Build and deploy the contract

    +

    Your contract is now ready to use! Compile it using

    +
    fe build auction.fe
    +
    +

    You will find the contract ABI and bytecode in the newly created outputs directory.

    +

    Start a local blockchain to deploy your contract to:

    +
    anvil
    +
    +

    There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode.

    +

    First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10:

    +
    cast --to_hex(10)
    +
    +>> 0xa // this is 10 in hex
    +
    +

    Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments.

    +
    cast send --from <your-address> --private-key <your-private-key> --create $(cat output/Auction/Auction.bin) $(cast abi-encode "__init__(uint256,address)" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720)
    +
    +

    You will see the contract address reported in your terminal.

    +

    Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35:

    +
    cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "bid()" --value "100ether" --private-key <your-private-key> --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
    +
    +

    You can check whether this was successful by calling the check_highest_bidder() function:

    +
    cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bidder()"
    +
    +

    You will see a response looking similar to:

    +
    0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720
    +
    +

    The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address).

    +

    You can do the same to check the highest bid:

    +
    cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bid()"
    +
    +

    This returns:

    +
    0x0000000000000000000000000000000000000000000000056bc75e2d63100000
    +
    +

    Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH):

    +
    cast --to-dec 56bc75e2d63100000
    +
    +>> 100000000000000000000 // 100 ETH in wei
    +
    +

    Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using:

    +
    cast balance <address>
    +
    +

    And check whether the auction open time has expired using

    +
    cast <contract-address> "check_ended()"
    +
    +

    Summary

    +

    Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain!

    +

    If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war!

    +

    By following this tutorial, you learned:

    +
      +
    • basic Fe types, such as bool, address, map and u256
    • +
    • basic Fe styles, such as snake case for variable names
    • +
    • how to create a contract with a constructor
    • +
    • how to revert
    • +
    • how to handle state variables
    • +
    • how to avoid reentrancy
    • +
    • how to use ctx to handle transaction data
    • +
    • how to emit events using ctx.emit
    • +
    • how to deploy a contract with constructor arguments using Foundry
    • +
    • how to interact with your contract
    • +
    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/docs/user-guide/tutorials/index.html b/docs/user-guide/tutorials/index.html new file mode 100644 index 0000000000..b2aa52bdb0 --- /dev/null +++ b/docs/user-guide/tutorials/index.html @@ -0,0 +1,234 @@ + + + + + + Tutorials - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Tutorials

    +

    Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here!

    +

    For now, you can get started with:

    + +

    Watch this space for more tutorials coming soon!

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + + diff --git a/fe-logo-small.svg b/fe-logo-small.svg new file mode 100644 index 0000000000..3edf6c4d7c --- /dev/null +++ b/fe-logo-small.svg @@ -0,0 +1,10562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fe-logo.svg b/fe-logo.svg new file mode 100644 index 0000000000..9659a9b38f --- /dev/null +++ b/fe-logo.svg @@ -0,0 +1,10479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000000..6bb9aaa081 --- /dev/null +++ b/index.html @@ -0,0 +1,351 @@ + + + + + + + Fe - A next generation, statically typed, future-proof smart contract language for the Ethereum Virtual Machine + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + Fe Programming Language +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +

    The next generation
    smart contract language for Ethereum

    +

    Create decentralized applications in a powerful, future-proof and statically typed language that is easy to learn.

    +

    +
    +
    +
    +
    +
    + + + +

    Beautiful and elegant

    +

    The syntax of Fe is largely inspired by Rust. It is easy to learn, even for those who have never dealt with the EVM before. Fe is designed to be safe and equipped with the tooling needed to validate contracts.

    +
    +
    + + + +

    + Simple yet powerful +

    +

    Fe seeks to restrict dynamic behavior without limiting expressiveness. Equipped with traits and generics you write clean code without sacrificing compile-time guarantees. +

    +
    +
    + + + +

    Efficient

    +

    While currently YUL is used as IR, in the near future Fe will use the new LLVM-inspired compiler backend sonatina, which enables much more aggressive optimizations.

    +
    +
    +
    +

    Explore some advanced contracts written in Fe

    + See examples → +
    +
    + +
    +
    +

    The next generation smart contract language.

    +

    Fe is an evolving smart contract language that strives to make EVM development safer, simpler and more fun.

    +
    +
    +
    +
    +

    + + + + Static typing +

    +

    Statically typed and equipped with a powerful compiler, Fe guides us to write robust code and avoid bugs.

    +
    +
    +

    + + + + Improved decidability +

    +

    Fe limits dynamic program behavior to improve decidability and allow more precise gas cost estimation.

    +
    +
    +

    + + + + Standard library +

    +

    Fe aspires to offer a rich standard library to assist with common tasks of smart contract development.

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +                      
    +                      
    +// Structs can be emitted as events
    +struct Signed {
    +    pub book_msg: String<100>
    +}
    +
    +// The `contract` keyword defines a new contract type
    +contract GuestBook {
    +    // Strings are generic over a constant number
    +    // that restricts its maximum size
    +    messages: Map<address, String<100>>
    +
    +    // Context is a struct provided by the standard library
    +    // that gives access to various features of the EVM
    +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
    +        // All storage access is explicit using `self.<some-key>`
    +        self.messages[ctx.msg_sender()] = book_msg
    +
    +        // Emit the `Signed` event.
    +        ctx.emit(Signed(book_msg))
    +    }
    +
    +    pub fn get_msg(self, addr: address) -> String<100> {
    +        // Copying data from storage to memory
    +        // has to be done explicitly via `to_mem()`
    +        return self.messages[addr].to_mem()
    +    }
    +}
    +
    +                    
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Get involved

    + +

    Fe is evolving at a rapid pace. Now is a great time to get involved with the next generation smart contract language.

    + + +
    +
    + +
    + + + + + + + diff --git a/privacy-policy.docx b/privacy-policy.docx new file mode 100644 index 0000000000000000000000000000000000000000..284936d7178d88210a506e8161003011cb31f338 GIT binary patch literal 32292 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 literal 0 HcmV?d00001 From 76557c7919c0ee7b889794abaac5f6b29b21a747 Mon Sep 17 00:00:00 2001 From: Christoph Burgdorf Date: Tue, 16 Dec 2025 08:42:30 +0000 Subject: [PATCH 2/2] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index c7fc02bd8f..0000000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -fe-lang.org \ No newline at end of file

    _oFf;?JB7jE$h$rY=PG`rcZiGDuIwy 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 + + + + + Introduction - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

  • + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + +
    +
    +

    Document not found (404)

    +

    This URL is invalid, sorry. Please use the navigation bar or search to continue.

    + +
    + + +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + +